use hmac::{Hmac, Mac}; use rand::{rngs::OsRng, RngCore}; use sha2::Sha256; // Generate a random nonce pub fn generate_nonce() -> String { let mut bytes = [0u8; 16]; OsRng.fill_bytes(&mut bytes); hex::encode(bytes) } // Calculate HMAC using the shared secret pub fn calculate_hmac(secret: &str, data: &str) -> String { type HmacSha256 = Hmac; let mut mac = HmacSha256::new_from_slice(secret.as_bytes()) .expect("HMAC can take key of any size"); mac.update(data.as_bytes()); let result = mac.finalize(); let code_bytes = result.into_bytes(); hex::encode(code_bytes) } // Verify an HMAC token pub fn verify_hmac(secret: &str, data: &str, expected: &str) -> bool { let calculated = calculate_hmac(secret, data); calculated == expected }