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