libskyfall 0.1.0

Quantum-Safe P2P Communication System
Documentation
#![allow(missing_docs)]

use aes_gcm::Nonce;
use bon::bon;
use oqs::{kem::Ciphertext, sig::Signature};
use rmp_serde::config::BytesMode;
use serde::{ Deserialize, Serialize };
use serde_with::base64::Base64;
use typenum::U12;
use uuid::Uuid;

type UB64 = Base64<serde_with::base64::UrlSafe, serde_with::formats::Unpadded>;

#[serde_with::serde_as]
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Message {
    id: Uuid,

    #[serde_as(as = "UB64")]
    nonce: Vec<u8>,
    shared_secret: Ciphertext,
    #[serde_as(as = "UB64")]
    data: Vec<u8>,
    signature: Signature
}

#[bon]
impl Message {
    pub fn encode(self) -> crate::Result<Vec<u8>> {
        let buffer: Vec<u8> = Vec::new();
        let mut serializer = rmp_serde::encode::Serializer
            ::new(buffer)
            .with_bytes(BytesMode::ForceIterables);
        self.serialize(&mut serializer)?;
        Ok(serializer.into_inner())
    }

    pub fn decode(data: Vec<u8>) -> crate::Result<Self> {
        Ok(rmp_serde::decode::from_slice::<Self>(&data)?)
    }

    #[builder]
    pub(crate) fn new(nonce: Nonce<U12>, shared_secret: Ciphertext, data: Vec<u8>, signature: Signature) -> Self {
        Self {
            id: Uuid::new_v4(),
            nonce: nonce.to_vec(),
            shared_secret,
            data,
            signature
        }
    }

    pub fn id(&self) -> Uuid {
        self.id.clone()
    }

    pub fn nonce(&self) -> Nonce<U12> {
        Nonce::<U12>::from_iter(self.nonce.clone())
    }

    pub fn shared_secret(&self) -> Ciphertext {
        self.shared_secret.clone()
    }

    pub fn data(&self) -> Vec<u8> {
        self.data.clone()
    }

    pub fn signature(&self) -> Signature {
        self.signature.clone()
    }
}