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> {
14 let mut mac = HmacSha256::new_from_slice(&key).unwrap();
15 mac.update(&message);
16 let result = mac.finalize().into_bytes().to_vec();
17 result
18 }
19
20 fn sign_threadpool(key: Vec<u8>, message: Vec<u8>) -> Vec<u8> {
23 let (sender, receiver) = mpsc::channel();
24 rayon::spawn(move || {
25 let result = Self::sign(key, message);
26 sender.send(result).unwrap();
27 });
28 let result = receiver.recv().unwrap();
29 result
30 }
31
32 fn verify(key: Vec<u8>, message: Vec<u8>, signature: Vec<u8>) -> bool {
35 let mut mac = HmacSha256::new_from_slice(&key).unwrap();
36 mac.update(&message);
37 return mac.verify_slice(&signature).is_ok();
38 }
39
40 fn verify_threadpool(key: Vec<u8>, message: Vec<u8>, signature: Vec<u8>) -> bool {
43 let (sender, receiver) = mpsc::channel();
44 rayon::spawn(move || {
45 let result = Self::verify(key, message, signature);
46 sender.send(result).unwrap();
47 });
48 let result = receiver.recv().unwrap();
49 result
50 }
51}