1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use log::trace;
use openssl::{rsa::Rsa, pkey::{Public, Private}};

use crate::{types::ByteMessage, util::modes::Modes};

pub struct PubkeyMsg {
    pub pubkey: Rsa<Public>
}

impl PubkeyMsg {
    pub fn from_private(privkey: Rsa<Private>) -> anyhow::Result<Self> {
        let pem = privkey.public_key_to_pem()?;
        let pubkey = Rsa::public_key_from_pem(&pem)?;

        return Ok(PubkeyMsg {
            pubkey
        })
    }
}

impl ByteMessage for PubkeyMsg {

    fn serialize(&self) -> Vec<u8> {
        return Modes::SetPubkey.get_send(&self.pubkey.public_key_to_pem().unwrap().to_vec());
    }

    fn deserialize(data: &Vec<u8>) -> anyhow::Result<Self> {
        let data = data.clone();

        trace!("Parsing public key of length {}...", data.len());
        let key = Rsa::public_key_from_pem(&data)?;

        return Ok(PubkeyMsg {
            pubkey: key
        });
    }
}