Updated password generation functions
This commit is contained in:
parent
3b2633c880
commit
4d4cec1353
@ -1,6 +1,6 @@
|
|||||||
use arrayvec::{ArrayString, ArrayVec};
|
use arrayvec::ArrayString;
|
||||||
use rand::{rngs::OsRng, seq::SliceRandom};
|
use rand::{rngs::OsRng, seq::SliceRandom};
|
||||||
use std::str::from_utf8_unchecked;
|
use std::array;
|
||||||
|
|
||||||
const CHARS: &[u8] = br##"!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~"##;
|
const CHARS: &[u8] = br##"!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~"##;
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ bitflags::bitflags! {
|
|||||||
/// Returns true if the generated master password is valid.
|
/// Returns true if the generated master password is valid.
|
||||||
/// It checks that it has at least one lowercase, one uppercase, one number and one punctuation char
|
/// It checks that it has at least one lowercase, one uppercase, one number and one punctuation char
|
||||||
#[inline]
|
#[inline]
|
||||||
fn check_generated_password(password: &[u8]) -> bool {
|
fn check_generated_password(password: &[u8; 32]) -> bool {
|
||||||
let mut flags = PasswordFlags::empty();
|
let mut flags = PasswordFlags::empty();
|
||||||
for &byte in password {
|
for &byte in password {
|
||||||
match byte {
|
match byte {
|
||||||
@ -35,19 +35,18 @@ fn check_generated_password(password: &[u8]) -> bool {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn generate_password() -> ArrayString<32> {
|
||||||
|
loop {
|
||||||
|
let password: [u8; 32] = array::from_fn(|_| *CHARS.choose(&mut OsRng).unwrap());
|
||||||
|
if check_generated_password(&password) {
|
||||||
|
return ArrayString::from_byte_string(&password).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Continuously generates the password until it passes the checks
|
/// Continuously generates the password until it passes the checks
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn generate_passwords() -> [ArrayString<32>; 10] {
|
pub fn generate_passwords() -> [ArrayString<32>; 10] {
|
||||||
let mut passwords = ArrayVec::new_const();
|
array::from_fn(|_| generate_password())
|
||||||
while !passwords.is_full() {
|
|
||||||
let password: ArrayVec<u8, 32> = (0..32)
|
|
||||||
.map(|_| *CHARS.choose(&mut OsRng).unwrap())
|
|
||||||
.collect();
|
|
||||||
if check_generated_password(&password) {
|
|
||||||
let mut string = ArrayString::<32>::new_const();
|
|
||||||
unsafe { string.push_str(from_utf8_unchecked(&password)) };
|
|
||||||
passwords.push(string)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
unsafe { passwords.into_inner_unchecked() }
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user