1use digest::{
12 consts::{U136, U32},
13 generic_array::GenericArray,
14 BlockInput, Digest, FixedOutput, Reset, Update,
15};
16use tiny_keccak::{Hasher, Sha3};
17
18#[derive(Clone)]
24pub struct Sha3_256(Sha3);
25
26static_assertions::assert_impl_all!(Sha3_256: Digest);
28
29impl Default for Sha3_256 {
30 #[inline]
31 fn default() -> Self { Self(Sha3::v256()) }
32}
33
34impl BlockInput for Sha3_256 {
35 type BlockSize = U136;
36}
37
38impl Update for Sha3_256 {
39 #[inline]
40 fn update(&mut self, data: impl AsRef<[u8]>) {
41 self.0.update(data.as_ref());
42 }
43}
44
45impl Reset for Sha3_256 {
46 #[inline]
47 fn reset(&mut self) { *self = Self::default(); }
48}
49
50impl FixedOutput for Sha3_256 {
51 type OutputSize = U32;
52
53 #[inline]
54 fn finalize_into(self, out: &mut GenericArray<u8, Self::OutputSize>) {
55 self.0.finalize(out.as_mut());
56 }
57
58 #[inline]
59 fn finalize_into_reset(
60 &mut self, out: &mut GenericArray<u8, Self::OutputSize>,
61 ) {
62 self.clone().finalize_into(out);
63 Reset::reset(self)
64 }
65}