sigma_proofs/duplex_sponge/
shake.rs1use crate::duplex_sponge::DuplexSpongeInterface;
6use alloc::vec;
7use alloc::vec::Vec;
8use sha3::digest::{ExtendableOutput, Update};
9use sha3::Shake128;
10
11#[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}