cyware_convert/hash/
mod.rs1#[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}