use tiny_keccak::Keccak;
use ::utils::left_encode;
#[derive(Clone)]
pub struct CShake(pub(crate) Keccak);
impl CShake {
#[inline]
pub fn new_cshake128(name: &[u8], custom: &[u8]) -> Self {
let mut cshake = CShake(Keccak::new(168, 0x04));
cshake.init(name, custom, 168);
cshake
}
#[inline]
pub fn new_cshake256(name: &[u8], custom: &[u8]) -> Self {
let mut cshake = CShake(Keccak::new(136, 0x04));
cshake.init(name, custom, 136);
cshake
}
fn init(&mut self, name: &[u8], custom: &[u8], rate: usize) {
let mut encbuf = [0; 9];
let pos = left_encode(&mut encbuf, rate as u64);
self.0.absorb(&encbuf[pos..]);
let pos = left_encode(&mut encbuf, name.len() as u64 * 8);
self.0.absorb(&encbuf[pos..]); self.0.absorb(name);
let pos = left_encode(&mut encbuf, custom.len() as u64 * 8);
self.0.absorb(&encbuf[pos..]); self.0.absorb(custom);
self.0.fill_block(); }
#[inline]
pub fn update(&mut self, buf: &[u8]) {
self.0.absorb(buf)
}
#[inline]
pub fn finalize(&mut self, buf: &mut [u8]) {
self.0.pad();
self.0.keccakf();
self.0.squeeze(buf);
}
#[inline]
pub fn squeeze(&mut self, buf: &mut [u8]) {
self.0.squeeze(buf)
}
}