blot/multihash/
sha2.rs

1// Copyright 2018 Arnau Siches
2//
3// Licensed under the MIT license <LICENSE or http://opensource.org/licenses/MIT>.
4// This file may not be copied, modified, or distributed except according to
5// those terms.
6
7//! Blot implementation for sha2.
8
9use super::{Harvest, Multihash, MultihashError};
10use crypto_sha2 as digester;
11use crypto_sha2::Digest;
12use tag::Tag;
13use uvar::Uvar;
14
15// Sha2-256
16
17#[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// Sha2-512
79
80#[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}