pub use crate::hash::keccak::sponge::program::KECCAK_RC;
const RHO: [[u32; 5]; 5] = [
[0, 36, 3, 41, 18],
[1, 44, 10, 45, 2],
[62, 6, 43, 15, 61],
[28, 55, 25, 21, 56],
[27, 20, 39, 8, 14],
];
pub fn keccak_round(state: &mut [u64; 25], rc: u64) {
let mut c = [0u64; 5];
for x in 0..5 {
c[x] = state[x] ^ state[x + 5] ^ state[x + 10] ^ state[x + 15] ^ state[x + 20];
}
let mut d = [0u64; 5];
for x in 0..5 {
d[x] = c[(x + 4) % 5] ^ c[(x + 1) % 5].rotate_left(1);
}
for x in 0..5 {
for y in 0..5 {
state[x + 5 * y] ^= d[x];
}
}
let mut b = [0u64; 25];
for x in 0..5 {
for y in 0..5 {
b[y + 5 * ((2 * x + 3 * y) % 5)] = state[x + 5 * y].rotate_left(RHO[x][y]);
}
}
for y in 0..5 {
for x in 0..5 {
state[x + 5 * y] =
b[x + 5 * y] ^ ((!b[((x + 1) % 5) + 5 * y]) & b[((x + 2) % 5) + 5 * y]);
}
}
state[0] ^= rc;
}
pub fn keccak_f1600(state: [u64; 25]) -> [u64; 25] {
let mut s = state;
for &rc in &KECCAK_RC {
keccak_round(&mut s, rc);
}
s
}