Skip to main content

dec_cryptor/
hmac_validator.rs

1use hmac::{Hmac, Mac};
2use sha2::Sha256;
3
4/// HMAC-SHA256 校验器
5pub struct HmacValidator {
6    mac: Hmac<Sha256>,
7}
8
9impl HmacValidator {
10    /// 创建新的HMAC校验器
11    pub fn new(hmac_key: &[u8]) -> Result<Self, Box<dyn std::error::Error>> {
12        let mac = Hmac::<Sha256>::new_from_slice(hmac_key)
13            .map_err(|_| "Failed to create HMAC")?;
14        Ok(Self { mac })
15    }
16
17    /// 更新HMAC计算
18    pub fn update(&mut self, data: &[u8]) {
19        self.mac.update(data);
20    }
21
22    /// 完成HMAC计算并返回结果
23    pub fn finalize(self) -> Vec<u8> {
24        let result = self.mac.finalize();
25        result.into_bytes().to_vec()
26    }
27
28    /// 验证HMAC
29    pub fn verify(self, stored_hmac: &[u8]) -> Result<(), Box<dyn std::error::Error>> {
30        self.mac
31            .verify_slice(stored_hmac)
32            .map_err(|_| "HMAC验证失败,文件可能已被篡改或密码错误".into())
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn test_hmac_validator_creation() {
42        let key = b"test_hmac_key_32_bytes_long_key!";
43        let validator = HmacValidator::new(key);
44        assert!(validator.is_ok());
45    }
46
47    #[test]
48    fn test_hmac_validation_success() {
49        let key = b"test_hmac_key_32_bytes_long_key!";
50        let data = b"test data for hmac validation";
51
52        // 创建HMAC并计算
53        let mut validator = HmacValidator::new(key).unwrap();
54        validator.update(data);
55        let hmac_code = validator.finalize();
56
57        // 验证HMAC
58        let mut validator2 = HmacValidator::new(key).unwrap();
59        validator2.update(data);
60        let result = validator2.verify(&hmac_code);
61        assert!(result.is_ok());
62    }
63
64    #[test]
65    fn test_hmac_validation_failure() {
66        let key1 = b"test_hmac_key_32_bytes_long_key!";
67        let key2 = b"different_hmac_key_32_bytes_long!";
68        let data = b"test data for hmac validation";
69
70        // 用key1创建HMAC
71        let mut validator = HmacValidator::new(key1).unwrap();
72        validator.update(data);
73        let hmac_code = validator.finalize();
74
75        // 用key2验证应该失败
76        let mut validator2 = HmacValidator::new(key2).unwrap();
77        validator2.update(data);
78        let result = validator2.verify(&hmac_code);
79        assert!(result.is_err());
80    }
81}