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}