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}