2 * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #include <openssl/e_os2.h>
14 #define ROL32(a, offset) (((a) << (offset)) | ((a) >> ((32 - (offset)) & 31)))
16 static uint64_t ROL64(uint64_t val, int offset)
20 } else if (sizeof(void *) == 8) {
21 return (val << offset) | (val >> (64-offset));
23 uint32_t hi = (uint32_t)(val >> 32), lo = (uint32_t)val;
29 hi = ROL32(lo, offset);
30 lo = ROL32(tmp, offset + 1);
33 lo = ROL32(lo, offset);
34 hi = ROL32(hi, offset);
37 return ((uint64_t)hi << 32) | lo;
41 static const unsigned char rhotates[5][5] = {
43 { 36, 44, 6, 55, 20 },
44 { 3, 10, 43, 25, 39 },
45 { 41, 45, 15, 21, 8 },
49 static const uint64_t iotas[] = {
50 sizeof(void *) == 8 ? 0x0000000000000001U : 0x0000000000000001U,
51 sizeof(void *) == 8 ? 0x0000000000008082U : 0x0000008900000000U,
52 sizeof(void *) == 8 ? 0x800000000000808aU : 0x8000008b00000000U,
53 sizeof(void *) == 8 ? 0x8000000080008000U : 0x8000808000000000U,
54 sizeof(void *) == 8 ? 0x000000000000808bU : 0x0000008b00000001U,
55 sizeof(void *) == 8 ? 0x0000000080000001U : 0x0000800000000001U,
56 sizeof(void *) == 8 ? 0x8000000080008081U : 0x8000808800000001U,
57 sizeof(void *) == 8 ? 0x8000000000008009U : 0x8000008200000001U,
58 sizeof(void *) == 8 ? 0x000000000000008aU : 0x0000000b00000000U,
59 sizeof(void *) == 8 ? 0x0000000000000088U : 0x0000000a00000000U,
60 sizeof(void *) == 8 ? 0x0000000080008009U : 0x0000808200000001U,
61 sizeof(void *) == 8 ? 0x000000008000000aU : 0x0000800300000000U,
62 sizeof(void *) == 8 ? 0x000000008000808bU : 0x0000808b00000001U,
63 sizeof(void *) == 8 ? 0x800000000000008bU : 0x8000000b00000001U,
64 sizeof(void *) == 8 ? 0x8000000000008089U : 0x8000008a00000001U,
65 sizeof(void *) == 8 ? 0x8000000000008003U : 0x8000008100000001U,
66 sizeof(void *) == 8 ? 0x8000000000008002U : 0x8000008100000000U,
67 sizeof(void *) == 8 ? 0x8000000000000080U : 0x8000000800000000U,
68 sizeof(void *) == 8 ? 0x000000000000800aU : 0x0000008300000000U,
69 sizeof(void *) == 8 ? 0x800000008000000aU : 0x8000800300000000U,
70 sizeof(void *) == 8 ? 0x8000000080008081U : 0x8000808800000001U,
71 sizeof(void *) == 8 ? 0x8000000000008080U : 0x8000008800000000U,
72 sizeof(void *) == 8 ? 0x0000000080000001U : 0x0000800000000001U,
73 sizeof(void *) == 8 ? 0x8000000080008008U : 0x8000808200000000U
76 #if defined(KECCAK_REF)
78 * This is straightforward or "maximum clarity" implementation aiming
79 * to resemble section 3.2 of the FIPS PUB 202 "SHA-3 Standard:
80 * Permutation-Based Hash and Extendible-Output Functions" as much as
81 * possible. With one caveat. Because of the way C stores matrices,
82 * references to A[x,y] in the specification are presented as A[y][x].
83 * Implementation unrolls inner x-loops so that modulo 5 operations are
84 * explicitly pre-computed.
86 static void Theta(uint64_t A[5][5])
97 for (y = 1; y < 5; y++) {
105 D[0] = ROL64(C[1], 1) ^ C[4];
106 D[1] = ROL64(C[2], 1) ^ C[0];
107 D[2] = ROL64(C[3], 1) ^ C[1];
108 D[3] = ROL64(C[4], 1) ^ C[2];
109 D[4] = ROL64(C[0], 1) ^ C[3];
111 for (y = 0; y < 5; y++) {
120 static void Rho(uint64_t A[5][5])
124 for (y = 0; y < 5; y++) {
125 A[y][0] = ROL64(A[y][0], rhotates[y][0]);
126 A[y][1] = ROL64(A[y][1], rhotates[y][1]);
127 A[y][2] = ROL64(A[y][2], rhotates[y][2]);
128 A[y][3] = ROL64(A[y][3], rhotates[y][3]);
129 A[y][4] = ROL64(A[y][4], rhotates[y][4]);
133 static void Pi(uint64_t A[5][5])
139 * A[y][x] = T[x][(3*y+x)%5]
141 memcpy(T, A, sizeof(T));
174 static void Chi(uint64_t A[5][5])
179 for (y = 0; y < 5; y++) {
180 C[0] = A[y][0] ^ (~A[y][1] & A[y][2]);
181 C[1] = A[y][1] ^ (~A[y][2] & A[y][3]);
182 C[2] = A[y][2] ^ (~A[y][3] & A[y][4]);
183 C[3] = A[y][3] ^ (~A[y][4] & A[y][0]);
184 C[4] = A[y][4] ^ (~A[y][0] & A[y][1]);
194 static void Iota(uint64_t A[5][5], size_t i)
196 assert(i < (sizeof(iotas) / sizeof(iotas[0])));
200 void KeccakF1600(uint64_t A[5][5])
204 for (i = 0; i < 24; i++) {
213 #elif defined(KECCAK_1X)
215 * This implementation is optimization of above code featuring unroll
216 * of even y-loops, their fusion and code motion. It also minimizes
217 * temporary storage. Compiler would normally do all these things for
218 * you, purpose of manual optimization is to provide "unobscured"
219 * reference for assembly implementation [in case this approach is
220 * chosen for implementation on some platform]. In the nutshell it's
221 * equivalent of "plane-per-plane processing" approach discussed in
222 * section 2.4 of "Keccak implementation overview".
224 static void Round(uint64_t A[5][5], size_t i)
226 uint64_t C[5], E[2]; /* registers */
227 uint64_t D[5], T[2][5]; /* memory */
229 assert(i < (sizeof(iotas) / sizeof(iotas[0])));
231 C[0] = A[0][0] ^ A[1][0] ^ A[2][0] ^ A[3][0] ^ A[4][0];
232 C[1] = A[0][1] ^ A[1][1] ^ A[2][1] ^ A[3][1] ^ A[4][1];
233 C[2] = A[0][2] ^ A[1][2] ^ A[2][2] ^ A[3][2] ^ A[4][2];
234 C[3] = A[0][3] ^ A[1][3] ^ A[2][3] ^ A[3][3] ^ A[4][3];
235 C[4] = A[0][4] ^ A[1][4] ^ A[2][4] ^ A[3][4] ^ A[4][4];
238 D[1] = E[0] = ROL64(C[2], 1) ^ C[0];
239 D[4] = E[1] = ROL64(C[0], 1) ^ C[3];
240 D[0] = C[0] = ROL64(C[1], 1) ^ C[4];
241 D[2] = C[1] = ROL64(C[3], 1) ^ C[1];
242 D[3] = C[2] = ROL64(C[4], 1) ^ C[2];
244 T[0][0] = A[3][0] ^ C[0]; /* borrow T[0][0] */
245 T[0][1] = A[0][1] ^ E[0]; /* D[1] */
246 T[0][2] = A[0][2] ^ C[1]; /* D[2] */
247 T[0][3] = A[0][3] ^ C[2]; /* D[3] */
248 T[0][4] = A[0][4] ^ E[1]; /* D[4] */
250 C[3] = ROL64(A[3][3] ^ C[2], rhotates[3][3]); /* D[3] */
251 C[4] = ROL64(A[4][4] ^ E[1], rhotates[4][4]); /* D[4] */
252 C[0] = A[0][0] ^ C[0]; /* rotate by 0 */ /* D[0] */
253 C[2] = ROL64(A[2][2] ^ C[1], rhotates[2][2]); /* D[2] */
254 C[1] = ROL64(A[1][1] ^ E[0], rhotates[1][1]); /* D[1] */
256 D[0] = ROL64(C[1], 1) ^ C[4];
257 D[1] = ROL64(C[2], 1) ^ C[0];
258 D[2] = ROL64(C[3], 1) ^ C[1];
259 D[3] = ROL64(C[4], 1) ^ C[2];
260 D[4] = ROL64(C[0], 1) ^ C[3];
262 T[0][0] = A[3][0] ^ D[0]; /* borrow T[0][0] */
263 T[0][1] = A[0][1] ^ D[1];
264 T[0][2] = A[0][2] ^ D[2];
265 T[0][3] = A[0][3] ^ D[3];
266 T[0][4] = A[0][4] ^ D[4];
268 C[0] = A[0][0] ^ D[0]; /* rotate by 0 */
269 C[1] = ROL64(A[1][1] ^ D[1], rhotates[1][1]);
270 C[2] = ROL64(A[2][2] ^ D[2], rhotates[2][2]);
271 C[3] = ROL64(A[3][3] ^ D[3], rhotates[3][3]);
272 C[4] = ROL64(A[4][4] ^ D[4], rhotates[4][4]);
274 A[0][0] = C[0] ^ (~C[1] & C[2]) ^ iotas[i];
275 A[0][1] = C[1] ^ (~C[2] & C[3]);
276 A[0][2] = C[2] ^ (~C[3] & C[4]);
277 A[0][3] = C[3] ^ (~C[4] & C[0]);
278 A[0][4] = C[4] ^ (~C[0] & C[1]);
280 T[1][0] = A[1][0] ^ (C[3] = D[0]);
281 T[1][1] = A[2][1] ^ (C[4] = D[1]); /* borrow T[1][1] */
282 T[1][2] = A[1][2] ^ (E[0] = D[2]);
283 T[1][3] = A[1][3] ^ (E[1] = D[3]);
284 T[1][4] = A[2][4] ^ (C[2] = D[4]); /* borrow T[1][4] */
286 C[0] = ROL64(T[0][3], rhotates[0][3]);
287 C[1] = ROL64(A[1][4] ^ C[2], rhotates[1][4]); /* D[4] */
288 C[2] = ROL64(A[2][0] ^ C[3], rhotates[2][0]); /* D[0] */
289 C[3] = ROL64(A[3][1] ^ C[4], rhotates[3][1]); /* D[1] */
290 C[4] = ROL64(A[4][2] ^ E[0], rhotates[4][2]); /* D[2] */
292 A[1][0] = C[0] ^ (~C[1] & C[2]);
293 A[1][1] = C[1] ^ (~C[2] & C[3]);
294 A[1][2] = C[2] ^ (~C[3] & C[4]);
295 A[1][3] = C[3] ^ (~C[4] & C[0]);
296 A[1][4] = C[4] ^ (~C[0] & C[1]);
298 C[0] = ROL64(T[0][1], rhotates[0][1]);
299 C[1] = ROL64(T[1][2], rhotates[1][2]);
300 C[2] = ROL64(A[2][3] ^ D[3], rhotates[2][3]);
301 C[3] = ROL64(A[3][4] ^ D[4], rhotates[3][4]);
302 C[4] = ROL64(A[4][0] ^ D[0], rhotates[4][0]);
304 A[2][0] = C[0] ^ (~C[1] & C[2]);
305 A[2][1] = C[1] ^ (~C[2] & C[3]);
306 A[2][2] = C[2] ^ (~C[3] & C[4]);
307 A[2][3] = C[3] ^ (~C[4] & C[0]);
308 A[2][4] = C[4] ^ (~C[0] & C[1]);
310 C[0] = ROL64(T[0][4], rhotates[0][4]);
311 C[1] = ROL64(T[1][0], rhotates[1][0]);
312 C[2] = ROL64(T[1][1], rhotates[2][1]); /* originally A[2][1] */
313 C[3] = ROL64(A[3][2] ^ D[2], rhotates[3][2]);
314 C[4] = ROL64(A[4][3] ^ D[3], rhotates[4][3]);
316 A[3][0] = C[0] ^ (~C[1] & C[2]);
317 A[3][1] = C[1] ^ (~C[2] & C[3]);
318 A[3][2] = C[2] ^ (~C[3] & C[4]);
319 A[3][3] = C[3] ^ (~C[4] & C[0]);
320 A[3][4] = C[4] ^ (~C[0] & C[1]);
322 C[0] = ROL64(T[0][2], rhotates[0][2]);
323 C[1] = ROL64(T[1][3], rhotates[1][3]);
324 C[2] = ROL64(T[1][4], rhotates[2][4]); /* originally A[2][4] */
325 C[3] = ROL64(T[0][0], rhotates[3][0]); /* originally A[3][0] */
326 C[4] = ROL64(A[4][1] ^ D[1], rhotates[4][1]);
328 A[4][0] = C[0] ^ (~C[1] & C[2]);
329 A[4][1] = C[1] ^ (~C[2] & C[3]);
330 A[4][2] = C[2] ^ (~C[3] & C[4]);
331 A[4][3] = C[3] ^ (~C[4] & C[0]);
332 A[4][4] = C[4] ^ (~C[0] & C[1]);
335 void KeccakF1600(uint64_t A[5][5])
339 for (i = 0; i < 24; i++) {
344 #elif defined(KECCAK_2X)
346 * This implementation is variant of KECCAK_1X above with outer-most
347 * round loop unrolled twice. This allows to take temporary storage
348 * out of round procedure and simplify references to it by alternating
349 * it with actual data (see round loop below). Just like original, it's
350 * rather meant as reference for an assembly implementation. It's likely
351 * to provide best instruction per processed byte ratio at minimal
352 * round unroll factor...
354 static void Round(uint64_t R[5][5], uint64_t A[5][5], size_t i)
358 assert(i < (sizeof(iotas) / sizeof(iotas[0])));
360 C[0] = A[0][0] ^ A[1][0] ^ A[2][0] ^ A[3][0] ^ A[4][0];
361 C[1] = A[0][1] ^ A[1][1] ^ A[2][1] ^ A[3][1] ^ A[4][1];
362 C[2] = A[0][2] ^ A[1][2] ^ A[2][2] ^ A[3][2] ^ A[4][2];
363 C[3] = A[0][3] ^ A[1][3] ^ A[2][3] ^ A[3][3] ^ A[4][3];
364 C[4] = A[0][4] ^ A[1][4] ^ A[2][4] ^ A[3][4] ^ A[4][4];
366 D[0] = ROL64(C[1], 1) ^ C[4];
367 D[1] = ROL64(C[2], 1) ^ C[0];
368 D[2] = ROL64(C[3], 1) ^ C[1];
369 D[3] = ROL64(C[4], 1) ^ C[2];
370 D[4] = ROL64(C[0], 1) ^ C[3];
372 C[0] = A[0][0] ^ D[0]; /* rotate by 0 */
373 C[1] = ROL64(A[1][1] ^ D[1], rhotates[1][1]);
374 C[2] = ROL64(A[2][2] ^ D[2], rhotates[2][2]);
375 C[3] = ROL64(A[3][3] ^ D[3], rhotates[3][3]);
376 C[4] = ROL64(A[4][4] ^ D[4], rhotates[4][4]);
378 #ifdef KECCAK_COMPLEMENTING_TRANSFORM
379 R[0][0] = C[0] ^ ( C[1] | C[2]) ^ iotas[i];
380 R[0][1] = C[1] ^ (~C[2] | C[3]);
381 R[0][2] = C[2] ^ ( C[3] & C[4]);
382 R[0][3] = C[3] ^ ( C[4] | C[0]);
383 R[0][4] = C[4] ^ ( C[0] & C[1]);
385 R[0][0] = C[0] ^ (~C[1] & C[2]) ^ iotas[i];
386 R[0][1] = C[1] ^ (~C[2] & C[3]);
387 R[0][2] = C[2] ^ (~C[3] & C[4]);
388 R[0][3] = C[3] ^ (~C[4] & C[0]);
389 R[0][4] = C[4] ^ (~C[0] & C[1]);
392 C[0] = ROL64(A[0][3] ^ D[3], rhotates[0][3]);
393 C[1] = ROL64(A[1][4] ^ D[4], rhotates[1][4]);
394 C[2] = ROL64(A[2][0] ^ D[0], rhotates[2][0]);
395 C[3] = ROL64(A[3][1] ^ D[1], rhotates[3][1]);
396 C[4] = ROL64(A[4][2] ^ D[2], rhotates[4][2]);
398 #ifdef KECCAK_COMPLEMENTING_TRANSFORM
399 R[1][0] = C[0] ^ (C[1] | C[2]);
400 R[1][1] = C[1] ^ (C[2] & C[3]);
401 R[1][2] = C[2] ^ (C[3] | ~C[4]);
402 R[1][3] = C[3] ^ (C[4] | C[0]);
403 R[1][4] = C[4] ^ (C[0] & C[1]);
405 R[1][0] = C[0] ^ (~C[1] & C[2]);
406 R[1][1] = C[1] ^ (~C[2] & C[3]);
407 R[1][2] = C[2] ^ (~C[3] & C[4]);
408 R[1][3] = C[3] ^ (~C[4] & C[0]);
409 R[1][4] = C[4] ^ (~C[0] & C[1]);
412 C[0] = ROL64(A[0][1] ^ D[1], rhotates[0][1]);
413 C[1] = ROL64(A[1][2] ^ D[2], rhotates[1][2]);
414 C[2] = ROL64(A[2][3] ^ D[3], rhotates[2][3]);
415 C[3] = ROL64(A[3][4] ^ D[4], rhotates[3][4]);
416 C[4] = ROL64(A[4][0] ^ D[0], rhotates[4][0]);
418 #ifdef KECCAK_COMPLEMENTING_TRANSFORM
419 R[2][0] = C[0] ^ ( C[1] | C[2]);
420 R[2][1] = C[1] ^ ( C[2] & C[3]);
421 R[2][2] = C[2] ^ (~C[3] & C[4]);
422 R[2][3] = ~C[3] ^ ( C[4] | C[0]);
423 R[2][4] = C[4] ^ ( C[0] & C[1]);
425 R[2][0] = C[0] ^ (~C[1] & C[2]);
426 R[2][1] = C[1] ^ (~C[2] & C[3]);
427 R[2][2] = C[2] ^ (~C[3] & C[4]);
428 R[2][3] = C[3] ^ (~C[4] & C[0]);
429 R[2][4] = C[4] ^ (~C[0] & C[1]);
432 C[0] = ROL64(A[0][4] ^ D[4], rhotates[0][4]);
433 C[1] = ROL64(A[1][0] ^ D[0], rhotates[1][0]);
434 C[2] = ROL64(A[2][1] ^ D[1], rhotates[2][1]);
435 C[3] = ROL64(A[3][2] ^ D[2], rhotates[3][2]);
436 C[4] = ROL64(A[4][3] ^ D[3], rhotates[4][3]);
438 #ifdef KECCAK_COMPLEMENTING_TRANSFORM
439 R[3][0] = C[0] ^ ( C[1] & C[2]);
440 R[3][1] = C[1] ^ ( C[2] | C[3]);
441 R[3][2] = C[2] ^ (~C[3] | C[4]);
442 R[3][3] = ~C[3] ^ ( C[4] & C[0]);
443 R[3][4] = C[4] ^ ( C[0] | C[1]);
445 R[3][0] = C[0] ^ (~C[1] & C[2]);
446 R[3][1] = C[1] ^ (~C[2] & C[3]);
447 R[3][2] = C[2] ^ (~C[3] & C[4]);
448 R[3][3] = C[3] ^ (~C[4] & C[0]);
449 R[3][4] = C[4] ^ (~C[0] & C[1]);
452 C[0] = ROL64(A[0][2] ^ D[2], rhotates[0][2]);
453 C[1] = ROL64(A[1][3] ^ D[3], rhotates[1][3]);
454 C[2] = ROL64(A[2][4] ^ D[4], rhotates[2][4]);
455 C[3] = ROL64(A[3][0] ^ D[0], rhotates[3][0]);
456 C[4] = ROL64(A[4][1] ^ D[1], rhotates[4][1]);
458 #ifdef KECCAK_COMPLEMENTING_TRANSFORM
459 R[4][0] = C[0] ^ (~C[1] & C[2]);
460 R[4][1] = ~C[1] ^ ( C[2] | C[3]);
461 R[4][2] = C[2] ^ ( C[3] & C[4]);
462 R[4][3] = C[3] ^ ( C[4] | C[0]);
463 R[4][4] = C[4] ^ ( C[0] & C[1]);
465 R[4][0] = C[0] ^ (~C[1] & C[2]);
466 R[4][1] = C[1] ^ (~C[2] & C[3]);
467 R[4][2] = C[2] ^ (~C[3] & C[4]);
468 R[4][3] = C[3] ^ (~C[4] & C[0]);
469 R[4][4] = C[4] ^ (~C[0] & C[1]);
473 void KeccakF1600(uint64_t A[5][5])
478 #ifdef KECCAK_COMPLEMENTING_TRANSFORM
487 for (i = 0; i < 24; i += 2) {
492 #ifdef KECCAK_COMPLEMENTING_TRANSFORM
504 * This implementation is KECCAK_1X from above combined 4 times with
505 * a twist that allows to omit temporary storage and perform in-place
506 * processing. It's discussed in section 2.5 of "Keccak implementation
507 * overview". It's likely to be best suited for processors with large
510 static void FourRounds(uint64_t A[5][5], size_t i)
512 uint64_t B[5], C[5], D[5];
514 assert(i <= (sizeof(iotas) / sizeof(iotas[0]) - 4));
517 C[0] = A[0][0] ^ A[1][0] ^ A[2][0] ^ A[3][0] ^ A[4][0];
518 C[1] = A[0][1] ^ A[1][1] ^ A[2][1] ^ A[3][1] ^ A[4][1];
519 C[2] = A[0][2] ^ A[1][2] ^ A[2][2] ^ A[3][2] ^ A[4][2];
520 C[3] = A[0][3] ^ A[1][3] ^ A[2][3] ^ A[3][3] ^ A[4][3];
521 C[4] = A[0][4] ^ A[1][4] ^ A[2][4] ^ A[3][4] ^ A[4][4];
523 D[0] = ROL64(C[1], 1) ^ C[4];
524 D[1] = ROL64(C[2], 1) ^ C[0];
525 D[2] = ROL64(C[3], 1) ^ C[1];
526 D[3] = ROL64(C[4], 1) ^ C[2];
527 D[4] = ROL64(C[0], 1) ^ C[3];
529 B[0] = A[0][0] ^ D[0]; /* rotate by 0 */
530 B[1] = ROL64(A[1][1] ^ D[1], rhotates[1][1]);
531 B[2] = ROL64(A[2][2] ^ D[2], rhotates[2][2]);
532 B[3] = ROL64(A[3][3] ^ D[3], rhotates[3][3]);
533 B[4] = ROL64(A[4][4] ^ D[4], rhotates[4][4]);
535 C[0] = A[0][0] = B[0] ^ (~B[1] & B[2]) ^ iotas[i];
536 C[1] = A[1][1] = B[1] ^ (~B[2] & B[3]);
537 C[2] = A[2][2] = B[2] ^ (~B[3] & B[4]);
538 C[3] = A[3][3] = B[3] ^ (~B[4] & B[0]);
539 C[4] = A[4][4] = B[4] ^ (~B[0] & B[1]);
541 B[0] = ROL64(A[0][3] ^ D[3], rhotates[0][3]);
542 B[1] = ROL64(A[1][4] ^ D[4], rhotates[1][4]);
543 B[2] = ROL64(A[2][0] ^ D[0], rhotates[2][0]);
544 B[3] = ROL64(A[3][1] ^ D[1], rhotates[3][1]);
545 B[4] = ROL64(A[4][2] ^ D[2], rhotates[4][2]);
547 C[0] ^= A[2][0] = B[0] ^ (~B[1] & B[2]);
548 C[1] ^= A[3][1] = B[1] ^ (~B[2] & B[3]);
549 C[2] ^= A[4][2] = B[2] ^ (~B[3] & B[4]);
550 C[3] ^= A[0][3] = B[3] ^ (~B[4] & B[0]);
551 C[4] ^= A[1][4] = B[4] ^ (~B[0] & B[1]);
553 B[0] = ROL64(A[0][1] ^ D[1], rhotates[0][1]);
554 B[1] = ROL64(A[1][2] ^ D[2], rhotates[1][2]);
555 B[2] = ROL64(A[2][3] ^ D[3], rhotates[2][3]);
556 B[3] = ROL64(A[3][4] ^ D[4], rhotates[3][4]);
557 B[4] = ROL64(A[4][0] ^ D[0], rhotates[4][0]);
559 C[0] ^= A[4][0] = B[0] ^ (~B[1] & B[2]);
560 C[1] ^= A[0][1] = B[1] ^ (~B[2] & B[3]);
561 C[2] ^= A[1][2] = B[2] ^ (~B[3] & B[4]);
562 C[3] ^= A[2][3] = B[3] ^ (~B[4] & B[0]);
563 C[4] ^= A[3][4] = B[4] ^ (~B[0] & B[1]);
565 B[0] = ROL64(A[0][4] ^ D[4], rhotates[0][4]);
566 B[1] = ROL64(A[1][0] ^ D[0], rhotates[1][0]);
567 B[2] = ROL64(A[2][1] ^ D[1], rhotates[2][1]);
568 B[3] = ROL64(A[3][2] ^ D[2], rhotates[3][2]);
569 B[4] = ROL64(A[4][3] ^ D[3], rhotates[4][3]);
571 C[0] ^= A[1][0] = B[0] ^ (~B[1] & B[2]);
572 C[1] ^= A[2][1] = B[1] ^ (~B[2] & B[3]);
573 C[2] ^= A[3][2] = B[2] ^ (~B[3] & B[4]);
574 C[3] ^= A[4][3] = B[3] ^ (~B[4] & B[0]);
575 C[4] ^= A[0][4] = B[4] ^ (~B[0] & B[1]);
577 B[0] = ROL64(A[0][2] ^ D[2], rhotates[0][2]);
578 B[1] = ROL64(A[1][3] ^ D[3], rhotates[1][3]);
579 B[2] = ROL64(A[2][4] ^ D[4], rhotates[2][4]);
580 B[3] = ROL64(A[3][0] ^ D[0], rhotates[3][0]);
581 B[4] = ROL64(A[4][1] ^ D[1], rhotates[4][1]);
583 C[0] ^= A[3][0] = B[0] ^ (~B[1] & B[2]);
584 C[1] ^= A[4][1] = B[1] ^ (~B[2] & B[3]);
585 C[2] ^= A[0][2] = B[2] ^ (~B[3] & B[4]);
586 C[3] ^= A[1][3] = B[3] ^ (~B[4] & B[0]);
587 C[4] ^= A[2][4] = B[4] ^ (~B[0] & B[1]);
590 D[0] = ROL64(C[1], 1) ^ C[4];
591 D[1] = ROL64(C[2], 1) ^ C[0];
592 D[2] = ROL64(C[3], 1) ^ C[1];
593 D[3] = ROL64(C[4], 1) ^ C[2];
594 D[4] = ROL64(C[0], 1) ^ C[3];
596 B[0] = A[0][0] ^ D[0]; /* rotate by 0 */
597 B[1] = ROL64(A[3][1] ^ D[1], rhotates[1][1]);
598 B[2] = ROL64(A[1][2] ^ D[2], rhotates[2][2]);
599 B[3] = ROL64(A[4][3] ^ D[3], rhotates[3][3]);
600 B[4] = ROL64(A[2][4] ^ D[4], rhotates[4][4]);
602 C[0] = A[0][0] = B[0] ^ (~B[1] & B[2]) ^ iotas[i + 1];
603 C[1] = A[3][1] = B[1] ^ (~B[2] & B[3]);
604 C[2] = A[1][2] = B[2] ^ (~B[3] & B[4]);
605 C[3] = A[4][3] = B[3] ^ (~B[4] & B[0]);
606 C[4] = A[2][4] = B[4] ^ (~B[0] & B[1]);
608 B[0] = ROL64(A[3][3] ^ D[3], rhotates[0][3]);
609 B[1] = ROL64(A[1][4] ^ D[4], rhotates[1][4]);
610 B[2] = ROL64(A[4][0] ^ D[0], rhotates[2][0]);
611 B[3] = ROL64(A[2][1] ^ D[1], rhotates[3][1]);
612 B[4] = ROL64(A[0][2] ^ D[2], rhotates[4][2]);
614 C[0] ^= A[4][0] = B[0] ^ (~B[1] & B[2]);
615 C[1] ^= A[2][1] = B[1] ^ (~B[2] & B[3]);
616 C[2] ^= A[0][2] = B[2] ^ (~B[3] & B[4]);
617 C[3] ^= A[3][3] = B[3] ^ (~B[4] & B[0]);
618 C[4] ^= A[1][4] = B[4] ^ (~B[0] & B[1]);
620 B[0] = ROL64(A[1][1] ^ D[1], rhotates[0][1]);
621 B[1] = ROL64(A[4][2] ^ D[2], rhotates[1][2]);
622 B[2] = ROL64(A[2][3] ^ D[3], rhotates[2][3]);
623 B[3] = ROL64(A[0][4] ^ D[4], rhotates[3][4]);
624 B[4] = ROL64(A[3][0] ^ D[0], rhotates[4][0]);
626 C[0] ^= A[3][0] = B[0] ^ (~B[1] & B[2]);
627 C[1] ^= A[1][1] = B[1] ^ (~B[2] & B[3]);
628 C[2] ^= A[4][2] = B[2] ^ (~B[3] & B[4]);
629 C[3] ^= A[2][3] = B[3] ^ (~B[4] & B[0]);
630 C[4] ^= A[0][4] = B[4] ^ (~B[0] & B[1]);
632 B[0] = ROL64(A[4][4] ^ D[4], rhotates[0][4]);
633 B[1] = ROL64(A[2][0] ^ D[0], rhotates[1][0]);
634 B[2] = ROL64(A[0][1] ^ D[1], rhotates[2][1]);
635 B[3] = ROL64(A[3][2] ^ D[2], rhotates[3][2]);
636 B[4] = ROL64(A[1][3] ^ D[3], rhotates[4][3]);
638 C[0] ^= A[2][0] = B[0] ^ (~B[1] & B[2]);
639 C[1] ^= A[0][1] = B[1] ^ (~B[2] & B[3]);
640 C[2] ^= A[3][2] = B[2] ^ (~B[3] & B[4]);
641 C[3] ^= A[1][3] = B[3] ^ (~B[4] & B[0]);
642 C[4] ^= A[4][4] = B[4] ^ (~B[0] & B[1]);
644 B[0] = ROL64(A[2][2] ^ D[2], rhotates[0][2]);
645 B[1] = ROL64(A[0][3] ^ D[3], rhotates[1][3]);
646 B[2] = ROL64(A[3][4] ^ D[4], rhotates[2][4]);
647 B[3] = ROL64(A[1][0] ^ D[0], rhotates[3][0]);
648 B[4] = ROL64(A[4][1] ^ D[1], rhotates[4][1]);
650 C[0] ^= A[1][0] = B[0] ^ (~B[1] & B[2]);
651 C[1] ^= A[4][1] = B[1] ^ (~B[2] & B[3]);
652 C[2] ^= A[2][2] = B[2] ^ (~B[3] & B[4]);
653 C[3] ^= A[0][3] = B[3] ^ (~B[4] & B[0]);
654 C[4] ^= A[3][4] = B[4] ^ (~B[0] & B[1]);
657 D[0] = ROL64(C[1], 1) ^ C[4];
658 D[1] = ROL64(C[2], 1) ^ C[0];
659 D[2] = ROL64(C[3], 1) ^ C[1];
660 D[3] = ROL64(C[4], 1) ^ C[2];
661 D[4] = ROL64(C[0], 1) ^ C[3];
663 B[0] = A[0][0] ^ D[0]; /* rotate by 0 */
664 B[1] = ROL64(A[2][1] ^ D[1], rhotates[1][1]);
665 B[2] = ROL64(A[4][2] ^ D[2], rhotates[2][2]);
666 B[3] = ROL64(A[1][3] ^ D[3], rhotates[3][3]);
667 B[4] = ROL64(A[3][4] ^ D[4], rhotates[4][4]);
669 C[0] = A[0][0] = B[0] ^ (~B[1] & B[2]) ^ iotas[i + 2];
670 C[1] = A[2][1] = B[1] ^ (~B[2] & B[3]);
671 C[2] = A[4][2] = B[2] ^ (~B[3] & B[4]);
672 C[3] = A[1][3] = B[3] ^ (~B[4] & B[0]);
673 C[4] = A[3][4] = B[4] ^ (~B[0] & B[1]);
675 B[0] = ROL64(A[4][3] ^ D[3], rhotates[0][3]);
676 B[1] = ROL64(A[1][4] ^ D[4], rhotates[1][4]);
677 B[2] = ROL64(A[3][0] ^ D[0], rhotates[2][0]);
678 B[3] = ROL64(A[0][1] ^ D[1], rhotates[3][1]);
679 B[4] = ROL64(A[2][2] ^ D[2], rhotates[4][2]);
681 C[0] ^= A[3][0] = B[0] ^ (~B[1] & B[2]);
682 C[1] ^= A[0][1] = B[1] ^ (~B[2] & B[3]);
683 C[2] ^= A[2][2] = B[2] ^ (~B[3] & B[4]);
684 C[3] ^= A[4][3] = B[3] ^ (~B[4] & B[0]);
685 C[4] ^= A[1][4] = B[4] ^ (~B[0] & B[1]);
687 B[0] = ROL64(A[3][1] ^ D[1], rhotates[0][1]);
688 B[1] = ROL64(A[0][2] ^ D[2], rhotates[1][2]);
689 B[2] = ROL64(A[2][3] ^ D[3], rhotates[2][3]);
690 B[3] = ROL64(A[4][4] ^ D[4], rhotates[3][4]);
691 B[4] = ROL64(A[1][0] ^ D[0], rhotates[4][0]);
693 C[0] ^= A[1][0] = B[0] ^ (~B[1] & B[2]);
694 C[1] ^= A[3][1] = B[1] ^ (~B[2] & B[3]);
695 C[2] ^= A[0][2] = B[2] ^ (~B[3] & B[4]);
696 C[3] ^= A[2][3] = B[3] ^ (~B[4] & B[0]);
697 C[4] ^= A[4][4] = B[4] ^ (~B[0] & B[1]);
699 B[0] = ROL64(A[2][4] ^ D[4], rhotates[0][4]);
700 B[1] = ROL64(A[4][0] ^ D[0], rhotates[1][0]);
701 B[2] = ROL64(A[1][1] ^ D[1], rhotates[2][1]);
702 B[3] = ROL64(A[3][2] ^ D[2], rhotates[3][2]);
703 B[4] = ROL64(A[0][3] ^ D[3], rhotates[4][3]);
705 C[0] ^= A[4][0] = B[0] ^ (~B[1] & B[2]);
706 C[1] ^= A[1][1] = B[1] ^ (~B[2] & B[3]);
707 C[2] ^= A[3][2] = B[2] ^ (~B[3] & B[4]);
708 C[3] ^= A[0][3] = B[3] ^ (~B[4] & B[0]);
709 C[4] ^= A[2][4] = B[4] ^ (~B[0] & B[1]);
711 B[0] = ROL64(A[1][2] ^ D[2], rhotates[0][2]);
712 B[1] = ROL64(A[3][3] ^ D[3], rhotates[1][3]);
713 B[2] = ROL64(A[0][4] ^ D[4], rhotates[2][4]);
714 B[3] = ROL64(A[2][0] ^ D[0], rhotates[3][0]);
715 B[4] = ROL64(A[4][1] ^ D[1], rhotates[4][1]);
717 C[0] ^= A[2][0] = B[0] ^ (~B[1] & B[2]);
718 C[1] ^= A[4][1] = B[1] ^ (~B[2] & B[3]);
719 C[2] ^= A[1][2] = B[2] ^ (~B[3] & B[4]);
720 C[3] ^= A[3][3] = B[3] ^ (~B[4] & B[0]);
721 C[4] ^= A[0][4] = B[4] ^ (~B[0] & B[1]);
724 D[0] = ROL64(C[1], 1) ^ C[4];
725 D[1] = ROL64(C[2], 1) ^ C[0];
726 D[2] = ROL64(C[3], 1) ^ C[1];
727 D[3] = ROL64(C[4], 1) ^ C[2];
728 D[4] = ROL64(C[0], 1) ^ C[3];
730 B[0] = A[0][0] ^ D[0]; /* rotate by 0 */
731 B[1] = ROL64(A[0][1] ^ D[1], rhotates[1][1]);
732 B[2] = ROL64(A[0][2] ^ D[2], rhotates[2][2]);
733 B[3] = ROL64(A[0][3] ^ D[3], rhotates[3][3]);
734 B[4] = ROL64(A[0][4] ^ D[4], rhotates[4][4]);
736 /* C[0] = */ A[0][0] = B[0] ^ (~B[1] & B[2]) ^ iotas[i + 3];
737 /* C[1] = */ A[0][1] = B[1] ^ (~B[2] & B[3]);
738 /* C[2] = */ A[0][2] = B[2] ^ (~B[3] & B[4]);
739 /* C[3] = */ A[0][3] = B[3] ^ (~B[4] & B[0]);
740 /* C[4] = */ A[0][4] = B[4] ^ (~B[0] & B[1]);
742 B[0] = ROL64(A[1][3] ^ D[3], rhotates[0][3]);
743 B[1] = ROL64(A[1][4] ^ D[4], rhotates[1][4]);
744 B[2] = ROL64(A[1][0] ^ D[0], rhotates[2][0]);
745 B[3] = ROL64(A[1][1] ^ D[1], rhotates[3][1]);
746 B[4] = ROL64(A[1][2] ^ D[2], rhotates[4][2]);
748 /* C[0] ^= */ A[1][0] = B[0] ^ (~B[1] & B[2]);
749 /* C[1] ^= */ A[1][1] = B[1] ^ (~B[2] & B[3]);
750 /* C[2] ^= */ A[1][2] = B[2] ^ (~B[3] & B[4]);
751 /* C[3] ^= */ A[1][3] = B[3] ^ (~B[4] & B[0]);
752 /* C[4] ^= */ A[1][4] = B[4] ^ (~B[0] & B[1]);
754 B[0] = ROL64(A[2][1] ^ D[1], rhotates[0][1]);
755 B[1] = ROL64(A[2][2] ^ D[2], rhotates[1][2]);
756 B[2] = ROL64(A[2][3] ^ D[3], rhotates[2][3]);
757 B[3] = ROL64(A[2][4] ^ D[4], rhotates[3][4]);
758 B[4] = ROL64(A[2][0] ^ D[0], rhotates[4][0]);
760 /* C[0] ^= */ A[2][0] = B[0] ^ (~B[1] & B[2]);
761 /* C[1] ^= */ A[2][1] = B[1] ^ (~B[2] & B[3]);
762 /* C[2] ^= */ A[2][2] = B[2] ^ (~B[3] & B[4]);
763 /* C[3] ^= */ A[2][3] = B[3] ^ (~B[4] & B[0]);
764 /* C[4] ^= */ A[2][4] = B[4] ^ (~B[0] & B[1]);
766 B[0] = ROL64(A[3][4] ^ D[4], rhotates[0][4]);
767 B[1] = ROL64(A[3][0] ^ D[0], rhotates[1][0]);
768 B[2] = ROL64(A[3][1] ^ D[1], rhotates[2][1]);
769 B[3] = ROL64(A[3][2] ^ D[2], rhotates[3][2]);
770 B[4] = ROL64(A[3][3] ^ D[3], rhotates[4][3]);
772 /* C[0] ^= */ A[3][0] = B[0] ^ (~B[1] & B[2]);
773 /* C[1] ^= */ A[3][1] = B[1] ^ (~B[2] & B[3]);
774 /* C[2] ^= */ A[3][2] = B[2] ^ (~B[3] & B[4]);
775 /* C[3] ^= */ A[3][3] = B[3] ^ (~B[4] & B[0]);
776 /* C[4] ^= */ A[3][4] = B[4] ^ (~B[0] & B[1]);
778 B[0] = ROL64(A[4][2] ^ D[2], rhotates[0][2]);
779 B[1] = ROL64(A[4][3] ^ D[3], rhotates[1][3]);
780 B[2] = ROL64(A[4][4] ^ D[4], rhotates[2][4]);
781 B[3] = ROL64(A[4][0] ^ D[0], rhotates[3][0]);
782 B[4] = ROL64(A[4][1] ^ D[1], rhotates[4][1]);
784 /* C[0] ^= */ A[4][0] = B[0] ^ (~B[1] & B[2]);
785 /* C[1] ^= */ A[4][1] = B[1] ^ (~B[2] & B[3]);
786 /* C[2] ^= */ A[4][2] = B[2] ^ (~B[3] & B[4]);
787 /* C[3] ^= */ A[4][3] = B[3] ^ (~B[4] & B[0]);
788 /* C[4] ^= */ A[4][4] = B[4] ^ (~B[0] & B[1]);
791 void KeccakF1600(uint64_t A[5][5])
795 for (i = 0; i < 24; i += 4) {
802 static uint64_t BitInterleave(uint64_t Ai)
804 if (sizeof(void *) < 8) {
805 uint32_t hi = 0, lo = 0;
808 for (j = 0; j < 32; j++) {
809 lo |= ((uint32_t)(Ai >> (2 * j)) & 1) << j;
810 hi |= ((uint32_t)(Ai >> (2 * j + 1)) & 1) << j;
813 Ai = ((uint64_t)hi << 32) | lo;
819 static uint64_t BitDeinterleave(uint64_t Ai)
821 if (sizeof(void *) < 8) {
822 uint32_t hi = (uint32_t)(Ai >> 32), lo = (uint32_t)Ai;
826 for (j = 0; j < 32; j++) {
827 Ai |= (uint64_t)((lo >> j) & 1) << (2 * j);
828 Ai |= (uint64_t)((hi >> j) & 1) << (2 * j + 1);
836 * SHA3_absorb can be called multiple times, but at each invocation
837 * largest multiple of |r| out of |len| bytes are processed. Then
838 * remaining amount of bytes is returned. This is done to spare caller
839 * trouble of calculating the largest multiple of |r|. |r| can be viewed
840 * as blocksize. It is commonly (1600 - 256*n)/8, e.g. 168, 136, 104,
841 * 72, but can also be (1600 - 448)/8 = 144. All this means that message
842 * padding and intermediate sub-block buffering, byte- or bitwise, is
843 * caller's reponsibility.
845 size_t SHA3_absorb(uint64_t A[5][5], const unsigned char *inp, size_t len,
848 uint64_t *A_flat = (uint64_t *)A;
851 assert(r < (25 * sizeof(A[0][0])) && (r % 8) == 0);
854 for (i = 0; i < w; i++) {
855 uint64_t Ai = (uint64_t)inp[0] | (uint64_t)inp[1] << 8 |
856 (uint64_t)inp[2] << 16 | (uint64_t)inp[3] << 24 |
857 (uint64_t)inp[4] << 32 | (uint64_t)inp[5] << 40 |
858 (uint64_t)inp[6] << 48 | (uint64_t)inp[7] << 56;
861 A_flat[i] ^= BitInterleave(Ai);
871 * SHA3_squeeze is called once at the end to generate |out| hash value
874 void SHA3_squeeze(uint64_t A[5][5], unsigned char *out, size_t len, size_t r)
876 uint64_t *A_flat = (uint64_t *)A;
877 size_t i, rem, w = r / 8;
879 assert(r < (25 * sizeof(A[0][0])) && (r % 8) == 0);
882 for (i = 0; i < w; i++) {
883 uint64_t Ai = BitDeinterleave(A_flat[i]);
885 out[0] = (unsigned char)(Ai);
886 out[1] = (unsigned char)(Ai >> 8);
887 out[2] = (unsigned char)(Ai >> 16);
888 out[3] = (unsigned char)(Ai >> 24);
889 out[4] = (unsigned char)(Ai >> 32);
890 out[5] = (unsigned char)(Ai >> 40);
891 out[6] = (unsigned char)(Ai >> 48);
892 out[7] = (unsigned char)(Ai >> 56);
903 for (i = 0; i < len; i++) {
904 uint64_t Ai = BitDeinterleave(A_flat[i]);
906 out[0] = (unsigned char)(Ai);
907 out[1] = (unsigned char)(Ai >> 8);
908 out[2] = (unsigned char)(Ai >> 16);
909 out[3] = (unsigned char)(Ai >> 24);
910 out[4] = (unsigned char)(Ai >> 32);
911 out[5] = (unsigned char)(Ai >> 40);
912 out[6] = (unsigned char)(Ai >> 48);
913 out[7] = (unsigned char)(Ai >> 56);
918 uint64_t Ai = BitDeinterleave(A_flat[i]);
920 for (i = 0; i < rem; i++) {
921 *out++ = (unsigned char)Ai;
929 * Post-padding one-shot implementations would look as following:
931 * SHA3_224 SHA3_sponge(inp, len, out, 224/8, (1600-448)/8);
932 * SHA3_256 SHA3_sponge(inp, len, out, 256/8, (1600-512)/8);
933 * SHA3_384 SHA3_sponge(inp, len, out, 384/8, (1600-768)/8);
934 * SHA3_512 SHA3_sponge(inp, len, out, 512/8, (1600-1024)/8);
935 * SHAKE_128 SHA3_sponge(inp, len, out, d, (1600-256)/8);
936 * SHAKE_256 SHA3_sponge(inp, len, out, d, (1600-512)/8);
939 void SHA3_sponge(const unsigned char *inp, size_t len,
940 unsigned char *out, size_t d, size_t r)
944 memset(A, 0, sizeof(A));
945 SHA3_absorb(A, inp, len, r);
946 SHA3_squeeze(A, out, d, r);
954 * This is 5-bit SHAKE128 test from http://csrc.nist.gov/groups/ST/toolkit/examples.html#aHashing
956 unsigned char test[168] = { '\xf3', '\x3' };
957 unsigned char out[512];
959 static const unsigned char result[512] = {
960 0x2E, 0x0A, 0xBF, 0xBA, 0x83, 0xE6, 0x72, 0x0B,
961 0xFB, 0xC2, 0x25, 0xFF, 0x6B, 0x7A, 0xB9, 0xFF,
962 0xCE, 0x58, 0xBA, 0x02, 0x7E, 0xE3, 0xD8, 0x98,
963 0x76, 0x4F, 0xEF, 0x28, 0x7D, 0xDE, 0xCC, 0xCA,
964 0x3E, 0x6E, 0x59, 0x98, 0x41, 0x1E, 0x7D, 0xDB,
965 0x32, 0xF6, 0x75, 0x38, 0xF5, 0x00, 0xB1, 0x8C,
966 0x8C, 0x97, 0xC4, 0x52, 0xC3, 0x70, 0xEA, 0x2C,
967 0xF0, 0xAF, 0xCA, 0x3E, 0x05, 0xDE, 0x7E, 0x4D,
968 0xE2, 0x7F, 0xA4, 0x41, 0xA9, 0xCB, 0x34, 0xFD,
969 0x17, 0xC9, 0x78, 0xB4, 0x2D, 0x5B, 0x7E, 0x7F,
970 0x9A, 0xB1, 0x8F, 0xFE, 0xFF, 0xC3, 0xC5, 0xAC,
971 0x2F, 0x3A, 0x45, 0x5E, 0xEB, 0xFD, 0xC7, 0x6C,
972 0xEA, 0xEB, 0x0A, 0x2C, 0xCA, 0x22, 0xEE, 0xF6,
973 0xE6, 0x37, 0xF4, 0xCA, 0xBE, 0x5C, 0x51, 0xDE,
974 0xD2, 0xE3, 0xFA, 0xD8, 0xB9, 0x52, 0x70, 0xA3,
975 0x21, 0x84, 0x56, 0x64, 0xF1, 0x07, 0xD1, 0x64,
976 0x96, 0xBB, 0x7A, 0xBF, 0xBE, 0x75, 0x04, 0xB6,
977 0xED, 0xE2, 0xE8, 0x9E, 0x4B, 0x99, 0x6F, 0xB5,
978 0x8E, 0xFD, 0xC4, 0x18, 0x1F, 0x91, 0x63, 0x38,
979 0x1C, 0xBE, 0x7B, 0xC0, 0x06, 0xA7, 0xA2, 0x05,
980 0x98, 0x9C, 0x52, 0x6C, 0xD1, 0xBD, 0x68, 0x98,
981 0x36, 0x93, 0xB4, 0xBD, 0xC5, 0x37, 0x28, 0xB2,
982 0x41, 0xC1, 0xCF, 0xF4, 0x2B, 0xB6, 0x11, 0x50,
983 0x2C, 0x35, 0x20, 0x5C, 0xAB, 0xB2, 0x88, 0x75,
984 0x56, 0x55, 0xD6, 0x20, 0xC6, 0x79, 0x94, 0xF0,
985 0x64, 0x51, 0x18, 0x7F, 0x6F, 0xD1, 0x7E, 0x04,
986 0x66, 0x82, 0xBA, 0x12, 0x86, 0x06, 0x3F, 0xF8,
987 0x8F, 0xE2, 0x50, 0x8D, 0x1F, 0xCA, 0xF9, 0x03,
988 0x5A, 0x12, 0x31, 0xAD, 0x41, 0x50, 0xA9, 0xC9,
989 0xB2, 0x4C, 0x9B, 0x2D, 0x66, 0xB2, 0xAD, 0x1B,
990 0xDE, 0x0B, 0xD0, 0xBB, 0xCB, 0x8B, 0xE0, 0x5B,
991 0x83, 0x52, 0x29, 0xEF, 0x79, 0x19, 0x73, 0x73,
992 0x23, 0x42, 0x44, 0x01, 0xE1, 0xD8, 0x37, 0xB6,
993 0x6E, 0xB4, 0xE6, 0x30, 0xFF, 0x1D, 0xE7, 0x0C,
994 0xB3, 0x17, 0xC2, 0xBA, 0xCB, 0x08, 0x00, 0x1D,
995 0x34, 0x77, 0xB7, 0xA7, 0x0A, 0x57, 0x6D, 0x20,
996 0x86, 0x90, 0x33, 0x58, 0x9D, 0x85, 0xA0, 0x1D,
997 0xDB, 0x2B, 0x66, 0x46, 0xC0, 0x43, 0xB5, 0x9F,
998 0xC0, 0x11, 0x31, 0x1D, 0xA6, 0x66, 0xFA, 0x5A,
999 0xD1, 0xD6, 0x38, 0x7F, 0xA9, 0xBC, 0x40, 0x15,
1000 0xA3, 0x8A, 0x51, 0xD1, 0xDA, 0x1E, 0xA6, 0x1D,
1001 0x64, 0x8D, 0xC8, 0xE3, 0x9A, 0x88, 0xB9, 0xD6,
1002 0x22, 0xBD, 0xE2, 0x07, 0xFD, 0xAB, 0xC6, 0xF2,
1003 0x82, 0x7A, 0x88, 0x0C, 0x33, 0x0B, 0xBF, 0x6D,
1004 0xF7, 0x33, 0x77, 0x4B, 0x65, 0x3E, 0x57, 0x30,
1005 0x5D, 0x78, 0xDC, 0xE1, 0x12, 0xF1, 0x0A, 0x2C,
1006 0x71, 0xF4, 0xCD, 0xAD, 0x92, 0xED, 0x11, 0x3E,
1007 0x1C, 0xEA, 0x63, 0xB9, 0x19, 0x25, 0xED, 0x28,
1008 0x19, 0x1E, 0x6D, 0xBB, 0xB5, 0xAA, 0x5A, 0x2A,
1009 0xFD, 0xA5, 0x1F, 0xC0, 0x5A, 0x3A, 0xF5, 0x25,
1010 0x8B, 0x87, 0x66, 0x52, 0x43, 0x55, 0x0F, 0x28,
1011 0x94, 0x8A, 0xE2, 0xB8, 0xBE, 0xB6, 0xBC, 0x9C,
1012 0x77, 0x0B, 0x35, 0xF0, 0x67, 0xEA, 0xA6, 0x41,
1013 0xEF, 0xE6, 0x5B, 0x1A, 0x44, 0x90, 0x9D, 0x1B,
1014 0x14, 0x9F, 0x97, 0xEE, 0xA6, 0x01, 0x39, 0x1C,
1015 0x60, 0x9E, 0xC8, 0x1D, 0x19, 0x30, 0xF5, 0x7C,
1016 0x18, 0xA4, 0xE0, 0xFA, 0xB4, 0x91, 0xD1, 0xCA,
1017 0xDF, 0xD5, 0x04, 0x83, 0x44, 0x9E, 0xDC, 0x0F,
1018 0x07, 0xFF, 0xB2, 0x4D, 0x2C, 0x6F, 0x9A, 0x9A,
1019 0x3B, 0xFF, 0x39, 0xAE, 0x3D, 0x57, 0xF5, 0x60,
1020 0x65, 0x4D, 0x7D, 0x75, 0xC9, 0x08, 0xAB, 0xE6,
1021 0x25, 0x64, 0x75, 0x3E, 0xAC, 0x39, 0xD7, 0x50,
1022 0x3D, 0xA6, 0xD3, 0x7C, 0x2E, 0x32, 0xE1, 0xAF,
1023 0x3B, 0x8A, 0xEC, 0x8A, 0xE3, 0x06, 0x9C, 0xD9
1027 SHA3_sponge(test, sizeof(test), out, sizeof(out), sizeof(test));
1030 * Rationale behind keeping output [formatted as below] is that
1031 * one should be able to redirect it to a file, then copy-n-paste
1032 * final "output val" from official example to another file, and
1033 * compare the two with diff(1).
1035 for (i = 0; i < sizeof(out);) {
1036 printf("%02X", out[i]);
1037 printf(++i % 16 && i != sizeof(out) ? " " : "\n");
1040 if (memcmp(out,result,sizeof(out))) {
1041 fprintf(stderr,"failure\n");
1044 fprintf(stderr,"success\n");