bitwarden_core/auth/
key_connector.rs

1use bitwarden_crypto::{CryptoError, MasterKey, RsaKeyPair};
2
3#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
4pub struct KeyConnectorResponse {
5    pub master_key: String,
6    pub encrypted_user_key: String,
7    pub keys: RsaKeyPair,
8}
9
10pub(super) fn make_key_connector_keys(
11    mut rng: impl rand::RngCore,
12) -> Result<KeyConnectorResponse, CryptoError> {
13    let master_key = MasterKey::generate(&mut rng);
14    let (user_key, encrypted_user_key) = master_key.make_user_key()?;
15    let keys = user_key.make_key_pair()?;
16
17    Ok(KeyConnectorResponse {
18        master_key: master_key.to_base64(),
19        encrypted_user_key: encrypted_user_key.to_string(),
20        keys,
21    })
22}
23
24#[cfg(test)]
25mod tests {
26    use rand::SeedableRng;
27    use rand_chacha::ChaCha8Rng;
28
29    use super::*;
30
31    #[test]
32    fn test_make_key_connector_keys() {
33        let mut rng = ChaCha8Rng::from_seed([0u8; 32]);
34
35        let result = make_key_connector_keys(&mut rng).unwrap();
36
37        assert_eq!(
38            result.master_key,
39            "PgDvL4lfQNZ/W7joHwmloSyEDsPOmn87GBvhiO9xGh4="
40        );
41    }
42}