extern crate rand; use rand::prelude::*; // GOALS: // // make it as generic as possible so that people can // load in their own custom alphabets through an API // or use the default parameters // // then publish to crates.io // Function to determine passphrase difficulty: // easy, medium, hard, random, errror fn difficulty(mode: &str) -> i32 { if mode == "easy" { thread_rng().gen_range(1, 3) } else if mode == "medium" { thread_rng().gen_range(3, 6) } else if mode == "hard" { thread_rng().gen_range(6, 9) } else if mode == "random" { thread_rng().gen_range(1, 9) } else { println!("Not a valid mode. Please set mode to easy, medium, or hard"); 0 } } // Function to join all padding types into one vector fn join_padding_types<'a>(numbers: Vec<&'a str>, letters: Vec<&'a str>, symbols: Vec<&'a str>, other: Vec<&'a str>) -> Vec<&'a str> { let mut v: Vec<&str> = Vec::new(); v.append(&mut numbers.clone()); v.append(&mut letters.clone()); v.append(&mut symbols.clone()); v.append(&mut other.clone()); v } // Function to create a padding string from the padding vector fn create_padding(stuff: Vec<&str>, len: i32) -> Vec<&str> { let mut v: Vec<&str> = Vec::new(); let l = thread_rng().gen_range(1, len); let s = thread_rng().gen_range(1, stuff.len()); for _i in 0..l { v.push(stuff[s]); } v } // Function to generate a passphrase with padding fn passphrase(words: Vec<&str>, padding_chars: Vec<&str>, mode: &str) -> String { // init variables let mut v: Vec<&str> = Vec::new(); let mut rng = thread_rng(); let d = difficulty(mode); let p = create_padding(padding_chars, d); // add words and padding to vector for i in 0..d { let w = rng.gen_range(1, words.len()); v.push(words[w]); v.append(&mut p.clone()); } // convert vector to string let mut passphrase = String::new(); for i in v { passphrase.push_str(i); } // return passphrase string passphrase } // Function to create a random password to compare with // a random passphrase fn password(stuff: Vec<&str>, len: i32) -> String { // init variables let mut v: Vec<&str> = Vec::new(); let mut rng = thread_rng(); // add random values to a vector for i in 0..len { let s = thread_rng().gen_range(1, stuff.len()); v.push(stuff[s]) } // convert vector to string let mut password = String::new(); for i in v { password.push_str(i); } // return password string password } fn main() { // Create alphabets let words = vec!["apple", "bagel", "cat", "dolphin", "elephant", "frog", "gopher", "horse", "iguana", "jackrabbit", "kangaroo", "lizzard", "monkey", "nightengale", "otter", "prayingmantis", "quail", "rooster", "snake", "turtle", "ummm", "velocorapter", "walrus", "x", "yarr", "zebra"]; let nums = vec!["0","1","2","3","4","5","6","7","8","9"]; let symbols = vec!["`", "~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "[", "{", "]", "}", "?", ".", ">", ",", "<", ";", "|", ":", "/"]; let letters = vec!["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; let other = vec![""]; let mode = "medium"; // easy, medium, hard, random let padding = join_padding_types(nums, symbols, letters, other); // Create passphrase and password let _passphrase = passphrase(words.clone(), padding.clone(), mode); let _password = password(padding.clone(), _passphrase.len() as i32); // Print results for comparison println!("Which is easier to remember?\n"); println!("password: {}", _password); println!("password length: {}", _password.len()); println!("\nor...\n"); println!("passphrase: {}", _passphrase); println!("passphrase length: {}", _passphrase.len()); }