Skip to main content

libsumatracrypt_rs/
digest.rs

1use blake3;
2use blake2_rfc;
3use sha2::{Sha224, Sha256, Sha384, Sha512, Digest};
4use tiny_keccak::{Shake, *};
5use sha1::{Sha1};
6use hex::*;
7
8use serde::{Serialize,Deserialize};
9
10use zeroize::{Zeroize,ZeroizeOnDrop,Zeroizing};
11
12pub struct SumatraBlake3;
13pub struct SumatraBlake2b;
14pub struct SumatraSha2;
15pub struct SumatraSha3;
16pub struct SumatraShake256;
17
18pub struct SumatraSha1;
19
20#[derive(Zeroize,ZeroizeOnDrop,Clone,Serialize,Deserialize)]
21pub struct SumatraDigest(String);
22
23impl SumatraDigest {
24    pub fn to_string(&self) -> Zeroizing<String> {
25        let zeroizer = Zeroizing::new(self.0.to_string());
26        return zeroizer
27    }
28}
29
30impl SumatraBlake3 {
31    pub fn new<T: AsRef<[u8]>>(bytes: T) -> SumatraDigest {
32        let digest = blake3::hash(bytes.as_ref());
33        return SumatraDigest(hex::encode_upper(digest.as_bytes()));
34    }
35}
36
37impl SumatraBlake2b {
38    pub fn new<T: AsRef<[u8]>>(bytes: T, key: T, digest_size: usize) -> SumatraDigest {
39        if digest_size > 0usize && digest_size <= 64usize {
40            let hash = blake2_rfc::blake2b::blake2b(digest_size, key.as_ref(), bytes.as_ref());
41
42            return SumatraDigest(hex::encode_upper(hash.as_bytes()));
43        }
44        else {
45            panic!("Digest size is too high or too low")
46        }
47    }
48}
49
50impl SumatraSha1 {
51    pub fn new<T: AsRef<[u8]>>(bytes: T) -> SumatraDigest {
52        use sha1::Digest;
53        let mut hasher = Sha1::new();
54
55        hasher.update(bytes.as_ref());
56
57        let output = hasher.finalize();
58
59        return SumatraDigest(hex::encode_upper(output))
60    }
61}
62
63impl SumatraSha2 {
64    pub fn new<T: AsRef<[u8]>>(bytes: T) -> SumatraDigest {
65        return Self::sha256(bytes)
66    }
67    pub fn sha224<T: AsRef<[u8]>>(bytes: T) -> SumatraDigest {
68        let mut hasher = Sha224::new();
69        hasher.update(bytes.as_ref());
70        let digest = hasher.finalize();
71        return SumatraDigest(hex::encode_upper(digest));
72    }
73    pub fn sha256<T: AsRef<[u8]>>(bytes: T) -> SumatraDigest {
74        let mut hasher = Sha256::new();
75        hasher.update(bytes.as_ref());
76        let digest = hasher.finalize();
77        return SumatraDigest(hex::encode_upper(digest));
78    }
79    pub fn sha384<T: AsRef<[u8]>>(bytes: T) -> SumatraDigest {
80        let mut hasher = Sha384::new();
81        hasher.update(bytes.as_ref());
82        let digest = hasher.finalize();
83        return SumatraDigest(hex::encode_upper(digest));
84    }
85    pub fn sha512<T: AsRef<[u8]>>(bytes: T) -> SumatraDigest {
86        let mut hasher = Sha512::new();
87        hasher.update(bytes.as_ref());
88        let digest = hasher.finalize();
89        return SumatraDigest(hex::encode_upper(digest));
90    }
91}
92
93impl SumatraSha3 {
94    pub fn sha3_224<T: AsRef<[u8]>>(data: T) -> SumatraDigest {
95        let mut output = [0u8;28];
96
97        let mut sha3 = Sha3::v224();
98        sha3.update(data.as_ref());
99        sha3.finalize(&mut output);
100
101        return SumatraDigest(hex::encode_upper(output))
102    }
103    pub fn sha3_256<T: AsRef<[u8]>>(data: T) -> SumatraDigest {
104        let mut output = [0u8;32];
105
106        let mut sha3 = Sha3::v256();
107        sha3.update(data.as_ref());
108        sha3.finalize(&mut output);
109
110        return SumatraDigest(hex::encode_upper(output))
111    }
112    pub fn sha3_384<T: AsRef<[u8]>>(data: T) -> SumatraDigest {
113        let mut output = [0u8;48];
114
115        let mut sha3 = Sha3::v384();
116        sha3.update(data.as_ref());
117        sha3.finalize(&mut output);
118
119        return SumatraDigest(hex::encode_upper(output))
120    }
121    pub fn sha3_512<T: AsRef<[u8]>>(data: T) -> SumatraDigest {
122        let mut output = [0u8;64];
123
124        let mut sha3 = Sha3::v512();
125        sha3.update(data.as_ref());
126        sha3.finalize(&mut output);
127
128        return SumatraDigest(hex::encode_upper(output))
129    }
130}
131
132impl SumatraShake256 {
133    pub fn new<T: AsRef<[u8]>>(data: T) -> SumatraDigest {
134        let mut output = [0u8;64];
135
136        let mut shake = Shake::v256();
137        shake.update(data.as_ref());
138        shake.finalize(&mut output);
139
140        return SumatraDigest(hex::encode_upper(output))
141    }
142}