Hex Artifact Content
Not logged in

Artifact 76f22fdf4bdcac5261e52b977808f6ce8d523309:


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: 23 69 66 20 28 55 6e 72 6f 6c 6c 69 6e 67 20 3d  #if (Unrolling =
01f0: 3d 20 31 32 29 0a 23 64 65 66 69 6e 65 20 72 6f  = 12).#define ro
0200: 75 6e 64 73 28 72 6f 75 6e 64 29 20 5c 0a 20 20  unds(round) \.  
0210: 20 20 70 72 65 70 61 72 65 54 68 65 74 61 20 5c    prepareTheta \
0220: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
0230: 72 6f 75 6e 64 3b 20 69 2b 3d 31 32 29 20 7b 20  round; i+=12) { 
0240: 5c 0a 20 20 20 20 20 20 20 20 74 68 65 74 61 52  \.        thetaR
0250: 68 6f 50 69 43 68 69 49 6f 74 61 50 72 65 70 61  hoPiChiIotaPrepa
0260: 72 65 54 68 65 74 61 28 69 20 20 20 2c 20 41 2c  reTheta(i   , A,
0270: 20 45 29 20 5c 0a 20 20 20 20 20 20 20 20 74 68   E) \.        th
0280: 65 74 61 52 68 6f 50 69 43 68 69 49 6f 74 61 50  etaRhoPiChiIotaP
0290: 72 65 70 61 72 65 54 68 65 74 61 28 69 2b 20 31  repareTheta(i+ 1
02a0: 2c 20 45 2c 20 41 29 20 5c 0a 20 20 20 20 20 20  , E, A) \.      
02b0: 20 20 74 68 65 74 61 52 68 6f 50 69 43 68 69 49    thetaRhoPiChiI
02c0: 6f 74 61 50 72 65 70 61 72 65 54 68 65 74 61 28  otaPrepareTheta(
02d0: 69 2b 20 32 2c 20 41 2c 20 45 29 20 5c 0a 20 20  i+ 2, A, E) \.  
02e0: 20 20 20 20 20 20 74 68 65 74 61 52 68 6f 50 69        thetaRhoPi
02f0: 43 68 69 49 6f 74 61 50 72 65 70 61 72 65 54 68  ChiIotaPrepareTh
0300: 65 74 61 28 69 2b 20 33 2c 20 45 2c 20 41 29 20  eta(i+ 3, E, A) 
0310: 5c 0a 20 20 20 20 20 20 20 20 74 68 65 74 61 52  \.        thetaR
0320: 68 6f 50 69 43 68 69 49 6f 74 61 50 72 65 70 61  hoPiChiIotaPrepa
0330: 72 65 54 68 65 74 61 28 69 2b 20 34 2c 20 41 2c  reTheta(i+ 4, A,
0340: 20 45 29 20 5c 0a 20 20 20 20 20 20 20 20 74 68   E) \.        th
0350: 65 74 61 52 68 6f 50 69 43 68 69 49 6f 74 61 50  etaRhoPiChiIotaP
0360: 72 65 70 61 72 65 54 68 65 74 61 28 69 2b 20 35  repareTheta(i+ 5
0370: 2c 20 45 2c 20 41 29 20 5c 0a 20 20 20 20 20 20  , E, A) \.      
0380: 20 20 74 68 65 74 61 52 68 6f 50 69 43 68 69 49    thetaRhoPiChiI
0390: 6f 74 61 50 72 65 70 61 72 65 54 68 65 74 61 28  otaPrepareTheta(
03a0: 69 2b 20 36 2c 20 41 2c 20 45 29 20 5c 0a 20 20  i+ 6, A, E) \.  
03b0: 20 20 20 20 20 20 74 68 65 74 61 52 68 6f 50 69        thetaRhoPi
03c0: 43 68 69 49 6f 74 61 50 72 65 70 61 72 65 54 68  ChiIotaPrepareTh
03d0: 65 74 61 28 69 2b 20 37 2c 20 45 2c 20 41 29 20  eta(i+ 7, E, A) 
03e0: 5c 0a 20 20 20 20 20 20 20 20 74 68 65 74 61 52  \.        thetaR
03f0: 68 6f 50 69 43 68 69 49 6f 74 61 50 72 65 70 61  hoPiChiIotaPrepa
0400: 72 65 54 68 65 74 61 28 69 2b 20 38 2c 20 41 2c  reTheta(i+ 8, A,
0410: 20 45 29 20 5c 0a 20 20 20 20 20 20 20 20 74 68   E) \.        th
0420: 65 74 61 52 68 6f 50 69 43 68 69 49 6f 74 61 50  etaRhoPiChiIotaP
0430: 72 65 70 61 72 65 54 68 65 74 61 28 69 2b 20 39  repareTheta(i+ 9
0440: 2c 20 45 2c 20 41 29 20 5c 0a 20 20 20 20 20 20  , E, A) \.      
0450: 20 20 74 68 65 74 61 52 68 6f 50 69 43 68 69 49    thetaRhoPiChiI
0460: 6f 74 61 50 72 65 70 61 72 65 54 68 65 74 61 28  otaPrepareTheta(
0470: 69 2b 31 30 2c 20 41 2c 20 45 29 20 5c 0a 20 20  i+10, A, E) \.  
0480: 20 20 20 20 20 20 74 68 65 74 61 52 68 6f 50 69        thetaRhoPi
0490: 43 68 69 49 6f 74 61 50 72 65 70 61 72 65 54 68  ChiIotaPrepareTh
04a0: 65 74 61 28 69 2b 31 31 2c 20 45 2c 20 41 29 20  eta(i+11, E, A) 
04b0: 5c 0a 20 20 20 20 7d 20 5c 0a 20 20 20 20 63 6f  \.    } \.    co
04c0: 70 79 54 6f 53 74 61 74 65 28 73 74 61 74 65 2c  pyToState(state,
04d0: 20 41 29 0a 23 65 6c 69 66 20 28 55 6e 72 6f 6c   A).#elif (Unrol
04e0: 6c 69 6e 67 20 3d 3d 20 36 29 0a 23 64 65 66 69  ling == 6).#defi
04f0: 6e 65 20 72 6f 75 6e 64 73 28 72 6f 75 6e 64 29  ne rounds(round)
0500: 20 5c 0a 20 20 20 20 70 72 65 70 61 72 65 54 68   \.    prepareTh
0510: 65 74 61 20 5c 0a 20 20 20 20 66 6f 72 28 69 3d  eta \.    for(i=
0520: 30 3b 20 69 3c 72 6f 75 6e 64 3b 20 69 2b 3d 36  0; i<round; i+=6
0530: 29 20 7b 20 5c 0a 20 20 20 20 20 20 20 20 74 68  ) { \.        th
0540: 65 74 61 52 68 6f 50 69 43 68 69 49 6f 74 61 50  etaRhoPiChiIotaP
0550: 72 65 70 61 72 65 54 68 65 74 61 28 69 20 20 2c  repareTheta(i  ,
0560: 20 41 2c 20 45 29 20 5c 0a 20 20 20 20 20 20 20   A, E) \.       
0570: 20 74 68 65 74 61 52 68 6f 50 69 43 68 69 49 6f   thetaRhoPiChiIo
0580: 74 61 50 72 65 70 61 72 65 54 68 65 74 61 28 69  taPrepareTheta(i
0590: 2b 31 2c 20 45 2c 20 41 29 20 5c 0a 20 20 20 20  +1, E, A) \.    
05a0: 20 20 20 20 74 68 65 74 61 52 68 6f 50 69 43 68      thetaRhoPiCh
05b0: 69 49 6f 74 61 50 72 65 70 61 72 65 54 68 65 74  iIotaPrepareThet
05c0: 61 28 69 2b 32 2c 20 41 2c 20 45 29 20 5c 0a 20  a(i+2, A, E) \. 
05d0: 20 20 20 20 20 20 20 74 68 65 74 61 52 68 6f 50         thetaRhoP
05e0: 69 43 68 69 49 6f 74 61 50 72 65 70 61 72 65 54  iChiIotaPrepareT
05f0: 68 65 74 61 28 69 2b 33 2c 20 45 2c 20 41 29 20  heta(i+3, E, A) 
0600: 5c 0a 20 20 20 20 20 20 20 20 74 68 65 74 61 52  \.        thetaR
0610: 68 6f 50 69 43 68 69 49 6f 74 61 50 72 65 70 61  hoPiChiIotaPrepa
0620: 72 65 54 68 65 74 61 28 69 2b 34 2c 20 41 2c 20  reTheta(i+4, A, 
0630: 45 29 20 5c 0a 20 20 20 20 20 20 20 20 74 68 65  E) \.        the
0640: 74 61 52 68 6f 50 69 43 68 69 49 6f 74 61 50 72  taRhoPiChiIotaPr
0650: 65 70 61 72 65 54 68 65 74 61 28 69 2b 35 2c 20  epareTheta(i+5, 
0660: 45 2c 20 41 29 20 5c 0a 20 20 20 20 7d 20 5c 0a  E, A) \.    } \.
0670: 20 20 20 20 63 6f 70 79 54 6f 53 74 61 74 65 28      copyToState(
0680: 73 74 61 74 65 2c 20 41 29 0a 23 65 6c 69 66 20  state, A).#elif 
0690: 28 55 6e 72 6f 6c 6c 69 6e 67 20 3d 3d 20 34 29  (Unrolling == 4)
06a0: 0a 23 64 65 66 69 6e 65 20 72 6f 75 6e 64 73 28  .#define rounds(
06b0: 72 6f 75 6e 64 29 20 5c 0a 20 20 20 20 70 72 65  round) \.    pre
06c0: 70 61 72 65 54 68 65 74 61 20 5c 0a 20 20 20 20  pareTheta \.    
06d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 6f 75 6e 64  for(i=0; i<round
06e0: 3b 20 69 2b 3d 34 29 20 7b 20 5c 0a 20 20 20 20  ; i+=4) { \.    
06f0: 20 20 20 20 74 68 65 74 61 52 68 6f 50 69 43 68      thetaRhoPiCh
0700: 69 49 6f 74 61 50 72 65 70 61 72 65 54 68 65 74  iIotaPrepareThet
0710: 61 28 69 20 20 2c 20 41 2c 20 45 29 20 5c 0a 20  a(i  , A, E) \. 
0720: 20 20 20 20 20 20 20 74 68 65 74 61 52 68 6f 50         thetaRhoP
0730: 69 43 68 69 49 6f 74 61 50 72 65 70 61 72 65 54  iChiIotaPrepareT
0740: 68 65 74 61 28 69 2b 31 2c 20 45 2c 20 41 29 20  heta(i+1, E, A) 
0750: 5c 0a 20 20 20 20 20 20 20 20 74 68 65 74 61 52  \.        thetaR
0760: 68 6f 50 69 43 68 69 49 6f 74 61 50 72 65 70 61  hoPiChiIotaPrepa
0770: 72 65 54 68 65 74 61 28 69 2b 32 2c 20 41 2c 20  reTheta(i+2, A, 
0780: 45 29 20 5c 0a 20 20 20 20 20 20 20 20 74 68 65  E) \.        the
0790: 74 61 52 68 6f 50 69 43 68 69 49 6f 74 61 50 72  taRhoPiChiIotaPr
07a0: 65 70 61 72 65 54 68 65 74 61 28 69 2b 33 2c 20  epareTheta(i+3, 
07b0: 45 2c 20 41 29 20 5c 0a 20 20 20 20 7d 20 5c 0a  E, A) \.    } \.
07c0: 20 20 20 20 63 6f 70 79 54 6f 53 74 61 74 65 28      copyToState(
07d0: 73 74 61 74 65 2c 20 41 29 0a 23 65 6c 69 66 20  state, A).#elif 
07e0: 28 55 6e 72 6f 6c 6c 69 6e 67 20 3d 3d 20 33 29  (Unrolling == 3)
07f0: 0a 23 64 65 66 69 6e 65 20 72 6f 75 6e 64 73 28  .#define rounds(
0800: 72 6f 75 6e 64 29 20 5c 0a 20 20 20 20 70 72 65  round) \.    pre
0810: 70 61 72 65 54 68 65 74 61 20 5c 0a 20 20 20 20  pareTheta \.    
0820: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 6f 75 6e 64  for(i=0; i<round
0830: 3b 20 69 2b 3d 33 29 20 7b 20 5c 0a 20 20 20 20  ; i+=3) { \.    
0840: 20 20 20 20 74 68 65 74 61 52 68 6f 50 69 43 68      thetaRhoPiCh
0850: 69 49 6f 74 61 50 72 65 70 61 72 65 54 68 65 74  iIotaPrepareThet
0860: 61 28 69 20 20 2c 20 41 2c 20 45 29 20 5c 0a 20  a(i  , A, E) \. 
0870: 20 20 20 20 20 20 20 74 68 65 74 61 52 68 6f 50         thetaRhoP
0880: 69 43 68 69 49 6f 74 61 50 72 65 70 61 72 65 54  iChiIotaPrepareT
0890: 68 65 74 61 28 69 2b 31 2c 20 45 2c 20 41 29 20  heta(i+1, E, A) 
08a0: 5c 0a 20 20 20 20 20 20 20 20 74 68 65 74 61 52  \.        thetaR
08b0: 68 6f 50 69 43 68 69 49 6f 74 61 50 72 65 70 61  hoPiChiIotaPrepa
08c0: 72 65 54 68 65 74 61 28 69 2b 32 2c 20 41 2c 20  reTheta(i+2, A, 
08d0: 45 29 20 5c 0a 20 20 20 20 20 20 20 20 63 6f 70  E) \.        cop
08e0: 79 53 74 61 74 65 56 61 72 69 61 62 6c 65 73 28  yStateVariables(
08f0: 41 2c 20 45 29 20 5c 0a 20 20 20 20 7d 20 5c 0a  A, E) \.    } \.
0900: 20 20 20 20 63 6f 70 79 54 6f 53 74 61 74 65 28      copyToState(
0910: 73 74 61 74 65 2c 20 41 29 0a 23 65 6c 69 66 20  state, A).#elif 
0920: 28 55 6e 72 6f 6c 6c 69 6e 67 20 3d 3d 20 32 29  (Unrolling == 2)
0930: 0a 23 64 65 66 69 6e 65 20 72 6f 75 6e 64 73 28  .#define rounds(
0940: 72 6f 75 6e 64 29 20 5c 0a 20 20 20 20 70 72 65  round) \.    pre
0950: 70 61 72 65 54 68 65 74 61 20 5c 0a 20 20 20 20  pareTheta \.    
0960: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 6f 75 6e 64  for(i=0; i<round
0970: 3b 20 69 2b 3d 32 29 20 7b 20 5c 0a 20 20 20 20  ; i+=2) { \.    
0980: 20 20 20 20 74 68 65 74 61 52 68 6f 50 69 43 68      thetaRhoPiCh
0990: 69 49 6f 74 61 50 72 65 70 61 72 65 54 68 65 74  iIotaPrepareThet
09a0: 61 28 69 20 20 2c 20 41 2c 20 45 29 20 5c 0a 20  a(i  , A, E) \. 
09b0: 20 20 20 20 20 20 20 74 68 65 74 61 52 68 6f 50         thetaRhoP
09c0: 69 43 68 69 49 6f 74 61 50 72 65 70 61 72 65 54  iChiIotaPrepareT
09d0: 68 65 74 61 28 69 2b 31 2c 20 45 2c 20 41 29 20  heta(i+1, E, A) 
09e0: 5c 0a 20 20 20 20 7d 20 5c 0a 20 20 20 20 63 6f  \.    } \.    co
09f0: 70 79 54 6f 53 74 61 74 65 28 73 74 61 74 65 2c  pyToState(state,
0a00: 20 41 29 0a 23 65 6c 69 66 20 28 55 6e 72 6f 6c   A).#elif (Unrol
0a10: 6c 69 6e 67 20 3d 3d 20 31 29 0a 23 64 65 66 69  ling == 1).#defi
0a20: 6e 65 20 72 6f 75 6e 64 73 28 72 6f 75 6e 64 29  ne rounds(round)
0a30: 20 5c 0a 20 20 20 20 70 72 65 70 61 72 65 54 68   \.    prepareTh
0a40: 65 74 61 20 5c 0a 20 20 20 20 66 6f 72 28 69 3d  eta \.    for(i=
0a50: 30 3b 20 69 3c 72 6f 75 6e 64 3b 20 69 2b 2b 29  0; i<round; i++)
0a60: 20 7b 20 5c 0a 20 20 20 20 20 20 20 20 74 68 65   { \.        the
0a70: 74 61 52 68 6f 50 69 43 68 69 49 6f 74 61 50 72  taRhoPiChiIotaPr
0a80: 65 70 61 72 65 54 68 65 74 61 28 69 20 20 2c 20  epareTheta(i  , 
0a90: 41 2c 20 45 29 20 5c 0a 20 20 20 20 20 20 20 20  A, E) \.        
0aa0: 63 6f 70 79 53 74 61 74 65 56 61 72 69 61 62 6c  copyStateVariabl
0ab0: 65 73 28 41 2c 20 45 29 20 5c 0a 20 20 20 20 7d  es(A, E) \.    }
0ac0: 20 5c 0a 20 20 20 20 63 6f 70 79 54 6f 53 74 61   \.    copyToSta
0ad0: 74 65 28 73 74 61 74 65 2c 20 41 29 0a 23 65 6c  te(state, A).#el
0ae0: 73 65 0a 23 65 72 72 6f 72 20 22 55 6e 72 6f 6c  se.#error "Unrol
0af0: 6c 69 6e 67 20 69 73 20 6e 6f 74 20 63 6f 72 72  ling is not corr
0b00: 65 63 74 6c 79 20 73 70 65 63 69 66 69 65 64 21  ectly specified!
0b10: 22 0a 23 65 6e 64 69 66 0a                       ".#endif.