rsa-msg-packets 0.1.7

A helper crate for rsa-messenger-client as well as rsa-messenger-server.
Documentation
use openssl::{pkey::Public, rsa::Rsa};

use crate::{util::{tools::{vec_to_usize, usize_to_vec}, vec::extract_vec}};


#[derive(Debug, Clone)]
pub struct UserInfoBasic {
    pub name: Option<String>,
    pub public_key: Option<Rsa<Public>>,
}

impl UserInfoBasic {
    pub fn serialize(&self) -> anyhow::Result<Vec<u8>> {
        let mut merged = Vec::new();
        let name = self.name.clone().unwrap_or("".to_owned());
        let name_len = name.len();

        let mut b_name_len = usize_to_vec(name_len)?;
        let mut b_name = name.as_bytes().to_vec();

        let mut pubkey = Vec::new();
        if self.public_key.is_some() {
            let key = self.public_key.clone().unwrap();
            pubkey = key.public_key_to_pem()?
        }

        let mut pubkey_len = usize_to_vec(pubkey.len())?;

        merged.append(&mut b_name_len);
        merged.append(&mut b_name);
        merged.append(&mut pubkey_len);
        merged.append(&mut pubkey);

        return Ok(merged);
    }

    pub fn deserialize(data: &Vec<u8>) -> anyhow::Result<Self> where Self: Sized {
        let mut data = data.clone();
        let name_len = vec_to_usize(&mut data)?;

        let b_name = extract_vec(0..name_len, &mut data)?;
        let name = String::from_utf8(b_name)?;

        let mut name_out = None;
        if name_len != 0 {
            name_out = Some(name);
        }

        let pubkey_len = vec_to_usize(&mut data)?;
        let pubkey_pem = extract_vec(0..pubkey_len, &mut data)?;

        let mut public_key= None;
        if pubkey_len != 0 {
            public_key = Some(Rsa::public_key_from_pem(&pubkey_pem)?);
        }

        return Ok(Self {
            name: name_out,
            public_key
        });
    }
}