HKDS: Heirarchal Key Derivation System 1.0.0.2 (A2)
A fast post-quantum secure replacement for DUKPT
keccak.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 HKDS_KECCAK_H
41#define HKDS_KECCAK_H
42
43#include "common.h"
44#include "hkds_config.h"
45
119
124#define HKDS_KECCAK_CSHAKE_DOMAIN_ID 0x04
125
130#define HKDS_KECCAK_KMAC_DOMAIN_ID 0x04
131
136#define HKDS_KECCAK_KPA_DOMAIN_ID 0x41
137
142#if defined(HKDS_KECCAK_HALF_ROUNDS)
143# define HKDS_KECCAK_PERMUTATION_ROUNDS 12
144#elif defined(HKDS_KECCAK_DOUBLE_ROUNDS)
145# define HKDS_KECCAK_PERMUTATION_ROUNDS 48
146#else
147# define HKDS_KECCAK_PERMUTATION_ROUNDS 24
148#endif
149
154#define HKDS_KECCAK_PERMUTATION_MAX_ROUNDS 48
155
160#define HKDS_KECCAK_PERMUTATION_MIN_ROUNDS 12
161
166#define HKDS_KECCAK_SHA3_DOMAIN_ID 0x06
167
172#define HKDS_KECCAK_SHAKE_DOMAIN_ID 0x1F
173
178#define HKDS_KECCAK_STATE_BYTE_SIZE 200
179
184#define HKDS_KECCAK_128_RATE 168
185
190#define HKDS_KECCAK_256_RATE 136
191
196#define HKDS_KECCAK_512_RATE 72
197
202#define HKDS_KECCAK_STATE_SIZE 25
203
208#define HKDS_KECCAK_STATE_BYTE_SIZE 200
209
214#define HKDS_KMAC_256_KEY_SIZE 32
215
220#define HKDS_KMAC_512_KEY_SIZE 64
221
226#define HKDS_KECCAK_SCBKDF_DOMAIN_ID 0x42
227
232#define HKDS_SHA3_128_HASH_SIZE 16
233
238#define HKDS_SHA3_256_HASH_SIZE 32
239
244#define HKDS_SHA3_512_HASH_SIZE 64
245
250#define HKDS_SHAKE_256_KEY_SIZE 32
251
256#define HKDS_SHAKE512_KEY_SIZE 64
257
258/* common */
259
270
282
293HKDS_EXPORT_API void hkds_keccak_absorb(hkds_keccak_state* ctx, hkds_keccak_rate rate, const uint8_t* message, size_t msglen, uint8_t domain, size_t rounds);
294
306HKDS_EXPORT_API void hkds_keccak_absorb_custom(hkds_keccak_state* ctx, hkds_keccak_rate rate, const uint8_t* custom, size_t custlen, const uint8_t* name, size_t namelen, size_t rounds);
307
321HKDS_EXPORT_API void hkds_keccak_absorb_key_custom(hkds_keccak_state* ctx, hkds_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);
322
331HKDS_EXPORT_API void hkds_keccak_dispose(hkds_keccak_state* ctx);
332
343HKDS_EXPORT_API void hkds_keccak_finalize(hkds_keccak_state* ctx, hkds_keccak_rate rate, uint8_t* output, size_t outlen, uint8_t domain, size_t rounds);
344
353HKDS_EXPORT_API void hkds_keccak_incremental_absorb(hkds_keccak_state* ctx, uint32_t rate, const uint8_t* message, size_t msglen);
354
362HKDS_EXPORT_API void hkds_keccak_incremental_finalize(hkds_keccak_state* ctx, uint32_t rate, uint8_t domain);
363
372HKDS_EXPORT_API void hkds_keccak_incremental_squeeze(hkds_keccak_state* ctx, size_t rate, uint8_t* output, size_t outlen);
373
381HKDS_EXPORT_API void hkds_keccak_permute(hkds_keccak_state* ctx, size_t rounds);
382
390HKDS_EXPORT_API void hkds_keccak_permute_p1600c(uint64_t* state, size_t rounds);
391
398HKDS_EXPORT_API void hkds_keccak_permute_p1600u(uint64_t* state);
399
411HKDS_EXPORT_API void hkds_keccak_squeezeblocks(hkds_keccak_state* ctx, uint8_t* output, size_t nblocks, hkds_keccak_rate rate, size_t rounds);
412
419HKDS_EXPORT_API void hkds_keccak_initialize_state(hkds_keccak_state* ctx);
420
432HKDS_EXPORT_API void hkds_keccak_update(hkds_keccak_state* ctx, hkds_keccak_rate rate, const uint8_t* message, size_t msglen, size_t rounds);
433
434/* SHAKE */
435
447HKDS_EXPORT_API void hkds_shake128_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen);
448
460HKDS_EXPORT_API void hkds_shake256_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen);
461
473HKDS_EXPORT_API void hkds_shake512_compute(uint8_t* output, size_t outlen, const uint8_t* key, size_t keylen);
474
485HKDS_EXPORT_API void hkds_shake_initialize(hkds_keccak_state* ctx, hkds_keccak_rate rate, const uint8_t* key, size_t keylen);
486
500HKDS_EXPORT_API void hkds_shake_squeezeblocks(hkds_keccak_state* ctx, hkds_keccak_rate rate, uint8_t* output, size_t nblocks);
501
502/* KMAC */
503
518HKDS_EXPORT_API void hkds_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);
519
534HKDS_EXPORT_API void hkds_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);
535
550HKDS_EXPORT_API void hkds_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);
551
563HKDS_EXPORT_API void hkds_kmac_update(hkds_keccak_state* ctx, hkds_keccak_rate rate, const uint8_t* message, size_t msglen);
564
577HKDS_EXPORT_API void hkds_kmac_finalize(hkds_keccak_state* ctx, hkds_keccak_rate rate, uint8_t* output, size_t outlen);
578
591HKDS_EXPORT_API void hkds_kmac_initialize(hkds_keccak_state* ctx, hkds_keccak_rate rate, const uint8_t* key, size_t keylen, const uint8_t* custom, size_t custlen);
592
593/* parallel Keccak x4 */
594
595#if defined(SYSTEM_HAS_AVX2)
596
612void hkds_keccakx4_absorb(__m256i state[HKDS_KECCAK_STATE_SIZE], hkds_keccak_rate rate,
613 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen, uint8_t domain);
614
629void hkds_keccakx4_squeezeblocks(__m256i state[HKDS_KECCAK_STATE_SIZE], hkds_keccak_rate rate,
630 uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t nblocks);
631
632#endif
633
634/* parallel Keccak x8 */
635
636#if defined(SYSTEM_HAS_AVX512)
637
657void hkds_keccakx8_absorb(__m512i state[HKDS_KECCAK_STATE_SIZE], hkds_keccak_rate rate,
658 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
659 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen, uint8_t domain);
660
675void hkds_keccakx8_squeezeblocks(__m512i state[HKDS_KECCAK_STATE_SIZE], hkds_keccak_rate rate,
676 uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, uint8_t* out4,
677 uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t nblocks);
678
679#endif
680
681/* parallel SHAKE x4 */
682
700HKDS_EXPORT_API void hkds_shake_128x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
701 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen);
702
720HKDS_EXPORT_API void hkds_shake_256x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
721 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen);
722
740HKDS_EXPORT_API void hkds_shake_512x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
741 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3, size_t inplen);
742
743/* parallel shake x8 */
744
770HKDS_EXPORT_API void hkds_shake_128x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
771 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
772 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
773 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen);
774
800HKDS_EXPORT_API void hkds_shake_256x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
801 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
802 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
803 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen);
804
830HKDS_EXPORT_API void hkds_shake_512x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
831 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
832 const uint8_t* inp0, const uint8_t* inp1, const uint8_t* inp2, const uint8_t* inp3,
833 const uint8_t* inp4, const uint8_t* inp5, const uint8_t* inp6, const uint8_t* inp7, size_t inplen);
834
835/* parallel kmac x4 */
836
864HKDS_EXPORT_API void hkds_kmac_128x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
865 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3, size_t keylen,
866 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3, size_t cstlen,
867 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3, size_t msglen);
868
896HKDS_EXPORT_API void hkds_kmac_256x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
897 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3, size_t keylen,
898 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3, size_t cstlen,
899 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3, size_t msglen);
900
928HKDS_EXPORT_API void hkds_kmac_512x4(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3, size_t outlen,
929 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3, size_t keylen,
930 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3, size_t cstlen,
931 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3, size_t msglen);
932
933/* parallel KMAC x8 */
934
978HKDS_EXPORT_API void hkds_kmac_128x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
979 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
980 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3,
981 const uint8_t* key4, const uint8_t* key5, const uint8_t* key6, const uint8_t* key7, size_t keylen,
982 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3,
983 const uint8_t* cst4, const uint8_t* cst5, const uint8_t* cst6, const uint8_t* cst7, size_t cstlen,
984 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3,
985 const uint8_t* msg4, const uint8_t* msg5, const uint8_t* msg6, const uint8_t* msg7, size_t msglen);
986
1030HKDS_EXPORT_API void hkds_kmac_256x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1031 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1032 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3,
1033 const uint8_t* key4, const uint8_t* key5, const uint8_t* key6, const uint8_t* key7, size_t keylen,
1034 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3,
1035 const uint8_t* cst4, const uint8_t* cst5, const uint8_t* cst6, const uint8_t* cst7, size_t cstlen,
1036 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3,
1037 const uint8_t* msg4, const uint8_t* msg5, const uint8_t* msg6, const uint8_t* msg7, size_t msglen);
1038
1082HKDS_EXPORT_API void hkds_kmac_512x8(uint8_t* out0, uint8_t* out1, uint8_t* out2, uint8_t* out3,
1083 uint8_t* out4, uint8_t* out5, uint8_t* out6, uint8_t* out7, size_t outlen,
1084 const uint8_t* key0, const uint8_t* key1, const uint8_t* key2, const uint8_t* key3,
1085 const uint8_t* key4, const uint8_t* key5, const uint8_t* key6, const uint8_t* key7, size_t keylen,
1086 const uint8_t* cst0, const uint8_t* cst1, const uint8_t* cst2, const uint8_t* cst3,
1087 const uint8_t* cst4, const uint8_t* cst5, const uint8_t* cst6, const uint8_t* cst7, size_t cstlen,
1088 const uint8_t* msg0, const uint8_t* msg1, const uint8_t* msg2, const uint8_t* msg3,
1089 const uint8_t* msg4, const uint8_t* msg5, const uint8_t* msg6, const uint8_t* msg7, size_t msglen);
1090
1091#endif
HKDS configuration definitions.
HKDS_EXPORT_API void hkds_keccak_initialize_state(hkds_keccak_state *ctx)
Initializes a Keccak state structure, must be called before message processing. Long form api: must b...
Definition keccak.c:4043
hkds_keccak_rate
The Keccak rate; determines which security strength is used by the function, 128, 256,...
Definition keccak.h:276
@ hkds_keccak_rate_256
Definition keccak.h:279
@ hkds_keccak_rate_none
Definition keccak.h:277
@ hkds_keccak_rate_128
Definition keccak.h:278
@ hkds_keccak_rate_512
Definition keccak.h:280
HKDS_EXPORT_API void hkds_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 keccak.c:4865
HKDS_EXPORT_API void hkds_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 keccak.c:5210
HKDS_EXPORT_API void hkds_keccak_permute_p1600u(uint64_t *state)
The unrolled Keccak permute function. Internal function: Permutes the state array,...
Definition keccak.c:1811
HKDS_EXPORT_API void hkds_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 keccak.c:4121
HKDS_EXPORT_API void hkds_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 keccak.c:4212
HKDS_EXPORT_API void hkds_kmac_update(hkds_keccak_state *ctx, hkds_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 keccak.c:4240
#define HKDS_KECCAK_STATE_SIZE
The Keccak SHA3 uint64 state array size.
Definition keccak.h:202
HKDS_EXPORT_API void hkds_keccak_incremental_squeeze(hkds_keccak_state *ctx, size_t rate, uint8_t *output, size_t outlen)
Extract an array of bytes from the Keccak state.
Definition keccak.c:1408
HKDS_EXPORT_API void hkds_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 keccak.c:4528
HKDS_EXPORT_API void hkds_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 keccak.c:4199
HKDS_EXPORT_API void hkds_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 keccak.c:4098
HKDS_EXPORT_API void hkds_keccak_permute(hkds_keccak_state *ctx, size_t rounds)
The Keccak permute function. Internal function: Permutes the state array, can be used in external con...
Definition keccak.c:1483
HKDS_EXPORT_API void hkds_keccak_absorb(hkds_keccak_state *ctx, hkds_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 keccak.c:1097
HKDS_EXPORT_API void hkds_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 keccak.c:5132
HKDS_EXPORT_API void hkds_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 keccak.c:4144
HKDS_EXPORT_API void hkds_keccak_incremental_finalize(hkds_keccak_state *ctx, uint32_t rate, uint8_t domain)
Finalize state added incrementally.
Definition keccak.c:1394
#define HKDS_KECCAK_512_RATE
The 512 bit absorption rate.
Definition keccak.h:196
#define HKDS_KECCAK_256_RATE
The 256-bit absorption rate.
Definition keccak.h:190
HKDS_EXPORT_API void hkds_shake_initialize(hkds_keccak_state *ctx, hkds_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 keccak.c:4167
#define HKDS_KECCAK_128_RATE
The 128-bit absorption rate.
Definition keccak.h:184
HKDS_EXPORT_API void hkds_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 keccak.c:4699
HKDS_EXPORT_API void hkds_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 keccak.c:1497
HKDS_EXPORT_API void hkds_kmac_finalize(hkds_keccak_state *ctx, hkds_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 keccak.c:4225
HKDS_EXPORT_API void hkds_kmac_initialize(hkds_keccak_state *ctx, hkds_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 keccak.c:4230
#define HKDS_KECCAK_STATE_BYTE_SIZE
The Keccak state array byte size.
Definition keccak.h:178
HKDS_EXPORT_API void hkds_keccak_absorb_key_custom(hkds_keccak_state *ctx, hkds_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 keccak.c:1187
HKDS_EXPORT_API void hkds_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 keccak.c:5545
HKDS_EXPORT_API void hkds_keccak_update(hkds_keccak_state *ctx, hkds_keccak_rate rate, const uint8_t *message, size_t msglen, size_t rounds)
Update Keccak state with message input.
Definition keccak.c:4055
HKDS_EXPORT_API void hkds_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 keccak.c:4186
HKDS_EXPORT_API void hkds_keccak_dispose(hkds_keccak_state *ctx)
Dispose of the Keccak state.
Definition keccak.c:1264
HKDS_EXPORT_API void hkds_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 keccak.c:4641
HKDS_EXPORT_API void hkds_keccak_squeezeblocks(hkds_keccak_state *ctx, uint8_t *output, size_t nblocks, hkds_keccak_rate rate, size_t rounds)
The Keccak squeeze function.
Definition keccak.c:4018
HKDS_EXPORT_API void hkds_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 keccak.c:5477
HKDS_EXPORT_API void hkds_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 keccak.c:4782
HKDS_EXPORT_API void hkds_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 keccak.c:4585
HKDS_EXPORT_API void hkds_keccak_incremental_absorb(hkds_keccak_state *ctx, uint32_t rate, const uint8_t *message, size_t msglen)
Absorb bytes into state incrementally.
Definition keccak.c:1319
HKDS_EXPORT_API void hkds_keccak_absorb_custom(hkds_keccak_state *ctx, hkds_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 keccak.c:1137
HKDS_EXPORT_API void hkds_shake_squeezeblocks(hkds_keccak_state *ctx, hkds_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 keccak.c:4176
HKDS_EXPORT_API void hkds_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 keccak.c:5613
HKDS_EXPORT_API void hkds_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 keccak.c:5171
HKDS_EXPORT_API void hkds_keccak_finalize(hkds_keccak_state *ctx, hkds_keccak_rate rate, uint8_t *output, size_t outlen, uint8_t domain, size_t rounds)
Finalize the Keccak state.
Definition keccak.c:1276
The Keccak state array; state array must be initialized by the caller.
Definition keccak.h:265
uint8_t buffer[HKDS_KECCAK_STATE_BYTE_SIZE]
Definition keccak.h:267
uint64_t state[HKDS_KECCAK_STATE_SIZE]
Definition keccak.h:266
size_t position
Definition keccak.h:268