0000: 2f 2a 0a 54 68 65 20 4b 65 63 63 61 6b 20 73 70 /*.The Keccak sp
0010: 6f 6e 67 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 onge function, d
0020: 65 73 69 67 6e 65 64 20 62 79 20 47 75 69 64 6f esigned by Guido
0030: 20 42 65 72 74 6f 6e 69 2c 20 4a 6f 61 6e 20 44 Bertoni, Joan D
0040: 61 65 6d 65 6e 2c 0a 4d 69 63 68 61 c3 ab 6c 20 aemen,.Michaël
0050: 50 65 65 74 65 72 73 20 61 6e 64 20 47 69 6c 6c Peeters and Gill
0060: 65 73 20 56 61 6e 20 41 73 73 63 68 65 2e 20 46 es Van Assche. F
0070: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 or more informat
0080: 69 6f 6e 2c 20 66 65 65 64 62 61 63 6b 20 6f 72 ion, feedback or
0090: 0a 71 75 65 73 74 69 6f 6e 73 2c 20 70 6c 65 61 .questions, plea
00a0: 73 65 20 72 65 66 65 72 20 74 6f 20 6f 75 72 20 se refer to our
00b0: 77 65 62 73 69 74 65 3a 20 68 74 74 70 3a 2f 2f website: http://
00c0: 6b 65 63 63 61 6b 2e 6e 6f 65 6b 65 6f 6e 2e 6f keccak.noekeon.o
00d0: 72 67 2f 0a 0a 49 6d 70 6c 65 6d 65 6e 74 61 74 rg/..Implementat
00e0: 69 6f 6e 20 62 79 20 74 68 65 20 64 65 73 69 67 ion by the desig
00f0: 6e 65 72 73 2c 0a 68 65 72 65 62 79 20 64 65 6e ners,.hereby den
0100: 6f 74 65 64 20 61 73 20 22 74 68 65 20 69 6d 70 oted as "the imp
0110: 6c 65 6d 65 6e 74 65 72 22 2e 0a 0a 54 6f 20 74 lementer"...To t
0120: 68 65 20 65 78 74 65 6e 74 20 70 6f 73 73 69 62 he extent possib
0130: 6c 65 20 75 6e 64 65 72 20 6c 61 77 2c 20 74 68 le under law, th
0140: 65 20 69 6d 70 6c 65 6d 65 6e 74 65 72 20 68 61 e implementer ha
0150: 73 20 77 61 69 76 65 64 20 61 6c 6c 20 63 6f 70 s waived all cop
0160: 79 72 69 67 68 74 0a 61 6e 64 20 72 65 6c 61 74 yright.and relat
0170: 65 64 20 6f 72 20 6e 65 69 67 68 62 6f 72 69 6e ed or neighborin
0180: 67 20 72 69 67 68 74 73 20 74 6f 20 74 68 65 20 g rights to the
0190: 73 6f 75 72 63 65 20 63 6f 64 65 20 69 6e 20 74 source code in t
01a0: 68 69 73 20 66 69 6c 65 2e 0a 68 74 74 70 3a 2f his file..http:/
01b0: 2f 63 72 65 61 74 69 76 65 63 6f 6d 6d 6f 6e 73 /creativecommons
01c0: 2e 6f 72 67 2f 70 75 62 6c 69 63 64 6f 6d 61 69 .org/publicdomai
01d0: 6e 2f 7a 65 72 6f 2f 31 2e 30 2f 0a 2a 2f 0a 0a n/zero/1.0/.*/..
01e0: 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 typedef unsigned
01f0: 20 69 6e 74 20 53 54 41 54 45 49 3b 0a 23 69 6e int STATEI;.#in
0200: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e clude <string.h>
0210: 0a 23 69 6e 63 6c 75 64 65 20 22 62 72 67 5f 65 .#include "brg_e
0220: 6e 64 69 61 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 ndian.h".#includ
0230: 65 20 22 4b 65 63 63 61 6b 46 2d 31 36 30 30 2d e "KeccakF-1600-
0240: 6f 70 74 33 32 2d 73 65 74 74 69 6e 67 73 2e 68 opt32-settings.h
0250: 22 0a 23 69 6e 63 6c 75 64 65 20 22 4b 65 63 63 ".#include "Kecc
0260: 61 6b 46 2d 31 36 30 30 2e 68 22 0a 0a 23 69 66 akF-1600.h"..#if
0270: 64 65 66 20 55 73 65 49 6e 74 65 72 6c 65 61 76 def UseInterleav
0280: 65 54 61 62 6c 65 73 0a 69 6e 74 20 69 6e 74 65 eTables.int inte
0290: 72 6c 65 61 76 65 54 61 62 6c 65 73 42 75 69 6c rleaveTablesBuil
02a0: 74 20 3d 20 30 3b 0a 55 49 4e 54 31 36 20 69 6e t = 0;.UINT16 in
02b0: 74 65 72 6c 65 61 76 65 54 61 62 6c 65 5b 36 35 terleaveTable[65
02c0: 35 33 36 5d 3b 0a 55 49 4e 54 31 36 20 64 65 69 536];.UINT16 dei
02d0: 6e 74 65 72 6c 65 61 76 65 54 61 62 6c 65 5b 36 nterleaveTable[6
02e0: 35 35 33 36 5d 3b 0a 0a 76 6f 69 64 20 62 75 69 5536];..void bui
02f0: 6c 64 49 6e 74 65 72 6c 65 61 76 65 54 61 62 6c ldInterleaveTabl
0300: 65 73 28 29 0a 7b 0a 20 20 20 20 55 49 4e 54 33 es().{. UINT3
0310: 32 20 69 2c 20 6a 3b 0a 20 20 20 20 55 49 4e 54 2 i, j;. UINT
0320: 31 36 20 78 3b 0a 0a 20 20 20 20 69 66 20 28 21 16 x;.. if (!
0330: 69 6e 74 65 72 6c 65 61 76 65 54 61 62 6c 65 73 interleaveTables
0340: 42 75 69 6c 74 29 20 7b 0a 20 20 20 20 20 20 20 Built) {.
0350: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 35 35 33 for(i=0; i<6553
0360: 36 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 6; i++) {.
0370: 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 x = 0;.
0380: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 for(j=0
0390: 3b 20 6a 3c 31 36 3b 20 6a 2b 2b 29 20 7b 0a 20 ; j<16; j++) {.
03a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 i
03b0: 66 20 28 69 20 26 20 28 31 20 3c 3c 20 6a 29 29 f (i & (1 << j))
03c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
03d0: 20 20 20 20 20 78 20 7c 3d 20 28 31 20 3c 3c 20 x |= (1 <<
03e0: 28 6a 2f 32 20 2b 20 38 2a 28 6a 25 32 29 29 29 (j/2 + 8*(j%2)))
03f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a ;. }.
0400: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 inte
0410: 72 6c 65 61 76 65 54 61 62 6c 65 5b 69 5d 20 3d rleaveTable[i] =
0420: 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 x;.
0430: 64 65 69 6e 74 65 72 6c 65 61 76 65 54 61 62 6c deinterleaveTabl
0440: 65 5b 78 5d 20 3d 20 28 55 49 4e 54 31 36 29 69 e[x] = (UINT16)i
0450: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
0460: 20 20 20 20 69 6e 74 65 72 6c 65 61 76 65 54 61 interleaveTa
0470: 62 6c 65 73 42 75 69 6c 74 20 3d 20 31 3b 0a 20 blesBuilt = 1;.
0480: 20 20 20 7d 0a 7d 0a 0a 23 69 66 20 28 50 4c 41 }.}..#if (PLA
0490: 54 46 4f 52 4d 5f 42 59 54 45 5f 4f 52 44 45 52 TFORM_BYTE_ORDER
04a0: 20 3d 3d 20 49 53 5f 4c 49 54 54 4c 45 5f 45 4e == IS_LITTLE_EN
04b0: 44 49 41 4e 29 0a 0a 23 64 65 66 69 6e 65 20 78 DIAN)..#define x
04c0: 6f 72 32 62 79 74 65 73 49 6e 74 6f 49 6e 74 65 or2bytesIntoInte
04d0: 72 6c 65 61 76 65 64 57 6f 72 64 73 28 65 76 65 rleavedWords(eve
04e0: 6e 2c 20 6f 64 64 2c 20 73 6f 75 72 63 65 2c 20 n, odd, source,
04f0: 6a 29 20 5c 0a 20 20 20 20 69 23 23 6a 20 3d 20 j) \. i##j =
0500: 69 6e 74 65 72 6c 65 61 76 65 54 61 62 6c 65 5b interleaveTable[
0510: 28 28 63 6f 6e 73 74 20 55 49 4e 54 31 36 2a 29 ((const UINT16*)
0520: 73 6f 75 72 63 65 29 5b 6a 5d 5d 3b 20 5c 0a 20 source)[j]]; \.
0530: 20 20 20 28 28 55 49 4e 54 38 2a 29 65 76 65 6e ((UINT8*)even
0540: 29 5b 6a 5d 20 5e 3d 20 69 23 23 6a 20 26 20 30 )[j] ^= i##j & 0
0550: 78 46 46 3b 20 5c 0a 20 20 20 20 28 28 55 49 4e xFF; \. ((UIN
0560: 54 38 2a 29 6f 64 64 29 5b 6a 5d 20 5e 3d 20 69 T8*)odd)[j] ^= i
0570: 23 23 6a 20 3e 3e 20 38 3b 0a 0a 23 64 65 66 69 ##j >> 8;..#defi
0580: 6e 65 20 73 65 74 49 6e 74 65 72 6c 65 61 76 65 ne setInterleave
0590: 64 57 6f 72 64 73 49 6e 74 6f 32 62 79 74 65 73 dWordsInto2bytes
05a0: 28 64 65 73 74 2c 20 65 76 65 6e 2c 20 6f 64 64 (dest, even, odd
05b0: 2c 20 6a 29 20 5c 0a 20 20 20 20 64 23 23 6a 20 , j) \. d##j
05c0: 3d 20 64 65 69 6e 74 65 72 6c 65 61 76 65 54 61 = deinterleaveTa
05d0: 62 6c 65 5b 28 28 65 76 65 6e 20 3e 3e 20 28 6a ble[((even >> (j
05e0: 2a 38 29 29 20 26 20 30 78 46 46 29 20 5e 20 28 *8)) & 0xFF) ^ (
05f0: 28 28 6f 64 64 20 3e 3e 20 28 6a 2a 38 29 29 20 ((odd >> (j*8))
0600: 26 20 30 78 46 46 29 20 3c 3c 20 38 29 5d 3b 20 & 0xFF) << 8)];
0610: 5c 0a 20 20 20 20 28 28 55 49 4e 54 31 36 2a 29 \. ((UINT16*)
0620: 64 65 73 74 29 5b 6a 5d 20 3d 20 64 23 23 6a 3b dest)[j] = d##j;
0630: 0a 0a 23 65 6c 73 65 20 2f 2f 20 28 50 4c 41 54 ..#else // (PLAT
0640: 46 4f 52 4d 5f 42 59 54 45 5f 4f 52 44 45 52 20 FORM_BYTE_ORDER
0650: 3d 3d 20 49 53 5f 42 49 47 5f 45 4e 44 49 41 4e == IS_BIG_ENDIAN
0660: 29 0a 0a 23 64 65 66 69 6e 65 20 78 6f 72 32 62 )..#define xor2b
0670: 79 74 65 73 49 6e 74 6f 49 6e 74 65 72 6c 65 61 ytesIntoInterlea
0680: 76 65 64 57 6f 72 64 73 28 65 76 65 6e 2c 20 6f vedWords(even, o
0690: 64 64 2c 20 73 6f 75 72 63 65 2c 20 6a 29 20 5c dd, source, j) \
06a0: 0a 20 20 20 20 69 23 23 6a 20 3d 20 69 6e 74 65 . i##j = inte
06b0: 72 6c 65 61 76 65 54 61 62 6c 65 5b 73 6f 75 72 rleaveTable[sour
06c0: 63 65 5b 32 2a 6a 5d 20 5e 20 28 28 55 49 4e 54 ce[2*j] ^ ((UINT
06d0: 31 36 29 73 6f 75 72 63 65 5b 32 2a 6a 2b 31 5d 16)source[2*j+1]
06e0: 20 3c 3c 20 38 29 5d 3b 20 5c 0a 20 20 20 20 2a << 8)]; \. *
06f0: 65 76 65 6e 20 5e 3d 20 28 69 23 23 6a 20 26 20 even ^= (i##j &
0700: 30 78 46 46 29 20 3c 3c 20 28 6a 2a 38 29 3b 20 0xFF) << (j*8);
0710: 5c 0a 20 20 20 20 2a 6f 64 64 20 5e 3d 20 28 28 \. *odd ^= ((
0720: 69 23 23 6a 20 3e 3e 20 38 29 20 26 20 30 78 46 i##j >> 8) & 0xF
0730: 46 29 20 3c 3c 20 28 6a 2a 38 29 3b 0a 0a 23 64 F) << (j*8);..#d
0740: 65 66 69 6e 65 20 73 65 74 49 6e 74 65 72 6c 65 efine setInterle
0750: 61 76 65 64 57 6f 72 64 73 49 6e 74 6f 32 62 79 avedWordsInto2by
0760: 74 65 73 28 64 65 73 74 2c 20 65 76 65 6e 2c 20 tes(dest, even,
0770: 6f 64 64 2c 20 6a 29 20 5c 0a 20 20 20 20 64 23 odd, j) \. d#
0780: 23 6a 20 3d 20 64 65 69 6e 74 65 72 6c 65 61 76 #j = deinterleav
0790: 65 54 61 62 6c 65 5b 28 28 65 76 65 6e 20 3e 3e eTable[((even >>
07a0: 20 28 6a 2a 38 29 29 20 26 20 30 78 46 46 29 20 (j*8)) & 0xFF)
07b0: 5e 20 28 28 28 6f 64 64 20 3e 3e 20 28 6a 2a 38 ^ (((odd >> (j*8
07c0: 29 29 20 26 20 30 78 46 46 29 20 3c 3c 20 38 29 )) & 0xFF) << 8)
07d0: 5d 3b 20 5c 0a 20 20 20 20 64 65 73 74 5b 32 2a ]; \. dest[2*
07e0: 6a 5d 20 3d 20 64 23 23 6a 20 26 20 30 78 46 46 j] = d##j & 0xFF
07f0: 3b 20 5c 0a 20 20 20 20 64 65 73 74 5b 32 2a 6a ; \. dest[2*j
0800: 2b 31 5d 20 3d 20 64 23 23 6a 20 3e 3e 20 38 3b +1] = d##j >> 8;
0810: 0a 0a 23 65 6e 64 69 66 20 2f 2f 20 45 6e 64 69 ..#endif // Endi
0820: 61 6e 6e 65 73 73 0a 0a 76 6f 69 64 20 78 6f 72 anness..void xor
0830: 38 62 79 74 65 73 49 6e 74 6f 49 6e 74 65 72 6c 8bytesIntoInterl
0840: 65 61 76 65 64 57 6f 72 64 73 28 55 49 4e 54 33 eavedWords(UINT3
0850: 32 20 2a 65 76 65 6e 2c 20 55 49 4e 54 33 32 20 2 *even, UINT32
0860: 2a 6f 64 64 2c 20 63 6f 6e 73 74 20 55 49 4e 54 *odd, const UINT
0870: 38 2a 20 73 6f 75 72 63 65 29 0a 7b 0a 20 20 20 8* source).{.
0880: 20 55 49 4e 54 31 36 20 69 30 2c 20 69 31 2c 20 UINT16 i0, i1,
0890: 69 32 2c 20 69 33 3b 0a 0a 20 20 20 20 78 6f 72 i2, i3;.. xor
08a0: 32 62 79 74 65 73 49 6e 74 6f 49 6e 74 65 72 6c 2bytesIntoInterl
08b0: 65 61 76 65 64 57 6f 72 64 73 28 65 76 65 6e 2c eavedWords(even,
08c0: 20 6f 64 64 2c 20 73 6f 75 72 63 65 2c 20 30 29 odd, source, 0)
08d0: 0a 20 20 20 20 78 6f 72 32 62 79 74 65 73 49 6e . xor2bytesIn
08e0: 74 6f 49 6e 74 65 72 6c 65 61 76 65 64 57 6f 72 toInterleavedWor
08f0: 64 73 28 65 76 65 6e 2c 20 6f 64 64 2c 20 73 6f ds(even, odd, so
0900: 75 72 63 65 2c 20 31 29 0a 20 20 20 20 78 6f 72 urce, 1). xor
0910: 32 62 79 74 65 73 49 6e 74 6f 49 6e 74 65 72 6c 2bytesIntoInterl
0920: 65 61 76 65 64 57 6f 72 64 73 28 65 76 65 6e 2c eavedWords(even,
0930: 20 6f 64 64 2c 20 73 6f 75 72 63 65 2c 20 32 29 odd, source, 2)
0940: 0a 20 20 20 20 78 6f 72 32 62 79 74 65 73 49 6e . xor2bytesIn
0950: 74 6f 49 6e 74 65 72 6c 65 61 76 65 64 57 6f 72 toInterleavedWor
0960: 64 73 28 65 76 65 6e 2c 20 6f 64 64 2c 20 73 6f ds(even, odd, so
0970: 75 72 63 65 2c 20 33 29 0a 7d 0a 0a 76 6f 69 64 urce, 3).}..void
0980: 20 78 6f 72 4c 61 6e 65 73 49 6e 74 6f 53 74 61 xorLanesIntoSta
0990: 74 65 28 69 6e 74 20 62 79 74 65 43 6f 75 6e 74 te(int byteCount
09a0: 2c 20 55 49 4e 54 33 32 2a 20 73 74 61 74 65 2c , UINT32* state,
09b0: 20 55 49 4e 54 38 2a 20 69 6e 70 75 74 29 0a 20 UINT8* input).
09c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55 49 4e {. int i;. UIN
09d0: 54 36 34 20 74 6d 70 3d 30 3b 0a 20 20 66 6f 72 T64 tmp=0;. for
09e0: 28 69 3d 30 3b 20 69 3c 28 62 79 74 65 43 6f 75 (i=0; i<(byteCou
09f0: 6e 74 2d 37 29 3b 20 69 2b 3d 38 29 0a 20 20 20 nt-7); i+=8).
0a00: 20 78 6f 72 38 62 79 74 65 73 49 6e 74 6f 49 6e xor8bytesIntoIn
0a10: 74 65 72 6c 65 61 76 65 64 57 6f 72 64 73 28 73 terleavedWords(s
0a20: 74 61 74 65 2b 28 69 3e 3e 32 29 2c 20 73 74 61 tate+(i>>2), sta
0a30: 74 65 2b 28 69 3e 3e 32 29 2b 31 2c 20 69 6e 70 te+(i>>2)+1, inp
0a40: 75 74 2b 69 29 3b 0a 20 20 69 66 28 62 79 74 65 ut+i);. if(byte
0a50: 43 6f 75 6e 74 20 26 20 37 29 20 7b 0a 20 20 20 Count & 7) {.
0a60: 20 6d 65 6d 6d 6f 76 65 28 26 74 6d 70 2c 20 69 memmove(&tmp, i
0a70: 6e 70 75 74 2b 69 2c 20 62 79 74 65 43 6f 75 6e nput+i, byteCoun
0a80: 74 20 26 20 37 29 3b 0a 20 20 20 20 78 6f 72 38 t & 7);. xor8
0a90: 62 79 74 65 73 49 6e 74 6f 49 6e 74 65 72 6c 65 bytesIntoInterle
0aa0: 61 76 65 64 57 6f 72 64 73 28 73 74 61 74 65 2b avedWords(state+
0ab0: 28 69 3e 3e 32 29 2c 20 73 74 61 74 65 2b 28 69 (i>>2), state+(i
0ac0: 3e 3e 32 29 2b 31 2c 20 28 55 49 4e 54 38 2a 29 >>2)+1, (UINT8*)
0ad0: 26 74 6d 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f &tmp);. }.}..vo
0ae0: 69 64 20 73 65 74 49 6e 74 65 72 6c 65 61 76 65 id setInterleave
0af0: 64 57 6f 72 64 73 49 6e 74 6f 38 62 79 74 65 73 dWordsInto8bytes
0b00: 28 55 49 4e 54 38 2a 20 64 65 73 74 2c 20 55 49 (UINT8* dest, UI
0b10: 4e 54 33 32 20 65 76 65 6e 2c 20 55 49 4e 54 33 NT32 even, UINT3
0b20: 32 20 6f 64 64 29 0a 7b 0a 20 20 20 20 55 49 4e 2 odd).{. UIN
0b30: 54 31 36 20 64 30 2c 20 64 31 2c 20 64 32 2c 20 T16 d0, d1, d2,
0b40: 64 33 3b 0a 0a 20 20 20 20 73 65 74 49 6e 74 65 d3;.. setInte
0b50: 72 6c 65 61 76 65 64 57 6f 72 64 73 49 6e 74 6f rleavedWordsInto
0b60: 32 62 79 74 65 73 28 64 65 73 74 2c 20 65 76 65 2bytes(dest, eve
0b70: 6e 2c 20 6f 64 64 2c 20 30 29 0a 20 20 20 20 73 n, odd, 0). s
0b80: 65 74 49 6e 74 65 72 6c 65 61 76 65 64 57 6f 72 etInterleavedWor
0b90: 64 73 49 6e 74 6f 32 62 79 74 65 73 28 64 65 73 dsInto2bytes(des
0ba0: 74 2c 20 65 76 65 6e 2c 20 6f 64 64 2c 20 31 29 t, even, odd, 1)
0bb0: 0a 20 20 20 20 73 65 74 49 6e 74 65 72 6c 65 61 . setInterlea
0bc0: 76 65 64 57 6f 72 64 73 49 6e 74 6f 32 62 79 74 vedWordsInto2byt
0bd0: 65 73 28 64 65 73 74 2c 20 65 76 65 6e 2c 20 6f es(dest, even, o
0be0: 64 64 2c 20 32 29 0a 20 20 20 20 73 65 74 49 6e dd, 2). setIn
0bf0: 74 65 72 6c 65 61 76 65 64 57 6f 72 64 73 49 6e terleavedWordsIn
0c00: 74 6f 32 62 79 74 65 73 28 64 65 73 74 2c 20 65 to2bytes(dest, e
0c10: 76 65 6e 2c 20 6f 64 64 2c 20 33 29 0a 7d 0a 0a ven, odd, 3).}..
0c20: 65 78 74 72 61 63 74 4c 61 6e 65 73 28 69 6e 74 extractLanes(int
0c30: 20 62 79 74 65 43 6f 75 6e 74 2c 20 55 49 4e 54 byteCount, UINT
0c40: 33 32 2a 20 73 74 61 74 65 2c 20 55 49 4e 54 38 32* state, UINT8
0c50: 2a 20 64 61 74 61 29 20 5c 0a 7b 0a 20 20 69 6e * data) \.{. in
0c60: 74 20 69 3b 0a 20 20 55 49 4e 54 36 34 20 74 6d t i;. UINT64 tm
0c70: 70 3d 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 p=0;. for(i=0;
0c80: 69 3c 28 62 79 74 65 43 6f 75 6e 74 2d 37 29 3b i<(byteCount-7);
0c90: 20 69 2b 3d 38 29 20 7b 0a 20 20 20 20 20 20 73 i+=8) {. s
0ca0: 65 74 49 6e 74 65 72 6c 65 61 76 65 64 57 6f 72 etInterleavedWor
0cb0: 64 73 49 6e 74 6f 38 62 79 74 65 73 28 64 61 74 dsInto8bytes(dat
0cc0: 61 2b 69 2c 20 73 74 61 74 65 5b 69 3e 3e 32 5d a+i, state[i>>2]
0cd0: 2c 20 73 74 61 74 65 5b 28 69 3e 3e 32 29 2b 31 , state[(i>>2)+1
0ce0: 5d 29 3b 0a 20 20 7d 0a 20 20 73 65 74 49 6e 74 ]);. }. setInt
0cf0: 65 72 6c 65 61 76 65 64 57 6f 72 64 73 49 6e 74 erleavedWordsInt
0d00: 6f 38 62 79 74 65 73 28 26 74 6d 70 2c 20 73 74 o8bytes(&tmp, st
0d10: 61 74 65 5b 69 3e 3e 32 5d 2c 20 73 74 61 74 65 ate[i>>2], state
0d20: 5b 28 69 3e 3e 32 29 2b 31 5d 29 3b 0a 20 20 6d [(i>>2)+1]);. m
0d30: 65 6d 6d 6f 76 65 28 64 61 74 61 2b 69 2c 20 26 emmove(data+i, &
0d40: 74 6d 70 2c 20 62 79 74 65 43 6f 75 6e 74 20 26 tmp, byteCount &
0d50: 20 37 29 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2f 7);.}..#else //
0d60: 20 4e 6f 20 69 6e 74 65 72 6c 65 61 76 69 6e 67 No interleaving
0d70: 20 74 61 62 6c 65 73 0a 0a 23 69 66 20 28 50 4c tables..#if (PL
0d80: 41 54 46 4f 52 4d 5f 42 59 54 45 5f 4f 52 44 45 ATFORM_BYTE_ORDE
0d90: 52 20 3d 3d 20 49 53 5f 4c 49 54 54 4c 45 5f 45 R == IS_LITTLE_E
0da0: 4e 44 49 41 4e 29 0a 0a 2f 2f 20 43 72 65 64 69 NDIAN)..// Credi
0db0: 74 3a 20 48 65 6e 72 79 20 53 2e 20 57 61 72 72 t: Henry S. Warr
0dc0: 65 6e 2c 20 48 61 63 6b 65 72 27 73 20 44 65 6c en, Hacker's Del
0dd0: 69 67 68 74 2c 20 41 64 64 69 73 6f 6e 2d 57 65 ight, Addison-We
0de0: 73 6c 65 79 2c 20 32 30 30 32 0a 76 6f 69 64 20 sley, 2002.void
0df0: 78 6f 72 49 6e 74 65 72 6c 65 61 76 65 64 4c 45 xorInterleavedLE
0e00: 28 69 6e 74 20 62 79 74 65 43 6f 75 6e 74 2c 20 (int byteCount,
0e10: 55 49 4e 54 33 32 2a 20 73 74 61 74 65 2c 20 55 UINT32* state, U
0e20: 49 4e 54 33 32 2a 20 69 6e 70 75 74 29 0a 7b 0a INT32* input).{.
0e30: 20 20 63 6f 6e 73 74 20 55 49 4e 54 33 32 20 2a const UINT32 *
0e40: 20 70 49 20 3d 20 28 63 6f 6e 73 74 20 55 49 4e pI = (const UIN
0e50: 54 33 32 20 2a 29 69 6e 70 75 74 3b 0a 20 20 55 T32 *)input;. U
0e60: 49 4e 54 33 32 20 2a 20 70 53 20 3d 20 73 74 61 INT32 * pS = sta
0e70: 74 65 3b 0a 20 20 55 49 4e 54 33 32 20 74 2c 20 te;. UINT32 t,
0e80: 78 30 2c 20 78 31 3b 0a 20 20 69 6e 74 20 69 3b x0, x1;. int i;
0e90: 0a 20 20 66 6f 72 20 28 69 20 3d 20 28 62 79 74 . for (i = (byt
0ea0: 65 43 6f 75 6e 74 29 2d 38 3b 20 69 20 3e 3d 20 eCount)-8; i >=
0eb0: 30 3b 20 69 2d 3d 38 29 0a 20 20 20 20 7b 0a 20 0; i-=8). {.
0ec0: 20 20 20 20 20 78 30 20 3d 20 2a 28 70 49 2b 2b x0 = *(pI++
0ed0: 29 3b 0a 20 20 20 20 20 20 74 20 3d 20 28 78 30 );. t = (x0
0ee0: 20 5e 20 28 78 30 20 3e 3e 20 20 31 29 29 20 26 ^ (x0 >> 1)) &
0ef0: 20 30 78 32 32 32 32 32 32 32 32 55 4c 3b 20 20 0x22222222UL;
0f00: 78 30 20 3d 20 78 30 20 5e 20 74 20 5e 20 28 74 x0 = x0 ^ t ^ (t
0f10: 20 3c 3c 20 20 31 29 3b 0a 20 20 20 20 20 20 74 << 1);. t
0f20: 20 3d 20 28 78 30 20 5e 20 28 78 30 20 3e 3e 20 = (x0 ^ (x0 >>
0f30: 20 32 29 29 20 26 20 30 78 30 43 30 43 30 43 30 2)) & 0x0C0C0C0
0f40: 43 55 4c 3b 20 20 78 30 20 3d 20 78 30 20 5e 20 CUL; x0 = x0 ^
0f50: 74 20 5e 20 28 74 20 3c 3c 20 20 32 29 3b 0a 20 t ^ (t << 2);.
0f60: 20 20 20 20 20 74 20 3d 20 28 78 30 20 5e 20 28 t = (x0 ^ (
0f70: 78 30 20 3e 3e 20 20 34 29 29 20 26 20 30 78 30 x0 >> 4)) & 0x0
0f80: 30 46 30 30 30 46 30 55 4c 3b 20 20 78 30 20 3d 0F000F0UL; x0 =
0f90: 20 78 30 20 5e 20 74 20 5e 20 28 74 20 3c 3c 20 x0 ^ t ^ (t <<
0fa0: 20 34 29 3b 0a 20 20 20 20 20 20 74 20 3d 20 28 4);. t = (
0fb0: 78 30 20 5e 20 28 78 30 20 3e 3e 20 20 38 29 29 x0 ^ (x0 >> 8))
0fc0: 20 26 20 30 78 30 30 30 30 46 46 30 30 55 4c 3b & 0x0000FF00UL;
0fd0: 20 20 78 30 20 3d 20 78 30 20 5e 20 74 20 5e 20 x0 = x0 ^ t ^
0fe0: 28 74 20 3c 3c 20 20 38 29 3b 0a 20 20 20 20 20 (t << 8);.
0ff0: 20 78 31 20 3d 20 2a 28 70 49 2b 2b 29 3b 0a 20 x1 = *(pI++);.
1000: 20 20 20 20 20 74 20 3d 20 28 78 31 20 5e 20 28 t = (x1 ^ (
1010: 78 31 20 3e 3e 20 20 31 29 29 20 26 20 30 78 32 x1 >> 1)) & 0x2
1020: 32 32 32 32 32 32 32 55 4c 3b 20 20 78 31 20 3d 2222222UL; x1 =
1030: 20 78 31 20 5e 20 74 20 5e 20 28 74 20 3c 3c 20 x1 ^ t ^ (t <<
1040: 20 31 29 3b 0a 20 20 20 20 20 20 74 20 3d 20 28 1);. t = (
1050: 78 31 20 5e 20 28 78 31 20 3e 3e 20 20 32 29 29 x1 ^ (x1 >> 2))
1060: 20 26 20 30 78 30 43 30 43 30 43 30 43 55 4c 3b & 0x0C0C0C0CUL;
1070: 20 20 78 31 20 3d 20 78 31 20 5e 20 74 20 5e 20 x1 = x1 ^ t ^
1080: 28 74 20 3c 3c 20 20 32 29 3b 0a 20 20 20 20 20 (t << 2);.
1090: 20 74 20 3d 20 28 78 31 20 5e 20 28 78 31 20 3e t = (x1 ^ (x1 >
10a0: 3e 20 20 34 29 29 20 26 20 30 78 30 30 46 30 30 > 4)) & 0x00F00
10b0: 30 46 30 55 4c 3b 20 20 78 31 20 3d 20 78 31 20 0F0UL; x1 = x1
10c0: 5e 20 74 20 5e 20 28 74 20 3c 3c 20 20 34 29 3b ^ t ^ (t << 4);
10d0: 0a 20 20 20 20 20 20 74 20 3d 20 28 78 31 20 5e . t = (x1 ^
10e0: 20 28 78 31 20 3e 3e 20 20 38 29 29 20 26 20 30 (x1 >> 8)) & 0
10f0: 78 30 30 30 30 46 46 30 30 55 4c 3b 20 20 78 31 x0000FF00UL; x1
1100: 20 3d 20 78 31 20 5e 20 74 20 5e 20 28 74 20 3c = x1 ^ t ^ (t <
1110: 3c 20 20 38 29 3b 0a 20 20 20 20 20 20 2a 28 70 < 8);. *(p
1120: 53 2b 2b 29 20 5e 3d 20 28 55 49 4e 54 31 36 29 S++) ^= (UINT16)
1130: 78 30 20 7c 20 28 78 31 20 3c 3c 20 31 36 29 3b x0 | (x1 << 16);
1140: 0a 20 20 20 20 20 20 2a 28 70 53 2b 2b 29 20 5e . *(pS++) ^
1150: 3d 20 28 78 30 20 3e 3e 20 31 36 29 20 7c 20 28 = (x0 >> 16) | (
1160: 78 31 20 26 20 30 78 46 46 46 46 30 30 30 30 29 x1 & 0xFFFF0000)
1170: 3b 0a 20 20 20 20 7d 0a 20 20 62 79 74 65 43 6f ;. }. byteCo
1180: 75 6e 74 20 26 3d 20 37 3b 0a 20 20 69 66 28 62 unt &= 7;. if(b
1190: 79 74 65 43 6f 75 6e 74 29 20 7b 0a 20 20 20 20 yteCount) {.
11a0: 78 30 20 3d 20 28 62 79 74 65 43 6f 75 6e 74 20 x0 = (byteCount
11b0: 3e 3d 20 34 29 20 3f 20 2a 28 70 49 2b 2b 29 20 >= 4) ? *(pI++)
11c0: 3a 20 2a 28 70 49 2b 2b 29 20 26 20 30 78 66 66 : *(pI++) & 0xff
11d0: 66 66 66 66 66 66 75 20 3e 3e 20 28 38 2a 28 28 ffffffu >> (8*((
11e0: 34 2d 62 79 74 65 43 6f 75 6e 74 29 20 26 20 33 4-byteCount) & 3
11f0: 29 29 3b 0a 20 20 20 20 74 20 3d 20 28 78 30 20 ));. t = (x0
1200: 5e 20 28 78 30 20 3e 3e 20 20 31 29 29 20 26 20 ^ (x0 >> 1)) &
1210: 30 78 32 32 32 32 32 32 32 32 55 4c 3b 20 20 78 0x22222222UL; x
1220: 30 20 3d 20 78 30 20 5e 20 74 20 5e 20 28 74 20 0 = x0 ^ t ^ (t
1230: 3c 3c 20 20 31 29 3b 0a 20 20 20 20 74 20 3d 20 << 1);. t =
1240: 28 78 30 20 5e 20 28 78 30 20 3e 3e 20 20 32 29 (x0 ^ (x0 >> 2)
1250: 29 20 26 20 30 78 30 43 30 43 30 43 30 43 55 4c ) & 0x0C0C0C0CUL
1260: 3b 20 20 78 30 20 3d 20 78 30 20 5e 20 74 20 5e ; x0 = x0 ^ t ^
1270: 20 28 74 20 3c 3c 20 20 32 29 3b 0a 20 20 20 20 (t << 2);.
1280: 74 20 3d 20 28 78 30 20 5e 20 28 78 30 20 3e 3e t = (x0 ^ (x0 >>
1290: 20 20 34 29 29 20 26 20 30 78 30 30 46 30 30 30 4)) & 0x00F000
12a0: 46 30 55 4c 3b 20 20 78 30 20 3d 20 78 30 20 5e F0UL; x0 = x0 ^
12b0: 20 74 20 5e 20 28 74 20 3c 3c 20 20 34 29 3b 0a t ^ (t << 4);.
12c0: 20 20 20 20 74 20 3d 20 28 78 30 20 5e 20 28 78 t = (x0 ^ (x
12d0: 30 20 3e 3e 20 20 38 29 29 20 26 20 30 78 30 30 0 >> 8)) & 0x00
12e0: 30 30 46 46 30 30 55 4c 3b 20 20 78 30 20 3d 20 00FF00UL; x0 =
12f0: 78 30 20 5e 20 74 20 5e 20 28 74 20 3c 3c 20 20 x0 ^ t ^ (t <<
1300: 38 29 3b 0a 20 20 20 20 78 31 20 3d 20 28 62 79 8);. x1 = (by
1310: 74 65 43 6f 75 6e 74 20 3c 3d 20 34 29 20 3f 20 teCount <= 4) ?
1320: 30 20 3a 20 2a 28 70 49 2b 2b 29 20 26 20 30 78 0 : *(pI++) & 0x
1330: 66 66 66 66 66 66 66 66 75 20 3e 3e 20 28 38 2a ffffffffu >> (8*
1340: 28 28 34 2d 62 79 74 65 43 6f 75 6e 74 29 20 26 ((4-byteCount) &
1350: 20 33 29 29 3b 0a 20 20 20 20 74 20 3d 20 28 78 3));. t = (x
1360: 31 20 5e 20 28 78 31 20 3e 3e 20 20 31 29 29 20 1 ^ (x1 >> 1))
1370: 26 20 30 78 32 32 32 32 32 32 32 32 55 4c 3b 20 & 0x22222222UL;
1380: 20 78 31 20 3d 20 78 31 20 5e 20 74 20 5e 20 28 x1 = x1 ^ t ^ (
1390: 74 20 3c 3c 20 20 31 29 3b 0a 20 20 20 20 74 20 t << 1);. t
13a0: 3d 20 28 78 31 20 5e 20 28 78 31 20 3e 3e 20 20 = (x1 ^ (x1 >>
13b0: 32 29 29 20 26 20 30 78 30 43 30 43 30 43 30 43 2)) & 0x0C0C0C0C
13c0: 55 4c 3b 20 20 78 31 20 3d 20 78 31 20 5e 20 74 UL; x1 = x1 ^ t
13d0: 20 5e 20 28 74 20 3c 3c 20 20 32 29 3b 0a 20 20 ^ (t << 2);.
13e0: 20 20 74 20 3d 20 28 78 31 20 5e 20 28 78 31 20 t = (x1 ^ (x1
13f0: 3e 3e 20 20 34 29 29 20 26 20 30 78 30 30 46 30 >> 4)) & 0x00F0
1400: 30 30 46 30 55 4c 3b 20 20 78 31 20 3d 20 78 31 00F0UL; x1 = x1
1410: 20 5e 20 74 20 5e 20 28 74 20 3c 3c 20 20 34 29 ^ t ^ (t << 4)
1420: 3b 0a 20 20 20 20 74 20 3d 20 28 78 31 20 5e 20 ;. t = (x1 ^
1430: 28 78 31 20 3e 3e 20 20 38 29 29 20 26 20 30 78 (x1 >> 8)) & 0x
1440: 30 30 30 30 46 46 30 30 55 4c 3b 20 20 78 31 20 0000FF00UL; x1
1450: 3d 20 78 31 20 5e 20 74 20 5e 20 28 74 20 3c 3c = x1 ^ t ^ (t <<
1460: 20 20 38 29 3b 0a 20 20 20 20 2a 28 70 53 2b 2b 8);. *(pS++
1470: 29 20 5e 3d 20 28 55 49 4e 54 31 36 29 78 30 20 ) ^= (UINT16)x0
1480: 7c 20 28 78 31 20 3c 3c 20 31 36 29 3b 0a 20 20 | (x1 << 16);.
1490: 20 20 2a 28 70 53 2b 2b 29 20 5e 3d 20 28 78 30 *(pS++) ^= (x0
14a0: 20 3e 3e 20 31 36 29 20 7c 20 28 78 31 20 26 20 >> 16) | (x1 &
14b0: 30 78 46 46 46 46 30 30 30 30 29 3b 0a 20 20 7d 0xFFFF0000);. }
14c0: 0a 7d 0a 0a 76 6f 69 64 20 78 6f 72 4c 61 6e 65 .}..void xorLane
14d0: 73 49 6e 74 6f 53 74 61 74 65 28 69 6e 74 20 62 sIntoState(int b
14e0: 79 74 65 43 6f 75 6e 74 2c 20 55 49 4e 54 38 2a yteCount, UINT8*
14f0: 20 73 74 61 74 65 2c 20 55 49 4e 54 33 32 2a 20 state, UINT32*
1500: 69 6e 70 75 74 29 0a 7b 0a 20 20 78 6f 72 49 6e input).{. xorIn
1510: 74 65 72 6c 65 61 76 65 64 4c 45 28 62 79 74 65 terleavedLE(byte
1520: 43 6f 75 6e 74 2c 20 28 55 49 4e 54 33 32 2a 29 Count, (UINT32*)
1530: 73 74 61 74 65 2c 20 69 6e 70 75 74 29 3b 0a 7d state, input);.}
1540: 0a 0a 23 65 6c 73 65 20 2f 2f 20 28 50 4c 41 54 ..#else // (PLAT
1550: 46 4f 52 4d 5f 42 59 54 45 5f 4f 52 44 45 52 20 FORM_BYTE_ORDER
1560: 3d 3d 20 49 53 5f 42 49 47 5f 45 4e 44 49 41 4e == IS_BIG_ENDIAN
1570: 29 0a 0a 2f 2f 20 43 72 65 64 69 74 3a 20 48 65 )..// Credit: He
1580: 6e 72 79 20 53 2e 20 57 61 72 72 65 6e 2c 20 48 nry S. Warren, H
1590: 61 63 6b 65 72 27 73 20 44 65 6c 69 67 68 74 2c acker's Delight,
15a0: 20 41 64 64 69 73 6f 6e 2d 57 65 73 6c 65 79 2c Addison-Wesley,
15b0: 20 32 30 30 32 0a 55 49 4e 54 36 34 20 74 6f 49 2002.UINT64 toI
15c0: 6e 74 65 72 6c 65 61 76 69 6e 67 28 55 49 4e 54 nterleaving(UINT
15d0: 36 34 20 78 29 20 0a 7b 0a 20 20 20 55 49 4e 54 64 x) .{. UINT
15e0: 36 34 20 74 3b 0a 0a 20 20 20 74 20 3d 20 28 78 64 t;.. t = (x
15f0: 20 5e 20 28 78 20 3e 3e 20 20 31 29 29 20 26 20 ^ (x >> 1)) &
1600: 30 78 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0x22222222222222
1610: 32 32 55 4c 4c 3b 20 20 78 20 3d 20 78 20 5e 20 22ULL; x = x ^
1620: 74 20 5e 20 28 74 20 3c 3c 20 20 31 29 3b 0a 20 t ^ (t << 1);.
1630: 20 20 74 20 3d 20 28 78 20 5e 20 28 78 20 3e 3e t = (x ^ (x >>
1640: 20 20 32 29 29 20 26 20 30 78 30 43 30 43 30 43 2)) & 0x0C0C0C
1650: 30 43 30 43 30 43 30 43 30 43 55 4c 4c 3b 20 20 0C0C0C0C0CULL;
1660: 78 20 3d 20 78 20 5e 20 74 20 5e 20 28 74 20 3c x = x ^ t ^ (t <
1670: 3c 20 20 32 29 3b 0a 20 20 20 74 20 3d 20 28 78 < 2);. t = (x
1680: 20 5e 20 28 78 20 3e 3e 20 20 34 29 29 20 26 20 ^ (x >> 4)) &
1690: 30 78 30 30 46 30 30 30 46 30 30 30 46 30 30 30 0x00F000F000F000
16a0: 46 30 55 4c 4c 3b 20 20 78 20 3d 20 78 20 5e 20 F0ULL; x = x ^
16b0: 74 20 5e 20 28 74 20 3c 3c 20 20 34 29 3b 0a 20 t ^ (t << 4);.
16c0: 20 20 74 20 3d 20 28 78 20 5e 20 28 78 20 3e 3e t = (x ^ (x >>
16d0: 20 20 38 29 29 20 26 20 30 78 30 30 30 30 46 46 8)) & 0x0000FF
16e0: 30 30 30 30 30 30 46 46 30 30 55 4c 4c 3b 20 20 000000FF00ULL;
16f0: 78 20 3d 20 78 20 5e 20 74 20 5e 20 28 74 20 3c x = x ^ t ^ (t <
1700: 3c 20 20 38 29 3b 0a 20 20 20 74 20 3d 20 28 78 < 8);. t = (x
1710: 20 5e 20 28 78 20 3e 3e 20 31 36 29 29 20 26 20 ^ (x >> 16)) &
1720: 30 78 30 30 30 30 30 30 30 30 46 46 46 46 30 30 0x00000000FFFF00
1730: 30 30 55 4c 4c 3b 20 20 78 20 3d 20 78 20 5e 20 00ULL; x = x ^
1740: 74 20 5e 20 28 74 20 3c 3c 20 31 36 29 3b 0a 0a t ^ (t << 16);..
1750: 20 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a return x;.}..
1760: 76 6f 69 64 20 78 6f 72 38 62 79 74 65 73 49 6e void xor8bytesIn
1770: 74 6f 49 6e 74 65 72 6c 65 61 76 65 64 57 6f 72 toInterleavedWor
1780: 64 73 28 55 49 4e 54 33 32 2a 20 65 76 65 6e 41 ds(UINT32* evenA
1790: 6e 64 4f 64 64 2c 20 63 6f 6e 73 74 20 55 49 4e ndOdd, const UIN
17a0: 54 38 2a 20 73 6f 75 72 63 65 29 0a 7b 0a 20 20 T8* source).{.
17b0: 20 20 2f 2f 20 54 68 69 73 20 63 61 6e 20 62 65 // This can be
17c0: 20 6f 70 74 69 6d 69 7a 65 64 0a 20 20 20 20 55 optimized. U
17d0: 49 4e 54 36 34 20 73 6f 75 72 63 65 57 6f 72 64 INT64 sourceWord
17e0: 20 3d 0a 20 20 20 20 20 20 20 20 28 55 49 4e 54 =. (UINT
17f0: 36 34 29 73 6f 75 72 63 65 5b 30 5d 0a 20 20 20 64)source[0].
1800: 20 20 20 20 20 5e 20 28 28 28 55 49 4e 54 36 34 ^ (((UINT64
1810: 29 73 6f 75 72 63 65 5b 31 5d 29 20 3c 3c 20 20 )source[1]) <<
1820: 38 29 0a 20 20 20 20 20 20 20 20 5e 20 28 28 28 8). ^ (((
1830: 55 49 4e 54 36 34 29 73 6f 75 72 63 65 5b 32 5d UINT64)source[2]
1840: 29 20 3c 3c 20 31 36 29 0a 20 20 20 20 20 20 20 ) << 16).
1850: 20 5e 20 28 28 28 55 49 4e 54 36 34 29 73 6f 75 ^ (((UINT64)sou
1860: 72 63 65 5b 33 5d 29 20 3c 3c 20 32 34 29 0a 20 rce[3]) << 24).
1870: 20 20 20 20 20 20 20 5e 20 28 28 28 55 49 4e 54 ^ (((UINT
1880: 36 34 29 73 6f 75 72 63 65 5b 34 5d 29 20 3c 3c 64)source[4]) <<
1890: 20 33 32 29 0a 20 20 20 20 20 20 20 20 5e 20 28 32). ^ (
18a0: 28 28 55 49 4e 54 36 34 29 73 6f 75 72 63 65 5b ((UINT64)source[
18b0: 35 5d 29 20 3c 3c 20 34 30 29 0a 20 20 20 20 20 5]) << 40).
18c0: 20 20 20 5e 20 28 28 28 55 49 4e 54 36 34 29 73 ^ (((UINT64)s
18d0: 6f 75 72 63 65 5b 36 5d 29 20 3c 3c 20 34 38 29 ource[6]) << 48)
18e0: 0a 20 20 20 20 20 20 20 20 5e 20 28 28 28 55 49 . ^ (((UI
18f0: 4e 54 36 34 29 73 6f 75 72 63 65 5b 37 5d 29 20 NT64)source[7])
1900: 3c 3c 20 35 36 29 3b 0a 20 20 20 20 55 49 4e 54 << 56);. UINT
1910: 36 34 20 65 76 65 6e 41 6e 64 4f 64 64 57 6f 72 64 evenAndOddWor
1920: 64 20 3d 20 74 6f 49 6e 74 65 72 6c 65 61 76 69 d = toInterleavi
1930: 6e 67 28 73 6f 75 72 63 65 57 6f 72 64 29 3b 0a ng(sourceWord);.
1940: 20 20 20 20 65 76 65 6e 41 6e 64 4f 64 64 5b 30 evenAndOdd[0
1950: 5d 20 5e 3d 20 28 55 49 4e 54 33 32 29 65 76 65 ] ^= (UINT32)eve
1960: 6e 41 6e 64 4f 64 64 57 6f 72 64 3b 0a 20 20 20 nAndOddWord;.
1970: 20 65 76 65 6e 41 6e 64 4f 64 64 5b 31 5d 20 5e evenAndOdd[1] ^
1980: 3d 20 28 55 49 4e 54 33 32 29 28 65 76 65 6e 41 = (UINT32)(evenA
1990: 6e 64 4f 64 64 57 6f 72 64 20 3e 3e 20 33 32 29 ndOddWord >> 32)
19a0: 3b 0a 7d 0a 0a 76 6f 69 64 20 78 6f 72 4c 61 6e ;.}..void xorLan
19b0: 65 73 49 6e 74 6f 53 74 61 74 65 28 69 6e 74 20 esIntoState(int
19c0: 62 79 74 65 43 6f 75 6e 74 2c 20 55 49 4e 54 38 byteCount, UINT8
19d0: 2a 20 73 74 61 74 65 2c 20 55 49 4e 54 38 20 2a * state, UINT8 *
19e0: 69 6e 70 75 74 29 0a 7b 0a 20 20 69 6e 74 20 69 input).{. int i
19f0: 3b 20 55 49 4e 54 36 34 20 74 6d 70 3d 30 3b 0a ; UINT64 tmp=0;.
1a00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 62 79 for(i=0; i<(by
1a10: 74 65 43 6f 75 6e 74 2d 37 29 3b 20 69 2b 3d 38 teCount-7); i+=8
1a20: 29 0a 20 20 20 20 78 6f 72 38 62 79 74 65 73 49 ). xor8bytesI
1a30: 6e 74 6f 49 6e 74 65 72 6c 65 61 76 65 64 57 6f ntoInterleavedWo
1a40: 72 64 73 28 28 55 49 4e 54 33 32 2a 29 28 73 74 rds((UINT32*)(st
1a50: 61 74 65 2b 69 29 2c 20 28 55 49 4e 54 33 32 2a ate+i), (UINT32*
1a60: 29 28 69 6e 70 75 74 2b 69 29 29 3b 0a 20 20 69 )(input+i));. i
1a70: 66 28 62 79 74 65 43 6f 75 6e 74 20 26 20 37 29 f(byteCount & 7)
1a80: 20 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 {. memmove(&
1a90: 74 6d 70 2c 20 69 6e 70 75 74 2b 69 2c 20 62 79 tmp, input+i, by
1aa0: 74 65 43 6f 75 6e 74 20 26 20 37 29 3b 0a 20 20 teCount & 7);.
1ab0: 20 20 78 6f 72 38 62 79 74 65 73 49 6e 74 6f 49 xor8bytesIntoI
1ac0: 6e 74 65 72 6c 65 61 76 65 64 57 6f 72 64 73 28 nterleavedWords(
1ad0: 28 55 49 4e 54 33 32 2a 29 28 73 74 61 74 65 2b (UINT32*)(state+
1ae0: 69 29 2c 20 28 55 49 4e 54 33 32 2a 29 26 74 6d i), (UINT32*)&tm
1af0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 p);. }.}..#endi
1b00: 66 20 2f 2f 20 45 6e 64 69 61 6e 6e 65 73 73 0a f // Endianness.
1b10: 0a 2f 2f 20 43 72 65 64 69 74 3a 20 48 65 6e 72 .// Credit: Henr
1b20: 79 20 53 2e 20 57 61 72 72 65 6e 2c 20 48 61 63 y S. Warren, Hac
1b30: 6b 65 72 27 73 20 44 65 6c 69 67 68 74 2c 20 41 ker's Delight, A
1b40: 64 64 69 73 6f 6e 2d 57 65 73 6c 65 79 2c 20 32 ddison-Wesley, 2
1b50: 30 30 32 0a 55 49 4e 54 36 34 20 66 72 6f 6d 49 002.UINT64 fromI
1b60: 6e 74 65 72 6c 65 61 76 69 6e 67 28 55 49 4e 54 nterleaving(UINT
1b70: 36 34 20 78 29 0a 7b 0a 20 20 20 55 49 4e 54 36 64 x).{. UINT6
1b80: 34 20 74 3b 0a 0a 20 20 20 74 20 3d 20 28 78 20 4 t;.. t = (x
1b90: 5e 20 28 78 20 3e 3e 20 31 36 29 29 20 26 20 30 ^ (x >> 16)) & 0
1ba0: 78 30 30 30 30 30 30 30 30 46 46 46 46 30 30 30 x00000000FFFF000
1bb0: 30 55 4c 4c 3b 20 20 78 20 3d 20 78 20 5e 20 74 0ULL; x = x ^ t
1bc0: 20 5e 20 28 74 20 3c 3c 20 31 36 29 3b 0a 20 20 ^ (t << 16);.
1bd0: 20 74 20 3d 20 28 78 20 5e 20 28 78 20 3e 3e 20 t = (x ^ (x >>
1be0: 20 38 29 29 20 26 20 30 78 30 30 30 30 46 46 30 8)) & 0x0000FF0
1bf0: 30 30 30 30 30 46 46 30 30 55 4c 4c 3b 20 20 78 00000FF00ULL; x
1c00: 20 3d 20 78 20 5e 20 74 20 5e 20 28 74 20 3c 3c = x ^ t ^ (t <<
1c10: 20 20 38 29 3b 0a 20 20 20 74 20 3d 20 28 78 20 8);. t = (x
1c20: 5e 20 28 78 20 3e 3e 20 20 34 29 29 20 26 20 30 ^ (x >> 4)) & 0
1c30: 78 30 30 46 30 30 30 46 30 30 30 46 30 30 30 46 x00F000F000F000F
1c40: 30 55 4c 4c 3b 20 20 78 20 3d 20 78 20 5e 20 74 0ULL; x = x ^ t
1c50: 20 5e 20 28 74 20 3c 3c 20 20 34 29 3b 0a 20 20 ^ (t << 4);.
1c60: 20 74 20 3d 20 28 78 20 5e 20 28 78 20 3e 3e 20 t = (x ^ (x >>
1c70: 20 32 29 29 20 26 20 30 78 30 43 30 43 30 43 30 2)) & 0x0C0C0C0
1c80: 43 30 43 30 43 30 43 30 43 55 4c 4c 3b 20 20 78 C0C0C0C0CULL; x
1c90: 20 3d 20 78 20 5e 20 74 20 5e 20 28 74 20 3c 3c = x ^ t ^ (t <<
1ca0: 20 20 32 29 3b 0a 20 20 20 74 20 3d 20 28 78 20 2);. t = (x
1cb0: 5e 20 28 78 20 3e 3e 20 20 31 29 29 20 26 20 30 ^ (x >> 1)) & 0
1cc0: 78 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 x222222222222222
1cd0: 32 55 4c 4c 3b 20 20 78 20 3d 20 78 20 5e 20 74 2ULL; x = x ^ t
1ce0: 20 5e 20 28 74 20 3c 3c 20 20 31 29 3b 0a 0a 20 ^ (t << 1);..
1cf0: 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 76 return x;.}..v
1d00: 6f 69 64 20 73 65 74 49 6e 74 65 72 6c 65 61 76 oid setInterleav
1d10: 65 64 57 6f 72 64 73 49 6e 74 6f 38 62 79 74 65 edWordsInto8byte
1d20: 73 28 55 49 4e 54 38 2a 20 64 65 73 74 2c 20 55 s(UINT8* dest, U
1d30: 49 4e 54 33 32 2a 20 65 76 65 6e 41 6e 64 4f 64 INT32* evenAndOd
1d40: 64 29 0a 7b 0a 23 69 66 20 28 50 4c 41 54 46 4f d).{.#if (PLATFO
1d50: 52 4d 5f 42 59 54 45 5f 4f 52 44 45 52 20 3d 3d RM_BYTE_ORDER ==
1d60: 20 49 53 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 IS_LITTLE_ENDIA
1d70: 4e 29 0a 20 20 20 20 28 28 55 49 4e 54 36 34 2a N). ((UINT64*
1d80: 29 64 65 73 74 29 5b 30 5d 20 3d 20 66 72 6f 6d )dest)[0] = from
1d90: 49 6e 74 65 72 6c 65 61 76 69 6e 67 28 2a 28 55 Interleaving(*(U
1da0: 49 4e 54 36 34 2a 29 65 76 65 6e 41 6e 64 4f 64 INT64*)evenAndOd
1db0: 64 29 3b 0a 23 65 6c 73 65 20 2f 2f 20 28 50 4c d);.#else // (PL
1dc0: 41 54 46 4f 52 4d 5f 42 59 54 45 5f 4f 52 44 45 ATFORM_BYTE_ORDE
1dd0: 52 20 3d 3d 20 49 53 5f 42 49 47 5f 45 4e 44 49 R == IS_BIG_ENDI
1de0: 41 4e 29 0a 20 20 20 20 2f 2f 20 54 68 69 73 20 AN). // This
1df0: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 can be optimized
1e00: 0a 20 20 20 20 55 49 4e 54 36 34 20 65 76 65 6e . UINT64 even
1e10: 41 6e 64 4f 64 64 57 6f 72 64 20 3d 20 28 55 49 AndOddWord = (UI
1e20: 4e 54 36 34 29 65 76 65 6e 41 6e 64 4f 64 64 5b NT64)evenAndOdd[
1e30: 30 5d 20 5e 20 28 28 55 49 4e 54 36 34 29 65 76 0] ^ ((UINT64)ev
1e40: 65 6e 41 6e 64 4f 64 64 5b 31 5d 20 3c 3c 20 33 enAndOdd[1] << 3
1e50: 32 29 3b 0a 20 20 20 20 55 49 4e 54 36 34 20 64 2);. UINT64 d
1e60: 65 73 74 57 6f 72 64 20 3d 20 66 72 6f 6d 49 6e estWord = fromIn
1e70: 74 65 72 6c 65 61 76 69 6e 67 28 65 76 65 6e 41 terleaving(evenA
1e80: 6e 64 4f 64 64 57 6f 72 64 29 3b 0a 20 20 20 20 ndOddWord);.
1e90: 64 65 73 74 5b 30 5d 20 3d 20 64 65 73 74 57 6f dest[0] = destWo
1ea0: 72 64 20 26 20 30 78 46 46 3b 0a 20 20 20 20 64 rd & 0xFF;. d
1eb0: 65 73 74 5b 31 5d 20 3d 20 28 64 65 73 74 57 6f est[1] = (destWo
1ec0: 72 64 20 3e 3e 20 38 29 20 26 20 30 78 46 46 3b rd >> 8) & 0xFF;
1ed0: 0a 20 20 20 20 64 65 73 74 5b 32 5d 20 3d 20 28 . dest[2] = (
1ee0: 64 65 73 74 57 6f 72 64 20 3e 3e 20 31 36 29 20 destWord >> 16)
1ef0: 26 20 30 78 46 46 3b 0a 20 20 20 20 64 65 73 74 & 0xFF;. dest
1f00: 5b 33 5d 20 3d 20 28 64 65 73 74 57 6f 72 64 20 [3] = (destWord
1f10: 3e 3e 20 32 34 29 20 26 20 30 78 46 46 3b 0a 20 >> 24) & 0xFF;.
1f20: 20 20 20 64 65 73 74 5b 34 5d 20 3d 20 28 64 65 dest[4] = (de
1f30: 73 74 57 6f 72 64 20 3e 3e 20 33 32 29 20 26 20 stWord >> 32) &
1f40: 30 78 46 46 3b 0a 20 20 20 20 64 65 73 74 5b 35 0xFF;. dest[5
1f50: 5d 20 3d 20 28 64 65 73 74 57 6f 72 64 20 3e 3e ] = (destWord >>
1f60: 20 34 30 29 20 26 20 30 78 46 46 3b 0a 20 20 20 40) & 0xFF;.
1f70: 20 64 65 73 74 5b 36 5d 20 3d 20 28 64 65 73 74 dest[6] = (dest
1f80: 57 6f 72 64 20 3e 3e 20 34 38 29 20 26 20 30 78 Word >> 48) & 0x
1f90: 46 46 3b 0a 20 20 20 20 64 65 73 74 5b 37 5d 20 FF;. dest[7]
1fa0: 3d 20 28 64 65 73 74 57 6f 72 64 20 3e 3e 20 35 = (destWord >> 5
1fb0: 36 29 20 26 20 30 78 46 46 3b 0a 23 65 6e 64 69 6) & 0xFF;.#endi
1fc0: 66 20 2f 2f 20 45 6e 64 69 61 6e 6e 65 73 73 0a f // Endianness.
1fd0: 7d 0a 0a 76 6f 69 64 20 65 78 74 72 61 63 74 4c }..void extractL
1fe0: 61 6e 65 73 28 69 6e 74 20 62 79 74 65 43 6f 75 anes(int byteCou
1ff0: 6e 74 2c 20 55 49 4e 54 33 32 2a 20 73 74 61 74 nt, UINT32* stat
2000: 65 2c 20 55 49 4e 54 38 20 2a 64 61 74 61 29 0a e, UINT8 *data).
2010: 7b 0a 20 20 69 6e 74 20 69 3b 20 55 49 4e 54 36 {. int i; UINT6
2020: 34 20 74 6d 70 3d 30 3b 0a 20 20 66 6f 72 28 69 4 tmp=0;. for(i
2030: 3d 30 3b 20 69 3c 28 62 79 74 65 43 6f 75 6e 74 =0; i<(byteCount
2040: 2d 37 29 3b 20 69 2b 3d 38 29 20 7b 0a 20 20 20 -7); i+=8) {.
2050: 20 73 65 74 49 6e 74 65 72 6c 65 61 76 65 64 57 setInterleavedW
2060: 6f 72 64 73 49 6e 74 6f 38 62 79 74 65 73 28 64 ordsInto8bytes(d
2070: 61 74 61 2b 69 2c 20 73 74 61 74 65 2b 28 69 3e ata+i, state+(i>
2080: 3e 32 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74 49 >2));. }. setI
2090: 6e 74 65 72 6c 65 61 76 65 64 57 6f 72 64 73 49 nterleavedWordsI
20a0: 6e 74 6f 38 62 79 74 65 73 28 28 55 49 4e 54 38 nto8bytes((UINT8
20b0: 2a 29 26 74 6d 70 2c 20 73 74 61 74 65 2b 28 69 *)&tmp, state+(i
20c0: 3e 3e 32 29 29 3b 0a 20 20 6d 65 6d 6d 6f 76 65 >>2));. memmove
20d0: 28 64 61 74 61 2b 69 2c 20 28 55 49 4e 54 38 2a (data+i, (UINT8*
20e0: 29 26 74 6d 70 2c 20 62 79 74 65 43 6f 75 6e 74 )&tmp, byteCount
20f0: 20 26 20 37 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 & 7);.}..#endif
2100: 20 2f 2f 20 57 69 74 68 20 6f 72 20 77 69 74 68 // With or with
2110: 6f 75 74 20 69 6e 74 65 72 6c 65 61 76 69 6e 67 out interleaving
2120: 20 74 61 62 6c 65 73 0a 0a 23 69 66 20 64 65 66 tables..#if def
2130: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 23 ined(_MSC_VER).#
2140: 64 65 66 69 6e 65 20 52 4f 4c 33 32 28 61 2c 20 define ROL32(a,
2150: 6f 66 66 73 65 74 29 20 5f 72 6f 74 6c 28 61 2c offset) _rotl(a,
2160: 20 6f 66 66 73 65 74 29 0a 23 65 6c 69 66 20 28 offset).#elif (
2170: 64 65 66 69 6e 65 64 20 28 5f 5f 61 72 6d 5f 5f defined (__arm__
2180: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 ) && defined(__A
2190: 52 4d 43 43 5f 56 45 52 53 49 4f 4e 29 29 0a 23 RMCC_VERSION)).#
21a0: 64 65 66 69 6e 65 20 52 4f 4c 33 32 28 61 2c 20 define ROL32(a,
21b0: 6f 66 66 73 65 74 29 20 5f 5f 72 6f 72 28 61 2c offset) __ror(a,
21c0: 20 33 32 2d 28 6f 66 66 73 65 74 29 29 0a 23 65 32-(offset)).#e
21d0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 52 4f 4c 33 lse.#define ROL3
21e0: 32 28 61 2c 20 6f 66 66 73 65 74 29 20 28 28 28 2(a, offset) (((
21f0: 28 55 49 4e 54 33 32 29 61 29 20 3c 3c 20 28 6f (UINT32)a) << (o
2200: 66 66 73 65 74 29 29 20 5e 20 28 28 28 55 49 4e ffset)) ^ (((UIN
2210: 54 33 32 29 61 29 20 3e 3e 20 28 33 32 2d 28 6f T32)a) >> (32-(o
2220: 66 66 73 65 74 29 29 29 29 0a 23 65 6e 64 69 66 ffset)))).#endif
2230: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 4b 65 63 63 ..#include "Kecc
2240: 61 6b 46 2d 31 36 30 30 2d 75 6e 72 6f 6c 6c 69 akF-1600-unrolli
2250: 6e 67 2e 6d 61 63 72 6f 73 22 0a 23 69 6e 63 6c ng.macros".#incl
2260: 75 64 65 20 22 4b 65 63 63 61 6b 46 2d 31 36 30 ude "KeccakF-160
2270: 30 2d 33 32 2e 6d 61 63 72 6f 73 22 0a 0a 23 69 0-32.macros"..#i
2280: 66 20 28 55 73 65 53 63 68 65 64 75 6c 65 20 3d f (UseSchedule =
2290: 3d 20 33 29 0a 0a 23 69 66 64 65 66 20 55 73 65 = 3)..#ifdef Use
22a0: 42 65 62 69 67 6f 6b 69 6d 69 73 61 0a 23 65 72 Bebigokimisa.#er
22b0: 72 6f 72 20 22 4e 6f 20 6c 61 6e 65 20 63 6f 6d ror "No lane com
22c0: 70 6c 65 6d 65 6e 74 69 6e 67 20 77 69 74 68 20 plementing with
22d0: 73 63 68 65 64 75 6c 65 20 33 2e 22 0a 23 65 6e schedule 3.".#en
22e0: 64 69 66 0a 0a 23 69 66 20 28 55 6e 72 6f 6c 6c dif..#if (Unroll
22f0: 69 6e 67 20 21 3d 20 32 29 0a 23 65 72 72 6f 72 ing != 2).#error
2300: 20 22 4f 6e 6c 79 20 75 6e 72 6f 6c 6c 69 6e 67 "Only unrolling
2310: 20 32 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 2 is supported
2320: 62 79 20 73 63 68 65 64 75 6c 65 20 33 2e 22 0a by schedule 3.".
2330: 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 0a 0a #endif..#endif..
2340: 76 6f 69 64 20 4b 65 63 63 61 6b 46 28 6b 65 63 void KeccakF(kec
2350: 63 61 6b 5f 73 74 61 74 65 20 73 74 61 74 65 2c cak_state state,
2360: 20 69 6e 74 20 72 6f 75 6e 64 29 0a 7b 0a 20 20 int round).{.
2370: 20 20 64 65 63 6c 61 72 65 41 42 43 44 45 0a 23 declareABCDE.#
2380: 69 66 20 28 55 6e 72 6f 6c 6c 69 6e 67 20 21 3d if (Unrolling !=
2390: 20 32 34 29 0a 20 20 20 20 75 6e 73 69 67 6e 65 24). unsigne
23a0: 64 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a d int i;.#endif.
23b0: 0a 20 20 20 20 63 6f 70 79 46 72 6f 6d 53 74 61 . copyFromSta
23c0: 74 65 28 41 2c 20 73 74 61 74 65 29 0a 20 20 20 te(A, state).
23d0: 20 72 6f 75 6e 64 73 28 72 6f 75 6e 64 29 0a 7d rounds(round).}
23e0: 0a 0a 76 6f 69 64 20 4b 65 63 63 61 6b 49 6e 69 ..void KeccakIni
23f0: 74 69 61 6c 69 7a 65 28 29 0a 7b 0a 23 69 66 64 tialize().{.#ifd
2400: 65 66 20 55 73 65 49 6e 74 65 72 6c 65 61 76 65 ef UseInterleave
2410: 54 61 62 6c 65 73 0a 20 20 20 20 62 75 69 6c 64 Tables. build
2420: 49 6e 74 65 72 6c 65 61 76 65 54 61 62 6c 65 73 InterleaveTables
2430: 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 76 6f ();.#endif.}..vo
2440: 69 64 20 4b 65 63 63 61 6b 49 6e 69 74 69 61 6c id KeccakInitial
2450: 69 7a 65 53 74 61 74 65 28 6b 65 63 63 61 6b 5f izeState(keccak_
2460: 73 74 61 74 65 20 73 74 61 74 65 29 0a 7b 0a 20 state state).{.
2470: 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 2c memset(state,
2480: 20 30 2c 20 32 30 30 29 3b 0a 7d 0a 0a 76 6f 69 0, 200);.}..voi
2490: 64 20 4b 65 63 63 61 6b 45 78 74 72 61 63 74 28 d KeccakExtract(
24a0: 6b 65 63 63 61 6b 5f 73 74 61 74 65 20 73 74 61 keccak_state sta
24b0: 74 65 2c 20 55 49 4e 54 36 34 20 2a 64 61 74 61 te, UINT64 *data
24c0: 2c 20 69 6e 74 20 62 79 74 65 43 6f 75 6e 74 29 , int byteCount)
24d0: 0a 7b 0a 20 20 65 78 74 72 61 63 74 4c 61 6e 65 .{. extractLane
24e0: 73 28 62 79 74 65 43 6f 75 6e 74 2c 20 73 74 61 s(byteCount, sta
24f0: 74 65 2c 20 28 28 63 68 61 72 2a 29 64 61 74 61 te, ((char*)data
2500: 29 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4b 65 63 63 ));.}..void Kecc
2510: 61 6b 41 62 73 6f 72 62 28 6b 65 63 63 61 6b 5f akAbsorb(keccak_
2520: 73 74 61 74 65 20 73 74 61 74 65 2c 20 55 49 4e state state, UIN
2530: 54 36 34 20 2a 64 61 74 61 2c 20 69 6e 74 20 62 T64 *data, int b
2540: 79 74 65 43 6f 75 6e 74 29 0a 7b 0a 20 20 78 6f yteCount).{. xo
2550: 72 4c 61 6e 65 73 49 6e 74 6f 53 74 61 74 65 28 rLanesIntoState(
2560: 62 79 74 65 43 6f 75 6e 74 2c 20 73 74 61 74 65 byteCount, state
2570: 2c 20 28 28 63 68 61 72 2a 29 64 61 74 61 29 29 , ((char*)data))
2580: 3b 0a 7d 0a 0a 76 6f 69 64 20 4b 65 63 63 61 6b ;.}..void Keccak
2590: 45 6e 63 72 79 70 74 28 6b 65 63 63 61 6b 5f 73 Encrypt(keccak_s
25a0: 74 61 74 65 20 73 74 61 74 65 2c 20 55 49 4e 54 tate state, UINT
25b0: 36 34 20 2a 64 61 74 61 2c 20 69 6e 74 20 62 79 64 *data, int by
25c0: 74 65 43 6f 75 6e 74 29 0a 7b 0a 20 20 78 6f 72 teCount).{. xor
25d0: 4c 61 6e 65 73 49 6e 74 6f 53 74 61 74 65 28 62 LanesIntoState(b
25e0: 79 74 65 43 6f 75 6e 74 2c 20 73 74 61 74 65 2c yteCount, state,
25f0: 20 28 28 63 68 61 72 2a 29 64 61 74 61 29 29 3b ((char*)data));
2600: 0a 20 20 65 78 74 72 61 63 74 4c 61 6e 65 73 28 . extractLanes(
2610: 62 79 74 65 43 6f 75 6e 74 2c 20 73 74 61 74 65 byteCount, state
2620: 2c 20 28 28 63 68 61 72 2a 29 64 61 74 61 29 29 , ((char*)data))
2630: 3b 0a 7d 0a 0a 76 6f 69 64 20 4b 65 63 63 61 6b ;.}..void Keccak
2640: 44 65 63 72 79 70 74 28 6b 65 63 63 61 6b 5f 73 Decrypt(keccak_s
2650: 74 61 74 65 20 73 74 61 74 65 2c 20 55 49 4e 54 tate state, UINT
2660: 36 34 20 2a 64 61 74 61 2c 20 69 6e 74 20 62 79 64 *data, int by
2670: 74 65 43 6f 75 6e 74 29 0a 7b 0a 20 20 55 49 4e teCount).{. UIN
2680: 54 36 34 20 74 6d 70 5b 28 62 79 74 65 43 6f 75 T64 tmp[(byteCou
2690: 6e 74 3e 3e 33 29 2b 31 5d 3b 0a 20 20 69 6e 74 nt>>3)+1];. int
26a0: 20 69 3b 0a 20 20 74 6d 70 5b 28 62 79 74 65 43 i;. tmp[(byteC
26b0: 6f 75 6e 74 3e 3e 33 29 5d 3d 30 3b 0a 0a 20 20 ount>>3)]=0;..
26c0: 65 78 74 72 61 63 74 4c 61 6e 65 73 28 62 79 74 extractLanes(byt
26d0: 65 43 6f 75 6e 74 2c 20 73 74 61 74 65 2c 20 28 eCount, state, (
26e0: 28 63 68 61 72 2a 29 74 6d 70 29 29 3b 0a 20 20 (char*)tmp));.
26f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 62 79 74 65 43 for(i=0; i<byteC
2700: 6f 75 6e 74 2d 37 3b 20 69 2b 3d 38 29 20 7b 0a ount-7; i+=8) {.
2710: 20 20 20 20 64 61 74 61 5b 69 3e 3e 33 5d 20 5e data[i>>3] ^
2720: 3d 20 74 6d 70 5b 69 3e 3e 33 5d 3b 0a 20 20 7d = tmp[i>>3];. }
2730: 0a 20 20 69 66 28 62 79 74 65 43 6f 75 6e 74 20 . if(byteCount
2740: 26 20 37 29 0a 20 20 20 20 64 61 74 61 5b 69 3e & 7). data[i>
2750: 3e 33 5d 20 5e 3d 20 74 6d 70 5b 69 3e 3e 33 5d >3] ^= tmp[i>>3]
2760: 3b 0a 20 20 78 6f 72 4c 61 6e 65 73 49 6e 74 6f ;. xorLanesInto
2770: 53 74 61 74 65 28 62 79 74 65 43 6f 75 6e 74 2c State(byteCount,
2780: 20 73 74 61 74 65 2c 20 28 28 63 68 61 72 2a 29 state, ((char*)
2790: 64 61 74 61 29 29 3b 0a 7d 0a data));.}.