diff options
Diffstat (limited to 'src/pwgen.rs')
-rw-r--r-- | src/pwgen.rs | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/pwgen.rs b/src/pwgen.rs index 4d2d497..55151e6 100644 --- a/src/pwgen.rs +++ b/src/pwgen.rs @@ -1,4 +1,3 @@ -use chbs::scheme::ToScheme as _; use rand::seq::SliceRandom as _; const SYMBOLS: &[u8] = b"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"; @@ -17,6 +16,8 @@ pub enum Type { } pub fn pwgen(ty: Type, len: usize) -> String { + let mut rng = rand::thread_rng(); + let alphabet = match ty { Type::AllChars => { let mut v = vec![]; @@ -42,17 +43,10 @@ pub fn pwgen(ty: Type, len: usize) -> String { v } Type::Diceware => { - let config = chbs::config::BasicConfig { - words: len, - capitalize_first: chbs::probability::Probability::Never, - capitalize_words: chbs::probability::Probability::Never, - ..chbs::config::BasicConfig::default() - }; - return config.to_scheme().generate(); + return diceware(&mut rng, len); } }; - let mut rng = rand::thread_rng(); let mut pass = vec![]; pass.extend( std::iter::repeat_with(|| alphabet.choose(&mut rng).unwrap()) @@ -63,6 +57,15 @@ pub fn pwgen(ty: Type, len: usize) -> String { String::from_utf8(pass).unwrap() } +fn diceware(rng: &mut impl rand::RngCore, len: usize) -> String { + let mut words = vec![]; + for _ in 0..len { + // unwrap is safe because choose only returns None for an empty slice + words.push(*crate::wordlist::EFF_LONG.choose(rng).unwrap()); + } + words.join(" ") +} + #[cfg(test)] mod test { use super::*; |