QSC Post Quantum Cryptographic Library 1.0.0.6c (A6)
A post quantum secure library written in Ansi C
 
Loading...
Searching...
No Matches
sha3.h
Go to the documentation of this file.
1/* 2025 Quantum Resistant Cryptographic Solutions Corporation
2 * All Rights Reserved.
3 *
4 * NOTICE: This software and all accompanying materials are the exclusive
5 * property of Quantum Resistant Cryptographic Solutions Corporation (QRCS).
6 * The intellectual and technical concepts contained within this implementation
7 * are proprietary to QRCS and its authorized licensors and are protected under
8 * applicable U.S. and international copyright, patent, and trade secret laws.
9 *
10 * CRYPTOGRAPHIC STANDARDS:
11 * - This software includes implementations of cryptographic algorithms such as
12 * SHA3, AES, and others. These algorithms are public domain or standardized
13 * by organizations such as NIST and are NOT the property of QRCS.
14 * - However, all source code, optimizations, and implementations in this library
15 * are original works of QRCS and are protected under this license.
16 *
17 * RESTRICTIONS:
18 * - Redistribution, modification, or unauthorized distribution of this software,
19 * in whole or in part, is strictly prohibited.
20 * - This software is provided for non-commercial, educational, and research
21 * purposes only. Commercial use in any form is expressly forbidden.
22 * - Licensing and authorized distribution are solely at the discretion of QRCS.
23 * - Any use of this software implies acceptance of these restrictions.
24 *
25 * DISCLAIMER:
26 * This software is provided "as is," without warranty of any kind, express or
27 * implied, including but not limited to warranties of merchantability or fitness
28 * for a particular purpose. QRCS disclaims all liability for any direct, indirect,
29 * incidental, or consequential damages resulting from the use or misuse of this software.
30 *
31 * FULL LICENSE:
32 * This software is subject to the **Quantum Resistant Cryptographic Solutions
33 * Proprietary License (QRCS-PL)**. The complete license terms are included
34 * in the LICENSE.txt file distributed with this software.
35 *
36 * Written by: John G. Underhill
37 * Contact: john.underhill@protonmail.com
38 */
39
40#ifndef QSC_SHA3_H
41#define QSC_SHA3_H
42
43#include "common.h"
44#if defined(QSC_SYSTEM_AVX_INTRINSICS)
45# include "intrinsics.h"
46#endif
47
48QSC_CPLUSPLUS_ENABLED_START
49
100
105#define QSC_KECCAK_CSHAKE_DOMAIN_ID 0x04U
106
111#define QSC_KECCAK_KMAC_DOMAIN_ID 0x04U
112
117#define QSC_KECCAK_KPA_DOMAIN_ID 0x41U
118
123#define QSC_KECCAK_PERMUTATION_ROUNDS 24ULL
124
129#define QSC_KECCAK_PERMUTATION_MAX_ROUNDS 48ULL
130
135#define QSC_KECCAK_PERMUTATION_MIN_ROUNDS 12ULL
136
141#define QSC_KECCAK_SHA3_DOMAIN_ID 0x06U
142
147#define QSC_KECCAK_SHAKE_DOMAIN_ID 0x1FU
148
153#define QSC_KECCAK_STATE_BYTE_SIZE 200ULL
154
159#define QSC_KECCAK_128_RATE 168ULL
160
165#define QSC_KECCAK_256_RATE 136ULL
166
171#define QSC_KECCAK_512_RATE 72ULL
172
177#define QSC_KECCAK_STATE_SIZE 25ULL
178
183#define QSC_KECCAK_STATE_BYTE_SIZE 200ULL
184
189#define QSC_KMAC_256_KEY_SIZE 32ULL
190
195#define QSC_KMAC_512_KEY_SIZE 64ULL
196
201#define QSC_KECCAK_SCBKDF_DOMAIN_ID 0x42U
202
207#define QSC_SHA3_128_HASH_SIZE 16ULL
208
213#define QSC_SHA3_256_HASH_SIZE 32ULL
214
219#define QSC_SHA3_512_HASH_SIZE 64ULL
220
225#define QSC_SHAKE_256_KEY_SIZE 32ULL
226
231#define QSC_SHAKE512_KEY_SIZE 64ULL
232
233/* common */
234
245
257
268QSC_EXPORT_API void qsc_keccak_absorb(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* message, size_t msglen, uint8_t domain, size_t rounds);
269
281QSC_EXPORT_API void qsc_keccak_absorb_custom(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* custom, size_t custlen, const uint8_t* name, size_t namelen, size_t rounds);
282
296QSC_EXPORT_API void qsc_keccak_absorb_key_custom(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* key, size_t keylen, const uint8_t* custom, size_t custlen, const uint8_t* name, size_t namelen, size_t rounds);
297
307
318QSC_EXPORT_API void qsc_keccak_finalize(qsc_keccak_state* ctx, qsc_keccak_rate rate, uint8_t* output, size_t outlen, uint8_t domain, size_t rounds);
319
328QSC_EXPORT_API void qsc_keccak_incremental_absorb(qsc_keccak_state* ctx, uint32_t rate, const uint8_t* message, size_t msglen);
329
337QSC_EXPORT_API void qsc_keccak_incremental_finalize(qsc_keccak_state* ctx, uint32_t rate, uint8_t domain);
338
347QSC_EXPORT_API void qsc_keccak_incremental_squeeze(qsc_keccak_state* ctx, size_t rate, uint8_t* output, size_t outlen);
348
356QSC_EXPORT_API void qsc_keccak_permute(qsc_keccak_state* ctx, size_t rounds);
357
365QSC_EXPORT_API void qsc_keccak_permute_p1600c(uint64_t* state, size_t rounds);
366
373QSC_EXPORT_API void qsc_keccak_permute_p1600u(uint64_t* state);
374
386QSC_EXPORT_API void qsc_keccak_squeezeblocks(qsc_keccak_state* ctx, uint8_t* output, size_t nblocks, qsc_keccak_rate rate, size_t rounds);
387
395
407QSC_EXPORT_API void qsc_keccak_update(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* message, size_t msglen, size_t rounds);
408
409/* SHA3 */
410
421QSC_EXPORT_API void qsc_sha3_compute128(uint8_t* output, const uint8_t* message, size_t msglen);
422
433QSC_EXPORT_API void qsc_sha3_compute256(uint8_t* output, const uint8_t* message, size_t msglen);
434
445QSC_EXPORT_API void qsc_sha3_compute512(uint8_t* output, const uint8_t* message, size_t msglen);
446
461QSC_EXPORT_API void qsc_sha3_finalize(qsc_keccak_state* ctx, qsc_keccak_rate rate, uint8_t* output);
462
470
483QSC_EXPORT_API void qsc_sha3_update(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* message, size_t msglen);
484
485/* SHAKE */
486
498QSC_EXPORT_API void qsc_shake128_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen);
499
511QSC_EXPORT_API void qsc_shake256_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen);
512
524QSC_EXPORT_API void qsc_shake512_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen);
525
536QSC_EXPORT_API void qsc_shake_initialize(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* key, size_t keylen);
537
551QSC_EXPORT_API void qsc_shake_squeezeblocks(qsc_keccak_state* ctx, qsc_keccak_rate rate, uint8_t* output, size_t nblocks);
552
553/* cSHAKE */
554
569QSC_EXPORT_API void qsc_cshake128_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen, const uint8_t* name, size_t namelen, const uint8_t* custom, size_t custlen);
570
585QSC_EXPORT_API void qsc_cshake256_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen, const uint8_t* name, size_t namelen, const uint8_t* custom, size_t custlen);
586
601QSC_EXPORT_API void qsc_cshake512_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen, const uint8_t* name, size_t namelen, const uint8_t* custom, size_t custlen);
602
617QSC_EXPORT_API void qsc_cshake_initialize(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* key, size_t keylen, const uint8_t* name, size_t namelen, const uint8_t* custom, size_t custlen);
618
632QSC_EXPORT_API void qsc_cshake_squeezeblocks(qsc_keccak_state* ctx, qsc_keccak_rate rate, uint8_t* output, size_t nblocks);
633
647QSC_EXPORT_API void qsc_cshake_update(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* key, size_t keylen);
648
649/* KMAC */
650
665QSC_EXPORT_API void qsc_kmac128_compute(uint8_t* output, size_t outlen, const uint8_t* message, size_t msglen, const uint8_t* key, size_t keylen, const uint8_t* custom, size_t custlen);
666
681QSC_EXPORT_API void qsc_kmac256_compute(uint8_t* output, size_t outlen, const uint8_t* message, size_t msglen, const uint8_t* key, size_t keylen, const uint8_t* custom, size_t custlen);
682
697QSC_EXPORT_API void qsc_kmac512_compute(uint8_t* output, size_t outlen, const uint8_t* message, size_t msglen, const uint8_t* key, size_t keylen, const uint8_t* custom, size_t custlen);
698
710QSC_EXPORT_API void qsc_kmac_update(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* message, size_t msglen);
711
724QSC_EXPORT_API void qsc_kmac_finalize(qsc_keccak_state* ctx, qsc_keccak_rate rate, uint8_t* output, size_t outlen);
725
738QSC_EXPORT_API void qsc_kmac_initialize(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* key, size_t keylen, const uint8_t* custom, size_t custlen);
739
740/* KPA - Keccak-based Parallel Authentication */
741
742#if defined(QSC_SYSTEM_HAS_AVX512) || defined(QSC_SYSTEM_HAS_AVX2)
743#define QSC_KPA_AVX_PARALLEL
744#endif
745
750#define QSC_KPA_128_KEY_SIZE 16ULL
751
756#define QSC_KPA_256_KEY_SIZE 32ULL
757
762#define QSC_KPA_512_KEY_SIZE 64ULL
763
768#define QSC_KPA_ROUNDS 12ULL
769
774#define QSC_KPA_PARALLELISM 8ULL
775
780QSC_EXPORT_API typedef struct
781{
782#if defined(QSC_SYSTEM_HAS_AVX512)
783 __m512i statew[QSC_KECCAK_STATE_SIZE];
784#elif defined(QSC_SYSTEM_HAS_AVX2)
785 __m256i statew[2][QSC_KECCAK_STATE_SIZE];
786#endif
789 size_t position;
790 size_t processed;
793
805QSC_EXPORT_API void qsc_kpa_finalize(qsc_kpa_state* ctx, uint8_t* output, size_t outlen);
806
818QSC_EXPORT_API void qsc_kpa_initialize(qsc_kpa_state* ctx, const uint8_t* key, size_t keylen, const uint8_t* custom, size_t custlen);
819
830QSC_EXPORT_API void qsc_kpa_update(qsc_kpa_state* ctx, const uint8_t* message, size_t msglen);
831
841
842/* parallel Keccak x4 */
843
844#if defined(QSC_SYSTEM_HAS_AVX2)
845
861void qsc_keccakx4_absorb(__m256i state[QSC_KECCAK_STATE_SIZE], qsc_keccak_rate rate,
862 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen, uint8_t domain);
863
880void qsc_keccakx4_absorb_aligned(__m256i state[QSC_KECCAK_STATE_SIZE], qsc_keccak_rate rate,
881 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen, uint8_t domain);
882
897void qsc_keccakx4_squeezeblocks(__m256i state[QSC_KECCAK_STATE_SIZE], qsc_keccak_rate rate,
898 uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t nblocks);
899
900#endif
901
902/* parallel Keccak x8 */
903
904#if defined(QSC_SYSTEM_HAS_AVX512)
905
925void qsc_keccakx8_absorb(__m512i state[QSC_KECCAK_STATE_SIZE], qsc_keccak_rate rate,
926 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
927 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen, uint8_t domain);
928
949void qsc_keccakx8_absorb_aligned(__m512i state[QSC_KECCAK_STATE_SIZE], qsc_keccak_rate rate,
950 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
951 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen, uint8_t domain);
952
967void qsc_keccakx8_squeezeblocks(__m512i state[QSC_KECCAK_STATE_SIZE], qsc_keccak_rate rate,
968 uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, uint8_t* out4,
969 uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t nblocks);
970
971#endif
972
973/* parallel SHAKE x4 */
974
992QSC_EXPORT_API void qsc_shake_128x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
993 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen);
994
1012QSC_EXPORT_API void qsc_shake_256x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
1013 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen);
1014
1032QSC_EXPORT_API void qsc_shake_512x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
1033 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen);
1034
1035/* parallel shake x8 */
1036
1062QSC_EXPORT_API void qsc_shake_128x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1063 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1064 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
1065 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen);
1066
1092QSC_EXPORT_API void qsc_shake_256x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1093 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1094 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
1095 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen);
1096
1122QSC_EXPORT_API void qsc_shake_512x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1123 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1124 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
1125 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen);
1126
1127/* parallel kmac x4 */
1128
1156QSC_EXPORT_API void qsc_kmac_128x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
1157 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3, size_t keylen,
1158 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3, size_t cstlen,
1159 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3, size_t msglen);
1160
1188QSC_EXPORT_API void qsc_kmac_256x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
1189 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3, size_t keylen,
1190 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3, size_t cstlen,
1191 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3, size_t msglen);
1192
1220QSC_EXPORT_API void qsc_kmac_512x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
1221 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3, size_t keylen,
1222 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3, size_t cstlen,
1223 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3, size_t msglen);
1224
1225/* parallel KMAC x8 */
1226
1270QSC_EXPORT_API void qsc_kmac_128x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1271 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1272 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3,
1273 const uint8_t* key4, const uint8_t* key5, const uint8_t* key6, const uint8_t* key7, size_t keylen,
1274 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3,
1275 const uint8_t* cst4, const uint8_t* cst5, const uint8_t* cst6, const uint8_t* cst7, size_t cstlen,
1276 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3,
1277 const uint8_t* msg4, const uint8_t* msg5, const uint8_t* msg6, const uint8_t* msg7, size_t msglen);
1278
1322QSC_EXPORT_API void qsc_kmac_256x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1323 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1324 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3,
1325 const uint8_t* key4, const uint8_t* key5, const uint8_t* key6, const uint8_t* key7, size_t keylen,
1326 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3,
1327 const uint8_t* cst4, const uint8_t* cst5, const uint8_t* cst6, const uint8_t* cst7, size_t cstlen,
1328 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3,
1329 const uint8_t* msg4, const uint8_t* msg5, const uint8_t* msg6, const uint8_t* msg7, size_t msglen);
1330
1374QSC_EXPORT_API void qsc_kmac_512x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1375 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1376 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3,
1377 const uint8_t* key4, const uint8_t* key5, const uint8_t* key6, const uint8_t* key7, size_t keylen,
1378 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3,
1379 const uint8_t* cst4, const uint8_t* cst5, const uint8_t* cst6, const uint8_t* cst7, size_t cstlen,
1380 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3,
1381 const uint8_t* msg4, const uint8_t* msg5, const uint8_t* msg6, const uint8_t* msg7, size_t msglen);
1382
1383QSC_CPLUSPLUS_ENABLED_END
1384
1385#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 void qsc_kmac256_compute(uint8_t *output, size_t outlen, const uint8_t *message, size_t msglen, const uint8_t *key, size_t keylen, const uint8_t *custom, size_t custlen)
Key a KMAC-256 instance and generate a MAC code. Short form api: processes the key and custom inputs ...
Definition sha3.c:4417
QSC_EXPORT_API void qsc_kmac_finalize(qsc_keccak_state *ctx, qsc_keccak_rate rate, uint8_t *output, size_t outlen)
The KMAC finalize function. Long form api: must be used in conjunction with the initialize and blocku...
Definition sha3.c:4443
QSC_EXPORT_API void qsc_keccak_incremental_squeeze(qsc_keccak_state *ctx, size_t rate, uint8_t *output, size_t outlen)
Extract an array of bytes from the Keccak state.
Definition sha3.c:1409
QSC_EXPORT_API void qsc_shake_256x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *inp0, const uint8_t *inp1, const uint8_t *inp2, const uint8_t *inp3, size_t inplen)
Process 4 SHAKE-256 instances simultaneously using SIMD instructions.
Definition sha3.c:5519
QSC_EXPORT_API void qsc_sha3_finalize(qsc_keccak_state *ctx, qsc_keccak_rate rate, uint8_t *output)
Finalize the message state and returns the hash value in output. Long form api: must be used in conju...
Definition sha3.c:4144
QSC_EXPORT_API void qsc_keccak_permute_p1600u(uint64_t *state)
The unrolled Keccak permute function. Internal function: Permutes the state array,...
Definition sha3.c:1812
QSC_EXPORT_API void qsc_kmac512_compute(uint8_t *output, size_t outlen, const uint8_t *message, size_t msglen, const uint8_t *key, size_t keylen, const uint8_t *custom, size_t custlen)
Key a KMAC-512 instance and generate a MAC code. Short form api: processes the key and custom inputs ...
Definition sha3.c:4430
QSC_EXPORT_API void qsc_keccak_incremental_absorb(qsc_keccak_state *ctx, uint32_t rate, const uint8_t *message, size_t msglen)
Absorb bytes into state incrementally.
Definition sha3.c:1320
qsc_keccak_rate
The Keccak rate; determines which security strength is used by the function, 128, 256,...
Definition sha3.h:251
@ qsc_keccak_rate_256
Definition sha3.h:254
@ qsc_keccak_rate_128
Definition sha3.h:253
@ qsc_keccak_rate_512
Definition sha3.h:255
@ qsc_keccak_rate_none
Definition sha3.h:252
QSC_EXPORT_API void qsc_keccak_dispose(qsc_keccak_state *ctx)
Dispose of the Keccak state.
Definition sha3.c:1265
QSC_EXPORT_API void qsc_kpa_dispose(qsc_kpa_state *ctx)
Dispose of the KPA state.
Definition sha3.c:4697
QSC_EXPORT_API void qsc_sha3_update(qsc_keccak_state *ctx, qsc_keccak_rate rate, const uint8_t *message, size_t msglen)
Update SHA3 with message input. Long form api: must be used in conjunction with the initialize and fi...
Definition sha3.c:4176
QSC_EXPORT_API void qsc_keccak_permute_p1600c(uint64_t *state, size_t rounds)
The compact Keccak permute function. Internal function: Permutes the state array, can be used in exte...
Definition sha3.c:1498
QSC_EXPORT_API void qsc_shake_128x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *inp0, const uint8_t *inp1, const uint8_t *inp2, const uint8_t *inp3, size_t inplen)
Process 4 SHAKE-128 instances simultaneously using SIMD instructions.
Definition sha3.c:5462
QSC_EXPORT_API void qsc_keccak_initialize_state(qsc_keccak_state *ctx)
Initializes a Keccak state structure, must be called before message processing. Long form api: must b...
Definition sha3.c:4044
QSC_EXPORT_API void qsc_shake256_compute(uint8_t *output, size_t outlen, const uint8_t *key, size_t keylen)
Key a SHAKE-256 instance, and generate an array of pseudo-random bytes. Short form api: processes the...
Definition sha3.c:4206
#define QSC_KECCAK_STATE_SIZE
The Keccak SHA3 uint64 state array size.
Definition sha3.h:177
QSC_EXPORT_API void qsc_kmac_128x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *key0, const uint8_t *key1, const uint8_t *key2, const uint8_t *key3, size_t keylen, const uint8_t *cst0, const uint8_t *cst1, const uint8_t *cst2, const uint8_t *cst3, size_t cstlen, const uint8_t *msg0, const uint8_t *msg1, const uint8_t *msg2, const uint8_t *msg3, size_t msglen)
Process 4 KMAC-128 instances simultaneously using SIMD instructions.
Definition sha3.c:6066
QSC_EXPORT_API void qsc_shake_256x8(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, uint8_t *out4, uint8_t *out5, uint8_t *out6, uint8_t *out7, size_t outlen, const uint8_t *inp0, const uint8_t *inp1, const uint8_t *inp2, const uint8_t *inp3, const uint8_t *inp4, const uint8_t *inp5, const uint8_t *inp6, const uint8_t *inp7, size_t inplen)
Process 8 SHAKE-256 instances simultaneously using SIMD instructions.
Definition sha3.c:5716
#define QSC_KECCAK_STATE_BYTE_SIZE
The Keccak state array byte size.
Definition sha3.h:153
QSC_EXPORT_API void qsc_kpa_update(qsc_kpa_state *ctx, const uint8_t *message, size_t msglen)
The KPA message update function. Long form api: must be used in conjunction with the initialize and f...
Definition sha3.c:4942
QSC_EXPORT_API void qsc_kmac_initialize(qsc_keccak_state *ctx, qsc_keccak_rate rate, const uint8_t *key, size_t keylen, const uint8_t *custom, size_t custlen)
Initialize a KMAC instance. Long form api: must be used in conjunction with the blockupdate and final...
Definition sha3.c:4448
QSC_EXPORT_API void qsc_kmac_512x8(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, uint8_t *out4, uint8_t *out5, uint8_t *out6, uint8_t *out7, size_t outlen, const uint8_t *key0, const uint8_t *key1, const uint8_t *key2, const uint8_t *key3, const uint8_t *key4, const uint8_t *key5, const uint8_t *key6, const uint8_t *key7, size_t keylen, const uint8_t *cst0, const uint8_t *cst1, const uint8_t *cst2, const uint8_t *cst3, const uint8_t *cst4, const uint8_t *cst5, const uint8_t *cst6, const uint8_t *cst7, size_t cstlen, const uint8_t *msg0, const uint8_t *msg1, const uint8_t *msg2, const uint8_t *msg3, const uint8_t *msg4, const uint8_t *msg5, const uint8_t *msg6, const uint8_t *msg7, size_t msglen)
Process 8 KMAC-512 instances simultaneously using SIMD instructions.
Definition sha3.c:6547
QSC_EXPORT_API void qsc_sha3_compute512(uint8_t *output, const uint8_t *message, size_t msglen)
Process a message with SHA3-512 and return the hash code in the output byte array....
Definition sha3.c:4129
QSC_EXPORT_API void qsc_kmac_128x8(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, uint8_t *out4, uint8_t *out5, uint8_t *out6, uint8_t *out7, size_t outlen, const uint8_t *key0, const uint8_t *key1, const uint8_t *key2, const uint8_t *key3, const uint8_t *key4, const uint8_t *key5, const uint8_t *key6, const uint8_t *key7, size_t keylen, const uint8_t *cst0, const uint8_t *cst1, const uint8_t *cst2, const uint8_t *cst3, const uint8_t *cst4, const uint8_t *cst5, const uint8_t *cst6, const uint8_t *cst7, size_t cstlen, const uint8_t *msg0, const uint8_t *msg1, const uint8_t *msg2, const uint8_t *msg3, const uint8_t *msg4, const uint8_t *msg5, const uint8_t *msg6, const uint8_t *msg7, size_t msglen)
Process 8 KMAC-128 instances simultaneously using SIMD instructions.
Definition sha3.c:6411
QSC_EXPORT_API void qsc_keccak_permute(qsc_keccak_state *ctx, size_t rounds)
The Keccak permute function. Internal function: Permutes the state array, can be used in external con...
Definition sha3.c:1484
QSC_EXPORT_API void qsc_keccak_absorb(qsc_keccak_state *ctx, qsc_keccak_rate rate, const uint8_t *message, size_t msglen, uint8_t domain, size_t rounds)
Absorb an input message into the Keccak state.
Definition sha3.c:1098
QSC_EXPORT_API void qsc_sha3_compute256(uint8_t *output, const uint8_t *message, size_t msglen)
Process a message with SHA3-256 and return the hash code in the output byte array....
Definition sha3.c:4114
QSC_EXPORT_API void qsc_cshake128_compute(uint8_t *output, size_t outlen, const uint8_t *key, size_t keylen, const uint8_t *name, size_t namelen, const uint8_t *custom, size_t custlen)
Key a cSHAKE-128 instance and generate pseudo-random output. Short form api: processes the key,...
Definition sha3.c:4271
QSC_EXPORT_API void qsc_kmac_512x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *key0, const uint8_t *key1, const uint8_t *key2, const uint8_t *key3, size_t keylen, const uint8_t *cst0, const uint8_t *cst1, const uint8_t *cst2, const uint8_t *cst3, size_t cstlen, const uint8_t *msg0, const uint8_t *msg1, const uint8_t *msg2, const uint8_t *msg3, size_t msglen)
Process 4 KMAC-512 instances simultaneously using SIMD instructions.
Definition sha3.c:6144
QSC_EXPORT_API void qsc_kpa_initialize(qsc_kpa_state *ctx, const uint8_t *key, size_t keylen, const uint8_t *custom, size_t custlen)
Initialize a KPA instance. Long form api: must be used in conjunction with the blockupdate and finali...
Definition sha3.c:4794
QSC_EXPORT_API void qsc_keccak_incremental_finalize(qsc_keccak_state *ctx, uint32_t rate, uint8_t domain)
Finalize state added incrementally.
Definition sha3.c:1395
QSC_EXPORT_API void qsc_keccak_absorb_custom(qsc_keccak_state *ctx, qsc_keccak_rate rate, const uint8_t *custom, size_t custlen, const uint8_t *name, size_t namelen, size_t rounds)
Absorb the custom, and name arrays into the Keccak state.
Definition sha3.c:1138
QSC_EXPORT_API void qsc_keccak_squeezeblocks(qsc_keccak_state *ctx, uint8_t *output, size_t nblocks, qsc_keccak_rate rate, size_t rounds)
The Keccak squeeze function.
Definition sha3.c:4019
QSC_EXPORT_API void qsc_cshake_squeezeblocks(qsc_keccak_state *ctx, qsc_keccak_rate rate, uint8_t *output, size_t nblocks)
The cSHAKE squeeze function. Long form api: must be used in conjunction with the initialize function....
Definition sha3.c:4377
QSC_EXPORT_API void qsc_shake_512x8(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, uint8_t *out4, uint8_t *out5, uint8_t *out6, uint8_t *out7, size_t outlen, const uint8_t *inp0, const uint8_t *inp1, const uint8_t *inp2, const uint8_t *inp3, const uint8_t *inp4, const uint8_t *inp5, const uint8_t *inp6, const uint8_t *inp7, size_t inplen)
Process 8 SHAKE-512 instances simultaneously using SIMD instructions.
Definition sha3.c:5799
QSC_EXPORT_API void qsc_cshake_update(qsc_keccak_state *ctx, qsc_keccak_rate rate, const uint8_t *key, size_t keylen)
The cSHAKE update function. Long form api: must be used in conjunction with the initialize and squeez...
Definition sha3.c:4382
QSC_EXPORT_API void qsc_keccak_update(qsc_keccak_state *ctx, qsc_keccak_rate rate, const uint8_t *message, size_t msglen, size_t rounds)
Update Keccak state with message input.
Definition sha3.c:4056
QSC_EXPORT_API void qsc_kmac_256x8(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, uint8_t *out4, uint8_t *out5, uint8_t *out6, uint8_t *out7, size_t outlen, const uint8_t *key0, const uint8_t *key1, const uint8_t *key2, const uint8_t *key3, const uint8_t *key4, const uint8_t *key5, const uint8_t *key6, const uint8_t *key7, size_t keylen, const uint8_t *cst0, const uint8_t *cst1, const uint8_t *cst2, const uint8_t *cst3, const uint8_t *cst4, const uint8_t *cst5, const uint8_t *cst6, const uint8_t *cst7, size_t cstlen, const uint8_t *msg0, const uint8_t *msg1, const uint8_t *msg2, const uint8_t *msg3, const uint8_t *msg4, const uint8_t *msg5, const uint8_t *msg6, const uint8_t *msg7, size_t msglen)
Process 8 KMAC-256 instances simultaneously using SIMD instructions.
Definition sha3.c:6479
QSC_EXPORT_API void qsc_sha3_compute128(uint8_t *output, const uint8_t *message, size_t msglen)
Process a message with SHA3-128 and return the hash code in the output byte array....
Definition sha3.c:4099
QSC_EXPORT_API void qsc_kmac_update(qsc_keccak_state *ctx, qsc_keccak_rate rate, const uint8_t *message, size_t msglen)
The KMAC message update function. Long form api: must be used in conjunction with the initialize and ...
Definition sha3.c:4458
QSC_EXPORT_API void qsc_cshake_initialize(qsc_keccak_state *ctx, qsc_keccak_rate rate, const uint8_t *key, size_t keylen, const uint8_t *name, size_t namelen, const uint8_t *custom, size_t custlen)
The cSHAKE initialize function. Long form api: must be used in conjunction with the squeezeblocks fun...
Definition sha3.c:4365
QSC_EXPORT_API void qsc_shake_128x8(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, uint8_t *out4, uint8_t *out5, uint8_t *out6, uint8_t *out7, size_t outlen, const uint8_t *inp0, const uint8_t *inp1, const uint8_t *inp2, const uint8_t *inp3, const uint8_t *inp4, const uint8_t *inp5, const uint8_t *inp6, const uint8_t *inp7, size_t inplen)
Process 8 SHAKE-128 instances simultaneously using SIMD instructions.
Definition sha3.c:5633
QSC_EXPORT_API void qsc_cshake256_compute(uint8_t *output, size_t outlen, const uint8_t *key, size_t keylen, const uint8_t *name, size_t namelen, const uint8_t *custom, size_t custlen)
Key a cSHAKE-256 instance and generate pseudo-random output. Short form api: processes the key,...
Definition sha3.c:4302
QSC_EXPORT_API void qsc_shake128_compute(uint8_t *output, size_t outlen, const uint8_t *key, size_t keylen)
Key a SHAKE-128 instance, and generate an array of pseudo-random bytes. Short form api: processes the...
Definition sha3.c:4183
QSC_EXPORT_API void qsc_kmac_256x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *key0, const uint8_t *key1, const uint8_t *key2, const uint8_t *key3, size_t keylen, const uint8_t *cst0, const uint8_t *cst1, const uint8_t *cst2, const uint8_t *cst3, size_t cstlen, const uint8_t *msg0, const uint8_t *msg1, const uint8_t *msg2, const uint8_t *msg3, size_t msglen)
Process 4 KMAC-256 instances simultaneously using SIMD instructions.
Definition sha3.c:6105
QSC_EXPORT_API void qsc_shake512_compute(uint8_t *output, size_t outlen, const uint8_t *key, size_t keylen)
Key a SHAKE-512 instance, and generate an array of pseudo-random bytes. Short form api: processes the...
Definition sha3.c:4229
QSC_EXPORT_API void qsc_keccak_finalize(qsc_keccak_state *ctx, qsc_keccak_rate rate, uint8_t *output, size_t outlen, uint8_t domain, size_t rounds)
Finalize the Keccak state.
Definition sha3.c:1277
QSC_EXPORT_API void qsc_cshake512_compute(uint8_t *output, size_t outlen, const uint8_t *key, size_t keylen, const uint8_t *name, size_t namelen, const uint8_t *custom, size_t custlen)
Key a cSHAKE-512 instance and generate pseudo-random output. Short form api: processes the key,...
Definition sha3.c:4334
QSC_EXPORT_API void qsc_shake_squeezeblocks(qsc_keccak_state *ctx, qsc_keccak_rate rate, uint8_t *output, size_t nblocks)
The SHAKE squeeze function. Long form api: must be used in conjunction with the initialize function....
Definition sha3.c:4261
QSC_EXPORT_API void qsc_kpa_finalize(qsc_kpa_state *ctx, uint8_t *output, size_t outlen)
The KPA finalize function. Long form api: must be used in conjunction with the initialize and blockup...
Definition sha3.c:4715
QSC_EXPORT_API void qsc_sha3_initialize(qsc_keccak_state *ctx)
Initialize the SHA3 state Long form api: Must be called before the update or finalize functions are c...
Definition sha3.c:4171
QSC_EXPORT_API void qsc_shake_initialize(qsc_keccak_state *ctx, qsc_keccak_rate rate, const uint8_t *key, size_t keylen)
The SHAKE initialize function. Long form api: must be used in conjunction with the squeezeblocks func...
Definition sha3.c:4252
QSC_EXPORT_API void qsc_shake_512x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *inp0, const uint8_t *inp1, const uint8_t *inp2, const uint8_t *inp3, size_t inplen)
Process 4 SHAKE-512 instances simultaneously using SIMD instructions.
Definition sha3.c:5575
QSC_EXPORT_API void qsc_kmac128_compute(uint8_t *output, size_t outlen, const uint8_t *message, size_t msglen, const uint8_t *key, size_t keylen, const uint8_t *custom, size_t custlen)
Key a KMAC-128 instance and generate a MAC code. Short form api: processes the key and custom inputs ...
Definition sha3.c:4404
#define QSC_KPA_PARALLELISM
The KPA degree of parallelization.
Definition sha3.h:774
QSC_EXPORT_API void qsc_keccak_absorb_key_custom(qsc_keccak_state *ctx, qsc_keccak_rate rate, const uint8_t *key, size_t keylen, const uint8_t *custom, size_t custlen, const uint8_t *name, size_t namelen, size_t rounds)
Absorb the custom, name, and key arrays into the Keccak state.
Definition sha3.c:1188
The Keccak state array; state array must be initialized by the caller.
Definition sha3.h:240
uint64_t state[QSC_KECCAK_STATE_SIZE]
Definition sha3.h:241
size_t position
Definition sha3.h:243
uint8_t buffer[QSC_KECCAK_STATE_BYTE_SIZE]
Definition sha3.h:242
The KPA state array; state array must be initialized by the caller.
Definition sha3.h:781
uint64_t state[QSC_KPA_PARALLELISM][QSC_KECCAK_STATE_SIZE]
Definition sha3.h:787
size_t processed
Definition sha3.h:790
size_t position
Definition sha3.h:789
uint8_t buffer[QSC_KPA_PARALLELISM *QSC_KECCAK_STATE_BYTE_SIZE]
Definition sha3.h:788
qsc_keccak_rate rate
Definition sha3.h:791