45#include "intrinsics.h"
47QSC_CPLUSPLUS_ENABLED_START
64#define QSC_INTUTILS_KB_SIZE 1000ULL
70#define QSC_INTUTILS_KIB_SIZE 1024ULL
76#define QSC_INTUTILS_MB_SIZE 1000000ULL
82#define QSC_INTUTILS_MIB_SIZE 1048576ULL
88#define QSC_INTUTILS_GB_SIZE 1000000000ULL
94#define QSC_INTUTILS_GIB_SIZE 1073741824ULL
100#define QSC_INTUTILS_TB_SIZE 1000000000000ULL
106#define QSC_INTUTILS_TIB_SIZE 1099511627776ULL
112#define QSC_INTUTILS_PB_SIZE 1000000000000000ULL
118#define QSC_INTUTILS_PIB_SIZE 1125899906842624ULL
124#define QSC_INTUTILS_EB_SIZE 1000000000000000000ULL
130#define QSC_INTUTILS_EIB_SIZE 1152921504606846976ULL
233#if defined(QSC_SYSTEM_HAS_AVX)
241QSC_EXPORT_API void qsc_intutils_bswap32(uint32_t* dest,
const uint32_t* source,
size_t length);
250QSC_EXPORT_API void qsc_intutils_bswap64(uint64_t* dest,
const uint64_t* source,
size_t length);
422#if defined(QSC_SYSTEM_HAS_AVX)
428QSC_EXPORT_API void qsc_intutils_leincrement_x128(__m128i* counter);
431#if defined(QSC_SYSTEM_HAS_AVX512)
437QSC_EXPORT_API void qsc_intutils_leincrement_x512(__m512i* counter);
514#if defined(QSC_SYSTEM_HAS_AVX)
521QSC_EXPORT_API void qsc_intutils_reverse_bytes_x128(
const __m128i* input, __m128i* output);
524#if defined(QSC_SYSTEM_HAS_AVX512)
531QSC_EXPORT_API void qsc_intutils_reverse_bytes_x512(
const __m512i* input, __m512i* output);
580QSC_CPLUSPLUS_ENABLED_END
Contains common definitions for the Quantum Secure Cryptographic (QSC) library.
#define QSC_EXPORT_API
API export macro for Microsoft compilers when importing from a DLL.
Definition common.h:520
QSC_EXPORT_API uint32_t qsc_intutils_be8to32(const uint8_t *input)
Convert an 8-bit integer array to a 32-bit big-endian integer.
Definition intutils.c:50
QSC_EXPORT_API double qsc_intutils_calculate_log(double x)
Computes the natural logarithm ln(x) without using math.h.
Definition intutils.c:256
QSC_EXPORT_API uint16_t qsc_intutils_bit_reverse_u16(uint16_t x)
Reverse the bits of a 16-bit integer.
Definition intutils.c:129
QSC_EXPORT_API void qsc_intutils_clear64(uint64_t *a, size_t count)
Set an array of 64-bit integers to zero.
Definition intutils.c:430
QSC_EXPORT_API uint16_t qsc_intutils_le8to16(const uint8_t *input)
Convert an 8-bit integer array to a 16-bit little-endian integer.
Definition intutils.c:581
QSC_EXPORT_API void qsc_intutils_bin_to_hex(const uint8_t *input, char *hexstr, size_t inplen)
Convert a byte array to a hexadecimal string.
Definition intutils.c:491
QSC_EXPORT_API void qsc_intutils_le64to8(uint8_t *output, uint64_t value)
Convert a 64-bit integer to a little-endian 8-bit integer array.
Definition intutils.c:631
QSC_EXPORT_API uint32_t qsc_intutils_rotl32(uint32_t value, size_t shift)
Rotate an unsigned 32-bit integer to the left.
Definition intutils.c:691
QSC_EXPORT_API double qsc_intutils_calculate_exp(double x)
Computes the exponential function exp(x) using a Taylor series.
Definition intutils.c:189
QSC_EXPORT_API size_t qsc_intutils_min(size_t a, size_t b)
Return the smaller of two integers.
Definition intutils.c:650
QSC_EXPORT_API void qsc_intutils_hex_to_bin(const char *hexstr, uint8_t *output, size_t otplen)
Convert a hexadecimal string to a byte array.
Definition intutils.c:516
QSC_EXPORT_API void qsc_intutils_clear32(uint32_t *a, size_t count)
Set an array of 32-bit integers to zero.
Definition intutils.c:420
QSC_EXPORT_API size_t qsc_intutils_max(size_t a, size_t b)
Return the larger of two integers.
Definition intutils.c:645
QSC_EXPORT_API uint64_t qsc_intutils_be8to64(const uint8_t *input)
Convert an 8-bit integer array to a 64-bit big-endian integer.
Definition intutils.c:60
QSC_EXPORT_API uint32_t qsc_intutils_bit_reverse_u32(uint32_t x)
Reverse the bits of a 32-bit integer.
Definition intutils.c:118
QSC_EXPORT_API uint32_t qsc_intutils_popcount32(uint32_t v)
Count the number of bits set in a 32-bit unsigned integer.
Definition intutils.c:655
QSC_EXPORT_API uint32_t qsc_intutils_rotr32(uint32_t value, size_t shift)
Rotate an unsigned 32-bit integer to the right.
Definition intutils.c:701
QSC_EXPORT_API uint64_t qsc_intutils_rotr64(uint64_t value, size_t shift)
Rotate an unsigned 64-bit integer to the right.
Definition intutils.c:706
QSC_EXPORT_API bool qsc_intutils_is_gte(size_t x, size_t y)
Check if an integer is greater than or equal to another.
Definition intutils.c:486
QSC_EXPORT_API void qsc_intutils_clear8(uint8_t *a, size_t count)
Set an array of 8-bit integers to zero.
Definition intutils.c:400
QSC_EXPORT_API uint32_t qsc_intutils_le8to32(const uint8_t *input)
Convert an 8-bit integer array to a 32-bit little-endian integer.
Definition intutils.c:589
QSC_EXPORT_API void qsc_intutils_be8increment(uint8_t *output, size_t otplen)
Increment an 8-bit integer array as a segmented big-endian integer.
Definition intutils.c:25
QSC_EXPORT_API void qsc_intutils_cmov(uint8_t *dest, const uint8_t *source, size_t length, uint8_t cond)
Perform a constant-time conditional move on two arrays of 8-bit integers.
Definition intutils.c:440
QSC_EXPORT_API size_t qsc_intutils_bit_reverse(size_t x, uint32_t bits)
Reverse the bits of an integer.
Definition intutils.c:139
QSC_EXPORT_API void qsc_intutils_le16to8(uint8_t *output, uint16_t value)
Convert a 16-bit integer to a little-endian 8-bit integer array.
Definition intutils.c:613
QSC_EXPORT_API void qsc_intutils_le32to8(uint8_t *output, uint32_t value)
Convert a 32-bit integer to a little-endian 8-bit integer array.
Definition intutils.c:621
QSC_EXPORT_API int32_t qsc_intutils_verify(const uint8_t *a, const uint8_t *b, size_t length)
Constant-time comparison of two 8-bit integer arrays.
Definition intutils.c:711
QSC_EXPORT_API double qsc_intutils_calculate_sqrt(double x)
Computes the square root of a nonnegative number without using math.h.
Definition intutils.c:335
QSC_EXPORT_API double qsc_intutils_calculate_abs(double a)
Computes the absolute value of a double.
Definition intutils.c:180
QSC_EXPORT_API double qsc_intutils_calculate_fabs(double x)
Return the absolute value of a double.
Definition intutils.c:239
QSC_EXPORT_API void qsc_intutils_clear16(uint16_t *a, size_t count)
Set an array of 16-bit integers to zero.
Definition intutils.c:410
QSC_EXPORT_API uint64_t qsc_intutils_le8to64(const uint8_t *input)
Convert an 8-bit integer array to a 64-bit little-endian integer.
Definition intutils.c:599
QSC_EXPORT_API uint16_t qsc_intutils_be8to16(const uint8_t *input)
Convert an 8-bit integer array to a 16-bit big-endian integer.
Definition intutils.c:42
QSC_EXPORT_API size_t qsc_intutils_expand_mask(size_t x)
Expand an integer mask in constant time.
Definition intutils.c:463
QSC_EXPORT_API void qsc_intutils_le8increment(uint8_t *output, size_t otplen)
Increment an 8-bit integer array as a segmented little-endian integer.
Definition intutils.c:542
QSC_EXPORT_API void qsc_intutils_be32to8(uint8_t *output, uint32_t value)
Convert a 32-bit integer to a big-endian 8-bit integer array.
Definition intutils.c:82
QSC_EXPORT_API bool qsc_intutils_are_equal8(const uint8_t *a, const uint8_t *b, size_t length)
Compare two arrays of 8-bit integers for equality. \ warning This function is not constant time....
Definition intutils.c:4
QSC_EXPORT_API uint64_t qsc_intutils_bit_reverse_u64(uint64_t x)
Reverse the bits of a 64-bit integer.
Definition intutils.c:106
QSC_EXPORT_API uint64_t qsc_intutils_rotl64(uint64_t value, size_t shift)
Rotate an unsigned 64-bit integer to the left.
Definition intutils.c:696
QSC_EXPORT_API void qsc_intutils_be64to8(uint8_t *output, uint64_t value)
Convert a 64-bit integer to a big-endian 8-bit integer array.
Definition intutils.c:92
QSC_EXPORT_API void qsc_intutils_be16to8(uint8_t *output, uint16_t value)
Convert a 16-bit integer to a big-endian 8-bit integer array.
Definition intutils.c:74
QSC_EXPORT_API bool qsc_intutils_are_equal(size_t x, size_t y)
Check if two integers are equal.
Definition intutils.c:481