use base64::Engine; use base64::engine::general_purpose::URL_SAFE_NO_PAD; use rand::Rng; use rand::rngs::OsRng; use sha2::{Digest, Sha256}; pub fn generate_numeric_code(len: usize) -> String { let mut rng = OsRng; (0..len) .map(|_| rng.gen_range(0..10u32).to_string()) .collect() } pub fn sha256_b64url(data: &[u8]) -> String { URL_SAFE_NO_PAD.encode(Sha256::digest(data)) } pub fn constant_time_eq(a: &[u8], b: &[u8]) -> bool { if a.len() != b.len() { return false; } let mut diff = 0u8; for (x, y) in a.iter().zip(b.iter()) { diff |= x ^ y; } diff == 0 }