static void Safer_Expand_Userkey(const unsigned char *userkey_1, const unsigned char *userkey_2, unsigned int nof_rounds, int strengthened, safer_key_t key) #endif { unsigned int i, j, k; unsigned char ka[LTC_SAFER_BLOCK_LEN + 1]; unsigned char kb[LTC_SAFER_BLOCK_LEN + 1]; if (LTC_SAFER_MAX_NOF_ROUNDS < nof_rounds) nof_rounds = LTC_SAFER_MAX_NOF_ROUNDS; *key++ = (unsigned char)nof_rounds; ka[LTC_SAFER_BLOCK_LEN] = (unsigned char)0; kb[LTC_SAFER_BLOCK_LEN] = (unsigned char)0; k = 0; for (j = 0; j < LTC_SAFER_BLOCK_LEN; j++) { ka[j] = ROL8(userkey_1[j], 5); ka[LTC_SAFER_BLOCK_LEN] ^= ka[j]; kb[j] = *key++ = userkey_2[j]; kb[LTC_SAFER_BLOCK_LEN] ^= kb[j]; } for (i = 1; i <= nof_rounds; i++) { for (j = 0; j < LTC_SAFER_BLOCK_LEN + 1; j++) { ka[j] = ROL8(ka[j], 6); kb[j] = ROL8(kb[j], 6); } if (strengthened) { k = 2 * i - 1; while (k >= (LTC_SAFER_BLOCK_LEN + 1)) { k -= LTC_SAFER_BLOCK_LEN + 1; } } for (j = 0; j < LTC_SAFER_BLOCK_LEN; j++) { if (strengthened) { *key++ = (ka[k] + safer_ebox[(int)safer_ebox[(int)((18 * i + j + 1)&0xFF)]]) & 0xFF; if (++k == (LTC_SAFER_BLOCK_LEN + 1)) { k = 0; } } else { *key++ = (ka[j] + safer_ebox[(int)safer_ebox[(int)((18 * i + j + 1)&0xFF)]]) & 0xFF; } } if (strengthened) { k = 2 * i; while (k >= (LTC_SAFER_BLOCK_LEN + 1)) { k -= LTC_SAFER_BLOCK_LEN + 1; } } for (j = 0; j < LTC_SAFER_BLOCK_LEN; j++) { if (strengthened) { *key++ = (kb[k] + safer_ebox[(int)safer_ebox[(int)((18 * i + j + 10)&0xFF)]]) & 0xFF; if (++k == (LTC_SAFER_BLOCK_LEN + 1)) { k = 0; } } else { *key++ = (kb[j] + safer_ebox[(int)safer_ebox[(int)((18 * i + j + 10)&0xFF)]]) & 0xFF; } } } #ifdef LTC_CLEAN_STACK zeromem(ka, sizeof(ka)); zeromem(kb, sizeof(kb)); #endif }
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 ); }