use rand::Rng;
use super::base64::base64_url_encode;
const SALT_ENTROPY_BYTES: usize = 16;
pub fn generate_salt<R: Rng + ?Sized>(rng: &mut R) -> Vec<u8> {
let mut salt = vec![0u8; SALT_ENTROPY_BYTES];
rng.fill_bytes(&mut salt);
debug_assert_eq!(
salt.len(),
SALT_ENTROPY_BYTES,
"`salt` length MUST be {}",
SALT_ENTROPY_BYTES
);
salt
}
pub fn generate_nonce<R: Rng + ?Sized>(rng: &mut R) -> String {
let mut nonce_bytes = [0u8; 32];
rng.fill_bytes(&mut nonce_bytes);
base64_url_encode(nonce_bytes)
}
#[cfg(test)]
mod tests {
use rand::thread_rng;
use super::*;
#[test]
fn test_generate_salt() {
let mut rng = thread_rng();
let salt = generate_salt(&mut rng);
assert_eq!(salt.len(), SALT_ENTROPY_BYTES);
let all_zero = salt.into_iter().all(|b| b == 0);
assert!(!all_zero);
}
}