rsa_msg_packets/other/
info.rs

1use openssl::{pkey::Public, rsa::Rsa};
2
3use crate::{util::{tools::{vec_to_usize, usize_to_vec}, vec::extract_vec}};
4
5
6#[derive(Debug, Clone)]
7pub struct UserInfoBasic {
8    pub name: Option<String>,
9    pub public_key: Option<Rsa<Public>>,
10}
11
12impl UserInfoBasic {
13    pub fn serialize(&self) -> anyhow::Result<Vec<u8>> {
14        let mut merged = Vec::new();
15        let name = self.name.clone().unwrap_or("".to_owned());
16        let name_len = name.len();
17
18        let mut b_name_len = usize_to_vec(name_len)?;
19        let mut b_name = name.as_bytes().to_vec();
20
21        let mut pubkey = Vec::new();
22        if self.public_key.is_some() {
23            let key = self.public_key.clone().unwrap();
24            pubkey = key.public_key_to_pem()?
25        }
26
27        let mut pubkey_len = usize_to_vec(pubkey.len())?;
28
29        merged.append(&mut b_name_len);
30        merged.append(&mut b_name);
31        merged.append(&mut pubkey_len);
32        merged.append(&mut pubkey);
33
34        return Ok(merged);
35    }
36
37    pub fn deserialize(data: &Vec<u8>) -> anyhow::Result<Self> where Self: Sized {
38        let mut data = data.clone();
39        let name_len = vec_to_usize(&mut data)?;
40
41        let b_name = extract_vec(0..name_len, &mut data)?;
42        let name = String::from_utf8(b_name)?;
43
44        let mut name_out = None;
45        if name_len != 0 {
46            name_out = Some(name);
47        }
48
49        let pubkey_len = vec_to_usize(&mut data)?;
50        let pubkey_pem = extract_vec(0..pubkey_len, &mut data)?;
51
52        let mut public_key= None;
53        if pubkey_len != 0 {
54            public_key = Some(Rsa::public_key_from_pem(&pubkey_pem)?);
55        }
56
57        return Ok(Self {
58            name: name_out,
59            public_key
60        });
61    }
62}