8b913de223888192ae62732fc2542890fb622e41
[dnssec-prover] / src / crypto / hash.rs
1 //! Simple wrapper around various hash options to provide a single enum which can calculate
2 //! different hashes.
3
4 use bitcoin_hashes::Hash;
5 use bitcoin_hashes::HashEngine as _;
6 use bitcoin_hashes::sha1::Hash as Sha1;
7 use bitcoin_hashes::sha256::Hash as Sha256;
8 use bitcoin_hashes::sha512::Hash as Sha512;
9
10 pub(crate) enum Hasher {
11         Sha1(<Sha1 as Hash>::Engine),
12         Sha256(<Sha256 as Hash>::Engine),
13         #[allow(unused)]
14         Sha512(<Sha512 as Hash>::Engine),
15 }
16
17 pub(crate) enum HashResult {
18         Sha1(Sha1),
19         Sha256(Sha256),
20         Sha512(Sha512),
21 }
22
23 impl AsRef<[u8]> for HashResult {
24         fn as_ref(&self) -> &[u8] {
25                 match self {
26                         HashResult::Sha1(hash) => hash.as_ref(),
27                         HashResult::Sha256(hash) => hash.as_ref(),
28                         HashResult::Sha512(hash) => hash.as_ref(),
29                 }
30         }
31 }
32
33 impl Hasher {
34         pub(crate) fn sha1() -> Hasher { Hasher::Sha1(Sha1::engine()) }
35         pub(crate) fn sha256() -> Hasher { Hasher::Sha256(Sha256::engine()) }
36         #[allow(unused)]
37         pub(crate) fn sha512() -> Hasher { Hasher::Sha512(Sha512::engine()) }
38
39         pub(crate) fn update(&mut self, buf: &[u8]) {
40                 match self {
41                         Hasher::Sha1(hasher) => hasher.input(buf),
42                         Hasher::Sha256(hasher) => hasher.input(buf),
43                         Hasher::Sha512(hasher) => hasher.input(buf),
44                 }
45         }
46
47         pub(crate) fn finish(self) -> HashResult {
48                 match self {
49                         Hasher::Sha1(hasher) => HashResult::Sha1(Sha1::from_engine(hasher)),
50                         Hasher::Sha256(hasher) => HashResult::Sha256(Sha256::from_engine(hasher)),
51                         Hasher::Sha512(hasher) => HashResult::Sha512(Sha512::from_engine(hasher)),
52                 }
53         }
54 }
55