rsa_msg_packets/other/
key_iv.rs

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