kpqc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +21 -0
  4. data/README.md +174 -0
  5. data/Rakefile +57 -0
  6. data/THIRD_PARTY_NOTICES.md +53 -0
  7. data/ext/kpqc/aimer128f/extconf.rb +4 -0
  8. data/ext/kpqc/aimer128s/extconf.rb +4 -0
  9. data/ext/kpqc/aimer192f/extconf.rb +4 -0
  10. data/ext/kpqc/aimer192s/extconf.rb +4 -0
  11. data/ext/kpqc/aimer256f/extconf.rb +4 -0
  12. data/ext/kpqc/aimer256s/extconf.rb +4 -0
  13. data/ext/kpqc/extconf_helper.rb +93 -0
  14. data/ext/kpqc/haetae2/extconf.rb +4 -0
  15. data/ext/kpqc/haetae3/extconf.rb +4 -0
  16. data/ext/kpqc/haetae5/extconf.rb +4 -0
  17. data/ext/kpqc/module.c +195 -0
  18. data/ext/kpqc/ntruplus1152/extconf.rb +4 -0
  19. data/ext/kpqc/ntruplus768/extconf.rb +4 -0
  20. data/ext/kpqc/ntruplus864/extconf.rb +4 -0
  21. data/ext/kpqc/randombytes.c +107 -0
  22. data/ext/kpqc/smaugt128/extconf.rb +4 -0
  23. data/ext/kpqc/smaugt192/extconf.rb +4 -0
  24. data/ext/kpqc/smaugt256/extconf.rb +4 -0
  25. data/ext/kpqc/timer/extconf.rb +4 -0
  26. data/kpqc.gemspec +41 -0
  27. data/lib/kpqc/aimer.rb +38 -0
  28. data/lib/kpqc/api.rb +129 -0
  29. data/lib/kpqc/haetae.rb +25 -0
  30. data/lib/kpqc/ntruplus.rb +25 -0
  31. data/lib/kpqc/smaugt.rb +29 -0
  32. data/lib/kpqc/types.rb +103 -0
  33. data/lib/kpqc/version.rb +6 -0
  34. data/lib/kpqc.rb +33 -0
  35. data/test/algorithm_test.rb +111 -0
  36. data/test/api_test.rb +52 -0
  37. data/test/interop.mjs +34 -0
  38. data/test/interop_test.rb +82 -0
  39. data/test/kat/aimer128f.rsp +10 -0
  40. data/test/kat/aimer128s.rsp +10 -0
  41. data/test/kat/aimer192f.rsp +10 -0
  42. data/test/kat/aimer192s.rsp +10 -0
  43. data/test/kat/aimer256f.rsp +10 -0
  44. data/test/kat/aimer256s.rsp +10 -0
  45. data/test/kat/haetae2.rsp +10 -0
  46. data/test/kat/haetae3.rsp +10 -0
  47. data/test/kat/haetae5.rsp +10 -0
  48. data/test/kat/ntruplus1152.rsp +8 -0
  49. data/test/kat/ntruplus768.rsp +8 -0
  50. data/test/kat/ntruplus864.rsp +8 -0
  51. data/test/kat/smaugt128.rsp +8 -0
  52. data/test/kat/smaugt192.rsp +8 -0
  53. data/test/kat/smaugt256.rsp +8 -0
  54. data/test/kat/timer.rsp +8 -0
  55. data/test/kat_drbg.rb +155 -0
  56. data/test/kat_test.rb +99 -0
  57. data/test/test_helper.rb +21 -0
  58. data/vendor/AIMer/LICENSE +21 -0
  59. data/vendor/AIMer/aim2.c +163 -0
  60. data/vendor/AIMer/aim2.h +36 -0
  61. data/vendor/AIMer/aim2_constant.h +74 -0
  62. data/vendor/AIMer/api.h +42 -0
  63. data/vendor/AIMer/common/crypto_declassify.h +7 -0
  64. data/vendor/AIMer/common/fips202.c +878 -0
  65. data/vendor/AIMer/common/fips202.h +166 -0
  66. data/vendor/AIMer/common/rng.h +56 -0
  67. data/vendor/AIMer/field.h +43 -0
  68. data/vendor/AIMer/field128.c +454 -0
  69. data/vendor/AIMer/field192.c +485 -0
  70. data/vendor/AIMer/field256.c +564 -0
  71. data/vendor/AIMer/hash.c +50 -0
  72. data/vendor/AIMer/hash.h +37 -0
  73. data/vendor/AIMer/params/params-aimer-128f.h +34 -0
  74. data/vendor/AIMer/params/params-aimer-128s.h +34 -0
  75. data/vendor/AIMer/params/params-aimer-192f.h +34 -0
  76. data/vendor/AIMer/params/params-aimer-192s.h +34 -0
  77. data/vendor/AIMer/params/params-aimer-256f.h +34 -0
  78. data/vendor/AIMer/params/params-aimer-256s.h +34 -0
  79. data/vendor/AIMer/params.h +5 -0
  80. data/vendor/AIMer/sign.c +631 -0
  81. data/vendor/AIMer/sign.h +40 -0
  82. data/vendor/AIMer/tree.c +75 -0
  83. data/vendor/AIMer/tree.h +26 -0
  84. data/vendor/HAETAE/LICENSE +22 -0
  85. data/vendor/HAETAE/include/api.h +54 -0
  86. data/vendor/HAETAE/include/common.h +12 -0
  87. data/vendor/HAETAE/include/config.h +42 -0
  88. data/vendor/HAETAE/include/decompose.h +19 -0
  89. data/vendor/HAETAE/include/encoding.h +20 -0
  90. data/vendor/HAETAE/include/fft.h +26 -0
  91. data/vendor/HAETAE/include/fips202.h +40 -0
  92. data/vendor/HAETAE/include/fixpoint.h +125 -0
  93. data/vendor/HAETAE/include/ntt.h +16 -0
  94. data/vendor/HAETAE/include/packing.h +58 -0
  95. data/vendor/HAETAE/include/params.h +117 -0
  96. data/vendor/HAETAE/include/poly.h +65 -0
  97. data/vendor/HAETAE/include/polyfix.h +65 -0
  98. data/vendor/HAETAE/include/polymat.h +32 -0
  99. data/vendor/HAETAE/include/polyvec.h +131 -0
  100. data/vendor/HAETAE/include/randombytes.h +39 -0
  101. data/vendor/HAETAE/include/rans_byte.h +335 -0
  102. data/vendor/HAETAE/include/reduce.h +31 -0
  103. data/vendor/HAETAE/include/sampler.h +23 -0
  104. data/vendor/HAETAE/include/symmetric.h +52 -0
  105. data/vendor/HAETAE/src/decompose.c +73 -0
  106. data/vendor/HAETAE/src/encoding.c +700 -0
  107. data/vendor/HAETAE/src/fft.c +235 -0
  108. data/vendor/HAETAE/src/fips202.c +745 -0
  109. data/vendor/HAETAE/src/fixpoint.c +143 -0
  110. data/vendor/HAETAE/src/ntt.c +98 -0
  111. data/vendor/HAETAE/src/packing.c +595 -0
  112. data/vendor/HAETAE/src/poly.c +371 -0
  113. data/vendor/HAETAE/src/polyfix.c +298 -0
  114. data/vendor/HAETAE/src/polymat.c +82 -0
  115. data/vendor/HAETAE/src/polyvec.c +534 -0
  116. data/vendor/HAETAE/src/reduce.c +96 -0
  117. data/vendor/HAETAE/src/sampler.c +310 -0
  118. data/vendor/HAETAE/src/sign.c +558 -0
  119. data/vendor/HAETAE/src/symmetric-shake.c +50 -0
  120. data/vendor/NTRUplus/LICENSE +21 -0
  121. data/vendor/NTRUplus/NTRU+1152/api.h +24 -0
  122. data/vendor/NTRUplus/NTRU+1152/fips202/fips202.c +878 -0
  123. data/vendor/NTRUplus/NTRU+1152/fips202/fips202.h +166 -0
  124. data/vendor/NTRUplus/NTRU+1152/kem.c +286 -0
  125. data/vendor/NTRUplus/NTRU+1152/ntt.c +394 -0
  126. data/vendor/NTRUplus/NTRU+1152/ntt.h +16 -0
  127. data/vendor/NTRUplus/NTRU+1152/params.h +18 -0
  128. data/vendor/NTRUplus/NTRU+1152/poly.c +318 -0
  129. data/vendor/NTRUplus/NTRU+1152/poly.h +31 -0
  130. data/vendor/NTRUplus/NTRU+1152/randombytes.h +9 -0
  131. data/vendor/NTRUplus/NTRU+1152/symmetric.c +39 -0
  132. data/vendor/NTRUplus/NTRU+1152/symmetric.h +12 -0
  133. data/vendor/NTRUplus/NTRU+768/api.h +24 -0
  134. data/vendor/NTRUplus/NTRU+768/fips202/fips202.c +878 -0
  135. data/vendor/NTRUplus/NTRU+768/fips202/fips202.h +166 -0
  136. data/vendor/NTRUplus/NTRU+768/kem.c +286 -0
  137. data/vendor/NTRUplus/NTRU+768/ntt.c +379 -0
  138. data/vendor/NTRUplus/NTRU+768/ntt.h +16 -0
  139. data/vendor/NTRUplus/NTRU+768/params.h +18 -0
  140. data/vendor/NTRUplus/NTRU+768/poly.c +320 -0
  141. data/vendor/NTRUplus/NTRU+768/poly.h +31 -0
  142. data/vendor/NTRUplus/NTRU+768/randombytes.h +9 -0
  143. data/vendor/NTRUplus/NTRU+768/symmetric.c +39 -0
  144. data/vendor/NTRUplus/NTRU+768/symmetric.h +12 -0
  145. data/vendor/NTRUplus/NTRU+864/api.h +24 -0
  146. data/vendor/NTRUplus/NTRU+864/fips202/fips202.c +878 -0
  147. data/vendor/NTRUplus/NTRU+864/fips202/fips202.h +166 -0
  148. data/vendor/NTRUplus/NTRU+864/kem.c +286 -0
  149. data/vendor/NTRUplus/NTRU+864/ntt.c +383 -0
  150. data/vendor/NTRUplus/NTRU+864/ntt.h +16 -0
  151. data/vendor/NTRUplus/NTRU+864/params.h +18 -0
  152. data/vendor/NTRUplus/NTRU+864/poly.c +314 -0
  153. data/vendor/NTRUplus/NTRU+864/poly.h +31 -0
  154. data/vendor/NTRUplus/NTRU+864/randombytes.h +9 -0
  155. data/vendor/NTRUplus/NTRU+864/symmetric.c +39 -0
  156. data/vendor/NTRUplus/NTRU+864/symmetric.h +12 -0
  157. data/vendor/SMAUG-T/LICENSE +22 -0
  158. data/vendor/SMAUG-T/include/api.h +37 -0
  159. data/vendor/SMAUG-T/include/cbd.h +15 -0
  160. data/vendor/SMAUG-T/include/ciphertext.h +45 -0
  161. data/vendor/SMAUG-T/include/common.h +12 -0
  162. data/vendor/SMAUG-T/include/config.h +48 -0
  163. data/vendor/SMAUG-T/include/dg.h +28 -0
  164. data/vendor/SMAUG-T/include/fips202.h +41 -0
  165. data/vendor/SMAUG-T/include/hash.h +21 -0
  166. data/vendor/SMAUG-T/include/hwt.h +28 -0
  167. data/vendor/SMAUG-T/include/indcpa.h +33 -0
  168. data/vendor/SMAUG-T/include/key.h +34 -0
  169. data/vendor/SMAUG-T/include/pack.h +78 -0
  170. data/vendor/SMAUG-T/include/packring.h +50 -0
  171. data/vendor/SMAUG-T/include/params.h +84 -0
  172. data/vendor/SMAUG-T/include/poly.h +41 -0
  173. data/vendor/SMAUG-T/include/randombytes.h +11 -0
  174. data/vendor/SMAUG-T/include/toomcook.h +14 -0
  175. data/vendor/SMAUG-T/include/verify.h +16 -0
  176. data/vendor/SMAUG-T/src/cbd.c +159 -0
  177. data/vendor/SMAUG-T/src/ciphertext.c +95 -0
  178. data/vendor/SMAUG-T/src/dg.c +112 -0
  179. data/vendor/SMAUG-T/src/fips202.c +745 -0
  180. data/vendor/SMAUG-T/src/hash.c +15 -0
  181. data/vendor/SMAUG-T/src/hwt.c +121 -0
  182. data/vendor/SMAUG-T/src/indcpa.c +187 -0
  183. data/vendor/SMAUG-T/src/kem.c +194 -0
  184. data/vendor/SMAUG-T/src/key.c +102 -0
  185. data/vendor/SMAUG-T/src/pack.c +349 -0
  186. data/vendor/SMAUG-T/src/packring.c +503 -0
  187. data/vendor/SMAUG-T/src/poly.c +200 -0
  188. data/vendor/SMAUG-T/src/toomcook.c +256 -0
  189. data/vendor/SMAUG-T/src/verify.c +48 -0
  190. data/vendor/SOURCES.json +130 -0
  191. metadata +280 -0
