45#include "intrinsics.h"
47QSC_CPLUSPLUS_ENABLED_START
67#if defined(QSC_SYSTEM_COMPILER_MSC)
69 #define QSC_MEMUTILS_MEMORY_FENCE() _ReadWriteBarrier()
70#elif defined(QSC_SYSTEM_COMPILER_GCC)
71 #define QSC_MEMUTILS_MEMORY_FENCE() __asm__ __volatile__ ("" ::: "memory")
73 #define QSC_MEMUTILS_MEMORY_FENCE()
80#define QSC_MEMUTILS_CACHE_LINE_SIZE 64ULL
86#define QSC_MEMUTILS_MEMORY_PAGE_SIZE 4096ULL
401QSC_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 bool qsc_memutils_are_equal_128(const uint8_t *a, const uint8_t *b)
Compare two 16-byte arrays for equality.
Definition memutils.c:471
QSC_EXPORT_API void * qsc_memutils_realloc(void *block, size_t length)
Resize a block of memory.
Definition memutils.c:143
QSC_EXPORT_API bool qsc_memutils_greater_than_le256(const uint8_t *a, const uint8_t *b)
Compare two 32-byte arrays as 256-bit little-endian integers to determine if A is greater than B.
Definition memutils.c:1031
QSC_EXPORT_API void qsc_memutils_move(void *output, const void *input, size_t length)
Move a block of memory, erasing the previous location.
Definition memutils.c:1087
QSC_EXPORT_API bool qsc_memutils_are_equal(const uint8_t *a, const uint8_t *b, size_t length)
Compare two byte arrays for equality.
Definition memutils.c:418
QSC_EXPORT_API void qsc_memutils_flush_cache_line(void *address)
Flush a cache line.
Definition memutils.c:21
QSC_EXPORT_API void * qsc_memutils_aligned_alloc(int32_t align, size_t length)
Allocate an aligned 8-bit integer array.
Definition memutils.c:170
QSC_EXPORT_API void qsc_memutils_xorv(uint8_t *output, const uint8_t value, size_t length)
Bitwise XOR a block of memory with a byte value.
Definition memutils.c:1423
QSC_EXPORT_API bool qsc_memutils_are_equal_512(const uint8_t *a, const uint8_t *b)
Compare two 64-byte arrays for equality.
Definition memutils.c:526
QSC_EXPORT_API bool qsc_memutils_greater_than_be128(const uint8_t *a, const uint8_t *b)
Compare two 16-byte arrays as 128-bit big-endian integers to determine if A is greater than B.
Definition memutils.c:881
QSC_EXPORT_API bool qsc_memutils_array_uniform(const uint8_t *input, size_t length)
Check if all array members are the same.
Definition memutils.c:396
QSC_EXPORT_API void * qsc_memutils_aligned_realloc(void *block, size_t length)
Reallocate an aligned 8-bit integer array.
Definition memutils.c:200
QSC_EXPORT_API void qsc_memutils_alloc_free(void *block)
Free a memory block created with malloc.
Definition memutils.c:160
QSC_EXPORT_API void qsc_memutils_secure_erase(void *block, size_t length)
Securely erase a block of memory.
Definition memutils.c:1308
QSC_EXPORT_API bool qsc_memutils_greater_than_be512(const uint8_t *a, const uint8_t *b)
Compare two 64-byte arrays as 512-bit big-endian integers to determine if A is greater than B.
Definition memutils.c:964
QSC_EXPORT_API bool qsc_memutils_greater_than_le512(const uint8_t *a, const uint8_t *b)
Compare two 64-byte arrays as 512-bit little-endian integers to determine if A is greater than B.
Definition memutils.c:1067
QSC_EXPORT_API void qsc_memutils_clmulepi64_si256_avx(__m128i r[4], const __m128i a[2], const __m128i b[2])
Multiply two 256-bit field elements (each represented as two 128-bit integers) to produce a 512-bit p...
QSC_EXPORT_API void qsc_memutils_clear(void *output, size_t length)
Erase a block of memory.
Definition memutils.c:264
QSC_EXPORT_API bool qsc_memutils_greater_than_le128(const uint8_t *a, const uint8_t *b)
Compare two 16-byte arrays as 128-bit little-endian integers to determine if A is greater than B.
Definition memutils.c:984
QSC_EXPORT_API void qsc_memutils_prefetch_l3(uint8_t *address, size_t length)
Prefetch memory to L3 cache.
Definition memutils.c:78
QSC_EXPORT_API void qsc_memutils_clmulepi64_si128(uint64_t r[2], const uint64_t a[2], const uint64_t b[2], int32_t imm8)
Emulate the _mm_clmulepi64_si128 intrinsic.
Definition memutils.c:686
QSC_EXPORT_API bool qsc_memutils_zeroed(const void *input, size_t length)
Test if an array is entirely zeroed.
Definition memutils.c:1468
QSC_EXPORT_API void qsc_memutils_prefetch_l1(uint8_t *address, size_t length)
Prefetch memory to L1 cache.
Definition memutils.c:32
QSC_EXPORT_API bool qsc_memutils_greater_than_be256(const uint8_t *a, const uint8_t *b)
Compare two 32-byte arrays as 256-bit big-endian integers to determine if A is greater than B.
Definition memutils.c:928
QSC_EXPORT_API void qsc_memutils_xor(uint8_t *output, const uint8_t *input, size_t length)
Bitwise XOR two blocks of memory.
Definition memutils.c:1223
QSC_EXPORT_API void qsc_memutils_copy(void *output, const void *input, size_t length)
Copy a block of memory.
Definition memutils.c:590
QSC_EXPORT_API void qsc_memutils_clmulepi64_si256(uint64_t r[8], const uint64_t a[4], const uint64_t b[4])
Multiply two 256-bit field elements (each represented as two 128-bit integers) to produce a 512-bit p...
Definition memutils.c:823
QSC_EXPORT_API void qsc_memutils_set_value(void *output, size_t length, uint8_t value)
Set a block of memory to a specific value.
Definition memutils.c:1127
QSC_EXPORT_API void * qsc_memutils_secure_malloc(size_t length)
Allocate a secure 8-bit integer array.
Definition memutils.c:1354
QSC_EXPORT_API bool qsc_memutils_are_equal_256(const uint8_t *a, const uint8_t *b)
Compare two 32-byte arrays for equality.
Definition memutils.c:496
QSC_EXPORT_API void qsc_memutils_prefetch_l2(uint8_t *address, size_t length)
Prefetch memory to L2 cache.
Definition memutils.c:55
QSC_EXPORT_API void qsc_memutils_aligned_free(void *block)
Free an aligned memory block.
Definition memutils.c:221
QSC_EXPORT_API void qsc_memutils_secure_free(void *block, size_t length)
Free a secure memory block.
Definition memutils.c:1321
QSC_EXPORT_API void * qsc_memutils_malloc(size_t length)
Allocate a block of memory.
Definition memutils.c:101