Skip to main content

sigma_proofs/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 alloc::vec;
7use alloc::vec::Vec;
8use sha3::digest::{ExtendableOutput, Update};
9use sha3::Shake128;
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; 64]) -> Self {
17        let mut hasher = Shake128::default();
18        let initial_block = [iv.to_vec(), vec![0u8; 168 - 64]].concat();
19        hasher.update(&initial_block);
20        Self(hasher)
21    }
22
23    fn absorb(&mut self, input: &[u8]) {
24        self.0.update(input);
25    }
26
27    fn squeeze(&mut self, length: usize) -> Vec<u8> {
28        let mut output = vec![0u8; length];
29        self.0.clone().finalize_xof_into(&mut output);
30        output
31    }
32}