use tiny_keccak::{Hasher, Shake, Xof};
use zeroize::Zeroize;
#[derive(Clone)]
pub struct Sponge {
state: Shake,
}
impl Sponge {
pub fn new() -> Self {
Self {
state: Shake::v256(),
}
}
pub fn absorb(&mut self, input: &[u8]) {
self.state.update(input);
}
pub fn squeeze(&mut self, out_len: usize) -> Vec<u8> {
let mut out = vec![0u8; out_len];
self.state.squeeze(&mut out);
out
}
pub fn fork(&self) -> Self {
Self {
state: self.state.clone(),
}
}
}
impl Zeroize for Sponge {
fn zeroize(&mut self) {
self.state = Shake::v256();
}
}