rsa_msg_packets/other/
info.rs1use 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}