use zxcvbn::zxcvbn;
pub const MAX_PASSWORD_CHARS: usize = 1024;
pub const MAX_PASSWORD_BYTES: usize = 3072;
pub fn zxcvbn_entropy_score(password: &str) -> Result<(f64, u8), String> {
if password.is_empty() {
return Err("password cannot be empty".to_string());
}
let char_len = password.chars().count();
if char_len > MAX_PASSWORD_CHARS {
return Err(format!(
"password character length {} exceeds maximum allowed {}",
char_len, MAX_PASSWORD_CHARS
));
}
let byte_len = password.len();
if byte_len > MAX_PASSWORD_BYTES {
return Err(format!(
"password byte length {} exceeds maximum allowed {}",
byte_len, MAX_PASSWORD_BYTES
));
}
let analysis = zxcvbn(password, &[]);
let guesses_f = analysis.guesses() as f64;
let bits_of_entropy = guesses_f.log10() * std::f64::consts::LOG2_10;
let score_u8: u8 = analysis.score().into();
Ok((bits_of_entropy, score_u8))
}