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 result = Self::sign(key, message);
22            sender.send(result).unwrap();
23        });
24        let result = receiver.recv().unwrap();
25        result
26    }
27
28    fn verify(key: Vec<u8>, message: Vec<u8>, signature: Vec<u8>) -> bool {
29        let mut mac = HmacSha256::new_from_slice(&key).unwrap();
30        mac.update(&message);
31        return mac.verify_slice(&signature).is_ok();
32    }
33
34    fn verify_threadpool(key: Vec<u8>, message: Vec<u8>, signature: Vec<u8>) -> bool {
35        let (sender, receiver) = mpsc::channel();
36        rayon::spawn(move || {
37            let result = Self::verify(key, message, signature);
38            sender.send(result).unwrap();
39        });
40        let result = receiver.recv().unwrap();
41        result
42    }
43}