openvm_keccak256_circuit/
utils.rs

1use tiny_keccak::{keccakf, Hasher, Keccak};
2
3use super::KECCAK_RATE_BYTES;
4
5/// Wrapper function for tiny-keccak's keccak-f permutation.
6/// Returns the new state after permutation.
7pub fn keccak_f(mut state: [u64; 25]) -> [u64; 25] {
8    keccakf(&mut state);
9    state
10}
11
12pub fn keccak256(input: &[u8]) -> [u8; 32] {
13    let mut hasher = Keccak::v256();
14    hasher.update(input);
15    let mut output = [0u8; 32];
16    hasher.finalize(&mut output);
17    output
18}
19
20/// Number of keccak-f permutations required for keccak256 on
21/// input of `byte_len` bytes.
22pub fn num_keccak_f(byte_len: usize) -> usize {
23    // always need at least 1 extra byte for padding
24    // ceil((byte_len + 1) / rate) = byte_len // rate + 1
25    byte_len / KECCAK_RATE_BYTES + 1
26}