17 lines
498 B
Rust
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
|
|
}
|