pub use crate::sha3::KeccakState;
use crate::sha3::SHAKE256_RATE as CORE_SHAKE256_RATE;
use alloc::vec::Vec;
pub const SHAKE256_RATE: usize = CORE_SHAKE256_RATE;
pub fn shake256_into(data: &[u8], out: &mut [u8]) {
let mut state = KeccakState::new(SHAKE256_RATE, 0x1f);
state.absorb(data);
state.squeeze(out);
}
pub fn shake256(data: &[u8], out_len: usize) -> Vec<u8> {
let mut out = vec![0u8; out_len];
shake256_into(data, &mut out);
out
}
pub struct Shake256 {
state: KeccakState,
}
impl Shake256 {
pub fn new() -> Self {
Self {
state: KeccakState::new(SHAKE256_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);
}
pub fn finalize(mut self, out_len: usize) -> Vec<u8> {
let mut out = vec![0u8; out_len];
self.state.squeeze(&mut out);
out
}
}