cyware_convert/hash/
mod.rs

1#[cfg(target_family = "wasm")]
2use serde::{Deserialize, Serialize};
3use sha1::{Digest as Sha1Digest, Sha1};
4
5use crate::Operation;
6use crate::OperationError;
7
8#[derive(Clone)]
9#[cfg_attr(target_family = "wasm", derive(Serialize, Deserialize))]
10pub struct Md5Hash {}
11
12impl Operation for Md5Hash {
13    fn execute(&self, input: &[u8]) -> Result<Vec<u8>, OperationError> {
14        Ok(md5::compute(input).to_vec())
15    }
16}
17
18impl Md5Hash {
19    pub fn new() -> Self {
20        Md5Hash {}
21    }
22}
23
24#[derive(Clone)]
25#[cfg_attr(target_family = "wasm", derive(Serialize, Deserialize))]
26pub struct Sha1Hash {}
27
28impl Operation for Sha1Hash {
29    fn execute(&self, input: &[u8]) -> Result<Vec<u8>, OperationError> {
30        let mut hasher = Sha1::new();
31        hasher.update(input);
32        Ok(hasher.finalize().to_vec())
33    }
34}
35
36impl Sha1Hash {
37    pub fn new() -> Sha1Hash {
38        Sha1Hash {}
39    }
40}
41
42#[derive(Clone)]
43#[cfg_attr(target_family = "wasm", derive(Serialize, Deserialize))]
44pub struct Sha2Hash {
45    version: Sha2Version,
46}
47
48impl Sha2Hash {
49    pub fn new(version: Sha2Version) -> Sha2Hash {
50        Sha2Hash { version }
51    }
52}
53
54#[derive(Clone)]
55#[cfg_attr(target_family = "wasm", derive(Serialize, Deserialize))]
56pub enum Sha2Version {
57    Sha224,
58    Sha256,
59    Sha384,
60    Sha512,
61}
62
63impl Operation for Sha2Hash {
64    fn execute(&self, input: &[u8]) -> Result<Vec<u8>, OperationError> {
65        let hash_vec = match self.version {
66            Sha2Version::Sha224 => {
67                let mut hasher = sha2::Sha224::new();
68                hasher.update(input);
69                hasher.finalize().to_vec()
70            }
71            Sha2Version::Sha256 => {
72                let mut hasher = sha2::Sha256::new();
73                hasher.update(input);
74                hasher.finalize().to_vec()
75            }
76            Sha2Version::Sha384 => {
77                let mut hasher = sha2::Sha384::new();
78                hasher.update(input);
79                hasher.finalize().to_vec()
80            }
81            Sha2Version::Sha512 => {
82                let mut hasher = sha2::Sha512::new();
83                hasher.update(input);
84                hasher.finalize().to_vec()
85            }
86        };
87        Ok(hash_vec)
88    }
89}
90
91#[cfg(test)]
92mod tests {
93    use super::*;
94    use crate::HexEncode;
95
96    #[test]
97    fn hash_md5() {
98        let hasher = Md5Hash::new();
99        let res = hasher.execute(b"caido").unwrap();
100        let encode = HexEncode::new(crate::HexFormat::Lower, None, None);
101        let hex_result = encode.execute(&res).unwrap();
102        assert_eq!(hex_result, b"7542bf4fd4500c58ac741ae2e05a1521")
103    }
104}