QSC Post Quantum Cryptographic Library 1.1.0.2 (B2)
A post quantum secure library written in Ansi C
Loading...
Searching...
No Matches
sha3.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_SHA3_H
53#define QSC_SHA3_H
54
55#include "qsccommon.h"
56#if defined(QSC_SYSTEM_AVX_INTRINSICS)
57# include "intrinsics.h"
58#endif
59
60QSC_CPLUSPLUS_ENABLED_START
61
116
121#define QSC_KECCAK_CSHAKE_DOMAIN_ID 0x04U
122
127#define QSC_KECCAK_KMAC_DOMAIN_ID 0x04U
128
133#define QSC_KECCAK_KPA_DOMAIN_ID 0x41U
134
139#define QSC_KECCAK_PERMUTATION_ROUNDS 24U
140
145#define QSC_KECCAK_PERMUTATION_MAX_ROUNDS 48U
146
151#define QSC_KECCAK_PERMUTATION_MIN_ROUNDS 12U
152
157#define QSC_KECCAK_SHA3_DOMAIN_ID 0x06U
158
163#define QSC_KECCAK_SHAKE_DOMAIN_ID 0x1FU
164
169#define QSC_KECCAK_STATE_BYTE_SIZE 200U
170
175#define QSC_KECCAK_128_RATE 168U
176
181#define QSC_KECCAK_256_RATE 136U
182
187#define QSC_KECCAK_512_RATE 72U
188
193#define QSC_KECCAK_STATE_SIZE 25U
194
199#define QSC_KECCAK_STATE_BYTE_SIZE 200U
200
205#define QSC_KMAC_256_KEY_SIZE 32U
206
211#define QSC_KMAC_512_KEY_SIZE 64U
212
217#define QSC_KECCAK_SCBKDF_DOMAIN_ID 0x42U
218
223#define QSC_SHA3_128_HASH_SIZE 16U
224
229#define QSC_SHA3_256_HASH_SIZE 32U
230
235#define QSC_SHA3_512_HASH_SIZE 64U
236
241#define QSC_SHAKE_256_KEY_SIZE 32U
242
247#define QSC_SHAKE512_KEY_SIZE 64U
248
249/* common */
250
261
273
284QSC_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);
285
297QSC_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);
298
312QSC_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);
313
323
334QSC_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);
335
344QSC_EXPORT_API void qsc_keccak_incremental_absorb(qsc_keccak_state* ctx, uint32_t rate, const uint8_t* message, size_t msglen);
345
353QSC_EXPORT_API void qsc_keccak_incremental_finalize(qsc_keccak_state* ctx, uint32_t rate, uint8_t domain);
354
363QSC_EXPORT_API void qsc_keccak_incremental_squeeze(qsc_keccak_state* ctx, size_t rate, uint8_t* output, size_t outlen);
364
372QSC_EXPORT_API void qsc_keccak_permute(qsc_keccak_state* ctx, size_t rounds);
373
381QSC_EXPORT_API void qsc_keccak_permute_p1600c(uint64_t* state, size_t rounds);
382
389QSC_EXPORT_API void qsc_keccak_permute_p1600u(uint64_t* state);
390
402QSC_EXPORT_API void qsc_keccak_squeezeblocks(qsc_keccak_state* ctx, uint8_t* output, size_t nblocks, qsc_keccak_rate rate, size_t rounds);
403
411
423QSC_EXPORT_API void qsc_keccak_update(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* message, size_t msglen, size_t rounds);
424
425/* SHA3 */
426
437QSC_EXPORT_API void qsc_sha3_compute128(uint8_t* output, const uint8_t* message, size_t msglen);
438
449QSC_EXPORT_API void qsc_sha3_compute256(uint8_t* output, const uint8_t* message, size_t msglen);
450
461QSC_EXPORT_API void qsc_sha3_compute512(uint8_t* output, const uint8_t* message, size_t msglen);
462
477QSC_EXPORT_API void qsc_sha3_finalize(qsc_keccak_state* ctx, qsc_keccak_rate rate, uint8_t* output);
478
486
499QSC_EXPORT_API void qsc_sha3_update(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* message, size_t msglen);
500
501/* SHAKE */
502
514QSC_EXPORT_API void qsc_shake128_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen);
515
527QSC_EXPORT_API void qsc_shake256_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen);
528
540QSC_EXPORT_API void qsc_shake512_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen);
541
552QSC_EXPORT_API void qsc_shake_initialize(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* key, size_t keylen);
553
567QSC_EXPORT_API void qsc_shake_squeezeblocks(qsc_keccak_state* ctx, qsc_keccak_rate rate, uint8_t* output, size_t nblocks);
568
569/* cSHAKE */
570
585QSC_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);
586
601QSC_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);
602
617QSC_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);
618
633QSC_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);
634
648QSC_EXPORT_API void qsc_cshake_squeezeblocks(qsc_keccak_state* ctx, qsc_keccak_rate rate, uint8_t* output, size_t nblocks);
649
663QSC_EXPORT_API void qsc_cshake_update(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* key, size_t keylen);
664
665/* KMAC */
666
681QSC_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);
682
697QSC_EXPORT_API void qsc_kmac_xof128_compute(uint8_t* kout, size_t koutlen, const uint8_t* x, size_t xlen, const uint8_t* kin, size_t kinlen, const uint8_t* s, size_t slen);
698
713QSC_EXPORT_API void qsc_kmac_xof256_compute(uint8_t* kout, size_t koutlen, const uint8_t* x, size_t xlen, const uint8_t* kin, size_t kinlen, const uint8_t* s, size_t slen);
714
730QSC_EXPORT_API void qsc_kmac_xof512_compute(uint8_t* kout, size_t koutlen, const uint8_t* x, size_t xlen, const uint8_t* kin, size_t kinlen, const uint8_t* s, size_t slen);
731
746QSC_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);
747
762QSC_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);
763
775QSC_EXPORT_API void qsc_kmac_update(qsc_keccak_state* ctx, qsc_keccak_rate rate, const uint8_t* message, size_t msglen);
776
789QSC_EXPORT_API void qsc_kmac_finalize(qsc_keccak_state* ctx, qsc_keccak_rate rate, uint8_t* output, size_t outlen);
790
803QSC_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);
804
805/* parallel Keccak x4 */
806
807#if defined(QSC_SYSTEM_HAS_AVX2)
808
824void qsc_keccakx4_absorb(__m256i state[QSC_KECCAK_STATE_SIZE], qsc_keccak_rate rate,
825 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen, uint8_t domain);
826
841void qsc_keccakx4_squeezeblocks(__m256i state[QSC_KECCAK_STATE_SIZE], qsc_keccak_rate rate,
842 uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t nblocks);
843
844#endif
845
846/* parallel Keccak x8 */
847
848#if defined(QSC_SYSTEM_HAS_AVX512)
849
869void qsc_keccakx8_absorb(__m512i state[QSC_KECCAK_STATE_SIZE], qsc_keccak_rate rate,
870 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
871 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen, uint8_t domain);
872
887void qsc_keccakx8_squeezeblocks(__m512i state[QSC_KECCAK_STATE_SIZE], qsc_keccak_rate rate,
888 uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, uint8_t* out4,
889 uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t nblocks);
890
891#endif
892
893/* parallel SHAKE x4 */
894
912QSC_EXPORT_API void qsc_shake_128x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
913 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen);
914
932QSC_EXPORT_API void qsc_shake_256x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
933 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen);
934
952QSC_EXPORT_API void qsc_shake_512x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
953 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen);
954
955/* parallel shake x8 */
956
982QSC_EXPORT_API void qsc_shake_128x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
983 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
984 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
985 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen);
986
1012QSC_EXPORT_API void qsc_shake_256x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1013 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1014 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
1015 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen);
1016
1042QSC_EXPORT_API void qsc_shake_512x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1043 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1044 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
1045 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen);
1046
1047/* parallel kmac x4 */
1048
1076QSC_EXPORT_API void qsc_kmac_128x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
1077 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3, size_t keylen,
1078 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3, size_t cstlen,
1079 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3, size_t msglen);
1080
1108QSC_EXPORT_API void qsc_kmac_256x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
1109 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3, size_t keylen,
1110 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3, size_t cstlen,
1111 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3, size_t msglen);
1112
1140QSC_EXPORT_API void qsc_kmac_512x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
1141 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3, size_t keylen,
1142 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3, size_t cstlen,
1143 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3, size_t msglen);
1144
1145/* parallel KMAC x8 */
1146
1190QSC_EXPORT_API void qsc_kmac_128x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1191 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1192 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3,
1193 const uint8_t* key4, const uint8_t* key5, const uint8_t* key6, const uint8_t* key7, size_t keylen,
1194 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3,
1195 const uint8_t* cst4, const uint8_t* cst5, const uint8_t* cst6, const uint8_t* cst7, size_t cstlen,
1196 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3,
1197 const uint8_t* msg4, const uint8_t* msg5, const uint8_t* msg6, const uint8_t* msg7, size_t msglen);
1198
1242QSC_EXPORT_API void qsc_kmac_256x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1243 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1244 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3,
1245 const uint8_t* key4, const uint8_t* key5, const uint8_t* key6, const uint8_t* key7, size_t keylen,
1246 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3,
1247 const uint8_t* cst4, const uint8_t* cst5, const uint8_t* cst6, const uint8_t* cst7, size_t cstlen,
1248 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3,
1249 const uint8_t* msg4, const uint8_t* msg5, const uint8_t* msg6, const uint8_t* msg7, size_t msglen);
1250
1294QSC_EXPORT_API void qsc_kmac_512x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1295 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1296 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3,
1297 const uint8_t* key4, const uint8_t* key5, const uint8_t* key6, const uint8_t* key7, size_t keylen,
1298 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3,
1299 const uint8_t* cst4, const uint8_t* cst5, const uint8_t* cst6, const uint8_t* cst7, size_t cstlen,
1300 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3,
1301 const uint8_t* msg4, const uint8_t* msg5, const uint8_t* msg6, const uint8_t* msg7, size_t msglen);
1302
1303QSC_CPLUSPLUS_ENABLED_END
1304
1305#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 qsccommon.h:605
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:4035
QSC_EXPORT_API void qsc_kmac_xof256_compute(uint8_t *kout, size_t koutlen, const uint8_t *x, size_t xlen, const uint8_t *kin, size_t kinlen, const uint8_t *s, size_t slen)
Key a KMAC-256 XOF instance and generate an output key. Short form api: processes the keyin,...
Definition sha3.c:4090
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:4061
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:1018
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:4456
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:3762
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:1427
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:4048
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:923
qsc_keccak_rate
The Keccak rate; determines which security strength is used by the function, 128, 256,...
Definition sha3.h:267
@ qsc_keccak_rate_256
Definition sha3.h:270
@ qsc_keccak_rate_128
Definition sha3.h:269
@ qsc_keccak_rate_512
Definition sha3.h:271
@ qsc_keccak_rate_none
Definition sha3.h:268
QSC_EXPORT_API void qsc_keccak_dispose(qsc_keccak_state *ctx)
Dispose of the Keccak state.
Definition sha3.c:865
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:3794
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:1110
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:4396
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:3662
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:3824
#define QSC_KECCAK_STATE_SIZE
The Keccak SHA3 uint64 state array size.
Definition sha3.h:193
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:5021
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:4663
#define QSC_KECCAK_STATE_BYTE_SIZE
The Keccak state array byte size.
Definition sha3.h:169
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:4066
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:5524
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:3747
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:5378
QSC_EXPORT_API void qsc_kmac_xof512_compute(uint8_t *kout, size_t koutlen, const uint8_t *x, size_t xlen, const uint8_t *kin, size_t kinlen, const uint8_t *s, size_t slen)
Key a KMAC-512 XOF instance and generate an output key. The KMAC XOF as specified in SP800-108r1....
Definition sha3.c:4095
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:1096
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:690
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:3732
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:3889
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:5107
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:1001
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:735
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:3637
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:3995
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:4750
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:4000
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:3674
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:5451
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:3717
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:4077
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:3983
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:4576
QSC_EXPORT_API void qsc_kmac_xof128_compute(uint8_t *kout, size_t koutlen, const uint8_t *x, size_t xlen, const uint8_t *kin, size_t kinlen, const uint8_t *s, size_t slen)
Key a KMAC-128 XOF instance and generate an output key. Short form api: processes the keyin,...
Definition sha3.c:4085
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:3920
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:3801
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:5064
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:3847
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:877
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:3952
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:3879
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:3789
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:3870
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:4515
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:4022
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:785
The Keccak state array; state array must be initialized by the caller.
Definition sha3.h:256
uint64_t state[QSC_KECCAK_STATE_SIZE]
Definition sha3.h:257
size_t position
Definition sha3.h:259
uint8_t buffer[QSC_KECCAK_STATE_BYTE_SIZE]
Definition sha3.h:258