@@ -0,0 +1,878 @@
1
+ /* Based on the public domain implementation in
2
+ * crypto_hash/keccakc512/simple/ from http://bench.cr.yp.to/supercop.html
3
+ * by Ronny Van Keer
4
+ * and the public domain "TweetFips202" implementation
5
+ * from https://twitter.com/tweetfips202
6
+ * by Gilles Van Assche, Daniel J. Bernstein, and Peter Schwabe */
7
+
8
+ #include <stddef.h>
9
+ #include <stdint.h>
10
+ #include <string.h>
11
+
12
+ #include "fips202.h"
13
+
14
+ #define NROUNDS 24
15
+ #define ROL(a, offset) (((a) << (offset)) ^ ((a) >> (64 - (offset))))
16
+
17
+ static void clear_state(uint64_t *state, size_t words) {
18
+ volatile uint64_t *p = state;
19
+ while (words-- > 0) {
20
+ *p++ = 0;
21
+ }
22
+ }
23
+
24
+ /*************************************************
25
+ * Name: load64
26
+ *
27
+ * Description: Load 8 bytes into uint64_t in little-endian order
28
+ *
29
+ * Arguments: - const uint8_t *x: pointer to input byte array
30
+ *
31
+ * Returns the loaded 64-bit unsigned integer
32
+ **************************************************/
33
+ static uint64_t load64(const uint8_t *x) {
34
+ uint64_t r = 0;
35
+ for (size_t i = 0; i < 8; ++i) {
36
+ r |= (uint64_t)x[i] << 8 * i;
37
+ }
38
+
39
+ return r;
40
+ }
41
+
42
+ /*************************************************
43
+ * Name: store64
44
+ *
45
+ * Description: Store a 64-bit integer to a byte array in little-endian order
46
+ *
47
+ * Arguments: - uint8_t *x: pointer to the output byte array
48
+ * - uint64_t u: input 64-bit unsigned integer
49
+ **************************************************/
50
+ static void store64(uint8_t *x, uint64_t u) {
51
+ for (size_t i = 0; i < 8; ++i) {
52
+ x[i] = (uint8_t) (u >> 8 * i);
53
+ }
54
+ }
55
+
56
+ /* Keccak round constants */
57
+ static const uint64_t KeccakF_RoundConstants[NROUNDS] = {
58
+ 0x0000000000000001ULL, 0x0000000000008082ULL,
59
+ 0x800000000000808aULL, 0x8000000080008000ULL,
60
+ 0x000000000000808bULL, 0x0000000080000001ULL,
61
+ 0x8000000080008081ULL, 0x8000000000008009ULL,
62
+ 0x000000000000008aULL, 0x0000000000000088ULL,
63
+ 0x0000000080008009ULL, 0x000000008000000aULL,
64
+ 0x000000008000808bULL, 0x800000000000008bULL,
65
+ 0x8000000000008089ULL, 0x8000000000008003ULL,
66
+ 0x8000000000008002ULL, 0x8000000000000080ULL,
67
+ 0x000000000000800aULL, 0x800000008000000aULL,
68
+ 0x8000000080008081ULL, 0x8000000000008080ULL,
69
+ 0x0000000080000001ULL, 0x8000000080008008ULL
70
+ };
71
+
72
+ /*************************************************
73
+ * Name: KeccakF1600_StatePermute
74
+ *
75
+ * Description: The Keccak F1600 Permutation
76
+ *
77
+ * Arguments: - uint64_t *state: pointer to input/output Keccak state
78
+ **************************************************/
79
+ static void KeccakF1600_StatePermute(uint64_t *state) {
80
+ int round;
81
+
82
+ uint64_t Aba, Abe, Abi, Abo, Abu;
83
+ uint64_t Aga, Age, Agi, Ago, Agu;
84
+ uint64_t Aka, Ake, Aki, Ako, Aku;
85
+ uint64_t Ama, Ame, Ami, Amo, Amu;
86
+ uint64_t Asa, Ase, Asi, Aso, Asu;
87
+ uint64_t BCa, BCe, BCi, BCo, BCu;
88
+ uint64_t Da, De, Di, Do, Du;
89
+ uint64_t Eba, Ebe, Ebi, Ebo, Ebu;
90
+ uint64_t Ega, Ege, Egi, Ego, Egu;
91
+ uint64_t Eka, Eke, Eki, Eko, Eku;
92
+ uint64_t Ema, Eme, Emi, Emo, Emu;
93
+ uint64_t Esa, Ese, Esi, Eso, Esu;
94
+
95
+ // copyFromState(A, state)
96
+ Aba = state[0];
97
+ Abe = state[1];
98
+ Abi = state[2];
99
+ Abo = state[3];
100
+ Abu = state[4];
101
+ Aga = state[5];
102
+ Age = state[6];
103
+ Agi = state[7];
104
+ Ago = state[8];
105
+ Agu = state[9];
106
+ Aka = state[10];
107
+ Ake = state[11];
108
+ Aki = state[12];
109
+ Ako = state[13];
110
+ Aku = state[14];
111
+ Ama = state[15];
112
+ Ame = state[16];
113
+ Ami = state[17];
114
+ Amo = state[18];
115
+ Amu = state[19];
116
+ Asa = state[20];
117
+ Ase = state[21];
118
+ Asi = state[22];
119
+ Aso = state[23];
120
+ Asu = state[24];
121
+
122
+ for (round = 0; round < NROUNDS; round += 2) {
123
+ // prepareTheta
124
+ BCa = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
125
+ BCe = Abe ^ Age ^ Ake ^ Ame ^ Ase;
126
+ BCi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
127
+ BCo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
128
+ BCu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
129
+
130
+ // thetaRhoPiChiIotaPrepareTheta(round , A, E)
131
+ Da = BCu ^ ROL(BCe, 1);
132
+ De = BCa ^ ROL(BCi, 1);
133
+ Di = BCe ^ ROL(BCo, 1);
134
+ Do = BCi ^ ROL(BCu, 1);
135
+ Du = BCo ^ ROL(BCa, 1);
136
+
137
+ Aba ^= Da;
138
+ BCa = Aba;
139
+ Age ^= De;
140
+ BCe = ROL(Age, 44);
141
+ Aki ^= Di;
142
+ BCi = ROL(Aki, 43);
143
+ Amo ^= Do;
144
+ BCo = ROL(Amo, 21);
145
+ Asu ^= Du;
146
+ BCu = ROL(Asu, 14);
147
+ Eba = BCa ^ ((~BCe) & BCi);
148
+ Eba ^= KeccakF_RoundConstants[round];
149
+ Ebe = BCe ^ ((~BCi) & BCo);
150
+ Ebi = BCi ^ ((~BCo) & BCu);
151
+ Ebo = BCo ^ ((~BCu) & BCa);
152
+ Ebu = BCu ^ ((~BCa) & BCe);
153
+
154
+ Abo ^= Do;
155
+ BCa = ROL(Abo, 28);
156
+ Agu ^= Du;
157
+ BCe = ROL(Agu, 20);
158
+ Aka ^= Da;
159
+ BCi = ROL(Aka, 3);
160
+ Ame ^= De;
161
+ BCo = ROL(Ame, 45);
162
+ Asi ^= Di;
163
+ BCu = ROL(Asi, 61);
164
+ Ega = BCa ^ ((~BCe) & BCi);
165
+ Ege = BCe ^ ((~BCi) & BCo);
166
+ Egi = BCi ^ ((~BCo) & BCu);
167
+ Ego = BCo ^ ((~BCu) & BCa);
168
+ Egu = BCu ^ ((~BCa) & BCe);
169
+
170
+ Abe ^= De;
171
+ BCa = ROL(Abe, 1);
172
+ Agi ^= Di;
173
+ BCe = ROL(Agi, 6);
174
+ Ako ^= Do;
175
+ BCi = ROL(Ako, 25);
176
+ Amu ^= Du;
177
+ BCo = ROL(Amu, 8);
178
+ Asa ^= Da;
179
+ BCu = ROL(Asa, 18);
180
+ Eka = BCa ^ ((~BCe) & BCi);
181
+ Eke = BCe ^ ((~BCi) & BCo);
182
+ Eki = BCi ^ ((~BCo) & BCu);
183
+ Eko = BCo ^ ((~BCu) & BCa);
184
+ Eku = BCu ^ ((~BCa) & BCe);
185
+
186
+ Abu ^= Du;
187
+ BCa = ROL(Abu, 27);
188
+ Aga ^= Da;
189
+ BCe = ROL(Aga, 36);
190
+ Ake ^= De;
191
+ BCi = ROL(Ake, 10);
192
+ Ami ^= Di;
193
+ BCo = ROL(Ami, 15);
194
+ Aso ^= Do;
195
+ BCu = ROL(Aso, 56);
196
+ Ema = BCa ^ ((~BCe) & BCi);
197
+ Eme = BCe ^ ((~BCi) & BCo);
198
+ Emi = BCi ^ ((~BCo) & BCu);
199
+ Emo = BCo ^ ((~BCu) & BCa);
200
+ Emu = BCu ^ ((~BCa) & BCe);
201
+
202
+ Abi ^= Di;
203
+ BCa = ROL(Abi, 62);
204
+ Ago ^= Do;
205
+ BCe = ROL(Ago, 55);
206
+ Aku ^= Du;
207
+ BCi = ROL(Aku, 39);
208
+ Ama ^= Da;
209
+ BCo = ROL(Ama, 41);
210
+ Ase ^= De;
211
+ BCu = ROL(Ase, 2);
212
+ Esa = BCa ^ ((~BCe) & BCi);
213
+ Ese = BCe ^ ((~BCi) & BCo);
214
+ Esi = BCi ^ ((~BCo) & BCu);
215
+ Eso = BCo ^ ((~BCu) & BCa);
216
+ Esu = BCu ^ ((~BCa) & BCe);
217
+
218
+ // prepareTheta
219
+ BCa = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
220
+ BCe = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
221
+ BCi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
222
+ BCo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
223
+ BCu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
224
+
225
+ // thetaRhoPiChiIotaPrepareTheta(round+1, E, A)
226
+ Da = BCu ^ ROL(BCe, 1);
227
+ De = BCa ^ ROL(BCi, 1);
228
+ Di = BCe ^ ROL(BCo, 1);
229
+ Do = BCi ^ ROL(BCu, 1);
230
+ Du = BCo ^ ROL(BCa, 1);
231
+
232
+ Eba ^= Da;
233
+ BCa = Eba;
234
+ Ege ^= De;
235
+ BCe = ROL(Ege, 44);
236
+ Eki ^= Di;
237
+ BCi = ROL(Eki, 43);
238
+ Emo ^= Do;
239
+ BCo = ROL(Emo, 21);
240
+ Esu ^= Du;
241
+ BCu = ROL(Esu, 14);
242
+ Aba = BCa ^ ((~BCe) & BCi);
243
+ Aba ^= KeccakF_RoundConstants[round + 1];
244
+ Abe = BCe ^ ((~BCi) & BCo);
245
+ Abi = BCi ^ ((~BCo) & BCu);
246
+ Abo = BCo ^ ((~BCu) & BCa);
247
+ Abu = BCu ^ ((~BCa) & BCe);
248
+
249
+ Ebo ^= Do;
250
+ BCa = ROL(Ebo, 28);
251
+ Egu ^= Du;
252
+ BCe = ROL(Egu, 20);
253
+ Eka ^= Da;
254
+ BCi = ROL(Eka, 3);
255
+ Eme ^= De;
256
+ BCo = ROL(Eme, 45);
257
+ Esi ^= Di;
258
+ BCu = ROL(Esi, 61);
259
+ Aga = BCa ^ ((~BCe) & BCi);
260
+ Age = BCe ^ ((~BCi) & BCo);
261
+ Agi = BCi ^ ((~BCo) & BCu);
262
+ Ago = BCo ^ ((~BCu) & BCa);
263
+ Agu = BCu ^ ((~BCa) & BCe);
264
+
265
+ Ebe ^= De;
266
+ BCa = ROL(Ebe, 1);
267
+ Egi ^= Di;
268
+ BCe = ROL(Egi, 6);
269
+ Eko ^= Do;
270
+ BCi = ROL(Eko, 25);
271
+ Emu ^= Du;
272
+ BCo = ROL(Emu, 8);
273
+ Esa ^= Da;
274
+ BCu = ROL(Esa, 18);
275
+ Aka = BCa ^ ((~BCe) & BCi);
276
+ Ake = BCe ^ ((~BCi) & BCo);
277
+ Aki = BCi ^ ((~BCo) & BCu);
278
+ Ako = BCo ^ ((~BCu) & BCa);
279
+ Aku = BCu ^ ((~BCa) & BCe);
280
+
281
+ Ebu ^= Du;
282
+ BCa = ROL(Ebu, 27);
283
+ Ega ^= Da;
284
+ BCe = ROL(Ega, 36);
285
+ Eke ^= De;
286
+ BCi = ROL(Eke, 10);
287
+ Emi ^= Di;
288
+ BCo = ROL(Emi, 15);
289
+ Eso ^= Do;
290
+ BCu = ROL(Eso, 56);
291
+ Ama = BCa ^ ((~BCe) & BCi);
292
+ Ame = BCe ^ ((~BCi) & BCo);
293
+ Ami = BCi ^ ((~BCo) & BCu);
294
+ Amo = BCo ^ ((~BCu) & BCa);
295
+ Amu = BCu ^ ((~BCa) & BCe);
296
+
297
+ Ebi ^= Di;
298
+ BCa = ROL(Ebi, 62);
299
+ Ego ^= Do;
300
+ BCe = ROL(Ego, 55);
301
+ Eku ^= Du;
302
+ BCi = ROL(Eku, 39);
303
+ Ema ^= Da;
304
+ BCo = ROL(Ema, 41);
305
+ Ese ^= De;
306
+ BCu = ROL(Ese, 2);
307
+ Asa = BCa ^ ((~BCe) & BCi);
308
+ Ase = BCe ^ ((~BCi) & BCo);
309
+ Asi = BCi ^ ((~BCo) & BCu);
310
+ Aso = BCo ^ ((~BCu) & BCa);
311
+ Asu = BCu ^ ((~BCa) & BCe);
312
+ }
313
+
314
+ // copyToState(state, A)
315
+ state[0] = Aba;
316
+ state[1] = Abe;
317
+ state[2] = Abi;
318
+ state[3] = Abo;
319
+ state[4] = Abu;
320
+ state[5] = Aga;
321
+ state[6] = Age;
322
+ state[7] = Agi;
323
+ state[8] = Ago;
324
+ state[9] = Agu;
325
+ state[10] = Aka;
326
+ state[11] = Ake;
327
+ state[12] = Aki;
328
+ state[13] = Ako;
329
+ state[14] = Aku;
330
+ state[15] = Ama;
331
+ state[16] = Ame;
332
+ state[17] = Ami;
333
+ state[18] = Amo;
334
+ state[19] = Amu;
335
+ state[20] = Asa;
336
+ state[21] = Ase;
337
+ state[22] = Asi;
338
+ state[23] = Aso;
339
+ state[24] = Asu;
340
+ }
341
+
342
+ /*************************************************
343
+ * Name: keccak_absorb
344
+ *
345
+ * Description: Absorb step of Keccak;
346
+ * non-incremental, starts by zeroeing the state.
347
+ *
348
+ * Arguments: - uint64_t *s: pointer to (uninitialized) output Keccak state
349
+ * - uint32_t r: rate in bytes (e.g., 168 for SHAKE128)
350
+ * - const uint8_t *m: pointer to input to be absorbed into s
351
+ * - size_t mlen: length of input in bytes
352
+ * - uint8_t p: domain-separation byte for different
353
+ * Keccak-derived functions
354
+ **************************************************/
355
+ static void keccak_absorb(uint64_t *s, uint32_t r, const uint8_t *m,
356
+ size_t mlen, uint8_t p) {
357
+ size_t i;
358
+ uint8_t t[200];
359
+
360
+ /* Zero state */
361
+ for (i = 0; i < 25; ++i) {
362
+ s[i] = 0;
363
+ }
364
+
365
+ while (mlen >= r) {
366
+ for (i = 0; i < r / 8; ++i) {
367
+ s[i] ^= load64(m + 8 * i);
368
+ }
369
+
370
+ KeccakF1600_StatePermute(s);
371
+ mlen -= r;
372
+ m += r;
373
+ }
374
+
375
+ for (i = 0; i < r; ++i) {
376
+ t[i] = 0;
377
+ }
378
+ for (i = 0; i < mlen; ++i) {
379
+ t[i] = m[i];
380
+ }
381
+ t[i] = p;
382
+ t[r - 1] |= 128;
383
+ for (i = 0; i < r / 8; ++i) {
384
+ s[i] ^= load64(t + 8 * i);
385
+ }
386
+ }
387
+
388
+ /*************************************************
389
+ * Name: keccak_squeezeblocks
390
+ *
391
+ * Description: Squeeze step of Keccak. Squeezes full blocks of r bytes each.
392
+ * Modifies the state. Can be called multiple times to keep
393
+ * squeezing, i.e., is incremental.
394
+ *
395
+ * Arguments: - uint8_t *h: pointer to output blocks
396
+ * - size_t nblocks: number of blocks to be
397
+ * squeezed (written to h)
398
+ * - uint64_t *s: pointer to input/output Keccak state
399
+ * - uint32_t r: rate in bytes (e.g., 168 for SHAKE128)
400
+ **************************************************/
401
+ static void keccak_squeezeblocks(uint8_t *h, size_t nblocks,
402
+ uint64_t *s, uint32_t r) {
403
+ while (nblocks > 0) {
404
+ KeccakF1600_StatePermute(s);
405
+ for (size_t i = 0; i < (r >> 3); i++) {
406
+ store64(h + 8 * i, s[i]);
407
+ }
408
+ h += r;
409
+ nblocks--;
410
+ }
411
+ }
412
+
413
+ /*************************************************
414
+ * Name: keccak_inc_init
415
+ *
416
+ * Description: Initializes the incremental Keccak state to zero.
417
+ *
418
+ * Arguments: - uint64_t *s_inc: pointer to input/output incremental state
419
+ * First 25 values represent Keccak state.
420
+ * 26th value represents either the number of absorbed bytes
421
+ * that have not been permuted, or not-yet-squeezed bytes.
422
+ **************************************************/
423
+ static void keccak_inc_init(uint64_t *s_inc) {
424
+ size_t i;
425
+
426
+ for (i = 0; i < 25; ++i) {
427
+ s_inc[i] = 0;
428
+ }
429
+ s_inc[25] = 0;
430
+ }
431
+
432
+ /*************************************************
433
+ * Name: keccak_inc_absorb
434
+ *
435
+ * Description: Incremental keccak absorb
436
+ * Preceded by keccak_inc_init, succeeded by keccak_inc_finalize
437
+ *
438
+ * Arguments: - uint64_t *s_inc: pointer to input/output incremental state
439
+ * First 25 values represent Keccak state.
440
+ * 26th value represents either the number of absorbed bytes
441
+ * that have not been permuted, or not-yet-squeezed bytes.
442
+ * - uint32_t r: rate in bytes (e.g., 168 for SHAKE128)
443
+ * - const uint8_t *m: pointer to input to be absorbed into s
444
+ * - size_t mlen: length of input in bytes
445
+ **************************************************/
446
+ static void keccak_inc_absorb(uint64_t *s_inc, uint32_t r, const uint8_t *m,
447
+ size_t mlen) {
448
+ size_t i;
449
+
450
+ /* Recall that s_inc[25] is the non-absorbed bytes xored into the state */
451
+ while (mlen + s_inc[25] >= r) {
452
+ for (i = 0; i < r - (uint32_t)s_inc[25]; i++) {
453
+ /* Take the i'th byte from message
454
+ xor with the s_inc[25] + i'th byte of the state; little-endian */
455
+ s_inc[(s_inc[25] + i) >> 3] ^= (uint64_t)m[i] << (8 * ((s_inc[25] + i) & 0x07));
456
+ }
457
+ mlen -= (size_t)(r - s_inc[25]);
458
+ m += r - s_inc[25];
459
+ s_inc[25] = 0;
460
+
461
+ KeccakF1600_StatePermute(s_inc);
462
+ }
463
+
464
+ for (i = 0; i < mlen; i++) {
465
+ s_inc[(s_inc[25] + i) >> 3] ^= (uint64_t)m[i] << (8 * ((s_inc[25] + i) & 0x07));
466
+ }
467
+ s_inc[25] += mlen;
468
+ }
469
+
470
+ /*************************************************
471
+ * Name: keccak_inc_finalize
472
+ *
473
+ * Description: Finalizes Keccak absorb phase, prepares for squeezing
474
+ *
475
+ * Arguments: - uint64_t *s_inc: pointer to input/output incremental state
476
+ * First 25 values represent Keccak state.
477
+ * 26th value represents either the number of absorbed bytes
478
+ * that have not been permuted, or not-yet-squeezed bytes.
479
+ * - uint32_t r: rate in bytes (e.g., 168 for SHAKE128)
480
+ * - uint8_t p: domain-separation byte for different
481
+ * Keccak-derived functions
482
+ **************************************************/
483
+ static void keccak_inc_finalize(uint64_t *s_inc, uint32_t r, uint8_t p) {
484
+ /* After keccak_inc_absorb, we are guaranteed that s_inc[25] < r,
485
+ so we can always use one more byte for p in the current state. */
486
+ s_inc[s_inc[25] >> 3] ^= (uint64_t)p << (8 * (s_inc[25] & 0x07));
487
+ s_inc[(r - 1) >> 3] ^= (uint64_t)128 << (8 * ((r - 1) & 0x07));
488
+ s_inc[25] = 0;
489
+ }
490
+
491
+ /*************************************************
492
+ * Name: keccak_inc_squeeze
493
+ *
494
+ * Description: Incremental Keccak squeeze; can be called on byte-level
495
+ *
496
+ * Arguments: - uint8_t *h: pointer to output bytes
497
+ * - size_t outlen: number of bytes to be squeezed
498
+ * - uint64_t *s_inc: pointer to input/output incremental state
499
+ * First 25 values represent Keccak state.
500
+ * 26th value represents either the number of absorbed bytes
501
+ * that have not been permuted, or not-yet-squeezed bytes.
502
+ * - uint32_t r: rate in bytes (e.g., 168 for SHAKE128)
503
+ **************************************************/
504
+ static void keccak_inc_squeeze(uint8_t *h, size_t outlen,
505
+ uint64_t *s_inc, uint32_t r) {
506
+ size_t i;
507
+
508
+ /* First consume any bytes we still have sitting around */
509
+ for (i = 0; i < outlen && i < s_inc[25]; i++) {
510
+ /* There are s_inc[25] bytes left, so r - s_inc[25] is the first
511
+ available byte. We consume from there, i.e., up to r. */
512
+ h[i] = (uint8_t)(s_inc[(r - s_inc[25] + i) >> 3] >> (8 * ((r - s_inc[25] + i) & 0x07)));
513
+ }
514
+ h += i;
515
+ outlen -= i;
516
+ s_inc[25] -= i;
517
+
518
+ /* Then squeeze the remaining necessary blocks */
519
+ while (outlen > 0) {
520
+ KeccakF1600_StatePermute(s_inc);
521
+
522
+ for (i = 0; i < outlen && i < r; i++) {
523
+ h[i] = (uint8_t)(s_inc[i >> 3] >> (8 * (i & 0x07)));
524
+ }
525
+ h += i;
526
+ outlen -= i;
527
+ s_inc[25] = r - i;
528
+ }
529
+ }
530
+
531
+ void shake128_inc_init(shake128incctx *state) {
532
+ keccak_inc_init(state->ctx);
533
+ }
534
+
535
+ void shake128_inc_absorb(shake128incctx *state, const uint8_t *input, size_t inlen) {
536
+ keccak_inc_absorb(state->ctx, SHAKE128_RATE, input, inlen);
537
+ }
538
+
539
+ void shake128_inc_finalize(shake128incctx *state) {
540
+ keccak_inc_finalize(state->ctx, SHAKE128_RATE, 0x1F);
541
+ }
542
+
543
+ void shake128_inc_squeeze(uint8_t *output, size_t outlen, shake128incctx *state) {
544
+ keccak_inc_squeeze(output, outlen, state->ctx, SHAKE128_RATE);
545
+ }
546
+
547
+ void shake128_inc_ctx_clone(shake128incctx *dest, const shake128incctx *src) {
548
+ memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES);
549
+ }
550
+
551
+ void shake128_inc_ctx_release(shake128incctx *state) {
552
+ clear_state(state->ctx, 26);
553
+ }
554
+
555
+ void shake256_inc_init(shake256incctx *state) {
556
+ keccak_inc_init(state->ctx);
557
+ }
558
+
559
+ void shake256_inc_absorb(shake256incctx *state, const uint8_t *input, size_t inlen) {
560
+ keccak_inc_absorb(state->ctx, SHAKE256_RATE, input, inlen);
561
+ }
562
+
563
+ void shake256_inc_finalize(shake256incctx *state) {
564
+ keccak_inc_finalize(state->ctx, SHAKE256_RATE, 0x1F);
565
+ }
566
+
567
+ void shake256_inc_squeeze(uint8_t *output, size_t outlen, shake256incctx *state) {
568
+ keccak_inc_squeeze(output, outlen, state->ctx, SHAKE256_RATE);
569
+ }
570
+
571
+ void shake256_inc_ctx_clone(shake256incctx *dest, const shake256incctx *src) {
572
+ memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES);
573
+ }
574
+
575
+ void shake256_inc_ctx_release(shake256incctx *state) {
576
+ clear_state(state->ctx, 26);
577
+ }
578
+
579
+ /*************************************************
580
+ * Name: shake128_absorb
581
+ *
582
+ * Description: Absorb step of the SHAKE128 XOF.
583
+ * non-incremental, starts by zeroeing the state.
584
+ *
585
+ * Arguments: - uint64_t *s: pointer to (uninitialized) output Keccak state
586
+ * - const uint8_t *input: pointer to input to be absorbed
587
+ * into s
588
+ * - size_t inlen: length of input in bytes
589
+ **************************************************/
590
+ void shake128_absorb(shake128ctx *state, const uint8_t *input, size_t inlen) {
591
+ keccak_absorb(state->ctx, SHAKE128_RATE, input, inlen, 0x1F);
592
+ }
593
+
594
+ /*************************************************
595
+ * Name: shake128_squeezeblocks
596
+ *
597
+ * Description: Squeeze step of SHAKE128 XOF. Squeezes full blocks of
598
+ * SHAKE128_RATE bytes each. Modifies the state. Can be called
599
+ * multiple times to keep squeezing, i.e., is incremental.
600
+ *
601
+ * Arguments: - uint8_t *output: pointer to output blocks
602
+ * - size_t nblocks: number of blocks to be squeezed
603
+ * (written to output)
604
+ * - shake128ctx *state: pointer to input/output Keccak state
605
+ **************************************************/
606
+ void shake128_squeezeblocks(uint8_t *output, size_t nblocks, shake128ctx *state) {
607
+ keccak_squeezeblocks(output, nblocks, state->ctx, SHAKE128_RATE);
608
+ }
609
+
610
+ void shake128_ctx_clone(shake128ctx *dest, const shake128ctx *src) {
611
+ memcpy(dest->ctx, src->ctx, PQC_SHAKECTX_BYTES);
612
+ }
613
+
614
+ /** Release the allocated state. Call only once. */
615
+ void shake128_ctx_release(shake128ctx *state) {
616
+ clear_state(state->ctx, 25);
617
+ }
618
+
619
+ /*************************************************
620
+ * Name: shake256_absorb
621
+ *
622
+ * Description: Absorb step of the SHAKE256 XOF.
623
+ * non-incremental, starts by zeroeing the state.
624
+ *
625
+ * Arguments: - shake256ctx *state: pointer to (uninitialized) output Keccak state
626
+ * - const uint8_t *input: pointer to input to be absorbed
627
+ * into s
628
+ * - size_t inlen: length of input in bytes
629
+ **************************************************/
630
+ void shake256_absorb(shake256ctx *state, const uint8_t *input, size_t inlen) {
631
+ keccak_absorb(state->ctx, SHAKE256_RATE, input, inlen, 0x1F);
632
+ }
633
+
634
+ /*************************************************
635
+ * Name: shake256_squeezeblocks
636
+ *
637
+ * Description: Squeeze step of SHAKE256 XOF. Squeezes full blocks of
638
+ * SHAKE256_RATE bytes each. Modifies the state. Can be called
639
+ * multiple times to keep squeezing, i.e., is incremental.
640
+ *
641
+ * Arguments: - uint8_t *output: pointer to output blocks
642
+ * - size_t nblocks: number of blocks to be squeezed
643
+ * (written to output)
644
+ * - shake256ctx *state: pointer to input/output Keccak state
645
+ **************************************************/
646
+ void shake256_squeezeblocks(uint8_t *output, size_t nblocks, shake256ctx *state) {
647
+ keccak_squeezeblocks(output, nblocks, state->ctx, SHAKE256_RATE);
648
+ }
649
+
650
+ void shake256_ctx_clone(shake256ctx *dest, const shake256ctx *src) {
651
+ memcpy(dest->ctx, src->ctx, PQC_SHAKECTX_BYTES);
652
+ }
653
+
654
+ /** Release the allocated state. Call only once. */
655
+ void shake256_ctx_release(shake256ctx *state) {
656
+ clear_state(state->ctx, 25);
657
+ }
658
+
659
+ /*************************************************
660
+ * Name: shake128
661
+ *
662
+ * Description: SHAKE128 XOF with non-incremental API
663
+ *
664
+ * Arguments: - uint8_t *output: pointer to output
665
+ * - size_t outlen: requested output length in bytes
666
+ * - const uint8_t *input: pointer to input
667
+ * - size_t inlen: length of input in bytes
668
+ **************************************************/
669
+ void shake128(uint8_t *output, size_t outlen,
670
+ const uint8_t *input, size_t inlen) {
671
+ size_t nblocks = outlen / SHAKE128_RATE;
672
+ uint8_t t[SHAKE128_RATE];
673
+ shake128ctx s;
674
+
675
+ shake128_absorb(&s, input, inlen);
676
+ shake128_squeezeblocks(output, nblocks, &s);
677
+
678
+ output += nblocks * SHAKE128_RATE;
679
+ outlen -= nblocks * SHAKE128_RATE;
680
+
681
+ if (outlen) {
682
+ shake128_squeezeblocks(t, 1, &s);
683
+ for (size_t i = 0; i < outlen; ++i) {
684
+ output[i] = t[i];
685
+ }
686
+ }
687
+ shake128_ctx_release(&s);
688
+ }
689
+
690
+ /*************************************************
691
+ * Name: shake256
692
+ *
693
+ * Description: SHAKE256 XOF with non-incremental API
694
+ *
695
+ * Arguments: - uint8_t *output: pointer to output
696
+ * - size_t outlen: requested output length in bytes
697
+ * - const uint8_t *input: pointer to input
698
+ * - size_t inlen: length of input in bytes
699
+ **************************************************/
700
+ void shake256(uint8_t *output, size_t outlen,
701
+ const uint8_t *input, size_t inlen) {
702
+ size_t nblocks = outlen / SHAKE256_RATE;
703
+ uint8_t t[SHAKE256_RATE];
704
+ shake256ctx s;
705
+
706
+ shake256_absorb(&s, input, inlen);
707
+ shake256_squeezeblocks(output, nblocks, &s);
708
+
709
+ output += nblocks * SHAKE256_RATE;
710
+ outlen -= nblocks * SHAKE256_RATE;
711
+
712
+ if (outlen) {
713
+ shake256_squeezeblocks(t, 1, &s);
714
+ for (size_t i = 0; i < outlen; ++i) {
715
+ output[i] = t[i];
716
+ }
717
+ }
718
+ shake256_ctx_release(&s);
719
+ }
720
+
721
+ void sha3_256_inc_init(sha3_256incctx *state) {
722
+ keccak_inc_init(state->ctx);
723
+ }
724
+
725
+ void sha3_256_inc_ctx_clone(sha3_256incctx *dest, const sha3_256incctx *src) {
726
+ memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES);
727
+ }
728
+
729
+ void sha3_256_inc_ctx_release(sha3_256incctx *state) {
730
+ clear_state(state->ctx, 26);
731
+ }
732
+
733
+ void sha3_256_inc_absorb(sha3_256incctx *state, const uint8_t *input, size_t inlen) {
734
+ keccak_inc_absorb(state->ctx, SHA3_256_RATE, input, inlen);
735
+ }
736
+
737
+ void sha3_256_inc_finalize(uint8_t *output, sha3_256incctx *state) {
738
+ uint8_t t[SHA3_256_RATE];
739
+ keccak_inc_finalize(state->ctx, SHA3_256_RATE, 0x06);
740
+
741
+ keccak_squeezeblocks(t, 1, state->ctx, SHA3_256_RATE);
742
+
743
+ sha3_256_inc_ctx_release(state);
744
+
745
+ for (size_t i = 0; i < 32; i++) {
746
+ output[i] = t[i];
747
+ }
748
+ }
749
+
750
+ /*************************************************
751
+ * Name: sha3_256
752
+ *
753
+ * Description: SHA3-256 with non-incremental API
754
+ *
755
+ * Arguments: - uint8_t *output: pointer to output
756
+ * - const uint8_t *input: pointer to input
757
+ * - size_t inlen: length of input in bytes
758
+ **************************************************/
759
+ void sha3_256(uint8_t *output, const uint8_t *input, size_t inlen) {
760
+ uint64_t s[25];
761
+ uint8_t t[SHA3_256_RATE];
762
+
763
+ /* Absorb input */
764
+ keccak_absorb(s, SHA3_256_RATE, input, inlen, 0x06);
765
+
766
+ /* Squeeze output */
767
+ keccak_squeezeblocks(t, 1, s, SHA3_256_RATE);
768
+
769
+ for (size_t i = 0; i < 32; i++) {
770
+ output[i] = t[i];
771
+ }
772
+ }
773
+
774
+ void sha3_384_inc_init(sha3_384incctx *state) {
775
+ keccak_inc_init(state->ctx);
776
+ }
777
+
778
+ void sha3_384_inc_ctx_clone(sha3_384incctx *dest, const sha3_384incctx *src) {
779
+ memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES);
780
+ }
781
+
782
+ void sha3_384_inc_absorb(sha3_384incctx *state, const uint8_t *input, size_t inlen) {
783
+ keccak_inc_absorb(state->ctx, SHA3_384_RATE, input, inlen);
784
+ }
785
+
786
+ void sha3_384_inc_ctx_release(sha3_384incctx *state) {
787
+ clear_state(state->ctx, 26);
788
+ }
789
+
790
+ void sha3_384_inc_finalize(uint8_t *output, sha3_384incctx *state) {
791
+ uint8_t t[SHA3_384_RATE];
792
+ keccak_inc_finalize(state->ctx, SHA3_384_RATE, 0x06);
793
+
794
+ keccak_squeezeblocks(t, 1, state->ctx, SHA3_384_RATE);
795
+
796
+ sha3_384_inc_ctx_release(state);
797
+
798
+ for (size_t i = 0; i < 48; i++) {
799
+ output[i] = t[i];
800
+ }
801
+ }
802
+
803
+ /*************************************************
804
+ * Name: sha3_384
805
+ *
806
+ * Description: SHA3-256 with non-incremental API
807
+ *
808
+ * Arguments: - uint8_t *output: pointer to output
809
+ * - const uint8_t *input: pointer to input
810
+ * - size_t inlen: length of input in bytes
811
+ **************************************************/
812
+ void sha3_384(uint8_t *output, const uint8_t *input, size_t inlen) {
813
+ uint64_t s[25];
814
+ uint8_t t[SHA3_384_RATE];
815
+
816
+ /* Absorb input */
817
+ keccak_absorb(s, SHA3_384_RATE, input, inlen, 0x06);
818
+
819
+ /* Squeeze output */
820
+ keccak_squeezeblocks(t, 1, s, SHA3_384_RATE);
821
+
822
+ for (size_t i = 0; i < 48; i++) {
823
+ output[i] = t[i];
824
+ }
825
+ }
826
+
827
+ void sha3_512_inc_init(sha3_512incctx *state) {
828
+ keccak_inc_init(state->ctx);
829
+ }
830
+
831
+ void sha3_512_inc_ctx_clone(sha3_512incctx *dest, const sha3_512incctx *src) {
832
+ memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES);
833
+ }
834
+
835
+ void sha3_512_inc_absorb(sha3_512incctx *state, const uint8_t *input, size_t inlen) {
836
+ keccak_inc_absorb(state->ctx, SHA3_512_RATE, input, inlen);
837
+ }
838
+
839
+ void sha3_512_inc_ctx_release(sha3_512incctx *state) {
840
+ clear_state(state->ctx, 26);
841
+ }
842
+
843
+ void sha3_512_inc_finalize(uint8_t *output, sha3_512incctx *state) {
844
+ uint8_t t[SHA3_512_RATE];
845
+ keccak_inc_finalize(state->ctx, SHA3_512_RATE, 0x06);
846
+
847
+ keccak_squeezeblocks(t, 1, state->ctx, SHA3_512_RATE);
848
+
849
+ sha3_512_inc_ctx_release(state);
850
+
851
+ for (size_t i = 0; i < 64; i++) {
852
+ output[i] = t[i];
853
+ }
854
+ }
855
+
856
+ /*************************************************
857
+ * Name: sha3_512
858
+ *
859
+ * Description: SHA3-512 with non-incremental API
860
+ *
861
+ * Arguments: - uint8_t *output: pointer to output
862
+ * - const uint8_t *input: pointer to input
863
+ * - size_t inlen: length of input in bytes
864
+ **************************************************/
865
+ void sha3_512(uint8_t *output, const uint8_t *input, size_t inlen) {
866
+ uint64_t s[25];
867
+ uint8_t t[SHA3_512_RATE];
868
+
869
+ /* Absorb input */
870
+ keccak_absorb(s, SHA3_512_RATE, input, inlen, 0x06);
871
+
872
+ /* Squeeze output */
873
+ keccak_squeezeblocks(t, 1, s, SHA3_512_RATE);
874
+
875
+ for (size_t i = 0; i < 64; i++) {
876
+ output[i] = t[i];
877
+ }
878
+ }