bitwarden_core/auth/password/
mod.rs

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