Hex Artifact Content
Not logged in

Artifact cf1ed93ed7b945a85329c1e0d843479a9e7fd1ee:


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));.}.