armorlib/preprocessors/
hash.rs

1//! This module defines the `hash` preprocessor which makes hash information available to
2//! scan modules. The following hashes are currently supported:
3//! * `md5`
4//! * `sha1`
5//! * `sha256`
6//! * `sha512`
7//! * `sha224`
8//! * `sha384`
9//! * `sha3-256`
10//! * `sha3-512`
11//! * `sha3-224`
12//! * `sha3-384`
13//! The hashes are available under the metadata path `hash/name`, and the returned hash will be
14//! in lower case.
15
16use 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    /// Returns a map where the key is the hash type (md5, sha1, sha2, sha3) and the value is
27    /// the hash's value, in lower case. The following hashes are provided:
28    /// * `md5`
29    /// * `sha1`
30    /// * `sha256`
31    /// * `sha512`
32    /// * `sha224`
33    /// * `sha384`
34    /// * `sha3-256`
35    /// * `sha3-512`
36    /// * `sha3-224`
37    /// * `sha3-384`
38    /// (These hash names also indicate the key under which the string values are stored.)
39    fn process(&self, binary_object: &BinaryObject) -> HashMap<String, String> {
40        let mut map: HashMap<String, String> = HashMap::new();
41
42        // md5
43        let mut builder = md5::Md5::new();
44        builder.input(&binary_object.data);
45        map.insert(String::from("md5"), builder.result_str());
46
47        // sha1
48        let mut builder = sha1::Sha1::new();
49        builder.input(&binary_object.data);
50        map.insert(String::from("sha1"), builder.result_str());
51
52        // sha256
53        let mut builder = sha2::Sha256::new();
54        builder.input(&binary_object.data);
55        map.insert(String::from("sha256"), builder.result_str());
56
57        // sha512
58        let mut builder = sha2::Sha512::new();
59        builder.input(&binary_object.data);
60        map.insert(String::from("sha512"), builder.result_str());
61
62        // sha224
63        let mut builder = sha2::Sha224::new();
64        builder.input(&binary_object.data);
65        map.insert(String::from("sha224"), builder.result_str());
66
67        // sha384
68        let mut builder = sha2::Sha384::new();
69        builder.input(&binary_object.data);
70        map.insert(String::from("sha384"), builder.result_str());
71
72        // sha3 256
73        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        // sha3 512
78        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        // sha3 224
83        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        // sha3 384
88        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}