1use super::{Harvest, Multihash, MultihashError};
10use crypto_blake2 as digester;
11use crypto_blake2::Digest;
12use tag::Tag;
13use uvar::Uvar;
14
15#[derive(Debug, PartialEq)]
18pub struct Blake2b512;
19
20impl Default for Blake2b512 {
21 fn default() -> Self {
22 Blake2b512
23 }
24}
25
26impl From<Blake2b512> for Uvar {
27 fn from(hash: Blake2b512) -> Uvar {
28 hash.code()
29 }
30}
31
32impl From<Uvar> for Result<Blake2b512, MultihashError> {
33 fn from(code: Uvar) -> Result<Blake2b512, MultihashError> {
34 let n: u64 = code.into();
35
36 if n == 0xb240 {
37 Ok(Blake2b512)
38 } else {
39 Err(MultihashError::Unknown)
40 }
41 }
42}
43
44impl Multihash for Blake2b512 {
45 type Digester = digester::Blake2b;
46
47 fn name(&self) -> &'static str {
48 "blake2b-512"
49 }
50
51 fn code(&self) -> Uvar {
52 Uvar::from(0xb240)
53 }
54
55 fn length(&self) -> u8 {
56 64
57 }
58
59 fn digest_primitive(&self, tag: Tag, bytes: &[u8]) -> Harvest {
60 let mut digester = Self::Digester::default();
61 digester.input(&tag.to_bytes());
62 digester.input(bytes);
63 digester.result().as_ref().to_vec().into()
64 }
65
66 fn digest_collection(&self, tag: Tag, list: Vec<Vec<u8>>) -> Harvest {
67 let mut digester = Self::Digester::default();
68 digester.input(&tag.to_bytes());
69
70 for bytes in list {
71 digester.input(&bytes);
72 }
73
74 digester.result().as_ref().to_vec().into()
75 }
76}
77
78#[derive(Debug, PartialEq)]
81pub struct Blake2s256;
82
83impl Default for Blake2s256 {
84 fn default() -> Self {
85 Blake2s256
86 }
87}
88
89impl From<Blake2s256> for Uvar {
90 fn from(hash: Blake2s256) -> Uvar {
91 hash.code()
92 }
93}
94
95impl From<Uvar> for Result<Blake2s256, MultihashError> {
96 fn from(code: Uvar) -> Result<Blake2s256, MultihashError> {
97 let n: u64 = code.into();
98
99 if n == 0xb260 {
100 Ok(Blake2s256)
101 } else {
102 Err(MultihashError::Unknown)
103 }
104 }
105}
106
107impl Multihash for Blake2s256 {
108 type Digester = digester::Blake2s;
109
110 fn name(&self) -> &'static str {
111 "blake2s-256"
112 }
113
114 fn code(&self) -> Uvar {
115 Uvar::from(0xb260)
116 }
117
118 fn length(&self) -> u8 {
119 32
120 }
121
122 fn digest_primitive(&self, tag: Tag, bytes: &[u8]) -> Harvest {
123 let mut digester = Self::Digester::default();
124 digester.input(&tag.to_bytes());
125 digester.input(bytes);
126 digester.result().as_ref().to_vec().into()
127 }
128
129 fn digest_collection(&self, tag: Tag, list: Vec<Vec<u8>>) -> Harvest {
130 let mut digester = Self::Digester::default();
131 digester.input(&tag.to_bytes());
132
133 for bytes in list {
134 digester.input(&bytes);
135 }
136
137 digester.result().as_ref().to_vec().into()
138 }
139}