Skip to main content

mega_security_rs/
keys.rs

1use rsa::{pkcs8::{DecodePrivateKey, EncodePrivateKey}, RsaPrivateKey, RsaPublicKey};
2use aes_gcm::aes::{self};
3use aes::cipher::{block_padding::Pkcs7, BlockDecryptMut, BlockEncryptMut,KeyInit, generic_array::GenericArray,};
4
5use crate::{errors::ClientError, RSA_LENGTH};
6
7
8type Aes128EcbEnc = ecb::Encryptor<aes::Aes128>;
9type Aes128EcbDec = ecb::Decryptor<aes::Aes128>;
10
11
12#[derive(Debug, Clone)]
13pub struct KeysPayload {
14    pub rsa: Vec<u8>,
15    pub master: Vec<u8>,
16}
17
18impl KeysPayload {
19    pub fn new(master_key: &[u8], derived_encryption_key: &[u8]) -> Result<(Self, RsaPublicKey), ClientError> {
20        let mut rng = rand::thread_rng();
21
22        let aes_master_key_array = GenericArray::clone_from_slice(master_key);
23        
24        // RSA
25        let rsa_priv_key = if let Ok(pk) = RsaPrivateKey::new(&mut rng, RSA_LENGTH) { pk } 
26            else { return Err(ClientError::RsaKeyGenerationFailed) };
27        let rsa_pub_key = RsaPublicKey::from(&rsa_priv_key);
28        let rsa_encoded = if let Ok(der) = rsa_priv_key.to_pkcs8_der() {
29            der
30        } else { return Err(ClientError::RsaKeyEncodeFailed) };
31
32        let rsa_ct = Aes128EcbEnc::new(&aes_master_key_array)
33            .encrypt_padded_vec_mut::<Pkcs7>(&mut rsa_encoded.as_bytes());
34
35        // Master key
36        let aes_derived_enc_key_array = GenericArray::from_slice(derived_encryption_key);
37
38        let mut master_key_c = master_key;
39        let master_ct = Aes128EcbEnc::new(&aes_derived_enc_key_array)
40            .encrypt_padded_vec_mut::<Pkcs7>(&mut master_key_c);
41
42        Ok((Self {
43            rsa: rsa_ct.to_vec(),
44            master: master_ct.to_vec(),
45        }, rsa_pub_key))
46    }
47
48}
49
50#[derive(Debug)]
51pub struct KeysDecrypted {
52    pub rsa: RsaPrivateKey,
53    pub master: Vec<u8>,
54}
55
56impl KeysDecrypted {
57    pub fn from_encrypted(payload: &mut KeysPayload, derived_encryption_key: &[u8]) -> Result<Self, ClientError> {
58        let derived_encryption_key_array = GenericArray::from_slice(&derived_encryption_key);
59
60        let master = if let Ok(x) = Aes128EcbDec::new(&derived_encryption_key_array)
61            .decrypt_padded_vec_mut::<Pkcs7>(&mut payload.master) {
62                x
63            } else {
64                return Err(ClientError::FailureToDecrypt);
65        };
66        let master = GenericArray::from_slice(&master);
67
68        let rsa = if let Ok(x) = Aes128EcbDec::new(&master)
69            .decrypt_padded_vec_mut::<Pkcs7>(&mut payload.rsa) {
70                x
71            } else {
72                return Err(ClientError::FailureToDecrypt);
73        };
74
75        let rsa = if let Ok(pk) = RsaPrivateKey::from_pkcs8_der(&rsa) {
76            pk
77        } else { return Err(ClientError::RsaKeyDecodeFailed) };
78        let master = master.to_vec();
79
80        Ok(Self { rsa, master })
81    }
82}