bitwarden_core/auth/
key_connector.rs

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