1use crate::{bits_to_rate, keccakf::KeccakF, Hasher, KeccakState, Xof};
2
3#[derive(Clone)]
14pub struct Shake {
15 state: KeccakState<KeccakF>,
16}
17
18impl Shake {
19 const DELIM: u8 = 0x1f;
20
21 pub fn v128() -> Shake {
25 Shake::new(128)
26 }
27
28 pub fn v256() -> Shake {
32 Shake::new(256)
33 }
34
35 pub(crate) fn new(bits: usize) -> Shake {
36 Shake {
37 state: KeccakState::new(bits_to_rate(bits), Self::DELIM),
38 }
39 }
40}
41
42impl Hasher for Shake {
43 fn update(&mut self, input: &[u8]) {
44 self.state.update(input);
45 }
46
47 fn finalize(self, output: &mut [u8]) {
48 self.state.finalize(output);
49 }
50}
51
52impl Xof for Shake {
53 fn squeeze(&mut self, output: &mut [u8]) {
54 self.state.squeeze(output)
55 }
56}