blot/multihash/
blake2.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 blake2.
8
9use super::{Harvest, Multihash, MultihashError};
10use crypto_blake2 as digester;
11use crypto_blake2::Digest;
12use tag::Tag;
13use uvar::Uvar;
14
15// Blake2b-512
16
17#[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// Blake2s-256
79
80#[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}