56#include "intrinsics.h"
58QSC_CPLUSPLUS_ENABLED_START
78#if defined(QSC_SYSTEM_COMPILER_MSC)
80 #define QSC_MEMUTILS_MEMORY_FENCE() _ReadWriteBarrier()
81#elif defined(QSC_SYSTEM_COMPILER_GCC)
82 #define QSC_MEMUTILS_MEMORY_FENCE() __asm__ __volatile__ ("" ::: "memory")
84 #define QSC_MEMUTILS_MEMORY_FENCE()
91#define QSC_MEMUTILS_CACHE_LINE_SIZE 64ULL
97#define QSC_MEMUTILS_MEMORY_PAGE_SIZE 4096ULL
268#if defined(QSC_SYSTEM_HAS_AVX) && defined(QSC_SYSTEM_X86)
277QSC_EXPORT_API void qsc_memutils_clmulepi64_si256_avx(__m128i r[4U],
const __m128i a[2U],
const __m128i b[2U]);
421QSC_CPLUSPLUS_ENABLED_END
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:626
QSC_EXPORT_API void * qsc_memutils_realloc(void *block, size_t length)
Resize a block of memory.
Definition memutils.c:167
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:1218
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:1304
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:563
QSC_EXPORT_API void qsc_memutils_flush_cache_line(void *address)
Flush a cache line.
Definition memutils.c:32
QSC_EXPORT_API void * qsc_memutils_aligned_alloc(int32_t align, size_t length)
Allocate an aligned 8-bit integer array.
Definition memutils.c:194
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:1678
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:697
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:1061
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:541
QSC_EXPORT_API void * qsc_memutils_aligned_realloc(void *block, size_t length)
Reallocate an aligned 8-bit integer array.
Definition memutils.c:227
QSC_EXPORT_API void qsc_memutils_alloc_free(void *block)
Free a memory block created with malloc.
Definition memutils.c:184
QSC_EXPORT_API void qsc_memutils_secure_erase(void *block, size_t length)
Securely erase a block of memory.
Definition memutils.c:1737
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:1132
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:1261
QSC_EXPORT_API void qsc_memutils_clear(void *output, size_t length)
Erase a block of memory.
Definition memutils.c:354
QSC_EXPORT_API size_t qsc_memutils_page_size(void)
Get the system oage size.
Definition memutils.c:145
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:1175
QSC_EXPORT_API void qsc_memutils_clmulepi64_si256(uint64_t r[8U], const uint64_t a[4U], const uint64_t b[4U])
Multiply two 256-bit field elements (each represented as two 128-bit integers) to produce a 512-bit p...
Definition memutils.c:1029
QSC_EXPORT_API void qsc_memutils_prefetch_l3(uint8_t *address, size_t length)
Prefetch memory to L3 cache.
Definition memutils.c:102
QSC_EXPORT_API bool qsc_memutils_zeroed(const void *input, size_t length)
Test if an array is entirely zeroed.
Definition memutils.c:1862
QSC_EXPORT_API void qsc_memutils_prefetch_l1(uint8_t *address, size_t length)
Prefetch memory to L1 cache.
Definition memutils.c:48
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:1095
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:1553
QSC_EXPORT_API void qsc_memutils_copy(void *output, const void *input, size_t length)
Copy a block of memory.
Definition memutils.c:834
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:1406
QSC_EXPORT_API void * qsc_memutils_secure_malloc(size_t length)
Allocate a secure 8-bit integer array.
Definition memutils.c:1795
QSC_EXPORT_API void qsc_memutils_clmulepi64_si128(uint64_t r[2U], const uint64_t a[2U], const uint64_t b[2U], int32_t imm8)
Emulate the _mm_clmulepi64_si128 intrinsic.
Definition memutils.c:941
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:661
QSC_EXPORT_API void qsc_memutils_prefetch_l2(uint8_t *address, size_t length)
Prefetch memory to L2 cache.
Definition memutils.c:75
QSC_EXPORT_API void qsc_memutils_aligned_free(void *block)
Free an aligned memory block.
Definition memutils.c:248
QSC_EXPORT_API void qsc_memutils_secure_free(void *block, size_t length)
Free a secure memory block.
Definition memutils.c:1762
QSC_EXPORT_API void * qsc_memutils_malloc(size_t length)
Allocate a block of memory.
Definition memutils.c:129
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