QSC Post Quantum Cryptographic Library 1.1.0.2 (B2)
A post quantum secure library written in Ansi C
Loading...
Searching...
No Matches
memutils.h
Go to the documentation of this file.
1/* 2020-2026 Quantum Resistant Cryptographic Solutions Corporation
2 * All Rights Reserved.
3 *
4 * NOTICE:
5 * This software and all accompanying materials are the exclusive property of
6 * Quantum Resistant Cryptographic Solutions Corporation (QRCS). The intellectual
7 * and technical concepts contained herein are proprietary to QRCS and are
8 * protected under applicable Canadian, U.S., and international copyright,
9 * patent, and trade secret laws.
10 *
11 * CRYPTOGRAPHIC ALGORITHMS AND IMPLEMENTATIONS:
12 * - This software includes implementations of cryptographic primitives and
13 * algorithms that are standardized or in the public domain, such as AES
14 * and SHA-3, which are not proprietary to QRCS.
15 * - This software also includes cryptographic primitives, constructions, and
16 * algorithms designed by QRCS, including but not limited to RCS, SCB, CSX, QMAC, and
17 * related components, which are proprietary to QRCS.
18 * - All source code, implementations, protocol compositions, optimizations,
19 * parameter selections, and engineering work contained in this software are
20 * original works of QRCS and are protected under this license.
21 *
22 * LICENSE AND USE RESTRICTIONS:
23 * - This software is licensed under the Quantum Resistant Cryptographic Solutions
24 * Public Research and Evaluation License (QRCS-PREL), 2025-2026.
25 * - Permission is granted solely for non-commercial evaluation, academic research,
26 * cryptographic analysis, interoperability testing, and feasibility assessment.
27 * - Commercial use, production deployment, commercial redistribution, or
28 * integration into products or services is strictly prohibited without a
29 * separate written license agreement executed with QRCS.
30 * - Licensing and authorized distribution are solely at the discretion of QRCS.
31 *
32 * EXPERIMENTAL CRYPTOGRAPHY NOTICE:
33 * Portions of this software may include experimental, novel, or evolving
34 * cryptographic designs. Use of this software is entirely at the user's risk.
35 *
36 * DISCLAIMER:
37 * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
38 * IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS
39 * FOR A PARTICULAR PURPOSE, SECURITY, OR NON-INFRINGEMENT. QRCS DISCLAIMS ALL
40 * LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
41 * ARISING FROM THE USE OR MISUSE OF THIS SOFTWARE.
42 *
43 * FULL LICENSE:
44 * This software is subject to the Quantum Resistant Cryptographic Solutions
45 * Public Research and Evaluation License (QRCS-PREL), 2025-2026. The complete license terms
46 * are provided in the accompanying LICENSE file or at https://www.qrcscorp.ca.
47 *
48 * Written by: John G. Underhill
49 * Contact: contact@qrcscorp.ca
50 */
51
52#ifndef QSC_MEMUTILS_H
53#define QSC_MEMUTILS_H
54
55#include "qsccommon.h"
56#include "intrinsics.h"
57
58QSC_CPLUSPLUS_ENABLED_START
59
73
78#if defined(QSC_SYSTEM_COMPILER_MSC)
79 #include <intrin.h>
80 #define QSC_MEMUTILS_MEMORY_FENCE() _ReadWriteBarrier()
81#elif defined(QSC_SYSTEM_COMPILER_GCC)
82 #define QSC_MEMUTILS_MEMORY_FENCE() __asm__ __volatile__ ("" ::: "memory")
83#else
84 #define QSC_MEMUTILS_MEMORY_FENCE()
85#endif
86
91#define QSC_MEMUTILS_CACHE_LINE_SIZE 64ULL
92
97#define QSC_MEMUTILS_MEMORY_PAGE_SIZE 4096ULL
98
105
112QSC_EXPORT_API void qsc_memutils_prefetch_l1(uint8_t* address, size_t length);
113
120QSC_EXPORT_API void qsc_memutils_prefetch_l2(uint8_t* address, size_t length);
121
128QSC_EXPORT_API void qsc_memutils_prefetch_l3(uint8_t* address, size_t length);
129
137QSC_EXPORT_API void* qsc_memutils_malloc(size_t length);
138
145
154QSC_EXPORT_API void* qsc_memutils_realloc(void* block, size_t length);
155
162
171QSC_EXPORT_API void* qsc_memutils_aligned_alloc(int32_t align, size_t length);
172
181QSC_EXPORT_API void* qsc_memutils_aligned_realloc(void* block, size_t length);
182
189
196QSC_EXPORT_API void qsc_memutils_clear(void* output, size_t length);
197
206QSC_EXPORT_API bool qsc_memutils_array_uniform(const uint8_t* input, size_t length);
207
217QSC_EXPORT_API bool qsc_memutils_are_equal(const uint8_t* a, const uint8_t* b, size_t length);
218
227QSC_EXPORT_API bool qsc_memutils_are_equal_128(const uint8_t* a, const uint8_t* b);
228
237QSC_EXPORT_API bool qsc_memutils_are_equal_256(const uint8_t* a, const uint8_t* b);
238
247QSC_EXPORT_API bool qsc_memutils_are_equal_512(const uint8_t* a, const uint8_t* b);
248
256QSC_EXPORT_API void qsc_memutils_copy(void* output, const void* input, size_t length);
257
266QSC_EXPORT_API void qsc_memutils_clmulepi64_si128(uint64_t r[2U], const uint64_t a[2U], const uint64_t b[2U], int32_t imm8);
267
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]);
278#endif
279
288QSC_EXPORT_API void qsc_memutils_clmulepi64_si256(uint64_t r[8U], const uint64_t a[4U], const uint64_t b[4U]);
289
298QSC_EXPORT_API bool qsc_memutils_greater_than_be128(const uint8_t* a, const uint8_t* b);
299
308QSC_EXPORT_API bool qsc_memutils_greater_than_be256(const uint8_t* a, const uint8_t* b);
309
318QSC_EXPORT_API bool qsc_memutils_greater_than_be512(const uint8_t* a, const uint8_t* b);
319
328QSC_EXPORT_API bool qsc_memutils_greater_than_le128(const uint8_t* a, const uint8_t* b);
329
338QSC_EXPORT_API bool qsc_memutils_greater_than_le256(const uint8_t* a, const uint8_t* b);
339
348QSC_EXPORT_API bool qsc_memutils_greater_than_le512(const uint8_t* a, const uint8_t* b);
349
357QSC_EXPORT_API void qsc_memutils_move(void* output, const void* input, size_t length);
358
365QSC_EXPORT_API void qsc_memutils_secure_erase(void* block, size_t length);
366
373QSC_EXPORT_API void qsc_memutils_secure_free(void* block, size_t length);
374
382QSC_EXPORT_API void* qsc_memutils_secure_malloc(size_t length);
383
391QSC_EXPORT_API void qsc_memutils_set_value(void* output, size_t length, uint8_t value);
392
400QSC_EXPORT_API void qsc_memutils_xor(uint8_t* output, const uint8_t* input, size_t length);
401
409QSC_EXPORT_API void qsc_memutils_xorv(uint8_t* output, const uint8_t value, size_t length);
410
419QSC_EXPORT_API bool qsc_memutils_zeroed(const void* input, size_t length);
420
421QSC_CPLUSPLUS_ENABLED_END
422
423#endif
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