cas_lib/message/
hmac.rs

1use std::sync::mpsc;
2
3use super::cas_hmac::CASHMAC;
4use hmac::{Hmac, Mac};
5use sha2::Sha256;
6
7type HmacSha256 = Hmac<Sha256>;
8pub struct HMAC;
9
10impl CASHMAC for HMAC {
11    fn sign(key: Vec<u8>, message: Vec<u8>) -> Vec<u8> {
12        let mut mac = HmacSha256::new_from_slice(&key).unwrap();
13        mac.update(&message);
14        let result = mac.finalize().into_bytes().to_vec();
15        result
16    }
17
18    fn sign_threadpool(key: Vec<u8>, message: Vec<u8>) -> Vec<u8> {
19        let (sender, receiver) = mpsc::channel();
20        rayon::spawn(move || {
21            let mut mac = HmacSha256::new_from_slice(&key).unwrap();
22            mac.update(&message);
23            let result = mac.finalize().into_bytes().to_vec();
24            sender.send(result);
25        });
26        let result = receiver.recv().unwrap();
27        result
28    }
29
30    fn verify(key: Vec<u8>, message: Vec<u8>, signature: Vec<u8>) -> bool {
31        let mut mac = HmacSha256::new_from_slice(&key).unwrap();
32        mac.update(&message);
33        return mac.verify_slice(&signature).is_ok();
34    }
35
36    fn verify_threadpool(key: Vec<u8>, message: Vec<u8>, signature: Vec<u8>) -> bool {
37        let (sender, receiver) = mpsc::channel();
38        rayon::spawn(move || {
39            let mut mac = HmacSha256::new_from_slice(&key).unwrap();
40            mac.update(&message);
41            let result = mac.verify_slice(&signature).is_ok();
42            sender.send(result);
43        });
44        let result = receiver.recv().unwrap();
45        result
46    }
47}