void KeccakP200_Permute_Nrounds(void *argState, unsigned int nr) { tSmallUInt x, y; tKeccakLane temp; tKeccakLane BC[5]; tKeccakLane *state; const tKeccakLane *rc; state = (tKeccakLane*)argState; rc = KeccakF200_RoundConstants + 18 - nr; do { // Theta for ( x = 0; x < 5; ++x ) { BC[x] = state[x] ^ state[5 + x] ^ state[10 + x] ^ state[15 + x] ^ state[20 + x]; } for ( x = 0; x < 5; ++x ) { temp = BC[MOD5(x+4)] ^ ROL8(BC[MOD5(x+1)], 1); for ( y = 0; y < 25; y += 5 ) { state[y + x] ^= temp; } } // Rho Pi temp = state[1]; for ( x = 0; x < 24; ++x ) { BC[0] = state[KeccakP200_PiLane[x]]; state[KeccakP200_PiLane[x]] = ROL8( temp, KeccakP200_RotationConstants[x] ); temp = BC[0]; } // Chi for ( y = 0; y < 25; y += 5 ) { #if defined(UNROLL_CHILOOP) BC[0] = state[y + 0]; BC[1] = state[y + 1]; BC[2] = state[y + 2]; BC[3] = state[y + 3]; BC[4] = state[y + 4]; #else for ( x = 0; x < 5; ++x ) { BC[x] = state[y + x]; } #endif for ( x = 0; x < 5; ++x ) { state[y + x] = BC[x] ^((~BC[MOD5(x+1)]) & BC[MOD5(x+2)]); } } // Iota temp = *(rc++); state[0] ^= temp; } while( temp != 0x80 ); }
void KeccakP800_Permute_Nrounds(void *argState, unsigned int nr) { tSmallUInt x, y; tKeccakLane temp; tKeccakLane BC[5]; tKeccakLane *state; UINT8 LFSRstate; state = (tKeccakLane*)argState; LFSRstate = 0x01; for ( y = (tSmallUInt)(cKeccakNumberOfRounds - nr); y != 0; --y ) { for( x = 1; x < 128; x <<= 1 ) { if ((LFSRstate & 0x80) != 0) // Primitive polynomial over GF(2): x^8+x^6+x^5+x^4+1 LFSRstate = (LFSRstate << 1) ^ 0x71; else LFSRstate <<= 1; } } do { // Theta for ( x = 0; x < 5; ++x ) { BC[x] = state[x] ^ state[5 + x] ^ state[10 + x] ^ state[15 + x] ^ state[20 + x]; } for ( x = 0; x < 5; ++x ) { temp = BC[MOD5(x+4)] ^ ROL32(BC[MOD5(x+1)], 1); for ( y = 0; y < 25; y += 5 ) { state[y + x] ^= temp; } } // Rho Pi temp = state[1]; for ( x = 0; x < 24; ++x ) { BC[0] = state[KeccakP800_PiLane[x]]; state[KeccakP800_PiLane[x]] = ROL32( temp, KeccakP800_RotationConstants[x] ); temp = BC[0]; } // Chi for ( y = 0; y < 25; y += 5 ) { #if defined(UNROLL_CHILOOP) BC[0] = state[y + 0]; BC[1] = state[y + 1]; BC[2] = state[y + 2]; BC[3] = state[y + 3]; BC[4] = state[y + 4]; #else for ( x = 0; x < 5; ++x ) { BC[x] = state[y + x]; } #endif for ( x = 0; x < 5; ++x ) { state[y + x] = BC[x] ^((~BC[MOD5(x+1)]) & BC[MOD5(x+2)]); } } // Iota temp = 0; for( x = 1; x < 128; x <<= 1 ) { if ( x <= (sizeof(tKeccakLane)*8) ) temp ^= (tKeccakLane)(LFSRstate & 1) << (x - 1); if ((LFSRstate & 0x80) != 0) // Primitive polynomial over GF(2): x^8+x^6+x^5+x^4+1 LFSRstate = (LFSRstate << 1) ^ 0x71; else LFSRstate <<= 1; } state[0] ^= temp; } while( --nr != 0 ); }
void KeccakF1600_StatePermute(void *argState) { tSmallUInt x, y, round; tKeccakLane temp; tKeccakLane BC[5]; tKeccakLane *state; UINT8 LFSRstate; state = argState; LFSRstate = 0x01; round = cKeccakNumberOfRounds; do { // Theta for ( x = 0; x < 5; ++x ) { BC[x] = state[x] ^ state[5 + x] ^ state[10 + x] ^ state[15 + x] ^ state[20 + x]; } for ( x = 0; x < 5; ++x ) { temp = BC[MOD5(x+4)] ^ ROL64(BC[MOD5(x+1)], 1); for ( y = 0; y < 25; y += 5 ) { state[y + x] ^= temp; } } // Rho Pi temp = state[1]; for ( x = 0; x < 24; ++x ) { BC[0] = state[KeccakF_PiLane[x]]; state[KeccakF_PiLane[x]] = ROL64( temp, KeccakF_RotationConstants[x] ); temp = BC[0]; } // Chi for ( y = 0; y < 25; y += 5 ) { #if defined(UNROLL_CHILOOP) BC[0] = state[y + 0]; BC[1] = state[y + 1]; BC[2] = state[y + 2]; BC[3] = state[y + 3]; BC[4] = state[y + 4]; #else for ( x = 0; x < 5; ++x ) { BC[x] = state[y + x]; } #endif for ( x = 0; x < 5; ++x ) { state[y + x] = BC[x] ^((~BC[MOD5(x+1)]) & BC[MOD5(x+2)]); } } // Iota state[0] ^= KeccakF1600_GetNextRoundConstant(&LFSRstate); } while( --round != 0 ); }