mls-spec 3.0.0-pre.2

This crate is a repository of MLS / RFC9420-related data structures.
use crate::{
    SensitiveBytes,
    defs::{CiphersuiteId, ProtocolVersion},
    group::{KeyPackageRef, extensions::Extension},
    messages::MlsMessage,
    tree::leaf_node::LeafNode,
};

#[derive(Debug, Clone, PartialEq, Eq, thalassa::TlsplSerialize, thalassa::TlsplSize)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct KeyPackageTBS<'a> {
    pub version: &'a ProtocolVersion,
    pub cipher_suite: &'a CiphersuiteId,
    pub init_key: &'a [u8],
    pub leaf_node: &'a LeafNode<'a>,
    pub extensions: &'a [Extension<'a>],
}

#[derive(
    Debug, Clone, PartialEq, Eq, Hash, thalassa::TlsplAll, zeroize::Zeroize, zeroize::ZeroizeOnDrop,
)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct KeyPackage<'a> {
    #[zeroize(skip)]
    pub version: ProtocolVersion,
    #[zeroize(skip)]
    pub cipher_suite: CiphersuiteId,
    pub init_key: SensitiveBytes<'a>,
    #[zeroize(skip)]
    pub leaf_node: LeafNode<'a>,
    #[zeroize(skip)]
    pub extensions: Vec<Extension<'a>>,
    pub signature: SensitiveBytes<'a>,
}

impl<'a> KeyPackage<'a> {
    pub fn to_tbs(&'a self) -> KeyPackageTBS<'a> {
        KeyPackageTBS {
            version: &self.version,
            cipher_suite: &self.cipher_suite,
            init_key: &self.init_key,
            leaf_node: &self.leaf_node,
            extensions: &self.extensions,
        }
    }

    pub fn into_message(self) -> MlsMessage<'a> {
        MlsMessage {
            version: ProtocolVersion::default(),
            content: crate::messages::MlsMessageContent::KeyPackage(self),
        }
    }
}

#[derive(Debug, Clone, PartialEq, Eq, Hash, zeroize::Zeroize, zeroize::ZeroizeOnDrop)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct KeyPackageWithRef<'a> {
    pub keypackage_ref: KeyPackageRef<'a>,
    pub keypackage: KeyPackage<'a>,
}