| 221 | } |
| 222 | |
| 223 | static void |
| 224 | keccakf(uint64_t s[25]) |
| 225 | { |
| 226 | int i, j, round; |
| 227 | uint64_t t, bc[5]; |
| 228 | #define KECCAK_ROUNDS 24 |
| 229 | |
| 230 | for (round = 0; round < KECCAK_ROUNDS; round++) { |
| 231 | |
| 232 | /* Theta */ |
| 233 | for (i = 0; i < 5; i++) |
| 234 | bc[i] = s[i] ^ s[i + 5] ^ s[i + 10] ^ s[i + 15] ^ |
| 235 | s[i + 20]; |
| 236 | |
| 237 | for (i = 0; i < 5; i++) { |
| 238 | t = bc[(i + 4) % 5] ^ SHA3_ROTL64(bc[(i + 1) % 5], 1); |
| 239 | for (j = 0; j < 25; j += 5) |
| 240 | s[j + i] ^= t; |
| 241 | } |
| 242 | |
| 243 | /* Rho Pi */ |
| 244 | t = s[1]; |
| 245 | for (i = 0; i < 24; i++) { |
| 246 | j = keccakf_piln[i]; |
| 247 | bc[0] = s[j]; |
| 248 | s[j] = SHA3_ROTL64(t, keccakf_rotc[i]); |
| 249 | t = bc[0]; |
| 250 | } |
| 251 | |
| 252 | /* Chi */ |
| 253 | for (j = 0; j < 25; j += 5) { |
| 254 | for (i = 0; i < 5; i++) |
| 255 | bc[i] = s[j + i]; |
| 256 | for (i = 0; i < 5; i++) |
| 257 | s[j + i] ^= (~bc[(i + 1) % 5]) & |
| 258 | bc[(i + 2) % 5]; |
| 259 | } |
| 260 | |
| 261 | /* Iota */ |
| 262 | s[0] ^= keccakf_rndc[round]; |
| 263 | } |
| 264 | } |
| 265 | |
| 266 | static void |
| 267 | sha3_Init224(void *priv) |