bsv_wasm/hash/
sha256r_digest.rs1use crate::hash::FixedOutput;
2use digest::{
3 consts::{U32, U64},
4 BlockInput, Reset, Update,
5};
6use sha2::Sha256;
7
8use crate::reverse_digest::ReversibleDigest;
9
10#[derive(Clone, Default)]
14pub struct Sha256r {
15 engine: Sha256,
16 reverse: bool,
17}
18
19impl ReversibleDigest for Sha256r {
20 fn reverse(&self) -> Self {
21 let mut reversed = self.clone();
22 reversed.reverse = true;
23 reversed
24 }
25}
26
27impl BlockInput for Sha256r {
28 type BlockSize = U64;
29}
30
31impl Update for Sha256r {
32 fn update(&mut self, data: impl AsRef<[u8]>) {
33 self.engine.update(data);
34 }
35}
36
37impl FixedOutput for Sha256r {
38 type OutputSize = U32;
39
40 fn finalize_into(self, out: &mut digest::generic_array::GenericArray<u8, Self::OutputSize>) {
41 let finalised_hash = &mut *digest::Digest::finalize(self.engine);
42 if self.reverse {
43 finalised_hash.reverse()
44 }
45
46 out.copy_from_slice(&*finalised_hash);
47 }
48
49 fn finalize_into_reset(&mut self, out: &mut digest::generic_array::GenericArray<u8, Self::OutputSize>) {
50 self.clone().finalize_into(out);
51 digest::Reset::reset(self);
52 }
53
54 fn finalize_fixed(self) -> digest::generic_array::GenericArray<u8, Self::OutputSize>
55 where
56 Self: Sized,
57 {
58 let mut out = Default::default();
59 self.finalize_into(&mut out);
60 out
61 }
62
63 fn finalize_fixed_reset(&mut self) -> digest::generic_array::GenericArray<u8, Self::OutputSize> {
64 let mut out = Default::default();
65 self.finalize_into_reset(&mut out);
66 out
67 }
68}
69
70impl Reset for Sha256r {
71 fn reset(&mut self) {
72 self.engine = Sha256::default();
73 }
74}
75
76digest::impl_write!(Sha256r);