meta_secret_core/crypto/
keys.rs

1use crate::crypto::{
2    key_pair::{DsaKeyPair, KeyPair, TransportDsaKeyPair},
3};
4use crate::models::{CommunicationChannel, DeviceInfo, SerializedKeyManager, UserSecurityBox, UserSignature};
5
6pub struct KeyManager {
7    pub dsa: DsaKeyPair,
8    pub transport_key_pair: TransportDsaKeyPair,
9}
10
11/// Key manager can be used only with a single vault name (in the future they will be independent entities)
12impl KeyManager {
13    pub fn generate() -> KeyManager {
14        KeyManager {
15            dsa: DsaKeyPair::generate(),
16            transport_key_pair: TransportDsaKeyPair::generate(),
17        }
18    }
19
20    pub fn generate_security_box(vault_name: String) -> UserSecurityBox {
21        let key_manager = KeyManager::generate();
22
23        let signature = Box::from(key_manager.dsa.sign(vault_name.clone()));
24        UserSecurityBox {
25            vault_name,
26            signature,
27            key_manager: Box::from(SerializedKeyManager::from(&key_manager)),
28        }
29    }
30}
31
32impl UserSecurityBox {
33    pub fn get_user_sig(&self, device: &DeviceInfo) -> UserSignature {
34        let key_manager: KeyManager = KeyManager::try_from(self.key_manager.as_ref()).unwrap();
35
36        UserSignature {
37            vault_name: self.vault_name.clone(),
38            device: Box::from(device.clone()),
39            public_key: Box::from(key_manager.dsa.public_key()),
40            transport_public_key: Box::from(key_manager.transport_key_pair.public_key()),
41            signature: Box::from(key_manager.dsa.sign(self.vault_name.clone())),
42        }
43    }
44}
45
46impl CommunicationChannel {
47    pub fn inverse(self) -> Self {
48        Self {
49            sender: self.receiver,
50            receiver: self.sender,
51        }
52    }
53}