provekit-whir 0.1.1

An implementation of the WHIR polynomial commitment scheme
Documentation
#![cfg(test)]

use super::DuplexSpongeInterface;

#[derive(Clone, Debug)]
pub struct MockSponge<'a> {
    pub absorb: Option<&'a [u8]>,
    pub squeeze: &'a [u8],
}

impl DuplexSpongeInterface for MockSponge<'_> {
    type U = u8;

    fn absorb(&mut self, input: &[Self::U]) -> &mut Self {
        if let Some(absorb) = self.absorb.as_mut() {
            assert!(&absorb[..input.len()] == input);
            *absorb = &absorb[input.len()..];
        }
        self
    }

    fn squeeze(&mut self, output: &mut [Self::U]) -> &mut Self {
        output.copy_from_slice(&self.squeeze[..output.len()]);
        self.squeeze = &self.squeeze[output.len()..];
        self
    }

    fn ratchet(&mut self) -> &mut Self {
        if let Some(absorb) = self.absorb.as_mut() {
            assert!(&absorb[..7] == b"RATCHET");
            *absorb = &absorb[7..];
        }
        assert!(&self.squeeze[..7] == b"RATCHET");
        self.squeeze = &self.squeeze[7..];
        self
    }
}