armorlib/preprocessors/
hash.rs1use std::collections::HashMap;
17use crypto::{md5, sha1, sha2, sha3};
18use crypto::digest::Digest;
19
20use preprocessor::Preprocessor;
21use binary_object::BinaryObject;
22
23pub struct HashPreprocessor;
24
25impl Preprocessor for HashPreprocessor {
26 fn process(&self, binary_object: &BinaryObject) -> HashMap<String, String> {
40 let mut map: HashMap<String, String> = HashMap::new();
41
42 let mut builder = md5::Md5::new();
44 builder.input(&binary_object.data);
45 map.insert(String::from("md5"), builder.result_str());
46
47 let mut builder = sha1::Sha1::new();
49 builder.input(&binary_object.data);
50 map.insert(String::from("sha1"), builder.result_str());
51
52 let mut builder = sha2::Sha256::new();
54 builder.input(&binary_object.data);
55 map.insert(String::from("sha256"), builder.result_str());
56
57 let mut builder = sha2::Sha512::new();
59 builder.input(&binary_object.data);
60 map.insert(String::from("sha512"), builder.result_str());
61
62 let mut builder = sha2::Sha224::new();
64 builder.input(&binary_object.data);
65 map.insert(String::from("sha224"), builder.result_str());
66
67 let mut builder = sha2::Sha384::new();
69 builder.input(&binary_object.data);
70 map.insert(String::from("sha384"), builder.result_str());
71
72 let mut builder = sha3::Sha3::sha3_256();
74 builder.input(&binary_object.data);
75 map.insert(String::from("sha3-256"), builder.result_str());
76
77 let mut builder = sha3::Sha3::sha3_512();
79 builder.input(&binary_object.data);
80 map.insert(String::from("sha3-512"), builder.result_str());
81
82 let mut builder = sha3::Sha3::sha3_224();
84 builder.input(&binary_object.data);
85 map.insert(String::from("sha3-224"), builder.result_str());
86
87 let mut builder = sha3::Sha3::sha3_384();
89 builder.input(&binary_object.data);
90 map.insert(String::from("sha3-384"), builder.result_str());
91
92 map
93 }
94
95 fn info(&self) -> (&'static str, &'static str) {
96 ("hash", "determines the hash of the data")
97 }
98}
99
100#[cfg(test)]
101mod tests {
102 use preprocessors::hash::HashPreprocessor;
103 use preprocessor::Preprocessor;
104 use binary_object::BinaryObject;
105 use util::hex_to_vec;
106
107 #[test]
108 fn test_hashes() {
109 let data = hex_to_vec("41 72 6d 6f 72 4c 69 62 20 69 73 20 74 68 65 20 63 6f 6f 6c 65 73 74 20 6c 69 62 72 61 72 79 20 69 6e 20 74 68 65 20 77 6f 72 6c 64 21").unwrap();
110 let preprocessor = HashPreprocessor {};
111 let map = preprocessor.process(&BinaryObject::from(data));
112 assert_eq!(
113 map.get(&(String::from("md5"))),
114 Some(&String::from("add27d4d270f00204341ce6195f8482e"))
115 );
116 assert_eq!(
117 map.get(&(String::from("sha1"))),
118 Some(&String::from("3f12c3aac86060939a1ad230ba4a0536414a15ec"))
119 );
120 assert_eq!(
121 map.get(&(String::from("sha256"))),
122 Some(&String::from(
123 "2484bcddf142ad693a0ef13a85d4f16d77309b64a247f682061984c55addb5bf"
124 ))
125 );
126 assert_eq!(
127 map.get(&(String::from("sha384"))),
128 Some(&String::from(
129 "7659854a174e1a076e7c25f9094445722a4531f1cb6726e09cef8863391db727ab297a357b36a939a3dd91640eb59d9b"
130 ))
131 );
132 assert_eq!(
133 map.get(&(String::from("sha224"))),
134 Some(&String::from(
135 "337c7934dcc6baec4a191ead196a8b19f0a2a6e49088af36a0f9df01"
136 ))
137 );
138 assert_eq!(
139 map.get(&(String::from("sha512"))),
140 Some(&String::from(
141 "74a29a9ab188d2a78828846277c30f18af27538fe843e79992e9adc72fd6c50b7eded71a260c6498269bf6dbc19ef9310807994d1c83655f5c937aebffda6eac"
142 ))
143 );
144 assert_eq!(
145 map.get(&(String::from("sha3-256"))),
146 Some(&String::from(
147 "abf1e7f87ee4de30130e184908e48cf75d1d4cf9da2845186ea123f8aa40c2ed"
148 ))
149 );
150 assert_eq!(
151 map.get(&(String::from("sha3-384"))),
152 Some(&String::from(
153 "6665f5e49050f166abb4879d353d7ef1c608281cc2202f87d5b53ef21ab25814362a7c03a2607aa4e0d7d1da66199168"
154 ))
155 );
156 assert_eq!(
157 map.get(&(String::from("sha3-224"))),
158 Some(&String::from(
159 "6730f10daaf05c3ef1d48d33e5f5a33c3724d6f13a9af4774ab41f79"
160 ))
161 );
162 assert_eq!(
163 map.get(&(String::from("sha3-512"))),
164 Some(&String::from(
165 "1f72957a14b2ff2fc71faaaacf857eddab99d90a3a1639801df138de894e459310ae2513acfba245fcbeabaa2ef0d741637371b586ea88a236077a3aa512c1b7"
166 ))
167 );
168 }
169}