bitwarden_core/auth/
key_connector.rs

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