1use super::{Harvest, Multihash, MultihashError};
10use crypto_sha2 as digester;
11use crypto_sha2::Digest;
12use tag::Tag;
13use uvar::Uvar;
14
15#[derive(Debug, PartialEq)]
18pub struct Sha2256;
19
20impl Default for Sha2256 {
21 fn default() -> Self {
22 Sha2256
23 }
24}
25
26impl From<Sha2256> for Uvar {
27 fn from(hash: Sha2256) -> Uvar {
28 hash.code()
29 }
30}
31
32impl From<Uvar> for Result<Sha2256, MultihashError> {
33 fn from(code: Uvar) -> Result<Sha2256, MultihashError> {
34 let n: u64 = code.into();
35
36 if n == 0x12 {
37 Ok(Sha2256)
38 } else {
39 Err(MultihashError::Unknown)
40 }
41 }
42}
43
44impl Multihash for Sha2256 {
45 type Digester = digester::Sha256;
46
47 fn name(&self) -> &'static str {
48 "sha2-256"
49 }
50
51 fn code(&self) -> Uvar {
52 Uvar::from(0x12)
53 }
54
55 fn length(&self) -> u8 {
56 32
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 Sha2512;
82
83impl Default for Sha2512 {
84 fn default() -> Self {
85 Sha2512
86 }
87}
88
89impl From<Sha2512> for Uvar {
90 fn from(hash: Sha2512) -> Uvar {
91 hash.code()
92 }
93}
94
95impl From<Uvar> for Result<Sha2512, MultihashError> {
96 fn from(code: Uvar) -> Result<Sha2512, MultihashError> {
97 let n: u64 = code.into();
98
99 if n == 0x13 {
100 Ok(Sha2512)
101 } else {
102 Err(MultihashError::Unknown)
103 }
104 }
105}
106
107impl Multihash for Sha2512 {
108 type Digester = digester::Sha512;
109
110 fn name(&self) -> &'static str {
111 "sha2-512"
112 }
113
114 fn code(&self) -> Uvar {
115 Uvar::from(0x13)
116 }
117
118 fn length(&self) -> u8 {
119 64
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}