sigma_rs/duplex_sponge/
shake.rs

1//! SHAKE-based duplex sponge implementation
2//!
3//! This module implements a duplex sponge construction using SHAKE128.
4
5use crate::duplex_sponge::DuplexSpongeInterface;
6use sha3::{
7    digest::{ExtendableOutput, Reset, Update},
8    Shake128,
9};
10
11/// Duplex sponge construction using SHAKE128.
12#[derive(Clone, Debug)]
13pub struct ShakeDuplexSponge(Shake128);
14
15impl DuplexSpongeInterface for ShakeDuplexSponge {
16    fn new(iv: [u8; 32]) -> Self {
17        let mut hasher = Shake128::default();
18        hasher.update(&iv);
19        Self(hasher)
20    }
21
22    fn absorb(&mut self, input: &[u8]) {
23        self.0.update(input);
24    }
25
26    fn squeeze(&mut self, length: usize) -> Vec<u8> {
27        let mut output = vec![0u8; length];
28        self.0.clone().finalize_xof_into(&mut output);
29        output
30    }
31
32    fn ratchet(&mut self) {
33        let mut output = [0u8; 32];
34        self.0.clone().finalize_xof_into(&mut output);
35        self.0.reset();
36        self.0.update(&output);
37    }
38}