aboutsummaryrefslogtreecommitdiffstats
path: root/src/pwgen.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-04-11 16:03:30 -0400
committerJesse Luehrs <doy@tozt.net>2020-04-11 16:03:30 -0400
commit85e3c46466119c94724a7b48d22eda7e50538505 (patch)
tree4f18fd77b1ce19eec70023d075ea36136b3c2c9a /src/pwgen.rs
parent40a3cf1ee2124419c3c9336b5849652e74d4a00b (diff)
downloadrbw-85e3c46466119c94724a7b48d22eda7e50538505.tar.gz
rbw-85e3c46466119c94724a7b48d22eda7e50538505.zip
add password generation
Diffstat (limited to 'src/pwgen.rs')
-rw-r--r--src/pwgen.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/pwgen.rs b/src/pwgen.rs
new file mode 100644
index 0000000..656305e
--- /dev/null
+++ b/src/pwgen.rs
@@ -0,0 +1,64 @@
+use chbs::scheme::ToScheme as _;
+use rand::seq::SliceRandom as _;
+use zeroize::Zeroize as _;
+
+const SYMBOLS: &[u8] = b"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
+const NUMBERS: &[u8] = b"0123456789";
+const LETTERS: &[u8] =
+ b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+const NONCONFUSABLES: &[u8] = b"34678abcdefhjkmnpqrtuwxy";
+
+#[derive(Debug, Eq, PartialEq, Copy, Clone)]
+pub enum Type {
+ AllChars,
+ NoSymbols,
+ Numbers,
+ NonConfusables,
+ Diceware,
+}
+
+pub fn pwgen(ty: Type, len: usize) -> crate::locked::Vec {
+ if ty == Type::Diceware {
+ let mut locked_pass = crate::locked::Vec::new();
+ let mut config = chbs::config::BasicConfig::default();
+ config.words = len;
+ config.capitalize_first = chbs::probability::Probability::Never;
+ config.capitalize_words = chbs::probability::Probability::Never;
+ let mut pass = config.to_scheme().generate();
+ locked_pass.extend(pass.as_bytes().iter().copied());
+ pass.zeroize();
+ return locked_pass;
+ }
+
+ let alphabet = match ty {
+ Type::AllChars => {
+ let mut v = vec![];
+ v.extend(SYMBOLS.iter().copied());
+ v.extend(NUMBERS.iter().copied());
+ v.extend(LETTERS.iter().copied());
+ v
+ }
+ Type::NoSymbols => {
+ let mut v = vec![];
+ v.extend(NUMBERS.iter().copied());
+ v.extend(LETTERS.iter().copied());
+ v
+ }
+ Type::Numbers => {
+ let mut v = vec![];
+ v.extend(NUMBERS.iter().copied());
+ v
+ }
+ Type::NonConfusables => {
+ let mut v = vec![];
+ v.extend(NONCONFUSABLES.iter().copied());
+ v
+ }
+ Type::Diceware => unreachable!(),
+ };
+
+ let mut rng = rand::thread_rng();
+ let mut pass = crate::locked::Vec::new();
+ pass.extend(alphabet.choose_multiple(&mut rng, len).copied());
+ pass
+}