rustytoken/src/crypto.rs

17 lines
498 B
Rust

use hmac_sha1_compact::HMAC;
pub const INTERVAL: u64 = 30;
pub fn generate_otp_token(private_key: &[u8], actual_time: u64) -> u32 {
let interval = actual_time / INTERVAL;
let msg = interval.to_be_bytes();
let hmac_digest = HMAC::mac(&msg, private_key);
let start = (hmac_digest[19] & 0xF) as usize;
let bytes: [u8; 4] = hmac_digest[start..start + 4].try_into().unwrap();
let raw_token = u32::from_be_bytes(bytes);
((raw_token & 0x7F_FF_FF_FF) % 1_000_000) as u32
}