openmls/framing/
message_out.rsuse tls_codec::Serialize;
use super::*;
use crate::{
key_packages::KeyPackage, messages::group_info::GroupInfo, prelude::KeyPackageBundle,
versions::ProtocolVersion,
};
#[cfg(any(feature = "test-utils", test))]
use crate::messages::group_info::VerifiableGroupInfo;
#[derive(Debug, Clone, PartialEq, TlsSerialize, TlsSize)]
pub struct MlsMessageOut {
pub(crate) version: ProtocolVersion,
pub(crate) body: MlsMessageBodyOut,
}
#[derive(Debug, PartialEq, Clone, TlsSerialize, TlsSize)]
#[repr(u16)]
pub enum MlsMessageBodyOut {
#[tls_codec(discriminant = 1)]
PublicMessage(PublicMessage),
#[tls_codec(discriminant = 2)]
PrivateMessage(PrivateMessage),
#[tls_codec(discriminant = 3)]
Welcome(Welcome),
#[tls_codec(discriminant = 4)]
GroupInfo(GroupInfo),
#[tls_codec(discriminant = 5)]
#[allow(dead_code)]
KeyPackage(KeyPackage),
}
impl From<PublicMessage> for MlsMessageOut {
fn from(public_message: PublicMessage) -> Self {
Self {
version: ProtocolVersion::default(),
body: MlsMessageBodyOut::PublicMessage(public_message),
}
}
}
impl From<PrivateMessage> for MlsMessageOut {
fn from(private_message: PrivateMessage) -> Self {
Self {
version: ProtocolVersion::default(),
body: MlsMessageBodyOut::PrivateMessage(private_message),
}
}
}
impl From<GroupInfo> for MlsMessageOut {
fn from(group_info: GroupInfo) -> Self {
Self {
version: group_info.group_context().protocol_version(),
body: MlsMessageBodyOut::GroupInfo(group_info),
}
}
}
impl From<KeyPackage> for MlsMessageOut {
fn from(key_package: KeyPackage) -> Self {
Self {
version: key_package.protocol_version(),
body: MlsMessageBodyOut::KeyPackage(key_package),
}
}
}
impl From<KeyPackageBundle> for MlsMessageOut {
fn from(key_package: KeyPackageBundle) -> Self {
Self {
version: key_package.key_package().protocol_version(),
body: MlsMessageBodyOut::KeyPackage(key_package.key_package),
}
}
}
impl MlsMessageOut {
pub(crate) fn from_private_message(
private_message: PrivateMessage,
version: ProtocolVersion,
) -> Self {
Self {
version,
body: MlsMessageBodyOut::PrivateMessage(private_message),
}
}
pub fn from_welcome(welcome: Welcome, version: ProtocolVersion) -> Self {
MlsMessageOut {
version,
body: MlsMessageBodyOut::Welcome(welcome),
}
}
pub fn to_bytes(&self) -> Result<Vec<u8>, MlsMessageError> {
self.tls_serialize_detached()
.map_err(|_| MlsMessageError::UnableToEncode)
}
pub fn body(&self) -> &MlsMessageBodyOut {
&self.body
}
}
#[cfg(any(feature = "test-utils", test))]
impl MlsMessageOut {
#[cfg(any(feature = "test-utils", test))]
pub fn into_welcome(self) -> Option<Welcome> {
match self.body {
MlsMessageBodyOut::Welcome(w) => Some(w),
_ => None,
}
}
#[cfg(any(feature = "test-utils", test))]
pub fn into_protocol_message(self) -> Option<ProtocolMessage> {
let mls_message_in: MlsMessageIn = self.into();
match mls_message_in.extract() {
MlsMessageBodyIn::PublicMessage(pm) => Some(pm.into()),
MlsMessageBodyIn::PrivateMessage(pm) => Some(pm.into()),
_ => None,
}
}
#[cfg(any(feature = "test-utils", test))]
pub fn into_verifiable_group_info(self) -> Option<VerifiableGroupInfo> {
match self.body {
MlsMessageBodyOut::GroupInfo(group_info) => {
Some(group_info.into_verifiable_group_info())
}
_ => None,
}
}
}
#[cfg(any(feature = "test-utils", test))]
impl From<MlsMessageIn> for MlsMessageOut {
fn from(mls_message: MlsMessageIn) -> Self {
let version = mls_message.version;
let body = match mls_message.body {
MlsMessageBodyIn::Welcome(w) => MlsMessageBodyOut::Welcome(w),
MlsMessageBodyIn::GroupInfo(gi) => MlsMessageBodyOut::GroupInfo(gi.into()),
MlsMessageBodyIn::KeyPackage(kp) => MlsMessageBodyOut::KeyPackage(kp.into()),
MlsMessageBodyIn::PublicMessage(pm) => MlsMessageBodyOut::PublicMessage(pm.into()),
MlsMessageBodyIn::PrivateMessage(pm) => MlsMessageBodyOut::PrivateMessage(pm.into()),
};
Self { version, body }
}
}
#[cfg(any(feature = "test-utils", test))]
impl From<MlsMessageOut> for MlsMessageIn {
fn from(mls_message_out: MlsMessageOut) -> Self {
let version = mls_message_out.version;
let body = match mls_message_out.body {
MlsMessageBodyOut::PublicMessage(pm) => MlsMessageBodyIn::PublicMessage(pm.into()),
MlsMessageBodyOut::PrivateMessage(pm) => MlsMessageBodyIn::PrivateMessage(pm.into()),
MlsMessageBodyOut::Welcome(w) => MlsMessageBodyIn::Welcome(w),
MlsMessageBodyOut::GroupInfo(gi) => {
MlsMessageBodyIn::GroupInfo(gi.into_verifiable_group_info())
}
MlsMessageBodyOut::KeyPackage(kp) => MlsMessageBodyIn::KeyPackage(kp.into()),
};
Self { version, body }
}
}