QSC Post Quantum Cryptographic Library 1.0.0.6c (A6)
A post quantum secure library written in Ansi C
 
Loading...
Searching...
No Matches
intutils.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_INTUTILS_H
42#define QSC_INTUTILS_H
43
44#include "common.h"
45#include "intrinsics.h"
46
47QSC_CPLUSPLUS_ENABLED_START
48
59
64#define QSC_INTUTILS_KB_SIZE 1000ULL
65
70#define QSC_INTUTILS_KIB_SIZE 1024ULL
71
76#define QSC_INTUTILS_MB_SIZE 1000000ULL
77
82#define QSC_INTUTILS_MIB_SIZE 1048576ULL
83
88#define QSC_INTUTILS_GB_SIZE 1000000000ULL
89
94#define QSC_INTUTILS_GIB_SIZE 1073741824ULL
95
100#define QSC_INTUTILS_TB_SIZE 1000000000000ULL
101
106#define QSC_INTUTILS_TIB_SIZE 1099511627776ULL
107
112#define QSC_INTUTILS_PB_SIZE 1000000000000000ULL
113
118#define QSC_INTUTILS_PIB_SIZE 1125899906842624ULL
119
124#define QSC_INTUTILS_EB_SIZE 1000000000000000000ULL
125
130#define QSC_INTUTILS_EIB_SIZE 1152921504606846976ULL
131
142QSC_EXPORT_API bool qsc_intutils_are_equal8(const uint8_t* a, const uint8_t* b, size_t length);
143
150QSC_EXPORT_API uint16_t qsc_intutils_be8to16(const uint8_t* input);
151
158QSC_EXPORT_API uint32_t qsc_intutils_be8to32(const uint8_t* input);
159
166QSC_EXPORT_API uint64_t qsc_intutils_be8to64(const uint8_t* input);
167
174QSC_EXPORT_API void qsc_intutils_be16to8(uint8_t* output, uint16_t value);
175
182QSC_EXPORT_API void qsc_intutils_be32to8(uint8_t* output, uint32_t value);
183
190QSC_EXPORT_API void qsc_intutils_be64to8(uint8_t* output, uint64_t value);
191
198QSC_EXPORT_API void qsc_intutils_be8increment(uint8_t* output, size_t otplen);
199
207QSC_EXPORT_API size_t qsc_intutils_bit_reverse(size_t x, uint32_t bits);
208
216
224
232
233#if defined(QSC_SYSTEM_HAS_AVX)
241QSC_EXPORT_API void qsc_intutils_bswap32(uint32_t* dest, const uint32_t* source, size_t length);
242
250QSC_EXPORT_API void qsc_intutils_bswap64(uint64_t* dest, const uint64_t* source, size_t length);
251#endif
252
261
279
287
310
327
334QSC_EXPORT_API void qsc_intutils_clear8(uint8_t* a, size_t count);
335
342QSC_EXPORT_API void qsc_intutils_clear16(uint16_t* a, size_t count);
343
350QSC_EXPORT_API void qsc_intutils_clear32(uint32_t* a, size_t count);
351
358QSC_EXPORT_API void qsc_intutils_clear64(uint64_t* a, size_t count);
359
368QSC_EXPORT_API void qsc_intutils_cmov(uint8_t* dest, const uint8_t* source, size_t length, uint8_t cond);
369
377
385QSC_EXPORT_API bool qsc_intutils_are_equal(size_t x, size_t y);
386
394QSC_EXPORT_API bool qsc_intutils_is_gte(size_t x, size_t y);
395
403QSC_EXPORT_API void qsc_intutils_hex_to_bin(const char* hexstr, uint8_t* output, size_t otplen);
404
412QSC_EXPORT_API void qsc_intutils_bin_to_hex(const uint8_t* input, char* hexstr, size_t inplen);
413
420QSC_EXPORT_API void qsc_intutils_le8increment(uint8_t* output, size_t otplen);
421
422#if defined(QSC_SYSTEM_HAS_AVX)
428QSC_EXPORT_API void qsc_intutils_leincrement_x128(__m128i* counter);
429#endif
430
431#if defined(QSC_SYSTEM_HAS_AVX512)
437QSC_EXPORT_API void qsc_intutils_leincrement_x512(__m512i* counter);
438#endif
439
446QSC_EXPORT_API uint16_t qsc_intutils_le8to16(const uint8_t* input);
447
454QSC_EXPORT_API uint32_t qsc_intutils_le8to32(const uint8_t* input);
455
462QSC_EXPORT_API uint64_t qsc_intutils_le8to64(const uint8_t* input);
463
470QSC_EXPORT_API void qsc_intutils_le16to8(uint8_t* output, uint16_t value);
471
478QSC_EXPORT_API void qsc_intutils_le32to8(uint8_t* output, uint32_t value);
479
486QSC_EXPORT_API void qsc_intutils_le64to8(uint8_t* output, uint64_t value);
487
495QSC_EXPORT_API size_t qsc_intutils_max(size_t a, size_t b);
496
504QSC_EXPORT_API size_t qsc_intutils_min(size_t a, size_t b);
505
512QSC_EXPORT_API uint32_t qsc_intutils_popcount32(uint32_t v);
513
514#if defined(QSC_SYSTEM_HAS_AVX)
521QSC_EXPORT_API void qsc_intutils_reverse_bytes_x128(const __m128i* input, __m128i* output);
522#endif
523
524#if defined(QSC_SYSTEM_HAS_AVX512)
531QSC_EXPORT_API void qsc_intutils_reverse_bytes_x512(const __m512i* input, __m512i* output);
532#endif
533
541QSC_EXPORT_API uint32_t qsc_intutils_rotl32(uint32_t value, size_t shift);
542
550QSC_EXPORT_API uint64_t qsc_intutils_rotl64(uint64_t value, size_t shift);
551
559QSC_EXPORT_API uint32_t qsc_intutils_rotr32(uint32_t value, size_t shift);
560
568QSC_EXPORT_API uint64_t qsc_intutils_rotr64(uint64_t value, size_t shift);
569
578QSC_EXPORT_API int32_t qsc_intutils_verify(const uint8_t* a, const uint8_t* b, size_t length);
579
580QSC_CPLUSPLUS_ENABLED_END
581
582#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 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:50
QSC_EXPORT_API double qsc_intutils_calculate_log(double x)
Computes the natural logarithm ln(x) without using math.h.
Definition intutils.c:256
QSC_EXPORT_API uint16_t qsc_intutils_bit_reverse_u16(uint16_t x)
Reverse the bits of a 16-bit integer.
Definition intutils.c:129
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:430
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:581
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:491
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:631
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:691
QSC_EXPORT_API double qsc_intutils_calculate_exp(double x)
Computes the exponential function exp(x) using a Taylor series.
Definition intutils.c:189
QSC_EXPORT_API size_t qsc_intutils_min(size_t a, size_t b)
Return the smaller of two integers.
Definition intutils.c:650
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:516
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:420
QSC_EXPORT_API size_t qsc_intutils_max(size_t a, size_t b)
Return the larger of two integers.
Definition intutils.c:645
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:60
QSC_EXPORT_API uint32_t qsc_intutils_bit_reverse_u32(uint32_t x)
Reverse the bits of a 32-bit integer.
Definition intutils.c:118
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:655
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:701
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:706
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:486
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:400
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:589
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:25
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:440
QSC_EXPORT_API size_t qsc_intutils_bit_reverse(size_t x, uint32_t bits)
Reverse the bits of an integer.
Definition intutils.c:139
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:613
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:621
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:711
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:335
QSC_EXPORT_API double qsc_intutils_calculate_abs(double a)
Computes the absolute value of a double.
Definition intutils.c:180
QSC_EXPORT_API double qsc_intutils_calculate_fabs(double x)
Return the absolute value of a double.
Definition intutils.c:239
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:410
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:599
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:42
QSC_EXPORT_API size_t qsc_intutils_expand_mask(size_t x)
Expand an integer mask in constant time.
Definition intutils.c:463
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:542
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:82
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:4
QSC_EXPORT_API uint64_t qsc_intutils_bit_reverse_u64(uint64_t x)
Reverse the bits of a 64-bit integer.
Definition intutils.c:106
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:696
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:92
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:74
QSC_EXPORT_API bool qsc_intutils_are_equal(size_t x, size_t y)
Check if two integers are equal.
Definition intutils.c:481