You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
6.1 KiB
186 lines
6.1 KiB
/*
|
|
Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni,
|
|
Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby
|
|
denoted as "the implementer".
|
|
|
|
For more information, feedback or questions, please refer to our websites:
|
|
http://keccak.noekeon.org/
|
|
http://keyak.noekeon.org/
|
|
http://ketje.noekeon.org/
|
|
|
|
To the extent possible under law, the implementer has waived all copyright
|
|
and related or neighboring rights to the source code in this file.
|
|
http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
#if (defined(FullUnrolling))
|
|
#define rounds24 \
|
|
prepareTheta \
|
|
thetaRhoPiChiIotaPrepareTheta( 0, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta( 1, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta( 2, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta( 3, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta( 4, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta( 5, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta( 6, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta( 7, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta( 8, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta( 9, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(10, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(11, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(12, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(13, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(14, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(15, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(16, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(17, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(18, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(19, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(20, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(21, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(22, A, E) \
|
|
thetaRhoPiChiIota(23, E, A) \
|
|
|
|
#define rounds12 \
|
|
prepareTheta \
|
|
thetaRhoPiChiIotaPrepareTheta(12, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(13, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(14, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(15, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(16, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(17, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(18, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(19, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(20, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(21, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(22, A, E) \
|
|
thetaRhoPiChiIota(23, E, A) \
|
|
|
|
#elif (Unrolling == 12)
|
|
#define rounds24 \
|
|
prepareTheta \
|
|
for(i=0; i<24; i+=12) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+ 1, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+ 2, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+ 3, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+ 4, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+ 5, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+ 6, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+ 7, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+ 8, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+ 9, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+10, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+11, E, A) \
|
|
} \
|
|
|
|
#define rounds12 \
|
|
prepareTheta \
|
|
thetaRhoPiChiIotaPrepareTheta(12, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(13, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(14, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(15, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(16, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(17, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(18, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(19, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(20, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(21, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(22, A, E) \
|
|
thetaRhoPiChiIota(23, E, A) \
|
|
|
|
#elif (Unrolling == 6)
|
|
#define rounds24 \
|
|
prepareTheta \
|
|
for(i=0; i<24; i+=6) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+3, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+4, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+5, E, A) \
|
|
} \
|
|
|
|
#define rounds12 \
|
|
prepareTheta \
|
|
for(i=12; i<24; i+=6) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+3, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+4, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+5, E, A) \
|
|
} \
|
|
|
|
#elif (Unrolling == 4)
|
|
#define rounds24 \
|
|
prepareTheta \
|
|
for(i=0; i<24; i+=4) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+3, E, A) \
|
|
} \
|
|
|
|
#define rounds12 \
|
|
prepareTheta \
|
|
for(i=12; i<24; i+=4) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+3, E, A) \
|
|
} \
|
|
|
|
#elif (Unrolling == 3)
|
|
#define rounds24 \
|
|
prepareTheta \
|
|
for(i=0; i<24; i+=3) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
|
|
copyStateVariables(A, E) \
|
|
} \
|
|
|
|
#define rounds12 \
|
|
prepareTheta \
|
|
for(i=12; i<24; i+=3) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
|
|
copyStateVariables(A, E) \
|
|
} \
|
|
|
|
#elif (Unrolling == 2)
|
|
#define rounds24 \
|
|
prepareTheta \
|
|
for(i=0; i<24; i+=2) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
|
|
} \
|
|
|
|
#define rounds12 \
|
|
prepareTheta \
|
|
for(i=12; i<24; i+=2) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
|
|
} \
|
|
|
|
#elif (Unrolling == 1)
|
|
#define rounds24 \
|
|
prepareTheta \
|
|
for(i=0; i<24; i++) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
copyStateVariables(A, E) \
|
|
} \
|
|
|
|
#define rounds12 \
|
|
prepareTheta \
|
|
for(i=12; i<24; i++) { \
|
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
|
copyStateVariables(A, E) \
|
|
} \
|
|
|
|
#else
|
|
#error "Unrolling is not correctly specified!"
|
|
#endif
|