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    /// Signs a message using HMAC with SHA-256.
12    /// Returns the signature as a vector of bytes.
13    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    /// Signs a message using HMAC with SHA-256 on the threadpool.
21    /// Returns the signature as a vector of bytes.
22    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    /// Verifies a signature using HMAC with SHA-256.
33    /// Returns true if the signature is valid, false otherwise.
34    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    /// Verifies a signature using HMAC with SHA-256 on the threadpool.
41    /// Returns true if the signature is valid, false otherwise.
42    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}