1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
use digest::{
generic_array::{typenum::U32, GenericArray},
FixedOutput,
Input,
Reset,
};
use sha3::{Digest, Sha3_256};
#[deprecated(
note = "This wrapper becomes obsolete once tari_crypto updates to digest v0.9, which is dependent on Dalek \
libraries updating to digest 0.9. When that happens, you can use the underlying Sha3_256 hasher directly \
and this wrapper will be removed."
)]
#[derive(Clone, Debug)]
pub struct Sha3(Sha3_256);
#[allow(deprecated)]
impl Sha3 {
pub fn new() -> Self {
let h = Sha3_256::new();
Sha3(h)
}
pub fn result(self) -> GenericArray<u8, U32> {
self.fixed_result()
}
}
#[allow(deprecated)]
impl Default for Sha3 {
fn default() -> Self {
let h = Sha3_256::new();
Sha3(h)
}
}
#[allow(deprecated)]
impl Input for Sha3 {
fn input<B: AsRef<[u8]>>(&mut self, data: B) {
(self.0).update(data);
}
}
#[allow(deprecated)]
impl FixedOutput for Sha3 {
type OutputSize = U32;
fn fixed_result(self) -> GenericArray<u8, U32> {
let v = (self.0).finalize();
GenericArray::clone_from_slice(&v)
}
}
#[allow(deprecated)]
impl Reset for Sha3 {
fn reset(&mut self) {
(self.0).reset()
}
}
#[allow(deprecated)]
#[cfg(test)]
mod test {
use crate::hash::sha3::Sha3;
use digest::{Input, Reset};
use tari_utilities::hex;
#[test]
fn sha_test() {
let e = Sha3::new().chain(b"a").chain(b"bc").result().to_vec();
let h = hex::to_hex(&e);
assert_eq!(
h,
"3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532".to_string()
);
}
#[test]
fn reset() {
let mut e = Sha3::default().chain("fubar");
e.reset();
let e = e.chain(b"abc").result().to_vec();
let h = hex::to_hex(&e);
assert_eq!(
h,
"3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532".to_string()
);
}
}