pub trait SaltGenerator {
fn generate_salt(&self) -> Option<Vec<u8>>;
}
pub struct NoSalt {}
impl SaltGenerator for NoSalt {
fn generate_salt(&self) -> Option<Vec<u8>> {
None
}
}
pub const NO_SALT: &NoSalt = &NoSalt {};
pub struct DefaultSalt {
salt_len: usize,
}
impl DefaultSalt {
#[allow(dead_code)]
pub fn set_salt_length(&mut self, len: usize) {
self.salt_len = len;
}
}
impl Default for DefaultSalt {
fn default() -> Self {
DefaultSalt { salt_len: 16 }
}
}
impl SaltGenerator for DefaultSalt {
fn generate_salt(&self) -> Option<Vec<u8>> {
use rand::prelude::*;
let mut salt = vec![0u8; self.salt_len];
let mut rng = rand_chacha::ChaCha20Rng::from_entropy();
rng.fill_bytes(&mut salt);
Some(salt)
}
}