From 8b67b877b8b05052414c093d5f182d69b3b2082d Mon Sep 17 00:00:00 2001 From: Caio Sym Date: Mon, 30 Sep 2024 22:18:42 +0100 Subject: [PATCH 1/6] Rework leaf node extensions to work via parameters rather than as a client configuration --- mls-rs-uniffi/src/lib.rs | 6 +-- mls-rs/benches/group_add.rs | 4 +- mls-rs/examples/basic_server_usage.rs | 4 +- mls-rs/examples/basic_usage.rs | 4 +- mls-rs/examples/custom.rs | 6 +-- mls-rs/examples/large_group.rs | 8 ++-- mls-rs/examples/x509.rs | 2 +- mls-rs/src/client.rs | 22 ++++++---- mls-rs/src/client_builder.rs | 36 ---------------- mls-rs/src/client_config.rs | 5 +-- mls-rs/src/group/commit.rs | 41 +++++++++++++++--- mls-rs/src/group/external_commit.rs | 18 +++++++- .../interop_test_vectors/passive_client.rs | 8 ++-- .../tree_modifications.rs | 2 +- mls-rs/src/group/mod.rs | 43 ++++++++++--------- mls-rs/src/group/proposal_cache.rs | 4 +- mls-rs/src/group/resumption.rs | 11 ++++- mls-rs/src/group/test_utils.rs | 12 +++--- mls-rs/src/test_utils/fuzz_tests.rs | 2 +- mls-rs/src/test_utils/mod.rs | 4 +- mls-rs/src/tree_kem/kem.rs | 4 +- mls-rs/src/tree_kem/leaf_node.rs | 27 +++++++----- mls-rs/src/tree_kem/leaf_node_validator.rs | 8 ++-- mls-rs/src/tree_kem/private.rs | 2 +- mls-rs/src/tree_kem/tree_validator.rs | 2 +- mls-rs/src/tree_kem/update_path.rs | 2 +- mls-rs/test_harness_integration/src/main.rs | 4 +- mls-rs/tests/client_tests.rs | 8 ++-- 28 files changed, 164 insertions(+), 135 deletions(-) diff --git a/mls-rs-uniffi/src/lib.rs b/mls-rs-uniffi/src/lib.rs index f37ca887..3408f213 100644 --- a/mls-rs-uniffi/src/lib.rs +++ b/mls-rs-uniffi/src/lib.rs @@ -382,7 +382,7 @@ impl Client { /// See [`mls_rs::Client::generate_key_package_message`] for /// details. pub async fn generate_key_package_message(&self) -> Result { - let message = self.inner.generate_key_package_message().await?; + let message = self.inner.generate_key_package_message(Default::default()).await?; Ok(message.into()) } @@ -403,10 +403,10 @@ impl Client { let inner = match group_id { Some(group_id) => { self.inner - .create_group_with_id(group_id, extensions) + .create_group_with_id(group_id, extensions, Default::default()) .await? } - None => self.inner.create_group(extensions).await?, + None => self.inner.create_group(extensions, Default::default()).await?, }; Ok(Group { inner: Arc::new(Mutex::new(inner)), diff --git a/mls-rs/benches/group_add.rs b/mls-rs/benches/group_add.rs index e3181073..0c6a7ac3 100644 --- a/mls-rs/benches/group_add.rs +++ b/mls-rs/benches/group_add.rs @@ -16,7 +16,7 @@ use mls_rs_crypto_openssl::OpensslCryptoProvider; fn bench(c: &mut Criterion) { let alice = make_client("alice") - .create_group(Default::default()) + .create_group(Default::default(), Default::default()) .unwrap(); const MAX_ADD_COUNT: usize = 1000; @@ -24,7 +24,7 @@ fn bench(c: &mut Criterion) { let key_packages = (0..MAX_ADD_COUNT) .map(|i| { make_client(&format!("bob-{i}")) - .generate_key_package_message() + .generate_key_package_message(Default::default) .unwrap() }) .collect::>(); diff --git a/mls-rs/examples/basic_server_usage.rs b/mls-rs/examples/basic_server_usage.rs index fba71da5..12547427 100644 --- a/mls-rs/examples/basic_server_usage.rs +++ b/mls-rs/examples/basic_server_usage.rs @@ -140,8 +140,8 @@ fn main() -> Result<(), MlsError> { let bob = make_client("bob")?; // Alice creates a group with bob - let mut alice_group = alice.create_group(ExtensionList::default())?; - let bob_key_package = bob.generate_key_package_message()?; + let mut alice_group = alice.create_group(ExtensionList::default(), Default::default())?; + let bob_key_package = bob.generate_key_package_message(Default::default())?; let welcome = &alice_group .commit_builder() diff --git a/mls-rs/examples/basic_usage.rs b/mls-rs/examples/basic_usage.rs index c49af8f1..df9c7f44 100644 --- a/mls-rs/examples/basic_usage.rs +++ b/mls-rs/examples/basic_usage.rs @@ -44,10 +44,10 @@ fn main() -> Result<(), MlsError> { let bob = make_client(crypto_provider.clone(), "bob")?; // Alice creates a new group. - let mut alice_group = alice.create_group(ExtensionList::default())?; + let mut alice_group = alice.create_group(ExtensionList::default(), Default::default())?; // Bob generates a key package that Alice needs to add Bob to the group. - let bob_key_package = bob.generate_key_package_message()?; + let bob_key_package = bob.generate_key_package_message(Default::default())?; // Alice issues a commit that adds Bob to the group. let alice_commit = alice_group diff --git a/mls-rs/examples/custom.rs b/mls-rs/examples/custom.rs index f5d93273..2cc58834 100644 --- a/mls-rs/examples/custom.rs +++ b/mls-rs/examples/custom.rs @@ -369,11 +369,11 @@ fn main() -> Result<(), CustomError> { let roster = vec![alice.credential]; context_extensions.set_from(RosterExtension { roster })?; - let mut alice_tablet_group = make_client(alice_tablet)?.create_group(context_extensions)?; + let mut alice_tablet_group = make_client(alice_tablet)?.create_group(context_extensions, Default::default())?; // Alice can add her other device let alice_pc_client = make_client(alice_pc)?; - let key_package = alice_pc_client.generate_key_package_message()?; + let key_package = alice_pc_client.generate_key_package_message(Default::default())?; let welcome = alice_tablet_group .commit_builder() @@ -387,7 +387,7 @@ fn main() -> Result<(), CustomError> { // Alice cannot add bob's devices yet let bob_tablet_client = make_client(bob_tablet)?; - let key_package = bob_tablet_client.generate_key_package_message()?; + let key_package = bob_tablet_client.generate_key_package_message(Default::default())?; let res = alice_tablet_group .commit_builder() diff --git a/mls-rs/examples/large_group.rs b/mls-rs/examples/large_group.rs index c4377437..d1cea60a 100644 --- a/mls-rs/examples/large_group.rs +++ b/mls-rs/examples/large_group.rs @@ -58,7 +58,7 @@ fn make_groups_best_case( ) -> Result>, MlsError> { let bob_client = make_client(crypto_provider.clone(), &make_name(0))?; - let bob_group = bob_client.create_group(Default::default())?; + let bob_group = bob_client.create_group(Default::default(), Default::default())?; let mut groups = vec![bob_group]; @@ -66,7 +66,7 @@ fn make_groups_best_case( let bob_client = make_client(crypto_provider.clone(), &make_name(i + 1))?; // The new client generates a key package. - let bob_kpkg = bob_client.generate_key_package_message()?; + let bob_kpkg = bob_client.generate_key_package_message(Default::default())?; // Last group sends a commit adding the new client to the group. let commit = groups @@ -100,7 +100,7 @@ fn make_groups_worst_case( ) -> Result>, MlsError> { let alice_client = make_client(crypto_provider.clone(), &make_name(0))?; - let mut alice_group = alice_client.create_group(Default::default())?; + let mut alice_group = alice_client.create_group(Default::default(), Default::default())?; let bob_clients = (0..(num_groups - 1)) .map(|i| make_client(crypto_provider.clone(), &make_name(i + 1))) @@ -110,7 +110,7 @@ fn make_groups_worst_case( let mut commit_builder = alice_group.commit_builder(); for bob_client in &bob_clients { - let bob_kpkg = bob_client.generate_key_package_message()?; + let bob_kpkg = bob_client.generate_key_package_message(Default::default())?; commit_builder = commit_builder.add_member(bob_kpkg)?; } diff --git a/mls-rs/examples/x509.rs b/mls-rs/examples/x509.rs index 42316cef..73555428 100644 --- a/mls-rs/examples/x509.rs +++ b/mls-rs/examples/x509.rs @@ -31,7 +31,7 @@ fn main() { .signing_identity(signing_identity, secret_key, CIPHERSUITE) .build(); - let mut alice_group = alice_client.create_group(Default::default()).unwrap(); + let mut alice_group = alice_client.create_group(Default::default(), Default::default()).unwrap(); alice_group.commit(Vec::new()).unwrap(); alice_group.apply_pending_commit().unwrap(); diff --git a/mls-rs/src/client.rs b/mls-rs/src/client.rs index 574d4ba1..cb7d2fa4 100644 --- a/mls-rs/src/client.rs +++ b/mls-rs/src/client.rs @@ -429,12 +429,12 @@ where /// /// A key package message may only be used once. #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] - pub async fn generate_key_package_message(&self) -> Result { - Ok(self.generate_key_package().await?.key_package_message()) + pub async fn generate_key_package_message(&self, leaf_node_extensions: ExtensionList) -> Result { + Ok(self.generate_key_package(leaf_node_extensions).await?.key_package_message()) } #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] - async fn generate_key_package(&self) -> Result { + async fn generate_key_package(&self, leaf_node_extensions: ExtensionList) -> Result { let (signing_identity, cipher_suite) = self.signing_identity()?; let cipher_suite_provider = self @@ -455,7 +455,7 @@ where self.config.lifetime(), self.config.capabilities(), self.config.key_package_extensions(), - self.config.leaf_node_extensions(), + leaf_node_extensions, ) .await?; @@ -486,6 +486,7 @@ where &self, group_id: Vec, group_context_extensions: ExtensionList, + leaf_node_extensions: ExtensionList, ) -> Result, MlsError> { let (signing_identity, cipher_suite) = self.signing_identity()?; @@ -496,6 +497,7 @@ where self.version, signing_identity.clone(), group_context_extensions, + leaf_node_extensions, self.signer()?.clone(), ) .await @@ -510,6 +512,7 @@ where pub async fn create_group( &self, group_context_extensions: ExtensionList, + leaf_node_extensions: ExtensionList, ) -> Result, MlsError> { let (signing_identity, cipher_suite) = self.signing_identity()?; @@ -520,6 +523,7 @@ where self.version, signing_identity.clone(), group_context_extensions, + leaf_node_extensions, self.signer()?.clone(), ) .await @@ -674,6 +678,7 @@ where group_info: &MlsMessage, tree_data: Option>, authenticated_data: Vec, + leaf_node_extensions: ExtensionList, ) -> Result { let protocol_version = group_info.version; @@ -702,7 +707,7 @@ where ) .await?; - let key_package = self.generate_key_package().await?.key_package; + let key_package = self.generate_key_package(leaf_node_extensions).await?.key_package; (key_package.cipher_suite == cipher_suite) .then_some(()) @@ -816,7 +821,7 @@ pub(crate) mod test_utils { config(&mut client.config); - let key_package = client.generate_key_package_message().await.unwrap(); + let key_package = client.generate_key_package_message(ExtensionList::default()).await.unwrap(); (client, key_package) } @@ -863,7 +868,7 @@ mod tests { .build(); // TODO: Tests around extensions - let key_package = client.generate_key_package_message().await.unwrap(); + let key_package = client.generate_key_package_message(ExtensionList::default()).await.unwrap(); assert_eq!(key_package.version, protocol_version); @@ -902,6 +907,7 @@ mod tests { &alice_group.group_info_message(true).await.unwrap(), None, vec![], + ExtensionList::default(), ) .await .unwrap(); @@ -1047,7 +1053,7 @@ mod tests { .signing_identity(alice_identity.clone(), secret_key, TEST_CIPHER_SUITE) .build(); - let msg = alice.generate_key_package_message().await.unwrap(); + let msg = alice.generate_key_package_message(ExtensionList::default()).await.unwrap(); let res = alice.commit_external(msg).await.map(|_| ()); assert_matches!(res, Err(MlsError::UnexpectedMessageType)); diff --git a/mls-rs/src/client_builder.rs b/mls-rs/src/client_builder.rs index 186c4369..76db2c31 100644 --- a/mls-rs/src/client_builder.rs +++ b/mls-rs/src/client_builder.rs @@ -322,31 +322,6 @@ impl ClientBuilder { ClientBuilder(c) } - /// Add a leaf node extension to the list of leaf node extensions supported by the client. - pub fn leaf_node_extension( - self, - extension: T, - ) -> Result>, ExtensionError> - where - T: MlsExtension, - Self: Sized, - { - let mut c = self.0.into_config(); - c.0.settings.leaf_node_extensions.set_from(extension)?; - Ok(ClientBuilder(c)) - } - - /// Add multiple leaf node extensions to the list of leaf node extensions supported by the - /// client. - pub fn leaf_node_extensions( - self, - extensions: ExtensionList, - ) -> ClientBuilder> { - let mut c = self.0.into_config(); - c.0.settings.leaf_node_extensions.append(extensions); - ClientBuilder(c) - } - /// Set the lifetime duration in seconds of key packages generated by the client. pub fn key_package_lifetime(self, duration_in_s: u64) -> ClientBuilder> { let mut c = self.0.into_config(); @@ -737,10 +712,6 @@ where self.settings.key_package_extensions.clone() } - fn leaf_node_extensions(&self) -> ExtensionList { - self.settings.leaf_node_extensions.clone() - } - fn lifetime(&self) -> Lifetime { #[cfg(feature = "std")] let now_timestamp = MlsTime::now().seconds_since_epoch(); @@ -844,10 +815,6 @@ impl ClientConfig for T { self.get().key_package_extensions() } - fn leaf_node_extensions(&self) -> ExtensionList { - self.get().leaf_node_extensions() - } - fn lifetime(&self) -> Lifetime { self.get().lifetime() } @@ -871,7 +838,6 @@ pub(crate) struct Settings { pub(crate) protocol_versions: Vec, pub(crate) custom_proposal_types: Vec, pub(crate) key_package_extensions: ExtensionList, - pub(crate) leaf_node_extensions: ExtensionList, pub(crate) lifetime_in_s: u64, #[cfg(any(test, feature = "test_util"))] pub(crate) key_package_not_before: Option, @@ -883,7 +849,6 @@ impl Default for Settings { extension_types: Default::default(), protocol_versions: Default::default(), key_package_extensions: Default::default(), - leaf_node_extensions: Default::default(), lifetime_in_s: 365 * 24 * 3600, custom_proposal_types: Default::default(), #[cfg(any(test, feature = "test_util"))] @@ -904,7 +869,6 @@ pub(crate) fn recreate_config( protocol_versions: c.supported_protocol_versions(), custom_proposal_types: c.supported_custom_proposals(), key_package_extensions: c.key_package_extensions(), - leaf_node_extensions: c.leaf_node_extensions(), lifetime_in_s: { let l = c.lifetime(); l.not_after - l.not_before diff --git a/mls-rs/src/client_config.rs b/mls-rs/src/client_config.rs index 339f335a..f723f6b3 100644 --- a/mls-rs/src/client_config.rs +++ b/mls-rs/src/client_config.rs @@ -38,7 +38,6 @@ pub trait ClientConfig: Send + Sync + Clone { fn crypto_provider(&self) -> Self::CryptoProvider; fn key_package_extensions(&self) -> ExtensionList; - fn leaf_node_extensions(&self) -> ExtensionList; fn lifetime(&self) -> Lifetime; fn capabilities(&self) -> Capabilities { @@ -59,10 +58,10 @@ pub trait ClientConfig: Send + Sync + Clone { self.identity_provider().supported_types() } - fn leaf_properties(&self) -> ConfigProperties { + fn leaf_properties(&self, leaf_node_extensions: ExtensionList) -> ConfigProperties { ConfigProperties { capabilities: self.capabilities(), - extensions: self.leaf_node_extensions(), + extensions: leaf_node_extensions, } } } diff --git a/mls-rs/src/group/commit.rs b/mls-rs/src/group/commit.rs index f9a5fa3c..23d01ab8 100644 --- a/mls-rs/src/group/commit.rs +++ b/mls-rs/src/group/commit.rs @@ -7,7 +7,10 @@ use alloc::vec; use alloc::vec::Vec; use core::fmt::Debug; use mls_rs_codec::{MlsDecode, MlsEncode, MlsSize}; -use mls_rs_core::{crypto::SignatureSecretKey, error::IntoAnyError}; +use mls_rs_core::{ + crypto::SignatureSecretKey, + error::IntoAnyError +}; use crate::{ cipher_suite::CipherSuite, @@ -178,6 +181,7 @@ where group_info_extensions: ExtensionList, new_signer: Option, new_signing_identity: Option, + new_leaf_node_extensions: Option, } impl<'a, C> CommitBuilder<'a, C> @@ -326,6 +330,17 @@ where } } + /// Change the committer's leaf node extensions as part of making this commit. + pub fn set_leaf_node_extensions( + self, + new_leaf_node_extensions: ExtensionList, + ) -> Self { + Self { + new_leaf_node_extensions: Some(new_leaf_node_extensions), + ..self + } + } + /// Finalize the commit to send. /// /// # Errors @@ -345,6 +360,7 @@ where self.group_info_extensions, self.new_signer, self.new_signing_identity, + self.new_leaf_node_extensions, ) .await?; @@ -368,6 +384,7 @@ where self.group_info_extensions, self.new_signer, self.new_signing_identity, + self.new_leaf_node_extensions, ) .await?; @@ -452,6 +469,7 @@ where group_info_extensions: Default::default(), new_signer: Default::default(), new_signing_identity: Default::default(), + new_leaf_node_extensions: Default::default(), } } @@ -466,6 +484,7 @@ where mut welcome_group_info_extensions: ExtensionList, new_signer: Option, new_signing_identity: Option, + new_leaf_node_extensions: Option, ) -> Result<(CommitOutput, CommitGeneration), MlsError> { if self.pending_commit.is_some() { return Err(MlsError::ExistingPendingCommit); @@ -552,6 +571,16 @@ where // group_id, epoch, tree_hash, and confirmed_transcript_hash values in the initial // GroupContext object. The leaf_key_package for this UpdatePath must have a // parent_hash extension. + + let new_leaf_node_extensions = new_leaf_node_extensions + .or(external_leaf.map(|ln| ln.extensions.clone())); + + let new_leaf_node_extensions = match new_leaf_node_extensions { + Some(extensions) => extensions, + // If we are not setting new extensions and this is not an external leaf then the current node MUST exist. + None => self.current_user_leaf_node()?.extensions.clone(), + }; + let encap_gen = TreeKem::new( &mut provisional_state.public_tree, &mut provisional_private_tree, @@ -560,7 +589,7 @@ where &mut provisional_group_context, &provisional_state.indexes_of_added_kpkgs, new_signer_ref, - self.config.leaf_properties(), + Some(self.config.leaf_properties(new_leaf_node_extensions)), new_signing_identity, &self.cipher_suite_provider, #[cfg(test)] @@ -1419,10 +1448,10 @@ mod tests { #[maybe_async::test(not(mls_build_async), async(mls_build_async, crate::futures_test))] async fn member_identity_is_validated_against_new_extensions() { let alice = client_with_test_extension(b"alice").await; - let mut alice = alice.create_group(ExtensionList::new()).await.unwrap(); + let mut alice = alice.create_group(ExtensionList::new(), Default::default()).await.unwrap(); let bob = client_with_test_extension(b"bob").await; - let bob_kp = bob.generate_key_package_message().await.unwrap(); + let bob_kp = bob.generate_key_package_message(Default::default()).await.unwrap(); let mut extension_list = ExtensionList::new(); let extension = TestExtension { foo: b'a' }; @@ -1443,7 +1472,7 @@ mod tests { alice .commit_builder() - .add_member(alex.generate_key_package_message().await.unwrap()) + .add_member(alex.generate_key_package_message(Default::default()).await.unwrap()) .unwrap() .set_group_context_ext(extension_list.clone()) .unwrap() @@ -1456,7 +1485,7 @@ mod tests { #[maybe_async::test(not(mls_build_async), async(mls_build_async, crate::futures_test))] async fn server_identity_is_validated_against_new_extensions() { let alice = client_with_test_extension(b"alice").await; - let mut alice = alice.create_group(ExtensionList::new()).await.unwrap(); + let mut alice = alice.create_group(ExtensionList::new(), Default::default()).await.unwrap(); let mut extension_list = ExtensionList::new(); let extension = TestExtension { foo: b'a' }; diff --git a/mls-rs/src/group/external_commit.rs b/mls-rs/src/group/external_commit.rs index 0c931a09..4ed205d8 100644 --- a/mls-rs/src/group/external_commit.rs +++ b/mls-rs/src/group/external_commit.rs @@ -2,7 +2,7 @@ // Copyright by contributors to this project. // SPDX-License-Identifier: (Apache-2.0 OR MIT) -use mls_rs_core::{crypto::SignatureSecretKey, identity::SigningIdentity}; +use mls_rs_core::{crypto::SignatureSecretKey, extension::ExtensionList, identity::SigningIdentity}; use crate::{ client_config::ClientConfig, @@ -46,6 +46,7 @@ use super::{validate_tree_and_info_joiner, ExportedTree}; pub struct ExternalCommitBuilder { signer: SignatureSecretKey, signing_identity: SigningIdentity, + leaf_node_extensions: ExtensionList, config: C, tree_data: Option>, to_remove: Option, @@ -70,6 +71,7 @@ impl ExternalCommitBuilder { authenticated_data: Vec::new(), signer, signing_identity, + leaf_node_extensions: Default::default(), config, #[cfg(feature = "psk")] external_psks: Vec::new(), @@ -140,6 +142,17 @@ impl ExternalCommitBuilder { self } + /// Change the committer's leaf node extensions as part of making this commit. + pub fn with_leaf_node_extensions( + self, + leaf_node_extensions: ExtensionList, + ) -> Self { + Self { + leaf_node_extensions: leaf_node_extensions, + ..self + } + } + /// Build the external commit using a GroupInfo message provided by an existing group member. #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] pub async fn build(self, group_info: MlsMessage) -> Result<(Group, MlsMessage), MlsError> { @@ -174,7 +187,7 @@ impl ExternalCommitBuilder { let (leaf_node, _) = LeafNode::generate( &cipher_suite, - self.config.leaf_properties(), + self.config.leaf_properties(self.leaf_node_extensions), self.signing_identity, &self.signer, self.config.lifetime(), @@ -254,6 +267,7 @@ impl ExternalCommitBuilder { Default::default(), None, None, + None, ) .await?; diff --git a/mls-rs/src/group/interop_test_vectors/passive_client.rs b/mls-rs/src/group/interop_test_vectors/passive_client.rs index 29588ed4..2552b2e7 100644 --- a/mls-rs/src/group/interop_test_vectors/passive_client.rs +++ b/mls-rs/src/group/interop_test_vectors/passive_client.rs @@ -250,7 +250,7 @@ async fn invite_passive_client( .signing_identity(identity.clone(), secret_key.clone(), cs.cipher_suite()) .build(); - let key_pckg = client.generate_key_package_message().await.unwrap(); + let key_pckg = client.generate_key_package_message(Default::default()).await.unwrap(); let (_, key_pckg_secrets) = key_package_repo.key_packages()[0].clone(); @@ -489,7 +489,7 @@ async fn create_key_package(cs: CipherSuite) -> MlsMessage { ) .await; - client.generate_key_package_message().await.unwrap() + client.generate_key_package_message(Default::default()).await.unwrap() } #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] @@ -554,7 +554,7 @@ pub async fn generate_passive_client_random_tests() -> Vec { generate_basic_client(cs, VERSION, 0, None, false, &crypto, Some(ETERNAL_LIFETIME)) .await; - let creator_group = creator.create_group(Default::default()).await.unwrap(); + let creator_group = creator.create_group(Default::default(), Default::default()).await.unwrap(); let mut groups = vec![creator_group]; @@ -646,7 +646,7 @@ pub async fn add_random_members( let mut key_packages = Vec::new(); for client in &clients { - let key_package = client.generate_key_package_message().await.unwrap(); + let key_package = client.generate_key_package_message(Default::default()).await.unwrap(); key_packages.push(key_package); } diff --git a/mls-rs/src/group/interop_test_vectors/tree_modifications.rs b/mls-rs/src/group/interop_test_vectors/tree_modifications.rs index a172e0c0..25a47a63 100644 --- a/mls-rs/src/group/interop_test_vectors/tree_modifications.rs +++ b/mls-rs/src/group/interop_test_vectors/tree_modifications.rs @@ -166,7 +166,7 @@ async fn generate_update(i: u32, tree: &TreeWithSigners) -> Proposal { &test_cipher_suite_provider(TEST_CIPHER_SUITE), TEST_GROUP, i, - default_properties(), + Some(default_properties()), None, signer, ) diff --git a/mls-rs/src/group/mod.rs b/mls-rs/src/group/mod.rs index ccfdd923..d8d94787 100644 --- a/mls-rs/src/group/mod.rs +++ b/mls-rs/src/group/mod.rs @@ -296,13 +296,14 @@ where protocol_version: ProtocolVersion, signing_identity: SigningIdentity, group_context_extensions: ExtensionList, + leaf_node_extensions: ExtensionList, signer: SignatureSecretKey, ) -> Result { let cipher_suite_provider = cipher_suite_provider(config.crypto_provider(), cipher_suite)?; let (leaf_node, leaf_node_secret) = LeafNode::generate( &cipher_suite_provider, - config.leaf_properties(), + config.leaf_properties(leaf_node_extensions), signing_identity, &signer, config.lifetime(), @@ -809,7 +810,7 @@ where &mut self, authenticated_data: Vec, ) -> Result { - let proposal = self.update_proposal(None, None).await?; + let proposal = self.update_proposal(None, None, None).await?; self.proposal_message(proposal, authenticated_data).await } @@ -839,7 +840,7 @@ where authenticated_data: Vec, ) -> Result { let proposal = self - .update_proposal(Some(signer), Some(signing_identity)) + .update_proposal(Some(signer), Some(signing_identity), None) .await?; self.proposal_message(proposal, authenticated_data).await @@ -851,16 +852,18 @@ where &mut self, signer: Option, signing_identity: Option, + leaf_node_extensions: Option, ) -> Result { // Grab a copy of the current node and update it to have new key material - let mut new_leaf_node = self.current_user_leaf_node()?.clone(); + let mut new_leaf_node: LeafNode = self.current_user_leaf_node()?.clone(); + let new_leaf_node_extensions = leaf_node_extensions.unwrap_or(new_leaf_node.extensions.clone()); let secret_key = new_leaf_node .update( &self.cipher_suite_provider, self.group_id(), self.current_member_index(), - self.config.leaf_properties(), + Some(self.config.leaf_properties(new_leaf_node_extensions)), signing_identity, signer.as_ref().unwrap_or(&self.signer), ) @@ -2484,7 +2487,7 @@ mod tests { test_client_with_key_pkg(TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE, "alice") .await .0 - .create_group(core::iter::once(required_caps.into_extension().unwrap()).collect()) + .create_group(core::iter::once(required_caps.into_extension().unwrap()).collect(), Default::default()) .await } @@ -2550,7 +2553,7 @@ mod tests { test_client_with_key_pkg(TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE, "alice") .await .0 - .create_group(core::iter::once(ext_senders).collect()) + .create_group(core::iter::once(ext_senders).collect(), Default::default()) .await .map(|_| ()); @@ -2953,7 +2956,7 @@ mod tests { Some((bob_identity, TEST_CIPHER_SUITE)), TEST_PROTOCOL_VERSION, ) - .generate_key_package_message() + .generate_key_package_message(ExtensionList::default()) .await .unwrap(); @@ -3472,7 +3475,7 @@ mod tests { .with_random_signing_identity("alice", TEST_CIPHER_SUITE) .await .build() - .create_group(core::iter::once(ext_senders).collect()) + .create_group(core::iter::once(ext_senders).collect(), Default::default()) .await .unwrap(); @@ -3508,7 +3511,7 @@ mod tests { .with_random_signing_identity("alice", TEST_CIPHER_SUITE) .await .build() - .create_group(core::iter::once(ext_senders).collect()) + .create_group(core::iter::once(ext_senders).collect(), Default::default()) .await .unwrap(); @@ -3540,7 +3543,7 @@ mod tests { .with_random_signing_identity("alice", TEST_CIPHER_SUITE) .await .build() - .create_group(Default::default()) + .create_group(Default::default(), Default::default()) .await .unwrap(); @@ -3891,7 +3894,7 @@ mod tests { .await .extension_type(EXTENSION_TYPE) .build() - .create_group(group_extensions.clone()) + .create_group(group_extensions.clone(), Default::default()) .await .unwrap(); @@ -3922,11 +3925,11 @@ mod tests { // Alice adds Bob, Carol and Dave to the group. They all support the mandatory extension. let commit = alice .commit_builder() - .add_member(bob_client.generate_key_package_message().await.unwrap()) + .add_member(bob_client.generate_key_package_message(ExtensionList::default()).await.unwrap()) .unwrap() - .add_member(carol_client.generate_key_package_message().await.unwrap()) + .add_member(carol_client.generate_key_package_message(ExtensionList::default()).await.unwrap()) .unwrap() - .add_member(dave_client.generate_key_package_message().await.unwrap()) + .add_member(dave_client.generate_key_package_message(ExtensionList::default()).await.unwrap()) .unwrap() .build() .await @@ -4041,7 +4044,7 @@ mod tests { let mut alice = client_with_custom_rules(b"alice", mls_rules.clone()) .await - .create_group(Default::default()) + .create_group(Default::default(), Default::default()) .await .unwrap(); @@ -4049,7 +4052,7 @@ mod tests { let kp = client_with_custom_rules(b"bob", mls_rules) .await - .generate_key_package_message() + .generate_key_package_message(ExtensionList::default()) .await .unwrap(); @@ -4095,7 +4098,7 @@ mod tests { let mut alice = client_with_custom_rules(b"alice", mls_rules.clone()) .await - .create_group(Default::default()) + .create_group(Default::default(), Default::default()) .await .unwrap(); @@ -4130,7 +4133,7 @@ mod tests { let mut alice = client_with_custom_rules(b"alice", mls_rules.clone()) .await - .create_group(Default::default()) + .create_group(Default::default(), Default::default()) .await .unwrap(); @@ -4281,7 +4284,7 @@ mod tests { .await; let mut alice = TestGroup { - group: alice.create_group(Default::default()).await.unwrap(), + group: alice.create_group(Default::default(), Default::default()).await.unwrap(), }; let mut bob = alice.join("bob").await.0; diff --git a/mls-rs/src/group/proposal_cache.rs b/mls-rs/src/group/proposal_cache.rs index 142e7bcd..611de84f 100644 --- a/mls-rs/src/group/proposal_cache.rs +++ b/mls-rs/src/group/proposal_cache.rs @@ -796,7 +796,7 @@ mod tests { &test_cipher_suite_provider(TEST_CIPHER_SUITE), TEST_GROUP, leaf_index, - default_properties(), + Some(default_properties()), None, &signer, ) @@ -1357,7 +1357,7 @@ mod tests { &test_cipher_suite_provider(TEST_CIPHER_SUITE), TEST_GROUP, 0, - default_properties(), + Some(default_properties()), None, &signer, ) diff --git a/mls-rs/src/group/resumption.rs b/mls-rs/src/group/resumption.rs index 1fd617e5..5c0d4e88 100644 --- a/mls-rs/src/group/resumption.rs +++ b/mls-rs/src/group/resumption.rs @@ -57,6 +57,7 @@ where extensions: &self.group_state().context.extensions, }; + let current_leaf_node_extensions = &self.current_user_leaf_node()?.extensions; resumption_create_group( self.config.clone(), new_key_packages, @@ -64,6 +65,7 @@ where // TODO investigate if it's worth updating your own signing identity here self.current_member_signing_identity()?.clone(), self.signer.clone(), + current_leaf_node_extensions, #[cfg(any(feature = "private_message", feature = "psk"))] self.resumption_psk_input(ResumptionPSKUsage::Branch)?, ) @@ -164,7 +166,7 @@ impl ReinitClient { /// be used in [`ReinitClient::commit`]. #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] pub async fn generate_key_package(&self) -> Result { - self.client.generate_key_package_message().await + self.client.generate_key_package_message(Default::default()).await } /// Create the new group using new key packages of all group members, possibly @@ -186,6 +188,10 @@ impl ReinitClient { extensions: self.reinit.new_group_context_extensions(), }; + // TODO, should these come from the reinit proposal or as an arg instead? + let group = self.client.load_group(self.reinit.group_id())?; + let current_leaf_node_extensions = &group.current_user_leaf_node()?.extensions; + resumption_create_group( self.client.config.clone(), new_key_packages, @@ -193,6 +199,7 @@ impl ReinitClient { // These private fields are created with `Some(x)` by `get_reinit_client` self.client.signing_identity.unwrap().0, self.client.signer.unwrap(), + current_leaf_node_extensions, #[cfg(any(feature = "private_message", feature = "psk"))] self.psk_input, ) @@ -236,6 +243,7 @@ async fn resumption_create_group( new_group_params: &ResumptionGroupParameters<'_>, signing_identity: SigningIdentity, signer: SignatureSecretKey, + leaf_node_extensions: &ExtensionList, psk_input: PskSecretInput, ) -> Result<(Group, Vec), MlsError> { // Create a new group with new parameters @@ -246,6 +254,7 @@ async fn resumption_create_group( new_group_params.version, signing_identity, new_group_params.extensions.clone(), + leaf_node_extensions.clone(), signer, ) .await?; diff --git a/mls-rs/src/group/test_utils.rs b/mls-rs/src/group/test_utils.rs index dfdc2386..55df07d1 100644 --- a/mls-rs/src/group/test_utils.rs +++ b/mls-rs/src/group/test_utils.rs @@ -61,7 +61,7 @@ impl TestGroup { #[cfg(feature = "by_ref_proposal")] #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] pub(crate) async fn update_proposal(&mut self) -> Proposal { - self.group.update_proposal(None, None).await.unwrap() + self.group.update_proposal(None, None, None).await.unwrap() } #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] @@ -246,14 +246,13 @@ pub(crate) async fn test_group_custom( let (signing_identity, secret_key) = get_test_signing_identity(cipher_suite, b"member").await; let group = TestClientBuilder::new_for_test() - .leaf_node_extensions(leaf_extensions) .mls_rules(DefaultMlsRules::default().with_commit_options(commit_options)) .extension_types(extension_types) .protocol_versions(ProtocolVersion::all()) .used_protocol_version(protocol_version) .signing_identity(signing_identity.clone(), secret_key, cipher_suite) .build() - .create_group_with_id(TEST_GROUP.to_vec(), group_extensions()) + .create_group_with_id(TEST_GROUP.to_vec(), group_extensions(), leaf_extensions) .await .unwrap(); @@ -291,7 +290,7 @@ where let group = custom(client_builder) .signing_identity(signing_identity.clone(), secret_key, cipher_suite) .build() - .create_group_with_id(TEST_GROUP.to_vec(), group_extensions()) + .create_group_with_id(TEST_GROUP.to_vec(), group_extensions(), Default::default()) .await .unwrap(); @@ -346,21 +345,20 @@ pub(crate) async fn get_test_groups_with_features( clients.push( TestClientBuilder::new_for_test() .extension_type(999.into()) - .leaf_node_extensions(leaf_extensions.clone()) .signing_identity(identity, secret_key, TEST_CIPHER_SUITE) .build(), ); } let group = clients[0] - .create_group_with_id(b"TEST GROUP".to_vec(), extensions) + .create_group_with_id(b"TEST GROUP".to_vec(), extensions, leaf_extensions.clone()) .await .unwrap(); let mut groups = vec![group]; for client in clients.iter().skip(1) { - let key_package = client.generate_key_package_message().await.unwrap(); + let key_package = client.generate_key_package_message(leaf_extensions.clone()).await.unwrap(); let commit_output = groups[0] .commit_builder() diff --git a/mls-rs/src/test_utils/fuzz_tests.rs b/mls-rs/src/test_utils/fuzz_tests.rs index 9ec143ef..9de26376 100644 --- a/mls-rs/src/test_utils/fuzz_tests.rs +++ b/mls-rs/src/test_utils/fuzz_tests.rs @@ -42,7 +42,7 @@ pub fn create_group() -> Group { alice .commit_builder() - .add_member(bob.generate_key_package_message().unwrap()) + .add_member(bob.generate_key_package_message(Default::default()).unwrap()) .unwrap() .build() .unwrap(); diff --git a/mls-rs/src/test_utils/mod.rs b/mls-rs/src/test_utils/mod.rs index d7c238b2..283058ab 100644 --- a/mls-rs/src/test_utils/mod.rs +++ b/mls-rs/src/test_utils/mod.rs @@ -121,7 +121,7 @@ pub async fn get_test_groups( ) .await; - let mut creator_group = creator.create_group(Default::default()).await.unwrap(); + let mut creator_group = creator.create_group(Default::default(), Default::default()).await.unwrap(); let mut receiver_clients = Vec::new(); let mut commit_builder = creator_group.commit_builder(); @@ -137,7 +137,7 @@ pub async fn get_test_groups( None, ) .await; - let kp = client.generate_key_package_message().await.unwrap(); + let kp = client.generate_key_package_message(Default::default()).await.unwrap(); receiver_clients.push(client); commit_builder = commit_builder.add_member(kp.clone()).unwrap(); diff --git a/mls-rs/src/tree_kem/kem.rs b/mls-rs/src/tree_kem/kem.rs index cedeb0e3..95e43d8f 100644 --- a/mls-rs/src/tree_kem/kem.rs +++ b/mls-rs/src/tree_kem/kem.rs @@ -64,7 +64,7 @@ impl<'a> TreeKem<'a> { context: &mut GroupContext, excluding: &[LeafIndex], signer: &SignatureSecretKey, - update_leaf_properties: ConfigProperties, + update_leaf_properties: Option, signing_identity: Option, cipher_suite_provider: &P, #[cfg(test)] commit_modifiers: &CommitModifiers, @@ -581,7 +581,7 @@ mod tests { &mut get_test_group_context(42, cipher_suite).await, &[], &encap_signer, - update_leaf_properties, + Some(update_leaf_properties), None, &cipher_suite_provider, #[cfg(test)] diff --git a/mls-rs/src/tree_kem/leaf_node.rs b/mls-rs/src/tree_kem/leaf_node.rs index c59ed789..ab17890f 100644 --- a/mls-rs/src/tree_kem/leaf_node.rs +++ b/mls-rs/src/tree_kem/leaf_node.rs @@ -103,7 +103,7 @@ impl LeafNode { cipher_suite_provider: &P, group_id: &[u8], leaf_index: u32, - new_properties: ConfigProperties, + new_properties: Option, signing_identity: Option, signer: &SignatureSecretKey, ) -> Result { @@ -113,8 +113,12 @@ impl LeafNode { .map_err(|e| MlsError::CryptoProviderError(e.into_any_error()))?; self.public_key = public; - self.capabilities = new_properties.capabilities; - self.extensions = new_properties.extensions; + + if let Some(new_properties) = new_properties { + self.capabilities = new_properties.capabilities; + self.extensions = new_properties.extensions; + } + self.leaf_node_source = LeafNodeSource::Update; self.grease(cipher_suite_provider)?; @@ -140,7 +144,7 @@ impl LeafNode { cipher_suite_provider: &P, group_id: &[u8], leaf_index: u32, - new_properties: ConfigProperties, + new_properties: Option, new_signing_identity: Option, signer: &SignatureSecretKey, ) -> Result { @@ -150,8 +154,11 @@ impl LeafNode { .map_err(|e| MlsError::CryptoProviderError(e.into_any_error()))?; self.public_key = public; - self.capabilities = new_properties.capabilities; - self.extensions = new_properties.extensions; + + if let Some(new_properties) = new_properties { + self.capabilities = new_properties.capabilities; + self.extensions = new_properties.extensions; + } if let Some(new_signing_identity) = new_signing_identity { self.signing_identity = new_signing_identity; @@ -503,7 +510,7 @@ mod tests { &cipher_suite_provider, b"group", 0, - default_properties(), + Some(default_properties()), None, &secret, ) @@ -554,7 +561,7 @@ mod tests { &test_cipher_suite_provider(cipher_suite), b"group", 0, - new_properties.clone(), + Some(new_properties.clone()), None, &secret, ) @@ -582,7 +589,7 @@ mod tests { &cipher_suite_provider, b"group", 0, - default_properties(), + Some(default_properties()), None, &secret, ) @@ -634,7 +641,7 @@ mod tests { &test_cipher_suite_provider(cipher_suite), b"group", 0, - new_properties.clone(), + Some(new_properties.clone()), Some(new_signing_identity.clone()), &secret, ) diff --git a/mls-rs/src/tree_kem/leaf_node_validator.rs b/mls-rs/src/tree_kem/leaf_node_validator.rs index 442b3d83..8e177a6f 100644 --- a/mls-rs/src/tree_kem/leaf_node_validator.rs +++ b/mls-rs/src/tree_kem/leaf_node_validator.rs @@ -309,7 +309,7 @@ mod tests { group_id, 0, // TODO remove identity from input - default_properties(), + Some(default_properties()), None, &secret, ) @@ -340,7 +340,7 @@ mod tests { &cipher_suite_provider, group_id, 0, - default_properties(), + Some(default_properties()), None, &secret, ) @@ -383,7 +383,7 @@ mod tests { &cipher_suite_provider, b"foo", 0, - default_properties(), + Some(default_properties()), None, &secret, ) @@ -409,7 +409,7 @@ mod tests { &cipher_suite_provider, b"foo", 0, - default_properties(), + Some(default_properties()), None, &secret, ) diff --git a/mls-rs/src/tree_kem/private.rs b/mls-rs/src/tree_kem/private.rs index 1cc72eef..dc5c97f6 100644 --- a/mls-rs/src/tree_kem/private.rs +++ b/mls-rs/src/tree_kem/private.rs @@ -198,7 +198,7 @@ mod tests { &mut get_test_group_context(42, cipher_suite).await, &[], &alice_signing, - default_properties(), + Some(default_properties()), None, &cipher_suite_provider, #[cfg(test)] diff --git a/mls-rs/src/tree_kem/tree_validator.rs b/mls-rs/src/tree_kem/tree_validator.rs index 26d4baf1..0187736b 100644 --- a/mls-rs/src/tree_kem/tree_validator.rs +++ b/mls-rs/src/tree_kem/tree_validator.rs @@ -218,7 +218,7 @@ mod tests { &mut get_test_group_context(42, cipher_suite).await, &[LeafIndex(1), LeafIndex(2)], &test_tree.creator_signing_key, - default_properties(), + Some(default_properties()), None, &cipher_suite_provider, #[cfg(test)] diff --git a/mls-rs/src/tree_kem/update_path.rs b/mls-rs/src/tree_kem/update_path.rs index 2f873dc5..2ae50819 100644 --- a/mls-rs/src/tree_kem/update_path.rs +++ b/mls-rs/src/tree_kem/update_path.rs @@ -141,7 +141,7 @@ mod tests { &test_cipher_suite_provider(cipher_suite), TEST_GROUP, 0, - default_properties(), + Some(default_properties()), None, &signer, ) diff --git a/mls-rs/test_harness_integration/src/main.rs b/mls-rs/test_harness_integration/src/main.rs index e7f890d3..51e7eab8 100644 --- a/mls-rs/test_harness_integration/src/main.rs +++ b/mls-rs/test_harness_integration/src/main.rs @@ -215,7 +215,7 @@ impl MlsClient for MlsClientImpl { let group = client .client - .create_group_with_id(request.group_id, ExtensionList::default()) + .create_group_with_id(request.group_id, ExtensionList::default(), Default::default()) .map_err(abort)?; client.group = Some(group); @@ -236,7 +236,7 @@ impl MlsClient for MlsClientImpl { let key_package = client .client - .generate_key_package_message() + .generate_key_package_message(Default::default()) .map_err(abort)?; let (_, key_pckg_secrets) = client.key_package_repo.key_packages()[0].clone(); diff --git a/mls-rs/tests/client_tests.rs b/mls-rs/tests/client_tests.rs index 5c976022..bc5d9303 100644 --- a/mls-rs/tests/client_tests.rs +++ b/mls-rs/tests/client_tests.rs @@ -164,7 +164,7 @@ async fn test_create( ) { let alice = generate_client(cipher_suite, protocol_version, 0, encrypt_controls).await; let bob = generate_client(cipher_suite, protocol_version, 1, encrypt_controls).await; - let bob_key_pkg = bob.generate_key_package_message().await.unwrap(); + let bob_key_pkg = bob.generate_key_package_message(Default::default()).await.unwrap(); // Alice creates a group and adds bob let mut alice_group = alice @@ -602,7 +602,7 @@ async fn reinit_works() { // Create a group with 2 parties let mut alice_group = alice1.create_group(ExtensionList::new()).await.unwrap(); - let kp = bob1.generate_key_package_message().await.unwrap(); + let kp = bob1.generate_key_package_message(Default::default()).await.unwrap(); let welcome = &alice_group .commit_builder() @@ -696,7 +696,7 @@ async fn reinit_works() { // They can talk let carol = generate_client(suite2, version, 3, Default::default()).await; - let kp = carol.generate_key_package_message().await.unwrap(); + let kp = carol.generate_key_package_message(Default::default()).await.unwrap(); let commit_output = alice_group .commit_builder() @@ -806,7 +806,7 @@ async fn weird_tree_scenario() { async fn fake_key_package(id: usize) -> MlsMessage { generate_client(CipherSuite::P256_AES128, ProtocolVersion::MLS_10, id, false) .await - .generate_key_package_message() + .generate_key_package_message(Default::default()) .await .unwrap() } From c2b7b599ddaea350c6f490a93ace7d6a0cc16904 Mon Sep 17 00:00:00 2001 From: Caio Sym Date: Tue, 1 Oct 2024 22:57:42 +0100 Subject: [PATCH 2/6] Rework key package extensions to work via parameters rather than as a client configuration --- mls-rs-uniffi/src/lib.rs | 2 +- mls-rs/benches/group_add.rs | 2 +- mls-rs/examples/basic_server_usage.rs | 2 +- mls-rs/examples/basic_usage.rs | 2 +- mls-rs/examples/custom.rs | 4 +-- mls-rs/examples/large_group.rs | 4 +-- mls-rs/src/client.rs | 29 ++++++++------- mls-rs/src/client_builder.rs | 36 ------------------- mls-rs/src/client_config.rs | 1 - mls-rs/src/group/commit.rs | 4 +-- .../interop_test_vectors/passive_client.rs | 6 ++-- mls-rs/src/group/mod.rs | 22 ++++++------ mls-rs/src/group/resumption.rs | 2 +- mls-rs/src/group/test_utils.rs | 4 ++- mls-rs/src/test_utils/fuzz_tests.rs | 2 +- mls-rs/src/test_utils/mod.rs | 2 +- mls-rs/test_harness_integration/src/main.rs | 2 +- mls-rs/tests/client_tests.rs | 14 ++++---- 18 files changed, 51 insertions(+), 89 deletions(-) diff --git a/mls-rs-uniffi/src/lib.rs b/mls-rs-uniffi/src/lib.rs index 3408f213..798f1295 100644 --- a/mls-rs-uniffi/src/lib.rs +++ b/mls-rs-uniffi/src/lib.rs @@ -382,7 +382,7 @@ impl Client { /// See [`mls_rs::Client::generate_key_package_message`] for /// details. pub async fn generate_key_package_message(&self) -> Result { - let message = self.inner.generate_key_package_message(Default::default()).await?; + let message = self.inner.generate_key_package_message(Default::default(), Default::default()).await?; Ok(message.into()) } diff --git a/mls-rs/benches/group_add.rs b/mls-rs/benches/group_add.rs index 0c6a7ac3..3a9413ca 100644 --- a/mls-rs/benches/group_add.rs +++ b/mls-rs/benches/group_add.rs @@ -24,7 +24,7 @@ fn bench(c: &mut Criterion) { let key_packages = (0..MAX_ADD_COUNT) .map(|i| { make_client(&format!("bob-{i}")) - .generate_key_package_message(Default::default) + .generate_key_package_message(Default::default(), Default::default()) .unwrap() }) .collect::>(); diff --git a/mls-rs/examples/basic_server_usage.rs b/mls-rs/examples/basic_server_usage.rs index 12547427..13bb334b 100644 --- a/mls-rs/examples/basic_server_usage.rs +++ b/mls-rs/examples/basic_server_usage.rs @@ -141,7 +141,7 @@ fn main() -> Result<(), MlsError> { // Alice creates a group with bob let mut alice_group = alice.create_group(ExtensionList::default(), Default::default())?; - let bob_key_package = bob.generate_key_package_message(Default::default())?; + let bob_key_package = bob.generate_key_package_message(Default::default(), Default::default())?; let welcome = &alice_group .commit_builder() diff --git a/mls-rs/examples/basic_usage.rs b/mls-rs/examples/basic_usage.rs index df9c7f44..70d1ffc4 100644 --- a/mls-rs/examples/basic_usage.rs +++ b/mls-rs/examples/basic_usage.rs @@ -47,7 +47,7 @@ fn main() -> Result<(), MlsError> { let mut alice_group = alice.create_group(ExtensionList::default(), Default::default())?; // Bob generates a key package that Alice needs to add Bob to the group. - let bob_key_package = bob.generate_key_package_message(Default::default())?; + let bob_key_package = bob.generate_key_package_message(Default::default(), Default::default())?; // Alice issues a commit that adds Bob to the group. let alice_commit = alice_group diff --git a/mls-rs/examples/custom.rs b/mls-rs/examples/custom.rs index 2cc58834..44270d49 100644 --- a/mls-rs/examples/custom.rs +++ b/mls-rs/examples/custom.rs @@ -373,7 +373,7 @@ fn main() -> Result<(), CustomError> { // Alice can add her other device let alice_pc_client = make_client(alice_pc)?; - let key_package = alice_pc_client.generate_key_package_message(Default::default())?; + let key_package = alice_pc_client.generate_key_package_message(Default::default(), Default::default())?; let welcome = alice_tablet_group .commit_builder() @@ -387,7 +387,7 @@ fn main() -> Result<(), CustomError> { // Alice cannot add bob's devices yet let bob_tablet_client = make_client(bob_tablet)?; - let key_package = bob_tablet_client.generate_key_package_message(Default::default())?; + let key_package = bob_tablet_client.generate_key_package_message(Default::default(), Default::default())?; let res = alice_tablet_group .commit_builder() diff --git a/mls-rs/examples/large_group.rs b/mls-rs/examples/large_group.rs index d1cea60a..1a6ce938 100644 --- a/mls-rs/examples/large_group.rs +++ b/mls-rs/examples/large_group.rs @@ -66,7 +66,7 @@ fn make_groups_best_case( let bob_client = make_client(crypto_provider.clone(), &make_name(i + 1))?; // The new client generates a key package. - let bob_kpkg = bob_client.generate_key_package_message(Default::default())?; + let bob_kpkg = bob_client.generate_key_package_message(Default::default(), Default::default())?; // Last group sends a commit adding the new client to the group. let commit = groups @@ -110,7 +110,7 @@ fn make_groups_worst_case( let mut commit_builder = alice_group.commit_builder(); for bob_client in &bob_clients { - let bob_kpkg = bob_client.generate_key_package_message(Default::default())?; + let bob_kpkg = bob_client.generate_key_package_message(Default::default(), Default::default())?; commit_builder = commit_builder.add_member(bob_kpkg)?; } diff --git a/mls-rs/src/client.rs b/mls-rs/src/client.rs index cb7d2fa4..64da55d8 100644 --- a/mls-rs/src/client.rs +++ b/mls-rs/src/client.rs @@ -429,12 +429,12 @@ where /// /// A key package message may only be used once. #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] - pub async fn generate_key_package_message(&self, leaf_node_extensions: ExtensionList) -> Result { - Ok(self.generate_key_package(leaf_node_extensions).await?.key_package_message()) + pub async fn generate_key_package_message(&self, key_package_extensions: ExtensionList, leaf_node_extensions: ExtensionList) -> Result { + Ok(self.generate_key_package(key_package_extensions, leaf_node_extensions).await?.key_package_message()) } #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] - async fn generate_key_package(&self, leaf_node_extensions: ExtensionList) -> Result { + async fn generate_key_package(&self, key_package_extensions: ExtensionList, leaf_node_extensions: ExtensionList) -> Result { let (signing_identity, cipher_suite) = self.signing_identity()?; let cipher_suite_provider = self @@ -454,7 +454,7 @@ where .generate( self.config.lifetime(), self.config.capabilities(), - self.config.key_package_extensions(), + key_package_extensions, leaf_node_extensions, ) .await?; @@ -678,6 +678,7 @@ where group_info: &MlsMessage, tree_data: Option>, authenticated_data: Vec, + key_package_extensions: ExtensionList, leaf_node_extensions: ExtensionList, ) -> Result { let protocol_version = group_info.version; @@ -707,7 +708,7 @@ where ) .await?; - let key_package = self.generate_key_package(leaf_node_extensions).await?.key_package; + let key_package = self.generate_key_package(key_package_extensions, leaf_node_extensions).await?.key_package; (key_package.cipher_suite == cipher_suite) .then_some(()) @@ -750,11 +751,6 @@ where .ok_or(MlsError::SignerNotFound) } - /// Returns key package extensions used by this client - pub fn key_package_extensions(&self) -> ExtensionList { - self.config.key_package_extensions() - } - /// The [KeyPackageStorage] that this client was configured to use. #[cfg_attr(all(feature = "ffi", not(test)), safer_ffi_gen::safer_ffi_gen_ignore)] pub fn key_package_store(&self) -> ::KeyPackageRepository { @@ -798,7 +794,7 @@ pub(crate) mod test_utils { cipher_suite: CipherSuite, identity: &str, ) -> (Client, MlsMessage) { - test_client_with_key_pkg_custom(protocol_version, cipher_suite, identity, |_| {}).await + test_client_with_key_pkg_custom(protocol_version, cipher_suite, identity, Default::default(), Default::default(), |_| {}).await } #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] @@ -806,6 +802,8 @@ pub(crate) mod test_utils { protocol_version: ProtocolVersion, cipher_suite: CipherSuite, identity: &str, + key_package_extensions: ExtensionList, + leaf_node_extensions: ExtensionList, mut config: F, ) -> (Client, MlsMessage) where @@ -821,7 +819,7 @@ pub(crate) mod test_utils { config(&mut client.config); - let key_package = client.generate_key_package_message(ExtensionList::default()).await.unwrap(); + let key_package = client.generate_key_package_message(key_package_extensions, leaf_node_extensions).await.unwrap(); (client, key_package) } @@ -868,7 +866,7 @@ mod tests { .build(); // TODO: Tests around extensions - let key_package = client.generate_key_package_message(ExtensionList::default()).await.unwrap(); + let key_package = client.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); assert_eq!(key_package.version, protocol_version); @@ -907,7 +905,8 @@ mod tests { &alice_group.group_info_message(true).await.unwrap(), None, vec![], - ExtensionList::default(), + Default::default(), + Default::default(), ) .await .unwrap(); @@ -1053,7 +1052,7 @@ mod tests { .signing_identity(alice_identity.clone(), secret_key, TEST_CIPHER_SUITE) .build(); - let msg = alice.generate_key_package_message(ExtensionList::default()).await.unwrap(); + let msg = alice.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); let res = alice.commit_external(msg).await.map(|_| ()); assert_matches!(res, Err(MlsError::UnexpectedMessageType)); diff --git a/mls-rs/src/client_builder.rs b/mls-rs/src/client_builder.rs index 76db2c31..888d8c80 100644 --- a/mls-rs/src/client_builder.rs +++ b/mls-rs/src/client_builder.rs @@ -297,31 +297,6 @@ impl ClientBuilder { ClientBuilder(c) } - /// Add a key package extension to the list of key package extensions supported by the client. - pub fn key_package_extension( - self, - extension: T, - ) -> Result>, ExtensionError> - where - T: MlsExtension, - Self: Sized, - { - let mut c = self.0.into_config(); - c.0.settings.key_package_extensions.set_from(extension)?; - Ok(ClientBuilder(c)) - } - - /// Add multiple key package extensions to the list of key package extensions supported by the - /// client. - pub fn key_package_extensions( - self, - extensions: ExtensionList, - ) -> ClientBuilder> { - let mut c = self.0.into_config(); - c.0.settings.key_package_extensions.append(extensions); - ClientBuilder(c) - } - /// Set the lifetime duration in seconds of key packages generated by the client. pub fn key_package_lifetime(self, duration_in_s: u64) -> ClientBuilder> { let mut c = self.0.into_config(); @@ -708,10 +683,6 @@ where self.crypto_provider.clone() } - fn key_package_extensions(&self) -> ExtensionList { - self.settings.key_package_extensions.clone() - } - fn lifetime(&self) -> Lifetime { #[cfg(feature = "std")] let now_timestamp = MlsTime::now().seconds_since_epoch(); @@ -811,10 +782,6 @@ impl ClientConfig for T { self.get().crypto_provider() } - fn key_package_extensions(&self) -> ExtensionList { - self.get().key_package_extensions() - } - fn lifetime(&self) -> Lifetime { self.get().lifetime() } @@ -837,7 +804,6 @@ pub(crate) struct Settings { pub(crate) extension_types: Vec, pub(crate) protocol_versions: Vec, pub(crate) custom_proposal_types: Vec, - pub(crate) key_package_extensions: ExtensionList, pub(crate) lifetime_in_s: u64, #[cfg(any(test, feature = "test_util"))] pub(crate) key_package_not_before: Option, @@ -848,7 +814,6 @@ impl Default for Settings { Self { extension_types: Default::default(), protocol_versions: Default::default(), - key_package_extensions: Default::default(), lifetime_in_s: 365 * 24 * 3600, custom_proposal_types: Default::default(), #[cfg(any(test, feature = "test_util"))] @@ -868,7 +833,6 @@ pub(crate) fn recreate_config( extension_types: c.supported_extensions(), protocol_versions: c.supported_protocol_versions(), custom_proposal_types: c.supported_custom_proposals(), - key_package_extensions: c.key_package_extensions(), lifetime_in_s: { let l = c.lifetime(); l.not_after - l.not_before diff --git a/mls-rs/src/client_config.rs b/mls-rs/src/client_config.rs index f723f6b3..430013a1 100644 --- a/mls-rs/src/client_config.rs +++ b/mls-rs/src/client_config.rs @@ -37,7 +37,6 @@ pub trait ClientConfig: Send + Sync + Clone { fn identity_provider(&self) -> Self::IdentityProvider; fn crypto_provider(&self) -> Self::CryptoProvider; - fn key_package_extensions(&self) -> ExtensionList; fn lifetime(&self) -> Lifetime; fn capabilities(&self) -> Capabilities { diff --git a/mls-rs/src/group/commit.rs b/mls-rs/src/group/commit.rs index 23d01ab8..ae9970b3 100644 --- a/mls-rs/src/group/commit.rs +++ b/mls-rs/src/group/commit.rs @@ -1451,7 +1451,7 @@ mod tests { let mut alice = alice.create_group(ExtensionList::new(), Default::default()).await.unwrap(); let bob = client_with_test_extension(b"bob").await; - let bob_kp = bob.generate_key_package_message(Default::default()).await.unwrap(); + let bob_kp = bob.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); let mut extension_list = ExtensionList::new(); let extension = TestExtension { foo: b'a' }; @@ -1472,7 +1472,7 @@ mod tests { alice .commit_builder() - .add_member(alex.generate_key_package_message(Default::default()).await.unwrap()) + .add_member(alex.generate_key_package_message(Default::default(), Default::default()).await.unwrap()) .unwrap() .set_group_context_ext(extension_list.clone()) .unwrap() diff --git a/mls-rs/src/group/interop_test_vectors/passive_client.rs b/mls-rs/src/group/interop_test_vectors/passive_client.rs index 2552b2e7..1c89c2e8 100644 --- a/mls-rs/src/group/interop_test_vectors/passive_client.rs +++ b/mls-rs/src/group/interop_test_vectors/passive_client.rs @@ -250,7 +250,7 @@ async fn invite_passive_client( .signing_identity(identity.clone(), secret_key.clone(), cs.cipher_suite()) .build(); - let key_pckg = client.generate_key_package_message(Default::default()).await.unwrap(); + let key_pckg = client.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); let (_, key_pckg_secrets) = key_package_repo.key_packages()[0].clone(); @@ -489,7 +489,7 @@ async fn create_key_package(cs: CipherSuite) -> MlsMessage { ) .await; - client.generate_key_package_message(Default::default()).await.unwrap() + client.generate_key_package_message(Default::default(), Default::default()).await.unwrap() } #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] @@ -646,7 +646,7 @@ pub async fn add_random_members( let mut key_packages = Vec::new(); for client in &clients { - let key_package = client.generate_key_package_message(Default::default()).await.unwrap(); + let key_package = client.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); key_packages.push(key_package); } diff --git a/mls-rs/src/group/mod.rs b/mls-rs/src/group/mod.rs index d8d94787..62ab14d8 100644 --- a/mls-rs/src/group/mod.rs +++ b/mls-rs/src/group/mod.rs @@ -2355,13 +2355,9 @@ mod tests { TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE, "bob", - |config| { - config - .0 - .settings - .key_package_extensions - .set(LastResortKeyPackageExt.into_extension().unwrap()) - }, + LastResortKeyPackageExt.into_extension().unwrap(), + Default::default(), + |_| {}, ) .await; let mut carla_group = test_group(TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE).await; @@ -2956,7 +2952,7 @@ mod tests { Some((bob_identity, TEST_CIPHER_SUITE)), TEST_PROTOCOL_VERSION, ) - .generate_key_package_message(ExtensionList::default()) + .generate_key_package_message(Default::default(), Default::default()) .await .unwrap(); @@ -3925,11 +3921,11 @@ mod tests { // Alice adds Bob, Carol and Dave to the group. They all support the mandatory extension. let commit = alice .commit_builder() - .add_member(bob_client.generate_key_package_message(ExtensionList::default()).await.unwrap()) + .add_member(bob_client.generate_key_package_message(Default::default(), Default::default()).await.unwrap()) .unwrap() - .add_member(carol_client.generate_key_package_message(ExtensionList::default()).await.unwrap()) + .add_member(carol_client.generate_key_package_message(Default::default(), Default::default()).await.unwrap()) .unwrap() - .add_member(dave_client.generate_key_package_message(ExtensionList::default()).await.unwrap()) + .add_member(dave_client.generate_key_package_message(Default::default(), Default::default()).await.unwrap()) .unwrap() .build() .await @@ -4052,7 +4048,7 @@ mod tests { let kp = client_with_custom_rules(b"bob", mls_rules) .await - .generate_key_package_message(ExtensionList::default()) + .generate_key_package_message(Default::default(), Default::default()) .await .unwrap(); @@ -4279,6 +4275,8 @@ mod tests { TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE, "alice", + Default::default(), + Default::default(), |c| c.0.mls_rules.encryption_options.encrypt_control_messages = encrypt_proposal, ) .await; diff --git a/mls-rs/src/group/resumption.rs b/mls-rs/src/group/resumption.rs index 5c0d4e88..7d33b571 100644 --- a/mls-rs/src/group/resumption.rs +++ b/mls-rs/src/group/resumption.rs @@ -166,7 +166,7 @@ impl ReinitClient { /// be used in [`ReinitClient::commit`]. #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] pub async fn generate_key_package(&self) -> Result { - self.client.generate_key_package_message(Default::default()).await + self.client.generate_key_package_message(Default::default(), Default::default()).await } /// Create the new group using new key packages of all group members, possibly diff --git a/mls-rs/src/group/test_utils.rs b/mls-rs/src/group/test_utils.rs index 55df07d1..e174f23d 100644 --- a/mls-rs/src/group/test_utils.rs +++ b/mls-rs/src/group/test_utils.rs @@ -79,6 +79,8 @@ impl TestGroup { self.protocol_version(), self.cipher_suite(), name, + Default::default(), + Default::default(), &mut config, ) .await @@ -358,7 +360,7 @@ pub(crate) async fn get_test_groups_with_features( let mut groups = vec![group]; for client in clients.iter().skip(1) { - let key_package = client.generate_key_package_message(leaf_extensions.clone()).await.unwrap(); + let key_package = client.generate_key_package_message(Default::default(), leaf_extensions.clone()).await.unwrap(); let commit_output = groups[0] .commit_builder() diff --git a/mls-rs/src/test_utils/fuzz_tests.rs b/mls-rs/src/test_utils/fuzz_tests.rs index 9de26376..a7dfc249 100644 --- a/mls-rs/src/test_utils/fuzz_tests.rs +++ b/mls-rs/src/test_utils/fuzz_tests.rs @@ -42,7 +42,7 @@ pub fn create_group() -> Group { alice .commit_builder() - .add_member(bob.generate_key_package_message(Default::default()).unwrap()) + .add_member(bob.generate_key_package_message(Default::default(), Default::default()).unwrap()) .unwrap() .build() .unwrap(); diff --git a/mls-rs/src/test_utils/mod.rs b/mls-rs/src/test_utils/mod.rs index 283058ab..07a402f6 100644 --- a/mls-rs/src/test_utils/mod.rs +++ b/mls-rs/src/test_utils/mod.rs @@ -137,7 +137,7 @@ pub async fn get_test_groups( None, ) .await; - let kp = client.generate_key_package_message(Default::default()).await.unwrap(); + let kp = client.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); receiver_clients.push(client); commit_builder = commit_builder.add_member(kp.clone()).unwrap(); diff --git a/mls-rs/test_harness_integration/src/main.rs b/mls-rs/test_harness_integration/src/main.rs index 51e7eab8..3dfbf881 100644 --- a/mls-rs/test_harness_integration/src/main.rs +++ b/mls-rs/test_harness_integration/src/main.rs @@ -236,7 +236,7 @@ impl MlsClient for MlsClientImpl { let key_package = client .client - .generate_key_package_message(Default::default()) + .generate_key_package_message(Default::default(), Default::default()) .map_err(abort)?; let (_, key_pckg_secrets) = client.key_package_repo.key_packages()[0].clone(); diff --git a/mls-rs/tests/client_tests.rs b/mls-rs/tests/client_tests.rs index bc5d9303..837ad87e 100644 --- a/mls-rs/tests/client_tests.rs +++ b/mls-rs/tests/client_tests.rs @@ -164,11 +164,11 @@ async fn test_create( ) { let alice = generate_client(cipher_suite, protocol_version, 0, encrypt_controls).await; let bob = generate_client(cipher_suite, protocol_version, 1, encrypt_controls).await; - let bob_key_pkg = bob.generate_key_package_message(Default::default()).await.unwrap(); + let bob_key_pkg = bob.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); // Alice creates a group and adds bob let mut alice_group = alice - .create_group_with_id(b"group".to_vec(), ExtensionList::default()) + .create_group_with_id(b"group".to_vec(), Default::default(), Default::default()) .await .unwrap(); @@ -490,7 +490,7 @@ async fn external_commits_work( let creator = generate_client(cipher_suite, protocol_version, 0, false).await; let creator_group = creator - .create_group_with_id(b"group".to_vec(), ExtensionList::default()) + .create_group_with_id(b"group".to_vec(), Default::default(), Default::default()) .await .unwrap(); @@ -601,8 +601,8 @@ async fn reinit_works() { let bob1 = generate_client(suite1, version, 2, Default::default()).await; // Create a group with 2 parties - let mut alice_group = alice1.create_group(ExtensionList::new()).await.unwrap(); - let kp = bob1.generate_key_package_message(Default::default()).await.unwrap(); + let mut alice_group = alice1.create_group(Default::default(), Default::default()).await.unwrap(); + let kp = bob1.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); let welcome = &alice_group .commit_builder() @@ -696,7 +696,7 @@ async fn reinit_works() { // They can talk let carol = generate_client(suite2, version, 3, Default::default()).await; - let kp = carol.generate_key_package_message(Default::default()).await.unwrap(); + let kp = carol.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); let commit_output = alice_group .commit_builder() @@ -806,7 +806,7 @@ async fn weird_tree_scenario() { async fn fake_key_package(id: usize) -> MlsMessage { generate_client(CipherSuite::P256_AES128, ProtocolVersion::MLS_10, id, false) .await - .generate_key_package_message(Default::default()) + .generate_key_package_message(Default::default(), Default::default()) .await .unwrap() } From bd4c6d9e8e5ddcd76c3a4e3b1a61dfe641d0e507 Mon Sep 17 00:00:00 2001 From: Caio Sym Date: Tue, 1 Oct 2024 23:08:02 +0100 Subject: [PATCH 3/6] Address clippy issues --- mls-rs/src/client_builder.rs | 3 +-- mls-rs/src/group/commit.rs | 1 + mls-rs/src/group/external_commit.rs | 2 +- mls-rs/src/group/mod.rs | 3 ++- mls-rs/src/test_utils/fuzz_tests.rs | 4 ++-- mls-rs/test_harness_integration/src/by_ref_proposal.rs | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/mls-rs/src/client_builder.rs b/mls-rs/src/client_builder.rs index 888d8c80..545539a3 100644 --- a/mls-rs/src/client_builder.rs +++ b/mls-rs/src/client_builder.rs @@ -10,7 +10,7 @@ use crate::{ cipher_suite::CipherSuite, client::Client, client_config::ClientConfig, - extension::{ExtensionType, MlsExtension}, + extension::ExtensionType, group::{ mls_rules::{DefaultMlsRules, MlsRules}, proposal::ProposalType, @@ -907,7 +907,6 @@ mod private { use mls_rs_core::{ crypto::{CryptoProvider, SignatureSecretKey}, - extension::{ExtensionError, ExtensionList}, group::GroupStateStorage, identity::IdentityProvider, key_package::KeyPackageStorage, diff --git a/mls-rs/src/group/commit.rs b/mls-rs/src/group/commit.rs index ae9970b3..ebaf3d31 100644 --- a/mls-rs/src/group/commit.rs +++ b/mls-rs/src/group/commit.rs @@ -475,6 +475,7 @@ where /// Returns commit and optional [`MlsMessage`] containing a welcome message /// for newly added members. + #[allow(clippy::too_many_arguments)] #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] pub(super) async fn commit_internal( &mut self, diff --git a/mls-rs/src/group/external_commit.rs b/mls-rs/src/group/external_commit.rs index 4ed205d8..00d73546 100644 --- a/mls-rs/src/group/external_commit.rs +++ b/mls-rs/src/group/external_commit.rs @@ -148,7 +148,7 @@ impl ExternalCommitBuilder { leaf_node_extensions: ExtensionList, ) -> Self { Self { - leaf_node_extensions: leaf_node_extensions, + leaf_node_extensions, ..self } } diff --git a/mls-rs/src/group/mod.rs b/mls-rs/src/group/mod.rs index 62ab14d8..78cd08cc 100644 --- a/mls-rs/src/group/mod.rs +++ b/mls-rs/src/group/mod.rs @@ -288,6 +288,7 @@ impl Group where C: ClientConfig + Clone, { + #[allow(clippy::too_many_arguments)] #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] pub(crate) async fn new( config: C, @@ -2355,7 +2356,7 @@ mod tests { TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE, "bob", - LastResortKeyPackageExt.into_extension().unwrap(), + vec![LastResortKeyPackageExt.into_extension().unwrap()].into(), Default::default(), |_| {}, ) diff --git a/mls-rs/src/test_utils/fuzz_tests.rs b/mls-rs/src/test_utils/fuzz_tests.rs index a7dfc249..d874c1c5 100644 --- a/mls-rs/src/test_utils/fuzz_tests.rs +++ b/mls-rs/src/test_utils/fuzz_tests.rs @@ -18,7 +18,7 @@ use crate::{ Commit, Group, }, identity::{basic::BasicIdentityProvider, SigningIdentity}, - Client, ExtensionList, + Client, }; #[cfg(awslc)] @@ -38,7 +38,7 @@ pub fn create_group() -> Group { let alice = make_client(cipher_suite, "alice"); let bob = make_client(cipher_suite, "bob"); - let mut alice = alice.create_group(ExtensionList::new()).unwrap(); + let mut alice = alice.create_group(Default::default(), Default::default()).unwrap(); alice .commit_builder() diff --git a/mls-rs/test_harness_integration/src/by_ref_proposal.rs b/mls-rs/test_harness_integration/src/by_ref_proposal.rs index ae51d504..11f275f5 100644 --- a/mls-rs/test_harness_integration/src/by_ref_proposal.rs +++ b/mls-rs/test_harness_integration/src/by_ref_proposal.rs @@ -371,7 +371,7 @@ pub(crate) mod external_proposal { let proposal = client .client - .external_add_proposal(&group_info, None, vec![]) + .external_add_proposal(&group_info, None, vec![], Default::default(), Default::default()) .map_err(abort)? .to_bytes() .map_err(abort)?; From e9ef6f8c800ad993f8c1229d68d96291e8379531 Mon Sep 17 00:00:00 2001 From: Caio Sym Date: Tue, 1 Oct 2024 23:16:38 +0100 Subject: [PATCH 4/6] Apply formatting changes --- mls-rs-uniffi/src/lib.rs | 11 ++++- mls-rs/examples/basic_server_usage.rs | 3 +- mls-rs/examples/basic_usage.rs | 3 +- mls-rs/examples/custom.rs | 9 ++-- mls-rs/examples/large_group.rs | 6 ++- mls-rs/examples/x509.rs | 4 +- mls-rs/src/client.rs | 47 +++++++++++++++---- mls-rs/src/group/commit.rs | 37 +++++++++------ mls-rs/src/group/external_commit.rs | 9 ++-- .../interop_test_vectors/passive_client.rs | 20 ++++++-- mls-rs/src/group/mod.rs | 34 +++++++++++--- mls-rs/src/group/resumption.rs | 4 +- mls-rs/src/group/test_utils.rs | 5 +- mls-rs/src/test_utils/fuzz_tests.rs | 9 +++- mls-rs/src/test_utils/mod.rs | 10 +++- .../src/by_ref_proposal.rs | 8 +++- mls-rs/test_harness_integration/src/main.rs | 6 ++- mls-rs/tests/client_tests.rs | 20 ++++++-- 18 files changed, 185 insertions(+), 60 deletions(-) diff --git a/mls-rs-uniffi/src/lib.rs b/mls-rs-uniffi/src/lib.rs index 798f1295..9116fb34 100644 --- a/mls-rs-uniffi/src/lib.rs +++ b/mls-rs-uniffi/src/lib.rs @@ -382,7 +382,10 @@ impl Client { /// See [`mls_rs::Client::generate_key_package_message`] for /// details. pub async fn generate_key_package_message(&self) -> Result { - let message = self.inner.generate_key_package_message(Default::default(), Default::default()).await?; + let message = self + .inner + .generate_key_package_message(Default::default(), Default::default()) + .await?; Ok(message.into()) } @@ -406,7 +409,11 @@ impl Client { .create_group_with_id(group_id, extensions, Default::default()) .await? } - None => self.inner.create_group(extensions, Default::default()).await?, + None => { + self.inner + .create_group(extensions, Default::default()) + .await? + } }; Ok(Group { inner: Arc::new(Mutex::new(inner)), diff --git a/mls-rs/examples/basic_server_usage.rs b/mls-rs/examples/basic_server_usage.rs index 13bb334b..38fb9ecd 100644 --- a/mls-rs/examples/basic_server_usage.rs +++ b/mls-rs/examples/basic_server_usage.rs @@ -141,7 +141,8 @@ fn main() -> Result<(), MlsError> { // Alice creates a group with bob let mut alice_group = alice.create_group(ExtensionList::default(), Default::default())?; - let bob_key_package = bob.generate_key_package_message(Default::default(), Default::default())?; + let bob_key_package = + bob.generate_key_package_message(Default::default(), Default::default())?; let welcome = &alice_group .commit_builder() diff --git a/mls-rs/examples/basic_usage.rs b/mls-rs/examples/basic_usage.rs index 70d1ffc4..78ecd3bd 100644 --- a/mls-rs/examples/basic_usage.rs +++ b/mls-rs/examples/basic_usage.rs @@ -47,7 +47,8 @@ fn main() -> Result<(), MlsError> { let mut alice_group = alice.create_group(ExtensionList::default(), Default::default())?; // Bob generates a key package that Alice needs to add Bob to the group. - let bob_key_package = bob.generate_key_package_message(Default::default(), Default::default())?; + let bob_key_package = + bob.generate_key_package_message(Default::default(), Default::default())?; // Alice issues a commit that adds Bob to the group. let alice_commit = alice_group diff --git a/mls-rs/examples/custom.rs b/mls-rs/examples/custom.rs index 44270d49..d34e5439 100644 --- a/mls-rs/examples/custom.rs +++ b/mls-rs/examples/custom.rs @@ -369,11 +369,13 @@ fn main() -> Result<(), CustomError> { let roster = vec![alice.credential]; context_extensions.set_from(RosterExtension { roster })?; - let mut alice_tablet_group = make_client(alice_tablet)?.create_group(context_extensions, Default::default())?; + let mut alice_tablet_group = + make_client(alice_tablet)?.create_group(context_extensions, Default::default())?; // Alice can add her other device let alice_pc_client = make_client(alice_pc)?; - let key_package = alice_pc_client.generate_key_package_message(Default::default(), Default::default())?; + let key_package = + alice_pc_client.generate_key_package_message(Default::default(), Default::default())?; let welcome = alice_tablet_group .commit_builder() @@ -387,7 +389,8 @@ fn main() -> Result<(), CustomError> { // Alice cannot add bob's devices yet let bob_tablet_client = make_client(bob_tablet)?; - let key_package = bob_tablet_client.generate_key_package_message(Default::default(), Default::default())?; + let key_package = + bob_tablet_client.generate_key_package_message(Default::default(), Default::default())?; let res = alice_tablet_group .commit_builder() diff --git a/mls-rs/examples/large_group.rs b/mls-rs/examples/large_group.rs index 1a6ce938..fcdd2bba 100644 --- a/mls-rs/examples/large_group.rs +++ b/mls-rs/examples/large_group.rs @@ -66,7 +66,8 @@ fn make_groups_best_case( let bob_client = make_client(crypto_provider.clone(), &make_name(i + 1))?; // The new client generates a key package. - let bob_kpkg = bob_client.generate_key_package_message(Default::default(), Default::default())?; + let bob_kpkg = + bob_client.generate_key_package_message(Default::default(), Default::default())?; // Last group sends a commit adding the new client to the group. let commit = groups @@ -110,7 +111,8 @@ fn make_groups_worst_case( let mut commit_builder = alice_group.commit_builder(); for bob_client in &bob_clients { - let bob_kpkg = bob_client.generate_key_package_message(Default::default(), Default::default())?; + let bob_kpkg = + bob_client.generate_key_package_message(Default::default(), Default::default())?; commit_builder = commit_builder.add_member(bob_kpkg)?; } diff --git a/mls-rs/examples/x509.rs b/mls-rs/examples/x509.rs index 73555428..4f501f64 100644 --- a/mls-rs/examples/x509.rs +++ b/mls-rs/examples/x509.rs @@ -31,7 +31,9 @@ fn main() { .signing_identity(signing_identity, secret_key, CIPHERSUITE) .build(); - let mut alice_group = alice_client.create_group(Default::default(), Default::default()).unwrap(); + let mut alice_group = alice_client + .create_group(Default::default(), Default::default()) + .unwrap(); alice_group.commit(Vec::new()).unwrap(); alice_group.apply_pending_commit().unwrap(); diff --git a/mls-rs/src/client.rs b/mls-rs/src/client.rs index 64da55d8..b3d98fab 100644 --- a/mls-rs/src/client.rs +++ b/mls-rs/src/client.rs @@ -429,12 +429,23 @@ where /// /// A key package message may only be used once. #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] - pub async fn generate_key_package_message(&self, key_package_extensions: ExtensionList, leaf_node_extensions: ExtensionList) -> Result { - Ok(self.generate_key_package(key_package_extensions, leaf_node_extensions).await?.key_package_message()) + pub async fn generate_key_package_message( + &self, + key_package_extensions: ExtensionList, + leaf_node_extensions: ExtensionList, + ) -> Result { + Ok(self + .generate_key_package(key_package_extensions, leaf_node_extensions) + .await? + .key_package_message()) } #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] - async fn generate_key_package(&self, key_package_extensions: ExtensionList, leaf_node_extensions: ExtensionList) -> Result { + async fn generate_key_package( + &self, + key_package_extensions: ExtensionList, + leaf_node_extensions: ExtensionList, + ) -> Result { let (signing_identity, cipher_suite) = self.signing_identity()?; let cipher_suite_provider = self @@ -708,7 +719,10 @@ where ) .await?; - let key_package = self.generate_key_package(key_package_extensions, leaf_node_extensions).await?.key_package; + let key_package = self + .generate_key_package(key_package_extensions, leaf_node_extensions) + .await? + .key_package; (key_package.cipher_suite == cipher_suite) .then_some(()) @@ -794,7 +808,15 @@ pub(crate) mod test_utils { cipher_suite: CipherSuite, identity: &str, ) -> (Client, MlsMessage) { - test_client_with_key_pkg_custom(protocol_version, cipher_suite, identity, Default::default(), Default::default(), |_| {}).await + test_client_with_key_pkg_custom( + protocol_version, + cipher_suite, + identity, + Default::default(), + Default::default(), + |_| {}, + ) + .await } #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] @@ -819,7 +841,10 @@ pub(crate) mod test_utils { config(&mut client.config); - let key_package = client.generate_key_package_message(key_package_extensions, leaf_node_extensions).await.unwrap(); + let key_package = client + .generate_key_package_message(key_package_extensions, leaf_node_extensions) + .await + .unwrap(); (client, key_package) } @@ -866,7 +891,10 @@ mod tests { .build(); // TODO: Tests around extensions - let key_package = client.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); + let key_package = client + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(); assert_eq!(key_package.version, protocol_version); @@ -1052,7 +1080,10 @@ mod tests { .signing_identity(alice_identity.clone(), secret_key, TEST_CIPHER_SUITE) .build(); - let msg = alice.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); + let msg = alice + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(); let res = alice.commit_external(msg).await.map(|_| ()); assert_matches!(res, Err(MlsError::UnexpectedMessageType)); diff --git a/mls-rs/src/group/commit.rs b/mls-rs/src/group/commit.rs index ebaf3d31..2451826a 100644 --- a/mls-rs/src/group/commit.rs +++ b/mls-rs/src/group/commit.rs @@ -7,10 +7,7 @@ use alloc::vec; use alloc::vec::Vec; use core::fmt::Debug; use mls_rs_codec::{MlsDecode, MlsEncode, MlsSize}; -use mls_rs_core::{ - crypto::SignatureSecretKey, - error::IntoAnyError -}; +use mls_rs_core::{crypto::SignatureSecretKey, error::IntoAnyError}; use crate::{ cipher_suite::CipherSuite, @@ -331,10 +328,7 @@ where } /// Change the committer's leaf node extensions as part of making this commit. - pub fn set_leaf_node_extensions( - self, - new_leaf_node_extensions: ExtensionList, - ) -> Self { + pub fn set_leaf_node_extensions(self, new_leaf_node_extensions: ExtensionList) -> Self { Self { new_leaf_node_extensions: Some(new_leaf_node_extensions), ..self @@ -573,9 +567,9 @@ where // GroupContext object. The leaf_key_package for this UpdatePath must have a // parent_hash extension. - let new_leaf_node_extensions = new_leaf_node_extensions - .or(external_leaf.map(|ln| ln.extensions.clone())); - + let new_leaf_node_extensions = + new_leaf_node_extensions.or(external_leaf.map(|ln| ln.extensions.clone())); + let new_leaf_node_extensions = match new_leaf_node_extensions { Some(extensions) => extensions, // If we are not setting new extensions and this is not an external leaf then the current node MUST exist. @@ -1449,10 +1443,16 @@ mod tests { #[maybe_async::test(not(mls_build_async), async(mls_build_async, crate::futures_test))] async fn member_identity_is_validated_against_new_extensions() { let alice = client_with_test_extension(b"alice").await; - let mut alice = alice.create_group(ExtensionList::new(), Default::default()).await.unwrap(); + let mut alice = alice + .create_group(ExtensionList::new(), Default::default()) + .await + .unwrap(); let bob = client_with_test_extension(b"bob").await; - let bob_kp = bob.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); + let bob_kp = bob + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(); let mut extension_list = ExtensionList::new(); let extension = TestExtension { foo: b'a' }; @@ -1473,7 +1473,11 @@ mod tests { alice .commit_builder() - .add_member(alex.generate_key_package_message(Default::default(), Default::default()).await.unwrap()) + .add_member( + alex.generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(), + ) .unwrap() .set_group_context_ext(extension_list.clone()) .unwrap() @@ -1486,7 +1490,10 @@ mod tests { #[maybe_async::test(not(mls_build_async), async(mls_build_async, crate::futures_test))] async fn server_identity_is_validated_against_new_extensions() { let alice = client_with_test_extension(b"alice").await; - let mut alice = alice.create_group(ExtensionList::new(), Default::default()).await.unwrap(); + let mut alice = alice + .create_group(ExtensionList::new(), Default::default()) + .await + .unwrap(); let mut extension_list = ExtensionList::new(); let extension = TestExtension { foo: b'a' }; diff --git a/mls-rs/src/group/external_commit.rs b/mls-rs/src/group/external_commit.rs index 00d73546..907f8269 100644 --- a/mls-rs/src/group/external_commit.rs +++ b/mls-rs/src/group/external_commit.rs @@ -2,7 +2,9 @@ // Copyright by contributors to this project. // SPDX-License-Identifier: (Apache-2.0 OR MIT) -use mls_rs_core::{crypto::SignatureSecretKey, extension::ExtensionList, identity::SigningIdentity}; +use mls_rs_core::{ + crypto::SignatureSecretKey, extension::ExtensionList, identity::SigningIdentity, +}; use crate::{ client_config::ClientConfig, @@ -143,10 +145,7 @@ impl ExternalCommitBuilder { } /// Change the committer's leaf node extensions as part of making this commit. - pub fn with_leaf_node_extensions( - self, - leaf_node_extensions: ExtensionList, - ) -> Self { + pub fn with_leaf_node_extensions(self, leaf_node_extensions: ExtensionList) -> Self { Self { leaf_node_extensions, ..self diff --git a/mls-rs/src/group/interop_test_vectors/passive_client.rs b/mls-rs/src/group/interop_test_vectors/passive_client.rs index 1c89c2e8..e0c2bb7c 100644 --- a/mls-rs/src/group/interop_test_vectors/passive_client.rs +++ b/mls-rs/src/group/interop_test_vectors/passive_client.rs @@ -250,7 +250,10 @@ async fn invite_passive_client( .signing_identity(identity.clone(), secret_key.clone(), cs.cipher_suite()) .build(); - let key_pckg = client.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); + let key_pckg = client + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(); let (_, key_pckg_secrets) = key_package_repo.key_packages()[0].clone(); @@ -489,7 +492,10 @@ async fn create_key_package(cs: CipherSuite) -> MlsMessage { ) .await; - client.generate_key_package_message(Default::default(), Default::default()).await.unwrap() + client + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap() } #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] @@ -554,7 +560,10 @@ pub async fn generate_passive_client_random_tests() -> Vec { generate_basic_client(cs, VERSION, 0, None, false, &crypto, Some(ETERNAL_LIFETIME)) .await; - let creator_group = creator.create_group(Default::default(), Default::default()).await.unwrap(); + let creator_group = creator + .create_group(Default::default(), Default::default()) + .await + .unwrap(); let mut groups = vec![creator_group]; @@ -646,7 +655,10 @@ pub async fn add_random_members( let mut key_packages = Vec::new(); for client in &clients { - let key_package = client.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); + let key_package = client + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(); key_packages.push(key_package); } diff --git a/mls-rs/src/group/mod.rs b/mls-rs/src/group/mod.rs index 78cd08cc..5349035e 100644 --- a/mls-rs/src/group/mod.rs +++ b/mls-rs/src/group/mod.rs @@ -858,7 +858,8 @@ where // Grab a copy of the current node and update it to have new key material let mut new_leaf_node: LeafNode = self.current_user_leaf_node()?.clone(); - let new_leaf_node_extensions = leaf_node_extensions.unwrap_or(new_leaf_node.extensions.clone()); + let new_leaf_node_extensions = + leaf_node_extensions.unwrap_or(new_leaf_node.extensions.clone()); let secret_key = new_leaf_node .update( &self.cipher_suite_provider, @@ -2484,7 +2485,10 @@ mod tests { test_client_with_key_pkg(TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE, "alice") .await .0 - .create_group(core::iter::once(required_caps.into_extension().unwrap()).collect(), Default::default()) + .create_group( + core::iter::once(required_caps.into_extension().unwrap()).collect(), + Default::default(), + ) .await } @@ -3922,11 +3926,26 @@ mod tests { // Alice adds Bob, Carol and Dave to the group. They all support the mandatory extension. let commit = alice .commit_builder() - .add_member(bob_client.generate_key_package_message(Default::default(), Default::default()).await.unwrap()) + .add_member( + bob_client + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(), + ) .unwrap() - .add_member(carol_client.generate_key_package_message(Default::default(), Default::default()).await.unwrap()) + .add_member( + carol_client + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(), + ) .unwrap() - .add_member(dave_client.generate_key_package_message(Default::default(), Default::default()).await.unwrap()) + .add_member( + dave_client + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(), + ) .unwrap() .build() .await @@ -4283,7 +4302,10 @@ mod tests { .await; let mut alice = TestGroup { - group: alice.create_group(Default::default(), Default::default()).await.unwrap(), + group: alice + .create_group(Default::default(), Default::default()) + .await + .unwrap(), }; let mut bob = alice.join("bob").await.0; diff --git a/mls-rs/src/group/resumption.rs b/mls-rs/src/group/resumption.rs index 7d33b571..a8041fc0 100644 --- a/mls-rs/src/group/resumption.rs +++ b/mls-rs/src/group/resumption.rs @@ -166,7 +166,9 @@ impl ReinitClient { /// be used in [`ReinitClient::commit`]. #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] pub async fn generate_key_package(&self) -> Result { - self.client.generate_key_package_message(Default::default(), Default::default()).await + self.client + .generate_key_package_message(Default::default(), Default::default()) + .await } /// Create the new group using new key packages of all group members, possibly diff --git a/mls-rs/src/group/test_utils.rs b/mls-rs/src/group/test_utils.rs index e174f23d..de272901 100644 --- a/mls-rs/src/group/test_utils.rs +++ b/mls-rs/src/group/test_utils.rs @@ -360,7 +360,10 @@ pub(crate) async fn get_test_groups_with_features( let mut groups = vec![group]; for client in clients.iter().skip(1) { - let key_package = client.generate_key_package_message(Default::default(), leaf_extensions.clone()).await.unwrap(); + let key_package = client + .generate_key_package_message(Default::default(), leaf_extensions.clone()) + .await + .unwrap(); let commit_output = groups[0] .commit_builder() diff --git a/mls-rs/src/test_utils/fuzz_tests.rs b/mls-rs/src/test_utils/fuzz_tests.rs index d874c1c5..acade019 100644 --- a/mls-rs/src/test_utils/fuzz_tests.rs +++ b/mls-rs/src/test_utils/fuzz_tests.rs @@ -38,11 +38,16 @@ pub fn create_group() -> Group { let alice = make_client(cipher_suite, "alice"); let bob = make_client(cipher_suite, "bob"); - let mut alice = alice.create_group(Default::default(), Default::default()).unwrap(); + let mut alice = alice + .create_group(Default::default(), Default::default()) + .unwrap(); alice .commit_builder() - .add_member(bob.generate_key_package_message(Default::default(), Default::default()).unwrap()) + .add_member( + bob.generate_key_package_message(Default::default(), Default::default()) + .unwrap(), + ) .unwrap() .build() .unwrap(); diff --git a/mls-rs/src/test_utils/mod.rs b/mls-rs/src/test_utils/mod.rs index 07a402f6..4859e784 100644 --- a/mls-rs/src/test_utils/mod.rs +++ b/mls-rs/src/test_utils/mod.rs @@ -121,7 +121,10 @@ pub async fn get_test_groups( ) .await; - let mut creator_group = creator.create_group(Default::default(), Default::default()).await.unwrap(); + let mut creator_group = creator + .create_group(Default::default(), Default::default()) + .await + .unwrap(); let mut receiver_clients = Vec::new(); let mut commit_builder = creator_group.commit_builder(); @@ -137,7 +140,10 @@ pub async fn get_test_groups( None, ) .await; - let kp = client.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); + let kp = client + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(); receiver_clients.push(client); commit_builder = commit_builder.add_member(kp.clone()).unwrap(); diff --git a/mls-rs/test_harness_integration/src/by_ref_proposal.rs b/mls-rs/test_harness_integration/src/by_ref_proposal.rs index 11f275f5..9b90bf81 100644 --- a/mls-rs/test_harness_integration/src/by_ref_proposal.rs +++ b/mls-rs/test_harness_integration/src/by_ref_proposal.rs @@ -371,7 +371,13 @@ pub(crate) mod external_proposal { let proposal = client .client - .external_add_proposal(&group_info, None, vec![], Default::default(), Default::default()) + .external_add_proposal( + &group_info, + None, + vec![], + Default::default(), + Default::default(), + ) .map_err(abort)? .to_bytes() .map_err(abort)?; diff --git a/mls-rs/test_harness_integration/src/main.rs b/mls-rs/test_harness_integration/src/main.rs index 3dfbf881..424fc093 100644 --- a/mls-rs/test_harness_integration/src/main.rs +++ b/mls-rs/test_harness_integration/src/main.rs @@ -215,7 +215,11 @@ impl MlsClient for MlsClientImpl { let group = client .client - .create_group_with_id(request.group_id, ExtensionList::default(), Default::default()) + .create_group_with_id( + request.group_id, + ExtensionList::default(), + Default::default(), + ) .map_err(abort)?; client.group = Some(group); diff --git a/mls-rs/tests/client_tests.rs b/mls-rs/tests/client_tests.rs index 837ad87e..f907b5c5 100644 --- a/mls-rs/tests/client_tests.rs +++ b/mls-rs/tests/client_tests.rs @@ -164,7 +164,10 @@ async fn test_create( ) { let alice = generate_client(cipher_suite, protocol_version, 0, encrypt_controls).await; let bob = generate_client(cipher_suite, protocol_version, 1, encrypt_controls).await; - let bob_key_pkg = bob.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); + let bob_key_pkg = bob + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(); // Alice creates a group and adds bob let mut alice_group = alice @@ -601,8 +604,14 @@ async fn reinit_works() { let bob1 = generate_client(suite1, version, 2, Default::default()).await; // Create a group with 2 parties - let mut alice_group = alice1.create_group(Default::default(), Default::default()).await.unwrap(); - let kp = bob1.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); + let mut alice_group = alice1 + .create_group(Default::default(), Default::default()) + .await + .unwrap(); + let kp = bob1 + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(); let welcome = &alice_group .commit_builder() @@ -696,7 +705,10 @@ async fn reinit_works() { // They can talk let carol = generate_client(suite2, version, 3, Default::default()).await; - let kp = carol.generate_key_package_message(Default::default(), Default::default()).await.unwrap(); + let kp = carol + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(); let commit_output = alice_group .commit_builder() From 44a81f94ce0e333dc61993ebf4fe26db0448b1fe Mon Sep 17 00:00:00 2001 From: Caio Sym Date: Thu, 3 Oct 2024 12:50:45 +0100 Subject: [PATCH 5/6] Remove TODO on Renit Client as WONT DO is the conclusion --- mls-rs/src/group/resumption.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/mls-rs/src/group/resumption.rs b/mls-rs/src/group/resumption.rs index a8041fc0..8e1053c1 100644 --- a/mls-rs/src/group/resumption.rs +++ b/mls-rs/src/group/resumption.rs @@ -190,7 +190,6 @@ impl ReinitClient { extensions: self.reinit.new_group_context_extensions(), }; - // TODO, should these come from the reinit proposal or as an arg instead? let group = self.client.load_group(self.reinit.group_id())?; let current_leaf_node_extensions = &group.current_user_leaf_node()?.extensions; From 76507940363dc778dda879d03c1d77a6eefc6de6 Mon Sep 17 00:00:00 2001 From: Caio Sym Date: Thu, 3 Oct 2024 17:52:24 +0100 Subject: [PATCH 6/6] Fix unit tests breaking due to grease --- mls-rs/src/group/commit.rs | 4 ++-- mls-rs/src/group/mod.rs | 2 +- mls-rs/src/group/resumption.rs | 8 +++----- mls-rs/src/group/test_utils.rs | 1 - mls-rs/test_harness_integration/src/branch_reinit.rs | 4 +++- mls-rs/tests/client_tests.rs | 2 +- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/mls-rs/src/group/commit.rs b/mls-rs/src/group/commit.rs index 2451826a..708222d5 100644 --- a/mls-rs/src/group/commit.rs +++ b/mls-rs/src/group/commit.rs @@ -568,12 +568,12 @@ where // parent_hash extension. let new_leaf_node_extensions = - new_leaf_node_extensions.or(external_leaf.map(|ln| ln.extensions.clone())); + new_leaf_node_extensions.or(external_leaf.map(|ln| ln.ungreased_extensions())); let new_leaf_node_extensions = match new_leaf_node_extensions { Some(extensions) => extensions, // If we are not setting new extensions and this is not an external leaf then the current node MUST exist. - None => self.current_user_leaf_node()?.extensions.clone(), + None => self.current_user_leaf_node()?.ungreased_extensions(), }; let encap_gen = TreeKem::new( diff --git a/mls-rs/src/group/mod.rs b/mls-rs/src/group/mod.rs index 5349035e..d2ce6ba6 100644 --- a/mls-rs/src/group/mod.rs +++ b/mls-rs/src/group/mod.rs @@ -859,7 +859,7 @@ where let mut new_leaf_node: LeafNode = self.current_user_leaf_node()?.clone(); let new_leaf_node_extensions = - leaf_node_extensions.unwrap_or(new_leaf_node.extensions.clone()); + leaf_node_extensions.unwrap_or(new_leaf_node.ungreased_extensions()); let secret_key = new_leaf_node .update( &self.cipher_suite_provider, diff --git a/mls-rs/src/group/resumption.rs b/mls-rs/src/group/resumption.rs index 8e1053c1..f6180d81 100644 --- a/mls-rs/src/group/resumption.rs +++ b/mls-rs/src/group/resumption.rs @@ -57,7 +57,7 @@ where extensions: &self.group_state().context.extensions, }; - let current_leaf_node_extensions = &self.current_user_leaf_node()?.extensions; + let current_leaf_node_extensions = &self.current_user_leaf_node()?.ungreased_extensions(); resumption_create_group( self.config.clone(), new_key_packages, @@ -182,6 +182,7 @@ impl ReinitClient { pub async fn commit( self, new_key_packages: Vec, + new_leaf_node_extensions: ExtensionList, ) -> Result<(Group, Vec), MlsError> { let new_group_params = ResumptionGroupParameters { group_id: self.reinit.group_id(), @@ -190,9 +191,6 @@ impl ReinitClient { extensions: self.reinit.new_group_context_extensions(), }; - let group = self.client.load_group(self.reinit.group_id())?; - let current_leaf_node_extensions = &group.current_user_leaf_node()?.extensions; - resumption_create_group( self.client.config.clone(), new_key_packages, @@ -200,7 +198,7 @@ impl ReinitClient { // These private fields are created with `Some(x)` by `get_reinit_client` self.client.signing_identity.unwrap().0, self.client.signer.unwrap(), - current_leaf_node_extensions, + &new_leaf_node_extensions, #[cfg(any(feature = "private_message", feature = "psk"))] self.psk_input, ) diff --git a/mls-rs/src/group/test_utils.rs b/mls-rs/src/group/test_utils.rs index de272901..0cee427f 100644 --- a/mls-rs/src/group/test_utils.rs +++ b/mls-rs/src/group/test_utils.rs @@ -246,7 +246,6 @@ pub(crate) async fn test_group_custom( let commit_options = commit_options.unwrap_or_default(); let (signing_identity, secret_key) = get_test_signing_identity(cipher_suite, b"member").await; - let group = TestClientBuilder::new_for_test() .mls_rules(DefaultMlsRules::default().with_commit_options(commit_options)) .extension_types(extension_types) diff --git a/mls-rs/test_harness_integration/src/branch_reinit.rs b/mls-rs/test_harness_integration/src/branch_reinit.rs index 8fcecee2..379757ba 100644 --- a/mls-rs/test_harness_integration/src/branch_reinit.rs +++ b/mls-rs/test_harness_integration/src/branch_reinit.rs @@ -174,7 +174,9 @@ pub(crate) mod inner { ) .map_err(abort)?; - client.commit(new_key_pkgs).map_err(abort)? + client + .commit(new_key_pkgs, Default::default()) + .map_err(abort)? }; let welcome = welcome diff --git a/mls-rs/tests/client_tests.rs b/mls-rs/tests/client_tests.rs index f907b5c5..745251ce 100644 --- a/mls-rs/tests/client_tests.rs +++ b/mls-rs/tests/client_tests.rs @@ -697,7 +697,7 @@ async fn reinit_works() { // Bob produces key package, alice commits, bob joins let kp = bob2.generate_key_package().await.unwrap(); - let (mut alice_group, welcome) = alice2.commit(vec![kp]).await.unwrap(); + let (mut alice_group, welcome) = alice2.commit(vec![kp], Default::default()).await.unwrap(); let (mut bob_group, _) = bob2.join(&welcome[0], None).await.unwrap(); assert!(bob_group.cipher_suite() == suite2);