bitcoin_hashes/
impls.rs

1// SPDX-License-Identifier: CC0-1.0
2
3//! `std` / `io` Impls.
4//!
5//! Implementations of traits defined in `std` / `io` and not in `core`.
6//!
7
8use bitcoin_io::impl_write;
9
10use crate::{hmac, ripemd160, sha1, sha256, sha512, siphash24, HashEngine};
11
12impl_write!(
13    sha1::HashEngine,
14    |us: &mut sha1::HashEngine, buf| {
15        us.input(buf);
16        Ok(buf.len())
17    },
18    |_us| { Ok(()) }
19);
20
21impl_write!(
22    sha256::HashEngine,
23    |us: &mut sha256::HashEngine, buf| {
24        us.input(buf);
25        Ok(buf.len())
26    },
27    |_us| { Ok(()) }
28);
29
30impl_write!(
31    sha512::HashEngine,
32    |us: &mut sha512::HashEngine, buf| {
33        us.input(buf);
34        Ok(buf.len())
35    },
36    |_us| { Ok(()) }
37);
38
39impl_write!(
40    ripemd160::HashEngine,
41    |us: &mut ripemd160::HashEngine, buf| {
42        us.input(buf);
43        Ok(buf.len())
44    },
45    |_us| { Ok(()) }
46);
47
48impl_write!(
49    siphash24::HashEngine,
50    |us: &mut siphash24::HashEngine, buf| {
51        us.input(buf);
52        Ok(buf.len())
53    },
54    |_us| { Ok(()) }
55);
56
57impl_write!(
58    hmac::HmacEngine<T>,
59    |us: &mut hmac::HmacEngine<T>, buf| {
60        us.input(buf);
61        Ok(buf.len())
62    },
63    |_us| { Ok(()) },
64    T: crate::Hash
65);
66
67#[cfg(test)]
68mod tests {
69    use bitcoin_io::Write;
70
71    use crate::{hash160, hmac, ripemd160, sha1, sha256, sha256d, sha512, siphash24, Hash};
72
73    macro_rules! write_test {
74        ($mod:ident, $exp_empty:expr, $exp_256:expr, $exp_64k:expr,) => {
75            #[test]
76            fn $mod() {
77                let mut engine = $mod::Hash::engine();
78                engine.write_all(&[]).unwrap();
79                assert_eq!(format!("{}", $mod::Hash::from_engine(engine)), $exp_empty);
80
81                let mut engine = $mod::Hash::engine();
82                engine.write_all(&[1; 256]).unwrap();
83                assert_eq!(format!("{}", $mod::Hash::from_engine(engine)), $exp_256);
84
85                let mut engine = $mod::Hash::engine();
86                engine.write_all(&[99; 64000]).unwrap();
87                assert_eq!(format!("{}", $mod::Hash::from_engine(engine)), $exp_64k);
88            }
89        };
90    }
91
92    write_test!(
93        sha1,
94        "da39a3ee5e6b4b0d3255bfef95601890afd80709",
95        "ac458b067c6b021c7e9358229b636e9d1e4cb154",
96        "e4b66838f9f7b6f91e5be32a02ae78094df402e7",
97    );
98
99    write_test!(
100        sha256,
101        "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
102        "2661920f2409dd6c8adeb0c44972959f232b6429afa913845d0fd95e7e768234",
103        "5c5e904f5d4fd587c7a906bf846e08a927286f388c54c39213a4884695271bbc",
104    );
105
106    write_test!(
107        sha256d,
108        "56944c5d3f98413ef45cf54545538103cc9f298e0575820ad3591376e2e0f65d",
109        "374000d830c75d10d9417e493a7652920f30efbd300e3fb092f24c28c20baf64",
110        "0050d4148ad7a0437ca0643fad5bf4614cd95d9ba21fde52370b37dcc3f03307",
111    );
112
113    write_test!(
114        sha512,
115        "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce\
116         47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
117        "57ecf739d3a7ca647639adae80a05f4f361304bfcbfa1ceba93296b096e74287\
118         45fc10c142cecdd3bb587a3dba598c072f6f78b31cc0a06a3da0105ee51f75d6",
119        "dd28f78c53f3bc9bd0c2dca9642a1ad402a70412f985c1f6e54fadb98ce9c458\
120         4761df8d04ed04bb734ba48dd2106bb9ea54524f1394cdd18e6da3166e71c3ee",
121    );
122
123    write_test!(
124        ripemd160,
125        "9c1185a5c5e9fc54612808977ee8f548b2258d31",
126        "e571a1ca5b780aa52bafdb9ec852544ffca418ba",
127        "ddd2ecce739e823629c7d46ab18918e9c4a51c75",
128    );
129
130    write_test!(
131        hash160,
132        "b472a266d0bd89c13706a4132ccfb16f7c3b9fcb",
133        "671356a1a874695ad3bc20cae440f4360835bd5a",
134        "a9608c952c8dbcc20c53803d2ca5ad31d64d9313",
135    );
136
137    write_test!(siphash24, "d70077739d4b921e", "3a3ccefde9b5b1e3", "ce456e4e4ecbc5bf",);
138
139    #[test]
140    fn hmac() {
141        let mut engine = hmac::HmacEngine::<sha256::Hash>::new(&[0xde, 0xad, 0xbe, 0xef]);
142        engine.write_all(&[]).unwrap();
143        assert_eq!(
144            format!("{}", hmac::Hmac::from_engine(engine)),
145            "bf5515149cf797955c4d3194cca42472883281951697c8375d9d9b107f384225"
146        );
147
148        let mut engine = hmac::HmacEngine::<sha256::Hash>::new(&[0xde, 0xad, 0xbe, 0xef]);
149        engine.write_all(&[1; 256]).unwrap();
150        assert_eq!(
151            format!("{}", hmac::Hmac::from_engine(engine)),
152            "59c9aca10c81c73cb4c196d94db741b6bf2050e0153d5a45f2526bff34675ac5"
153        );
154
155        let mut engine = hmac::HmacEngine::<sha256::Hash>::new(&[0xde, 0xad, 0xbe, 0xef]);
156        engine.write_all(&[99; 64000]).unwrap();
157        assert_eq!(
158            format!("{}", hmac::Hmac::from_engine(engine)),
159            "30df499717415a395379a1eaabe50038036e4abb5afc94aa55c952f4aa57be08"
160        );
161    }
162}