rsa_msg_packets/other/
key_iv.rs1use openssl::{rand, symm::{encrypt, decrypt}, pkey::{Private, Public}, rsa::Rsa};
2
3use crate::{
4 consts::{AES_DIGEST, AES_IVSIZE_BYTES, AES_KEYSIZE_BYTES, AES_KEYSIZE_BITS, AES_IVSIZE_BITS},
5 util::{vec::extract_vec, rsa::{encrypt_rsa, decrypt_rsa}, tools::{vec_to_usize, usize_to_vec}},
6};
7
8#[derive(Debug, Clone)]
9pub struct KeyIVPair {
10 pub key: Vec<u8>,
11 pub iv: Vec<u8>,
12}
13
14impl KeyIVPair {
15 pub const BYTE_SIZE: usize = AES_KEYSIZE_BYTES + AES_IVSIZE_BYTES;
16 pub const BIT_SIZE: usize = AES_KEYSIZE_BITS + AES_IVSIZE_BITS;
17
18 pub fn serialize(&self, keypair: &Rsa<Public>) -> anyhow::Result<Vec<u8>> {
19 let mut merged = Vec::new();
20 let mut b_key = encrypt_rsa(keypair, &self.key.clone())?;
21 let mut b_key_size = usize_to_vec(b_key.len())?;
22
23 let mut b_iv = encrypt_rsa(keypair, &self.iv.clone())?;
24 let mut b_iv_size = usize_to_vec(b_iv.len())?;
25
26 merged.append(&mut b_key_size);
27 merged.append(&mut b_key);
28 merged.append(&mut b_iv_size);
29 merged.append(&mut b_iv);
30
31 return Ok(merged);
32 }
33
34 pub fn deserialize_mut(data: &mut Vec<u8>, keypair: &Rsa<Private>) -> anyhow::Result<Self>
35 where Self: Sized {
36 let key_size = vec_to_usize(data)?;
37 let key = extract_vec(0..key_size, data)?;
38
39 let iv_size = vec_to_usize(data)?;
40 let iv = extract_vec(0..iv_size, data)?;
41
42 let key = decrypt_rsa(keypair, &key)?;
43 let iv = decrypt_rsa(keypair, &iv)?;
44
45 return Ok(Self { key, iv });
46 }
47
48 pub fn deserialize(data: &Vec<u8>, keypair: &Rsa<Private>) -> anyhow::Result<Self>
49 where
50 Self: Sized,
51 {
52 let mut data = data.clone();
53 return Self::deserialize_mut(&mut data, keypair);
54 }
55}
56
57impl KeyIVPair {
58 pub fn generate() -> anyhow::Result<Self> {
59 let mut key = [0 as u8; AES_KEYSIZE_BYTES];
60 let mut iv = [0 as u8; AES_IVSIZE_BYTES];
61
62 rand::rand_bytes(&mut key)?;
63 rand::rand_bytes(&mut iv)?;
64
65 return Ok(Self {
66 key: key.to_vec(),
67 iv: iv.to_vec(),
68 });
69 }
70
71 pub fn encrypt(&self, data: &[u8]) -> anyhow::Result<Vec<u8>> {
72 let encrypted = encrypt(*AES_DIGEST, &self.key, Some(&self.iv), data)?;
73
74 return Ok(encrypted);
75 }
76
77 pub fn decrypt(&self, data: &[u8]) -> anyhow::Result<Vec<u8>> {
78 let decrypted =decrypt(*AES_DIGEST, &self.key, Some(&self.iv), data)?;
79
80 return Ok(decrypted);
81 }
82}