bitwarden_core/auth/password/
mod.rs1use 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}