QSC Post Quantum Cryptographic Library 1.0.0.6c (A6)
A post quantum secure library written in Ansi C
 
Loading...
Searching...
No Matches
memutils.h
Go to the documentation of this file.
1/*
2 * 2025 Quantum Resistant Cryptographic Solutions Corporation
3 * All Rights Reserved.
4 *
5 * NOTICE: This software and all accompanying materials are the exclusive
6 * property of Quantum Resistant Cryptographic Solutions Corporation (QRCS).
7 * The intellectual and technical concepts contained within this implementation
8 * are proprietary to QRCS and its authorized licensors and are protected under
9 * applicable U.S. and international copyright, patent, and trade secret laws.
10 *
11 * CRYPTOGRAPHIC STANDARDS:
12 * - This software includes implementations of cryptographic algorithms such as
13 * SHA3, AES, and others. These algorithms are public domain or standardized
14 * by organizations such as NIST and are NOT the property of QRCS.
15 * - However, all source code, optimizations, and implementations in this library
16 * are original works of QRCS and are protected under this license.
17 *
18 * RESTRICTIONS:
19 * - Redistribution, modification, or unauthorized distribution of this software,
20 * in whole or in part, is strictly prohibited.
21 * - This software is provided for non-commercial, educational, and research
22 * purposes only. Commercial use in any form is expressly forbidden.
23 * - Licensing and authorized distribution are solely at the discretion of QRCS.
24 * - Any use of this software implies acceptance of these restrictions.
25 *
26 * DISCLAIMER:
27 * This software is provided "as is," without warranty of any kind, express or
28 * implied, including but not limited to warranties of merchantability or fitness
29 * for a particular purpose. QRCS disclaims all liability for any direct, indirect,
30 * incidental, or consequential damages resulting from the use or misuse of this software.
31 *
32 * FULL LICENSE:
33 * This software is subject to the **Quantum Resistant Cryptographic Solutions
34 * Proprietary License (QRCS-PL)**. The complete license terms are included
35 * in the LICENSE.txt file distributed with this software.
36 *
37 * Written by: John G. Underhill
38 * Contact: john.underhill@protonmail.com
39 */
40
41#ifndef QSC_MEMUTILS_H
42#define QSC_MEMUTILS_H
43
44#include "common.h"
45#include "intrinsics.h"
46
47QSC_CPLUSPLUS_ENABLED_START
48
62
67#if defined(QSC_SYSTEM_COMPILER_MSC)
68 #include <intrin.h>
69 #define QSC_MEMUTILS_MEMORY_FENCE() _ReadWriteBarrier()
70#elif defined(QSC_SYSTEM_COMPILER_GCC)
71 #define QSC_MEMUTILS_MEMORY_FENCE() __asm__ __volatile__ ("" ::: "memory")
72#else
73 #define QSC_MEMUTILS_MEMORY_FENCE()
74#endif
75
80#define QSC_MEMUTILS_CACHE_LINE_SIZE 64ULL
81
86#define QSC_MEMUTILS_MEMORY_PAGE_SIZE 4096ULL
87
94
101QSC_EXPORT_API void qsc_memutils_prefetch_l1(uint8_t* address, size_t length);
102
109QSC_EXPORT_API void qsc_memutils_prefetch_l2(uint8_t* address, size_t length);
110
117QSC_EXPORT_API void qsc_memutils_prefetch_l3(uint8_t* address, size_t length);
118
126QSC_EXPORT_API void* qsc_memutils_malloc(size_t length);
127
136QSC_EXPORT_API void* qsc_memutils_realloc(void* block, size_t length);
137
144
153QSC_EXPORT_API void* qsc_memutils_aligned_alloc(int32_t align, size_t length);
154
163QSC_EXPORT_API void* qsc_memutils_aligned_realloc(void* block, size_t length);
164
171
178QSC_EXPORT_API void qsc_memutils_clear(void* output, size_t length);
179
188QSC_EXPORT_API bool qsc_memutils_array_uniform(const uint8_t* input, size_t length);
189
199QSC_EXPORT_API bool qsc_memutils_are_equal(const uint8_t* a, const uint8_t* b, size_t length);
200
209QSC_EXPORT_API bool qsc_memutils_are_equal_128(const uint8_t* a, const uint8_t* b);
210
219QSC_EXPORT_API bool qsc_memutils_are_equal_256(const uint8_t* a, const uint8_t* b);
220
229QSC_EXPORT_API bool qsc_memutils_are_equal_512(const uint8_t* a, const uint8_t* b);
230
238QSC_EXPORT_API void qsc_memutils_copy(void* output, const void* input, size_t length);
239
248QSC_EXPORT_API void qsc_memutils_clmulepi64_si128(uint64_t r[2], const uint64_t a[2], const uint64_t b[2], int32_t imm8);
249
258QSC_EXPORT_API void qsc_memutils_clmulepi64_si256_avx(__m128i r[4], const __m128i a[2], const __m128i b[2]);
259
268QSC_EXPORT_API void qsc_memutils_clmulepi64_si256(uint64_t r[8], const uint64_t a[4], const uint64_t b[4]);
269
278QSC_EXPORT_API bool qsc_memutils_greater_than_be128(const uint8_t* a, const uint8_t* b);
279
288QSC_EXPORT_API bool qsc_memutils_greater_than_be256(const uint8_t* a, const uint8_t* b);
289
298QSC_EXPORT_API bool qsc_memutils_greater_than_be512(const uint8_t* a, const uint8_t* b);
299
308QSC_EXPORT_API bool qsc_memutils_greater_than_le128(const uint8_t* a, const uint8_t* b);
309
318QSC_EXPORT_API bool qsc_memutils_greater_than_le256(const uint8_t* a, const uint8_t* b);
319
328QSC_EXPORT_API bool qsc_memutils_greater_than_le512(const uint8_t* a, const uint8_t* b);
329
337QSC_EXPORT_API void qsc_memutils_move(void* output, const void* input, size_t length);
338
345QSC_EXPORT_API void qsc_memutils_secure_erase(void* block, size_t length);
346
353QSC_EXPORT_API void qsc_memutils_secure_free(void* block, size_t length);
354
362QSC_EXPORT_API void* qsc_memutils_secure_malloc(size_t length);
363
371QSC_EXPORT_API void qsc_memutils_set_value(void* output, size_t length, uint8_t value);
372
380QSC_EXPORT_API void qsc_memutils_xor(uint8_t* output, const uint8_t* input, size_t length);
381
389QSC_EXPORT_API void qsc_memutils_xorv(uint8_t* output, const uint8_t value, size_t length);
390
399QSC_EXPORT_API bool qsc_memutils_zeroed(const void* input, size_t length);
400
401QSC_CPLUSPLUS_ENABLED_END
402
403#endif
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