From d7f969175c88add534c4ff0f037b7efb15757130 Mon Sep 17 00:00:00 2001 From: Marta Mularczyk Date: Tue, 18 Feb 2025 11:01:50 +0100 Subject: [PATCH] Add message description function from 1.x --- mls-rs/Cargo.toml | 2 +- mls-rs/src/group/framing.rs | 85 ++++++++++++++++++++++++++++++++++++- mls-rs/src/lib.rs | 2 +- 3 files changed, 86 insertions(+), 3 deletions(-) diff --git a/mls-rs/Cargo.toml b/mls-rs/Cargo.toml index 97e7a626..bfddadd6 100644 --- a/mls-rs/Cargo.toml +++ b/mls-rs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mls-rs" -version = "0.45.0" +version = "0.45.1" edition = "2021" description = "An implementation of Messaging Layer Security (RFC 9420)" homepage = "https://github.com/awslabs/mls-rs" diff --git a/mls-rs/src/group/framing.rs b/mls-rs/src/group/framing.rs index 116b1b27..03317a7b 100644 --- a/mls-rs/src/group/framing.rs +++ b/mls-rs/src/group/framing.rs @@ -342,6 +342,45 @@ impl From<&PrivateMessage> for PrivateContentAAD { } } +#[derive(Clone, Debug, PartialEq)] +pub enum MlsMessageDescription<'a> { + Welcome { + key_package_refs: Vec<&'a KeyPackageRef>, + cipher_suite: CipherSuite, + }, + ProtocolMessage { + group_id: &'a [u8], + epoch_id: u64, + content_type: ContentType, // commit, proposal, or application + }, + GroupInfo, + KeyPackage, +} + +impl MlsMessage { + pub fn description(&self) -> MlsMessageDescription<'_> { + match &self.payload { + MlsMessagePayload::Welcome(w) => MlsMessageDescription::Welcome { + key_package_refs: w.secrets.iter().map(|s| &s.new_member).collect(), + cipher_suite: w.cipher_suite, + }, + MlsMessagePayload::Plain(p) => MlsMessageDescription::ProtocolMessage { + group_id: &p.content.group_id, + epoch_id: p.content.epoch, + content_type: p.content.content_type(), + }, + #[cfg(feature = "private_message")] + MlsMessagePayload::Cipher(c) => MlsMessageDescription::ProtocolMessage { + group_id: &c.group_id, + epoch_id: c.epoch, + content_type: c.content_type, + }, + MlsMessagePayload::GroupInfo(_) => MlsMessageDescription::GroupInfo, + MlsMessagePayload::KeyPackage(_) => MlsMessageDescription::KeyPackage, + } + } +} + #[derive(Clone, Debug, PartialEq, MlsSize, MlsEncode, MlsDecode)] #[cfg_attr( all(feature = "ffi", not(test)), @@ -682,8 +721,10 @@ mod tests { crypto::test_utils::test_cipher_suite_provider, group::{ framing::test_utils::get_test_ciphertext_content, - proposal_ref::test_utils::auth_content_from_proposal, RemoveProposal, + proposal_ref::test_utils::auth_content_from_proposal, test_utils::test_group, + RemoveProposal, }, + key_package::test_utils::test_key_package_message, }; use super::*; @@ -745,4 +786,46 @@ mod tests { assert_eq!(computed_ref, expected_ref.to_vec()); } + + #[maybe_async::test(not(mls_build_async), async(mls_build_async, crate::futures_test))] + async fn message_description() { + let mut group = test_group(TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE).await; + + let message = group.commit(vec![]).await.unwrap(); + + let expected = MlsMessageDescription::ProtocolMessage { + group_id: group.group_id(), + epoch_id: group.context().epoch, + content_type: ContentType::Commit, + }; + + assert_eq!(message.commit_message.description(), expected); + + group.apply_pending_commit().await.unwrap(); + + let message = group + .encrypt_application_message(b"123", vec![]) + .await + .unwrap(); + + let expected = MlsMessageDescription::ProtocolMessage { + group_id: group.group_id(), + epoch_id: group.context().epoch, + content_type: ContentType::Application, + }; + + assert_eq!(message.description(), expected); + + let group_info = group + .group_info_message_allowing_ext_commit(true) + .await + .unwrap(); + + assert_eq!(group_info.description(), MlsMessageDescription::GroupInfo); + + let key_package = + test_key_package_message(TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE, "something").await; + + assert_eq!(key_package.description(), MlsMessageDescription::KeyPackage); + } } diff --git a/mls-rs/src/lib.rs b/mls-rs/src/lib.rs index 5c42c0dd..235f2f30 100644 --- a/mls-rs/src/lib.rs +++ b/mls-rs/src/lib.rs @@ -182,7 +182,7 @@ pub use mls_rs_core::extension::{Extension, ExtensionList}; pub use crate::{ client::Client, group::{ - framing::{MlsMessage, WireFormat}, + framing::{MlsMessage, MlsMessageDescription, WireFormat}, mls_rules::MlsRules, Group, },