mls-spec 2.0.1

This crate is a repository of MLS / RFC9420-related data structures.
Documentation
use crate::{
    SensitiveBytes,
    crypto::HpkeCiphertext,
    defs::{CiphersuiteId, ProtocolVersion},
    group::KeyPackageRef,
    key_schedule::PreSharedKeyId,
    messages::{MlsMessage, MlsMessageContent},
};

#[derive(
    Debug,
    Clone,
    PartialEq,
    Eq,
    tls_codec::TlsSerialize,
    tls_codec::TlsDeserialize,
    tls_codec::TlsSize,
)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PathSecret {
    pub path_secret: SensitiveBytes,
}

#[derive(
    Debug,
    Clone,
    PartialEq,
    Eq,
    tls_codec::TlsSerialize,
    tls_codec::TlsDeserialize,
    tls_codec::TlsSize,
)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct GroupSecrets {
    pub joiner_secret: SensitiveBytes,
    pub path_secret: Option<PathSecret>,
    pub psks: Vec<PreSharedKeyId>,
}

#[derive(Debug, Clone, PartialEq, Eq, tls_codec::TlsSerialize, tls_codec::TlsSize)]
pub struct GroupSecretsRef<'a> {
    pub joiner_secret: &'a [u8],
    pub path_secret: Option<&'a [u8]>,
    pub psks: &'a [PreSharedKeyId],
}

#[derive(
    Debug,
    Clone,
    PartialEq,
    Eq,
    tls_codec::TlsSerialize,
    tls_codec::TlsDeserialize,
    tls_codec::TlsSize,
)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EncryptedGroupSecrets {
    pub new_member: KeyPackageRef,
    pub encrypted_group_secrets: HpkeCiphertext,
}

#[derive(
    Debug,
    Clone,
    PartialEq,
    Eq,
    tls_codec::TlsSerialize,
    tls_codec::TlsDeserialize,
    tls_codec::TlsSize,
)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Welcome {
    pub cipher_suite: CiphersuiteId,
    pub secrets: Vec<EncryptedGroupSecrets>,
    pub encrypted_group_info: SensitiveBytes,
}

impl Welcome {
    pub fn into_mls_message(self, protocol_version: ProtocolVersion) -> MlsMessage {
        MlsMessage {
            version: protocol_version,
            content: MlsMessageContent::Welcome(self),
        }
    }
}