use base64::Engine; use base64::engine::general_purpose::URL_SAFE_NO_PAD; use rand::RngCore; use rand::rngs::OsRng; use sha2::{Digest, Sha256}; pub fn random_b64url(len: usize) -> String { let mut bytes = vec![0u8; len]; OsRng.fill_bytes(&mut bytes); URL_SAFE_NO_PAD.encode(bytes) } pub fn sha256_hex(bytes: &[u8]) -> String { let digest = Sha256::digest(bytes); let mut out = String::with_capacity(digest.len() * 2); for byte in digest { use std::fmt::Write; let _ = write!(out, "{byte:02x}"); } out }