bsv_wasm/hash/
sha256r_digest.rs

1use 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/**
11 *  Sha256 reversible - needed to convert the output of a Sha256 hash into Little Endian for SigHash BIP143
12 */
13#[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);