QSC Post Quantum Cryptographic Library 1.1.0.2 (B2)
A post quantum secure library written in Ansi C
Loading...
Searching...
No Matches
intutils.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_INTUTILS_H
53#define QSC_INTUTILS_H
54
55#include "qsccommon.h"
56#include "intrinsics.h"
57
58QSC_CPLUSPLUS_ENABLED_START
59
70
75#define QSC_INTUTILS_KB_SIZE 1000ULL
76
81#define QSC_INTUTILS_KIB_SIZE 1024ULL
82
87#define QSC_INTUTILS_MB_SIZE 1000000ULL
88
93#define QSC_INTUTILS_MIB_SIZE 1048576ULL
94
99#define QSC_INTUTILS_GB_SIZE 1000000000ULL
100
105#define QSC_INTUTILS_GIB_SIZE 1073741824ULL
106
111#define QSC_INTUTILS_TB_SIZE 1000000000000ULL
112
117#define QSC_INTUTILS_TIB_SIZE 1099511627776ULL
118
123#define QSC_INTUTILS_PB_SIZE 1000000000000000ULL
124
129#define QSC_INTUTILS_PIB_SIZE 1125899906842624ULL
130
135#define QSC_INTUTILS_EB_SIZE 1000000000000000000ULL
136
141#define QSC_INTUTILS_EIB_SIZE 1152921504606846976ULL
142
150QSC_EXPORT_API bool qsc_intutils_are_equal(size_t x, size_t y);
151
162QSC_EXPORT_API bool qsc_intutils_are_equal8(const uint8_t* a, const uint8_t* b, size_t length);
163
170QSC_EXPORT_API uint16_t qsc_intutils_be8to16(const uint8_t* input);
171
178QSC_EXPORT_API uint32_t qsc_intutils_be8to32(const uint8_t* input);
179
186QSC_EXPORT_API uint64_t qsc_intutils_be8to64(const uint8_t* input);
187
194QSC_EXPORT_API void qsc_intutils_be16to8(uint8_t* output, uint16_t value);
195
202QSC_EXPORT_API void qsc_intutils_be32to8(uint8_t* output, uint32_t value);
203
210QSC_EXPORT_API void qsc_intutils_be64to8(uint8_t* output, uint64_t value);
211
218QSC_EXPORT_API void qsc_intutils_be8increment(uint8_t* output, size_t otplen);
219
228void qsc_intutils_be8increment_rfc3686(uint8_t* output, size_t otplen);
229
237QSC_EXPORT_API size_t qsc_intutils_bit_reverse(size_t x, uint32_t bits);
238
246
254
262
263#if defined(QSC_SYSTEM_HAS_AVX)
271QSC_EXPORT_API void qsc_intutils_bswap32(uint32_t* dest, const uint32_t* source, size_t length);
272
280QSC_EXPORT_API void qsc_intutils_bswap64(uint64_t* dest, const uint64_t* source, size_t length);
281#endif
282
291
309
317
340
357
364QSC_EXPORT_API void qsc_intutils_clear8(uint8_t* a, size_t count);
365
372QSC_EXPORT_API void qsc_intutils_clear16(uint16_t* a, size_t count);
373
380QSC_EXPORT_API void qsc_intutils_clear32(uint32_t* a, size_t count);
381
388QSC_EXPORT_API void qsc_intutils_clear64(uint64_t* a, size_t count);
389
398QSC_EXPORT_API void qsc_intutils_cmov(uint8_t* dest, const uint8_t* source, size_t length, uint8_t cond);
399
407
415QSC_EXPORT_API bool qsc_intutils_is_gte(size_t x, size_t y);
416
425
434
442QSC_EXPORT_API void qsc_intutils_hex_to_bin(const char* hexstr, uint8_t* output, size_t otplen);
443
451QSC_EXPORT_API void qsc_intutils_bin_to_hex(const uint8_t* input, char* hexstr, size_t inplen);
452
459QSC_EXPORT_API void qsc_intutils_le8increment(uint8_t* output, size_t otplen);
460
461#if defined(QSC_SYSTEM_HAS_AVX)
467QSC_EXPORT_API void qsc_intutils_leincrement_x128(__m128i* counter);
468#endif
469
470#if defined(QSC_SYSTEM_HAS_AVX512)
476QSC_EXPORT_API void qsc_intutils_leincrement_x512(__m512i* counter);
477#endif
478
485QSC_EXPORT_API uint16_t qsc_intutils_le8to16(const uint8_t* input);
486
493QSC_EXPORT_API uint32_t qsc_intutils_le8to32(const uint8_t* input);
494
501QSC_EXPORT_API uint64_t qsc_intutils_le8to64(const uint8_t* input);
502
509QSC_EXPORT_API void qsc_intutils_le16to8(uint8_t* output, uint16_t value);
510
517QSC_EXPORT_API void qsc_intutils_le32to8(uint8_t* output, uint32_t value);
518
525QSC_EXPORT_API void qsc_intutils_le64to8(uint8_t* output, uint64_t value);
526
535
543QSC_EXPORT_API size_t qsc_intutils_max(size_t a, size_t b);
544
552QSC_EXPORT_API size_t qsc_intutils_min(size_t a, size_t b);
553
560QSC_EXPORT_API uint32_t qsc_intutils_popcount32(uint32_t v);
561
562#if defined(QSC_SYSTEM_HAS_AVX)
569QSC_EXPORT_API void qsc_intutils_reverse_bytes_x128(const __m128i* input, __m128i* output);
570#endif
571
572#if defined(QSC_SYSTEM_HAS_AVX512)
579QSC_EXPORT_API void qsc_intutils_reverse_bytes_x512(const __m512i* input, __m512i* output);
580#endif
581
589QSC_EXPORT_API uint32_t qsc_intutils_rotl32(uint32_t value, size_t shift);
590
598QSC_EXPORT_API uint64_t qsc_intutils_rotl64(uint64_t value, size_t shift);
599
607QSC_EXPORT_API uint32_t qsc_intutils_rotr32(uint32_t value, size_t shift);
608
616QSC_EXPORT_API uint64_t qsc_intutils_rotr64(uint64_t value, size_t shift);
617
626QSC_EXPORT_API int32_t qsc_intutils_verify(const uint8_t* a, const uint8_t* b, size_t length);
627
628QSC_CPLUSPLUS_ENABLED_END
629
630#endif
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:70
QSC_EXPORT_API double qsc_intutils_calculate_log(double x)
Computes the natural logarithm ln(x) without using math.h.
Definition intutils.c:286
QSC_EXPORT_API uint16_t qsc_intutils_bit_reverse_u16(uint16_t x)
Reverse the bits of a 16-bit integer.
Definition intutils.c:149
QSC_EXPORT_API bool qsc_intutils_lsb_is_set(size_t x)
Check if the integer has the lsb set.
Definition intutils.c:671
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:450
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:607
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:498
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:657
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:722
QSC_EXPORT_API double qsc_intutils_calculate_exp(double x)
Computes the exponential function exp(x) using a Taylor series.
Definition intutils.c:219
QSC_EXPORT_API size_t qsc_intutils_min(size_t a, size_t b)
Return the smaller of two integers.
Definition intutils.c:681
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:523
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:443
void qsc_intutils_be8increment_rfc3686(uint8_t *output, size_t otplen)
Definition intutils.c:44
QSC_EXPORT_API size_t qsc_intutils_max(size_t a, size_t b)
Return the larger of two integers.
Definition intutils.c:676
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:80
QSC_EXPORT_API uint32_t qsc_intutils_bit_reverse_u32(uint32_t x)
Reverse the bits of a 32-bit integer.
Definition intutils.c:138
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:686
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:736
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:743
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:493
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:429
QSC_EXPORT_API bool qsc_intutils_is_power_of_two(size_t x)
Check if the integer is a power of two.
Definition intutils.c:549
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:615
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:27
QSC_EXPORT_API size_t qsc_intutils_next_power_of_2(size_t x)
Find the next power of two.
Definition intutils.c:554
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:457
QSC_EXPORT_API size_t qsc_intutils_bit_reverse(size_t x, uint32_t bits)
Reverse the bits of an integer.
Definition intutils.c:159
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:639
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:647
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:750
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:365
QSC_EXPORT_API double qsc_intutils_calculate_abs(double a)
Computes the absolute value of a double.
Definition intutils.c:203
QSC_EXPORT_API double qsc_intutils_calculate_fabs(double x)
Return the absolute value of a double.
Definition intutils.c:269
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:436
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:625
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:62
QSC_EXPORT_API size_t qsc_intutils_expand_mask(size_t x)
Expand an integer mask in constant time.
Definition intutils.c:475
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:568
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:102
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:10
QSC_EXPORT_API uint64_t qsc_intutils_bit_reverse_u64(uint64_t x)
Reverse the bits of a 64-bit integer.
Definition intutils.c:126
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:729
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:112
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:94
QSC_EXPORT_API bool qsc_intutils_are_equal(size_t x, size_t y)
Check if two integers are equal.
Definition intutils.c:5
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