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.