56#include "intrinsics.h"
58QSC_CPLUSPLUS_ENABLED_START
75#define QSC_INTUTILS_KB_SIZE 1000ULL
81#define QSC_INTUTILS_KIB_SIZE 1024ULL
87#define QSC_INTUTILS_MB_SIZE 1000000ULL
93#define QSC_INTUTILS_MIB_SIZE 1048576ULL
99#define QSC_INTUTILS_GB_SIZE 1000000000ULL
105#define QSC_INTUTILS_GIB_SIZE 1073741824ULL
111#define QSC_INTUTILS_TB_SIZE 1000000000000ULL
117#define QSC_INTUTILS_TIB_SIZE 1099511627776ULL
123#define QSC_INTUTILS_PB_SIZE 1000000000000000ULL
129#define QSC_INTUTILS_PIB_SIZE 1125899906842624ULL
135#define QSC_INTUTILS_EB_SIZE 1000000000000000000ULL
141#define QSC_INTUTILS_EIB_SIZE 1152921504606846976ULL
263#if defined(QSC_SYSTEM_HAS_AVX)
271QSC_EXPORT_API void qsc_intutils_bswap32(uint32_t* dest,
const uint32_t* source,
size_t length);
280QSC_EXPORT_API void qsc_intutils_bswap64(uint64_t* dest,
const uint64_t* source,
size_t length);
461#if defined(QSC_SYSTEM_HAS_AVX)
467QSC_EXPORT_API void qsc_intutils_leincrement_x128(__m128i* counter);
470#if defined(QSC_SYSTEM_HAS_AVX512)
476QSC_EXPORT_API void qsc_intutils_leincrement_x512(__m512i* counter);
562#if defined(QSC_SYSTEM_HAS_AVX)
569QSC_EXPORT_API void qsc_intutils_reverse_bytes_x128(
const __m128i* input, __m128i* output);
572#if defined(QSC_SYSTEM_HAS_AVX512)
579QSC_EXPORT_API void qsc_intutils_reverse_bytes_x512(
const __m512i* input, __m512i* output);
628QSC_CPLUSPLUS_ENABLED_END
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:70
QSC_EXPORT_API double qsc_intutils_calculate_log(double x)
Computes the natural logarithm ln(x) without using math.h.
Definition intutils.c:286
QSC_EXPORT_API uint16_t qsc_intutils_bit_reverse_u16(uint16_t x)
Reverse the bits of a 16-bit integer.
Definition intutils.c:149
QSC_EXPORT_API bool qsc_intutils_lsb_is_set(size_t x)
Check if the integer has the lsb set.
Definition intutils.c:671
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:450
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:607
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:498
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:657
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:722
QSC_EXPORT_API double qsc_intutils_calculate_exp(double x)
Computes the exponential function exp(x) using a Taylor series.
Definition intutils.c:219
QSC_EXPORT_API size_t qsc_intutils_min(size_t a, size_t b)
Return the smaller of two integers.
Definition intutils.c:681
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:523
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:443
void qsc_intutils_be8increment_rfc3686(uint8_t *output, size_t otplen)
Definition intutils.c:44
QSC_EXPORT_API size_t qsc_intutils_max(size_t a, size_t b)
Return the larger of two integers.
Definition intutils.c:676
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:80
QSC_EXPORT_API uint32_t qsc_intutils_bit_reverse_u32(uint32_t x)
Reverse the bits of a 32-bit integer.
Definition intutils.c:138
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:686
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:736
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:743
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:493
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:429
QSC_EXPORT_API bool qsc_intutils_is_power_of_two(size_t x)
Check if the integer is a power of two.
Definition intutils.c:549
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:615
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:27
QSC_EXPORT_API size_t qsc_intutils_next_power_of_2(size_t x)
Find the next power of two.
Definition intutils.c:554
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:457
QSC_EXPORT_API size_t qsc_intutils_bit_reverse(size_t x, uint32_t bits)
Reverse the bits of an integer.
Definition intutils.c:159
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:639
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:647
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:750
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:365
QSC_EXPORT_API double qsc_intutils_calculate_abs(double a)
Computes the absolute value of a double.
Definition intutils.c:203
QSC_EXPORT_API double qsc_intutils_calculate_fabs(double x)
Return the absolute value of a double.
Definition intutils.c:269
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:436
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:625
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:62
QSC_EXPORT_API size_t qsc_intutils_expand_mask(size_t x)
Expand an integer mask in constant time.
Definition intutils.c:475
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:568
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:102
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:10
QSC_EXPORT_API uint64_t qsc_intutils_bit_reverse_u64(uint64_t x)
Reverse the bits of a 64-bit integer.
Definition intutils.c:126
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:729
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:112
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:94
QSC_EXPORT_API bool qsc_intutils_are_equal(size_t x, size_t y)
Check if two integers are equal.
Definition intutils.c:5
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 qsccommon.h:605