use crate::sha3::{KeccakState, SHA3_256_RATE, SHA3_512_RATE, SHAKE128_RATE, SHAKE256_RATE};
pub fn h(input: &[u8]) -> [u8; 32] {
let mut state = KeccakState::new(SHA3_256_RATE, 0x06);
state.absorb(input);
let mut out = [0u8; 32];
state.squeeze(&mut out);
out
}
pub fn g(input: &[u8]) -> ([u8; 32], [u8; 32]) {
let mut state = KeccakState::new(SHA3_512_RATE, 0x06);
state.absorb(input);
let mut out = [0u8; 64];
state.squeeze(&mut out);
let mut a = [0u8; 32];
let mut b = [0u8; 32];
a.copy_from_slice(&out[..32]);
b.copy_from_slice(&out[32..]);
(a, b)
}
pub fn j(input: &[u8]) -> [u8; 32] {
let mut state = KeccakState::new(SHAKE256_RATE, 0x1f);
state.absorb(input);
let mut out = [0u8; 32];
state.squeeze(&mut out);
out
}
pub fn prf(eta: usize, s: &[u8; 32], b: u8, out: &mut [u8]) {
debug_assert!(out.len() >= 64 * eta);
let mut state = KeccakState::new(SHAKE256_RATE, 0x1f);
state.absorb(s);
state.absorb(&[b]);
let len = 64 * eta;
state.squeeze(&mut out[..len]);
}
pub struct Xof {
state: KeccakState,
}
impl Xof {
pub fn new() -> Self {
Self {
state: KeccakState::new(SHAKE128_RATE, 0x1f),
}
}
pub fn absorb(&mut self, data: &[u8]) {
self.state.absorb(data);
}
pub fn squeeze(&mut self, out: &mut [u8]) {
self.state.squeeze(out);
}
}