dec_cryptor/
hmac_validator.rs1use hmac::{Hmac, Mac};
2use sha2::Sha256;
3
4pub struct HmacValidator {
6 mac: Hmac<Sha256>,
7}
8
9impl HmacValidator {
10 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 pub fn update(&mut self, data: &[u8]) {
19 self.mac.update(data);
20 }
21
22 pub fn finalize(self) -> Vec<u8> {
24 let result = self.mac.finalize();
25 result.into_bytes().to_vec()
26 }
27
28 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 let mut validator = HmacValidator::new(key).unwrap();
54 validator.update(data);
55 let hmac_code = validator.finalize();
56
57 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 let mut validator = HmacValidator::new(key1).unwrap();
72 validator.update(data);
73 let hmac_code = validator.finalize();
74
75 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}