blot/multihash/
sha1.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 sha1
8
9use super::{Harvest, Multihash, MultihashError};
10use crypto_sha1 as digester;
11use crypto_sha1::Digest;
12use tag::Tag;
13use uvar::Uvar;
14
15#[derive(Debug, PartialEq)]
16pub struct Sha1;
17
18impl Default for Sha1 {
19    fn default() -> Self {
20        Sha1
21    }
22}
23
24impl From<Sha1> for Uvar {
25    fn from(hash: Sha1) -> Uvar {
26        hash.code()
27    }
28}
29
30impl From<Uvar> for Result<Sha1, MultihashError> {
31    fn from(code: Uvar) -> Result<Sha1, MultihashError> {
32        let n: u64 = code.into();
33
34        if n == 0x11 {
35            Ok(Sha1)
36        } else {
37            Err(MultihashError::Unknown)
38        }
39    }
40}
41
42impl Multihash for Sha1 {
43    type Digester = digester::Sha1;
44
45    fn name(&self) -> &'static str {
46        "sha1"
47    }
48
49    fn code(&self) -> Uvar {
50        Uvar::from(0x11)
51    }
52
53    fn length(&self) -> u8 {
54        20
55    }
56
57    fn digest_primitive(&self, tag: Tag, bytes: &[u8]) -> Harvest {
58        let mut digester = Self::Digester::default();
59        digester.input(&tag.to_bytes());
60        digester.input(bytes);
61        digester.result().as_ref().to_vec().into()
62    }
63
64    fn digest_collection(&self, tag: Tag, list: Vec<Vec<u8>>) -> Harvest {
65        let mut digester = Self::Digester::default();
66        digester.input(&tag.to_bytes());
67
68        for bytes in list {
69            digester.input(&bytes);
70        }
71
72        digester.result().as_ref().to_vec().into()
73    }
74}