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 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 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}