bitwarden_core/auth/password/
mod.rs

1use bitwarden_crypto::{CryptoError, HashPurpose, Kdf, MasterKey};
2
3mod policy;
4pub(crate) use policy::satisfies_policy;
5pub use policy::MasterPasswordPolicyOptions;
6mod validate;
7pub(crate) use validate::{validate_password, validate_password_user_key};
8mod strength;
9pub(crate) use strength::password_strength;
10
11pub(crate) fn determine_password_hash(
12    email: &str,
13    kdf: &Kdf,
14    password: &str,
15    purpose: HashPurpose,
16) -> Result<String, CryptoError> {
17    let master_key = MasterKey::derive(password, email, kdf)?;
18    master_key.derive_master_key_hash(password.as_bytes(), purpose)
19}
20
21#[cfg(test)]
22mod tests {
23    use std::num::NonZeroU32;
24
25    use super::*;
26
27    #[test]
28    fn test_determine_password_hash() {
29        use super::determine_password_hash;
30
31        let password = "password123";
32        let email = "[email protected]";
33        let kdf = Kdf::PBKDF2 {
34            iterations: NonZeroU32::new(100_000).unwrap(),
35        };
36        let purpose = HashPurpose::LocalAuthorization;
37
38        let result = determine_password_hash(email, &kdf, password, purpose).unwrap();
39
40        assert_eq!(result, "7kTqkF1pY/3JeOu73N9kR99fDDe9O1JOZaVc7KH3lsU=");
41    }
42}