60 lines
1.2 KiB
Rust
60 lines
1.2 KiB
Rust
use itertools::Itertools;
|
|
|
|
#[cfg(feature = "passphrase-gen")]
|
|
pub mod passphrase_gen;
|
|
|
|
#[cfg(feature = "password-gen")]
|
|
pub mod password_gen;
|
|
|
|
#[path = "ed25519.rs"]
|
|
pub mod randomart;
|
|
|
|
#[cfg(feature = "ed25519")]
|
|
pub mod key_gen;
|
|
|
|
fn entropy(pass: &str) -> f32 {
|
|
let mut r = 0;
|
|
if pass.chars().any(|c| c.is_ascii_lowercase()) {
|
|
r += 26;
|
|
}
|
|
if pass.chars().any(|c| c.is_ascii_uppercase()) {
|
|
r += 26;
|
|
}
|
|
if pass.chars().any(|c| c.is_ascii_punctuation()) {
|
|
r += 36;
|
|
}
|
|
if pass.chars().any(|c| c.is_ascii_digit()) {
|
|
r += 10;
|
|
}
|
|
let len = pass.chars().count();
|
|
let other = pass
|
|
.chars()
|
|
.filter(|c| {
|
|
!(c.is_ascii_lowercase()
|
|
|| c.is_ascii_uppercase()
|
|
|| c.is_ascii_digit()
|
|
|| c.is_ascii_punctuation())
|
|
})
|
|
.dedup()
|
|
.count();
|
|
|
|
((r + other) as f32).log2() * len as f32
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use crate::entropy;
|
|
|
|
#[test]
|
|
fn test_entropy() {
|
|
println!(
|
|
"{}",
|
|
entropy("this is a long passphrase with quite a few words!")
|
|
);
|
|
println!(
|
|
"{}",
|
|
entropy("This Is A Long Passphrase With Quite A Few Words!")
|
|
);
|
|
}
|
|
}
|