|
1 | 1 | use blake2b_simd::Params as Blake2b;
|
2 | 2 | use blake2s_simd::Params as Blake2s;
|
3 | 3 | use digest::Digest;
|
4 |
| -use enum_primitive_derive::Primitive; |
5 | 4 | use sha1::Sha1 as Sha1Hasher;
|
6 | 5 | use sha2::{Sha256, Sha512};
|
7 | 6 | use tiny_keccak::{Hasher, Keccak, Sha3};
|
8 | 7 |
|
9 | 8 | use crate::digests::{wrap, Multihash, MultihashDigest};
|
10 | 9 |
|
11 |
| -#[derive(Clone, Debug, PartialEq, Primitive)] |
| 10 | +#[derive(Clone, Debug, PartialEq)] |
12 | 11 | pub enum Code {
|
| 12 | + /// Make it possible to use a custom code that is not part of the enum yet |
| 13 | + Custom(u64), |
| 14 | + /// Hashes that are immplemented in this crate |
| 15 | + Implemented(ImplementedCode), |
| 16 | +} |
| 17 | + |
| 18 | +#[derive(Clone, Copy, Debug, PartialEq)] |
| 19 | +pub enum ImplementedCode { |
13 | 20 | /// Identity (Raw binary )
|
14 | 21 | Identity = 0x00,
|
15 | 22 | /// SHA-1 (20-byte hash size)
|
@@ -44,220 +51,255 @@ pub enum Code {
|
44 | 51 | Blake2s256 = 0xb260,
|
45 | 52 | }
|
46 | 53 |
|
| 54 | +impl Code { |
| 55 | + /// Return the code as integer value. |
| 56 | + pub fn to_u64(&self) -> u64 { |
| 57 | + match *self { |
| 58 | + Self::Custom(code) => code, |
| 59 | + Self::Implemented(code) => code as _, |
| 60 | + } |
| 61 | + } |
| 62 | + |
| 63 | + /// Return the `Code` based on the integer value. If the code is unknown/not implemented yet |
| 64 | + /// then it returns a `Code::Custom`. |
| 65 | + /// implementes with that value. |
| 66 | + pub fn from_u64(code: u64) -> Self { |
| 67 | + match code { |
| 68 | + 0x00 => Code::Implemented(ImplementedCode::Identity), |
| 69 | + 0x11 => Code::Implemented(ImplementedCode::Sha1), |
| 70 | + 0x12 => Code::Implemented(ImplementedCode::Sha2_256), |
| 71 | + 0x13 => Code::Implemented(ImplementedCode::Sha2_512), |
| 72 | + 0x14 => Code::Implemented(ImplementedCode::Sha3_512), |
| 73 | + 0x15 => Code::Implemented(ImplementedCode::Sha3_384), |
| 74 | + 0x16 => Code::Implemented(ImplementedCode::Sha3_256), |
| 75 | + 0x17 => Code::Implemented(ImplementedCode::Sha3_224), |
| 76 | + 0x1A => Code::Implemented(ImplementedCode::Keccak224), |
| 77 | + 0x1B => Code::Implemented(ImplementedCode::Keccak256), |
| 78 | + 0x1C => Code::Implemented(ImplementedCode::Keccak384), |
| 79 | + 0x1D => Code::Implemented(ImplementedCode::Keccak512), |
| 80 | + 0xB220 => Code::Implemented(ImplementedCode::Blake2b256), |
| 81 | + 0xB240 => Code::Implemented(ImplementedCode::Blake2b512), |
| 82 | + 0xB250 => Code::Implemented(ImplementedCode::Blake2s128), |
| 83 | + 0xB260 => Code::Implemented(ImplementedCode::Blake2s256), |
| 84 | + _ => Code::Custom(code), |
| 85 | + } |
| 86 | + } |
| 87 | +} |
| 88 | + |
47 | 89 | #[derive(Clone, Debug)]
|
48 | 90 | pub struct Identity;
|
49 | 91 | impl MultihashDigest for Identity {
|
50 |
| - const CODE: u64 = Code::Identity as _; |
| 92 | + const CODE: Code = Code::Implemented(ImplementedCode::Identity); |
51 | 93 |
|
52 | 94 | fn digest(data: &[u8]) -> Multihash {
|
53 | 95 | if (data.len() as u64) >= u64::from(std::u32::MAX) {
|
54 | 96 | panic!("Input data for identity hash is too large, it needs to be less the 2^32.")
|
55 | 97 | }
|
56 |
| - wrap(Self::CODE, &data) |
| 98 | + wrap(&Self::CODE, &data) |
57 | 99 | }
|
58 | 100 | }
|
59 | 101 |
|
60 | 102 | #[derive(Clone, Debug)]
|
61 | 103 | pub struct Sha1;
|
62 | 104 | impl MultihashDigest for Sha1 {
|
63 |
| - const CODE: u64 = Code::Sha1 as _; |
| 105 | + const CODE: Code = Code::Implemented(ImplementedCode::Sha1); |
64 | 106 |
|
65 | 107 | fn digest(data: &[u8]) -> Multihash {
|
66 | 108 | let digest = Sha1Hasher::from(&data).digest().bytes();
|
67 |
| - wrap(Self::CODE, &digest) |
| 109 | + wrap(&Self::CODE, &digest) |
68 | 110 | }
|
69 | 111 | }
|
70 | 112 |
|
71 | 113 | #[derive(Clone, Debug)]
|
72 | 114 | pub struct Sha2_256;
|
73 | 115 | impl MultihashDigest for Sha2_256 {
|
74 |
| - const CODE: u64 = Code::Sha2_256 as _; |
| 116 | + const CODE: Code = Code::Implemented(ImplementedCode::Sha2_256); |
75 | 117 |
|
76 | 118 | fn digest(data: &[u8]) -> Multihash {
|
77 | 119 | let digest = Sha256::digest(&data);
|
78 |
| - wrap(Self::CODE, &digest) |
| 120 | + wrap(&Self::CODE, &digest) |
79 | 121 | }
|
80 | 122 | }
|
81 | 123 |
|
82 | 124 | #[derive(Clone, Debug)]
|
83 | 125 | pub struct Sha2_512;
|
84 | 126 | impl MultihashDigest for Sha2_512 {
|
85 |
| - const CODE: u64 = Code::Sha2_512 as _; |
| 127 | + const CODE: Code = Code::Implemented(ImplementedCode::Sha2_512); |
86 | 128 |
|
87 | 129 | fn digest(data: &[u8]) -> Multihash {
|
88 | 130 | let digest = Sha512::digest(&data);
|
89 |
| - wrap(Self::CODE, &digest) |
| 131 | + wrap(&Self::CODE, &digest) |
90 | 132 | }
|
91 | 133 | }
|
92 | 134 |
|
93 | 135 | #[derive(Clone, Debug)]
|
94 | 136 | pub struct Sha3_224;
|
95 | 137 | impl MultihashDigest for Sha3_224 {
|
96 |
| - const CODE: u64 = Code::Sha3_224 as _; |
| 138 | + const CODE: Code = Code::Implemented(ImplementedCode::Sha3_224); |
97 | 139 |
|
98 | 140 | fn digest(data: &[u8]) -> Multihash {
|
99 | 141 | let mut digest = [0; 28];
|
100 | 142 | let mut sha3 = Sha3::v224();
|
101 | 143 | sha3.update(&data);
|
102 | 144 | sha3.finalize(&mut digest);
|
103 |
| - wrap(Self::CODE, &digest) |
| 145 | + wrap(&Self::CODE, &digest) |
104 | 146 | }
|
105 | 147 | }
|
106 | 148 |
|
107 | 149 | #[derive(Clone, Debug)]
|
108 | 150 | pub struct Sha3_256;
|
109 | 151 | impl MultihashDigest for Sha3_256 {
|
110 |
| - const CODE: u64 = Code::Sha3_256 as _; |
| 152 | + const CODE: Code = Code::Implemented(ImplementedCode::Sha3_256); |
111 | 153 |
|
112 | 154 | fn digest(data: &[u8]) -> Multihash {
|
113 | 155 | let mut digest = [0; 32];
|
114 | 156 | let mut sha3 = Sha3::v256();
|
115 | 157 | sha3.update(&data);
|
116 | 158 | sha3.finalize(&mut digest);
|
117 |
| - wrap(Self::CODE, &digest) |
| 159 | + wrap(&Self::CODE, &digest) |
118 | 160 | }
|
119 | 161 | }
|
120 | 162 |
|
121 | 163 | #[derive(Clone, Debug)]
|
122 | 164 | pub struct Sha3_384;
|
123 | 165 | impl MultihashDigest for Sha3_384 {
|
124 |
| - const CODE: u64 = Code::Sha3_384 as _; |
| 166 | + const CODE: Code = Code::Implemented(ImplementedCode::Sha3_384); |
125 | 167 |
|
126 | 168 | fn digest(data: &[u8]) -> Multihash {
|
127 | 169 | let mut digest = [0; 48];
|
128 | 170 | let mut sha3 = Sha3::v384();
|
129 | 171 | sha3.update(&data);
|
130 | 172 | sha3.finalize(&mut digest);
|
131 |
| - wrap(Self::CODE, &digest) |
| 173 | + wrap(&Self::CODE, &digest) |
132 | 174 | }
|
133 | 175 | }
|
134 | 176 |
|
135 | 177 | #[derive(Clone, Debug)]
|
136 | 178 | pub struct Sha3_512;
|
137 | 179 | impl MultihashDigest for Sha3_512 {
|
138 |
| - const CODE: u64 = Code::Sha3_512 as _; |
| 180 | + const CODE: Code = Code::Implemented(ImplementedCode::Sha3_512); |
139 | 181 |
|
140 | 182 | fn digest(data: &[u8]) -> Multihash {
|
141 | 183 | let mut digest = [0; 64];
|
142 | 184 | let mut sha3 = Sha3::v512();
|
143 | 185 | sha3.update(&data);
|
144 | 186 | sha3.finalize(&mut digest);
|
145 |
| - wrap(Self::CODE, &digest) |
| 187 | + wrap(&Self::CODE, &digest) |
146 | 188 | }
|
147 | 189 | }
|
148 | 190 |
|
149 | 191 | #[derive(Clone, Debug)]
|
150 | 192 | pub struct Keccak224;
|
151 | 193 | impl MultihashDigest for Keccak224 {
|
152 |
| - const CODE: u64 = Code::Keccak224 as _; |
| 194 | + const CODE: Code = Code::Implemented(ImplementedCode::Keccak224); |
153 | 195 |
|
154 | 196 | fn digest(data: &[u8]) -> Multihash {
|
155 | 197 | let mut digest = [0; 28];
|
156 | 198 | let mut keccak = Keccak::v224();
|
157 | 199 | keccak.update(&data);
|
158 | 200 | keccak.finalize(&mut digest);
|
159 |
| - wrap(Self::CODE, &digest) |
| 201 | + wrap(&Self::CODE, &digest) |
160 | 202 | }
|
161 | 203 | }
|
162 | 204 |
|
163 | 205 | #[derive(Clone, Debug)]
|
164 | 206 | pub struct Keccak256;
|
165 | 207 | impl MultihashDigest for Keccak256 {
|
166 |
| - const CODE: u64 = Code::Keccak256 as _; |
| 208 | + const CODE: Code = Code::Implemented(ImplementedCode::Keccak256); |
167 | 209 |
|
168 | 210 | fn digest(data: &[u8]) -> Multihash {
|
169 | 211 | let mut digest = [0; 32];
|
170 | 212 | let mut keccak = Keccak::v256();
|
171 | 213 | keccak.update(&data);
|
172 | 214 | keccak.finalize(&mut digest);
|
173 |
| - wrap(Self::CODE, &digest) |
| 215 | + wrap(&Self::CODE, &digest) |
174 | 216 | }
|
175 | 217 | }
|
176 | 218 |
|
177 | 219 | #[derive(Clone, Debug)]
|
178 | 220 | pub struct Keccak384;
|
179 | 221 | impl MultihashDigest for Keccak384 {
|
180 |
| - const CODE: u64 = Code::Keccak384 as _; |
| 222 | + const CODE: Code = Code::Implemented(ImplementedCode::Keccak384); |
181 | 223 |
|
182 | 224 | fn digest(data: &[u8]) -> Multihash {
|
183 | 225 | let mut digest = [0; 48];
|
184 | 226 | let mut keccak = Keccak::v384();
|
185 | 227 | keccak.update(&data);
|
186 | 228 | keccak.finalize(&mut digest);
|
187 |
| - wrap(Self::CODE, &digest) |
| 229 | + wrap(&Self::CODE, &digest) |
188 | 230 | }
|
189 | 231 | }
|
190 | 232 |
|
191 | 233 | #[derive(Clone, Debug)]
|
192 | 234 | pub struct Keccak512;
|
193 | 235 | impl MultihashDigest for Keccak512 {
|
194 |
| - const CODE: u64 = Code::Keccak512 as _; |
| 236 | + const CODE: Code = Code::Implemented(ImplementedCode::Keccak512); |
195 | 237 |
|
196 | 238 | fn digest(data: &[u8]) -> Multihash {
|
197 | 239 | let mut digest = [0; 64];
|
198 | 240 | let mut keccak = Keccak::v512();
|
199 | 241 | keccak.update(&data);
|
200 | 242 | keccak.finalize(&mut digest);
|
201 |
| - wrap(Self::CODE, &digest) |
| 243 | + wrap(&Self::CODE, &digest) |
202 | 244 | }
|
203 | 245 | }
|
204 | 246 |
|
205 | 247 | #[derive(Clone, Debug)]
|
206 | 248 | pub struct Blake2b256;
|
207 | 249 | impl MultihashDigest for Blake2b256 {
|
208 |
| - const CODE: u64 = Code::Blake2b256 as _; |
| 250 | + const CODE: Code = Code::Implemented(ImplementedCode::Blake2b256); |
209 | 251 |
|
210 | 252 | fn digest(data: &[u8]) -> Multihash {
|
211 | 253 | let digest = Blake2b::new()
|
212 | 254 | .hash_length(32)
|
213 | 255 | .to_state()
|
214 | 256 | .update(&data)
|
215 | 257 | .finalize();
|
216 |
| - wrap(Self::CODE, &digest.as_bytes()) |
| 258 | + wrap(&Self::CODE, &digest.as_bytes()) |
217 | 259 | }
|
218 | 260 | }
|
219 | 261 |
|
220 | 262 | #[derive(Clone, Debug)]
|
221 | 263 | pub struct Blake2b512;
|
222 | 264 | impl MultihashDigest for Blake2b512 {
|
223 |
| - const CODE: u64 = Code::Blake2b512 as _; |
| 265 | + const CODE: Code = Code::Implemented(ImplementedCode::Blake2b512); |
224 | 266 |
|
225 | 267 | fn digest(data: &[u8]) -> Multihash {
|
226 | 268 | let digest = Blake2b::new()
|
227 | 269 | .hash_length(64)
|
228 | 270 | .to_state()
|
229 | 271 | .update(&data)
|
230 | 272 | .finalize();
|
231 |
| - wrap(Self::CODE, &digest.as_bytes()) |
| 273 | + wrap(&Self::CODE, &digest.as_bytes()) |
232 | 274 | }
|
233 | 275 | }
|
234 | 276 |
|
235 | 277 | #[derive(Clone, Debug)]
|
236 | 278 | pub struct Blake2s128;
|
237 | 279 | impl MultihashDigest for Blake2s128 {
|
238 |
| - const CODE: u64 = Code::Blake2s128 as _; |
| 280 | + const CODE: Code = Code::Implemented(ImplementedCode::Blake2s128); |
239 | 281 |
|
240 | 282 | fn digest(data: &[u8]) -> Multihash {
|
241 | 283 | let digest = Blake2s::new()
|
242 | 284 | .hash_length(16)
|
243 | 285 | .to_state()
|
244 | 286 | .update(&data)
|
245 | 287 | .finalize();
|
246 |
| - wrap(Self::CODE, &digest.as_bytes()) |
| 288 | + wrap(&Self::CODE, &digest.as_bytes()) |
247 | 289 | }
|
248 | 290 | }
|
249 | 291 |
|
250 | 292 | #[derive(Clone, Debug)]
|
251 | 293 | pub struct Blake2s256;
|
252 | 294 | impl MultihashDigest for Blake2s256 {
|
253 |
| - const CODE: u64 = Code::Blake2s256 as _; |
| 295 | + const CODE: Code = Code::Implemented(ImplementedCode::Blake2s256); |
254 | 296 |
|
255 | 297 | fn digest(data: &[u8]) -> Multihash {
|
256 | 298 | let digest = Blake2s::new()
|
257 | 299 | .hash_length(32)
|
258 | 300 | .to_state()
|
259 | 301 | .update(&data)
|
260 | 302 | .finalize();
|
261 |
| - wrap(Self::CODE, &digest.as_bytes()) |
| 303 | + wrap(&Self::CODE, &digest.as_bytes()) |
262 | 304 | }
|
263 | 305 | }
|
0 commit comments