diff --git a/mls-rs-uniffi/src/lib.rs b/mls-rs-uniffi/src/lib.rs index f37ca887..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().await?; + let message = self + .inner + .generate_key_package_message(Default::default(), Default::default()) + .await?; Ok(message.into()) } @@ -403,10 +406,14 @@ 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, Default::default()) .await? } - None => self.inner.create_group(extensions).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..3a9413ca 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(), Default::default()) .unwrap() }) .collect::>(); diff --git a/mls-rs/examples/basic_server_usage.rs b/mls-rs/examples/basic_server_usage.rs index fba71da5..38fb9ecd 100644 --- a/mls-rs/examples/basic_server_usage.rs +++ b/mls-rs/examples/basic_server_usage.rs @@ -140,8 +140,9 @@ 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(), 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..78ecd3bd 100644 --- a/mls-rs/examples/basic_usage.rs +++ b/mls-rs/examples/basic_usage.rs @@ -44,10 +44,11 @@ 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(), 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..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)?; + 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(), 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()?; + 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 c4377437..fcdd2bba 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,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()?; + 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 @@ -100,7 +101,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 +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()?; + 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 42316cef..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()).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..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) -> Result { - Ok(self.generate_key_package().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) -> 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,8 +465,8 @@ where .generate( self.config.lifetime(), self.config.capabilities(), - self.config.key_package_extensions(), - self.config.leaf_node_extensions(), + key_package_extensions, + leaf_node_extensions, ) .await?; @@ -486,6 +497,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 +508,7 @@ where self.version, signing_identity.clone(), group_context_extensions, + leaf_node_extensions, self.signer()?.clone(), ) .await @@ -510,6 +523,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 +534,7 @@ where self.version, signing_identity.clone(), group_context_extensions, + leaf_node_extensions, self.signer()?.clone(), ) .await @@ -674,6 +689,8 @@ 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; @@ -702,7 +719,10 @@ where ) .await?; - let key_package = self.generate_key_package().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(()) @@ -745,11 +765,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 { @@ -793,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, |_| {}).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)] @@ -801,6 +824,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 @@ -816,7 +841,10 @@ 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(key_package_extensions, leaf_node_extensions) + .await + .unwrap(); (client, key_package) } @@ -863,7 +891,10 @@ 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(Default::default(), Default::default()) + .await + .unwrap(); assert_eq!(key_package.version, protocol_version); @@ -902,6 +933,8 @@ mod tests { &alice_group.group_info_message(true).await.unwrap(), None, vec![], + Default::default(), + Default::default(), ) .await .unwrap(); @@ -1047,7 +1080,10 @@ 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(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 186c4369..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, @@ -297,56 +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) - } - - /// 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(); @@ -733,14 +683,6 @@ where self.crypto_provider.clone() } - fn key_package_extensions(&self) -> ExtensionList { - 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(); @@ -840,14 +782,6 @@ impl ClientConfig for T { self.get().crypto_provider() } - fn key_package_extensions(&self) -> ExtensionList { - self.get().key_package_extensions() - } - - fn leaf_node_extensions(&self) -> ExtensionList { - self.get().leaf_node_extensions() - } - fn lifetime(&self) -> Lifetime { self.get().lifetime() } @@ -870,8 +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) leaf_node_extensions: ExtensionList, pub(crate) lifetime_in_s: u64, #[cfg(any(test, feature = "test_util"))] pub(crate) key_package_not_before: Option, @@ -882,8 +814,6 @@ impl Default for Settings { Self { 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"))] @@ -903,8 +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(), - leaf_node_extensions: c.leaf_node_extensions(), lifetime_in_s: { let l = c.lifetime(); l.not_after - l.not_before @@ -979,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/client_config.rs b/mls-rs/src/client_config.rs index 339f335a..430013a1 100644 --- a/mls-rs/src/client_config.rs +++ b/mls-rs/src/client_config.rs @@ -37,8 +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 leaf_node_extensions(&self) -> ExtensionList; fn lifetime(&self) -> Lifetime; fn capabilities(&self) -> Capabilities { @@ -59,10 +57,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..708222d5 100644 --- a/mls-rs/src/group/commit.rs +++ b/mls-rs/src/group/commit.rs @@ -178,6 +178,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 +327,14 @@ 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 +354,7 @@ where self.group_info_extensions, self.new_signer, self.new_signing_identity, + self.new_leaf_node_extensions, ) .await?; @@ -368,6 +378,7 @@ where self.group_info_extensions, self.new_signer, self.new_signing_identity, + self.new_leaf_node_extensions, ) .await?; @@ -452,11 +463,13 @@ where group_info_extensions: Default::default(), new_signer: Default::default(), new_signing_identity: Default::default(), + new_leaf_node_extensions: Default::default(), } } /// 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, @@ -466,6 +479,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 +566,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.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()?.ungreased_extensions(), + }; + let encap_gen = TreeKem::new( &mut provisional_state.public_tree, &mut provisional_private_tree, @@ -560,7 +584,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 +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()).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(), Default::default()) + .await + .unwrap(); let mut extension_list = ExtensionList::new(); let extension = TestExtension { foo: b'a' }; @@ -1443,7 +1473,11 @@ mod tests { alice .commit_builder() - .add_member(alex.generate_key_package_message().await.unwrap()) + .add_member( + alex.generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(), + ) .unwrap() .set_group_context_ext(extension_list.clone()) .unwrap() @@ -1456,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()).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..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, identity::SigningIdentity}; +use mls_rs_core::{ + crypto::SignatureSecretKey, extension::ExtensionList, identity::SigningIdentity, +}; use crate::{ client_config::ClientConfig, @@ -46,6 +48,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 +73,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 +144,14 @@ 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, + ..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 +186,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 +266,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..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().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().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()).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().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/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..d2ce6ba6 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, @@ -296,13 +297,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 +811,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 +841,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 +853,19 @@ 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.ungreased_extensions()); 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), ) @@ -2352,13 +2357,9 @@ mod tests { TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE, "bob", - |config| { - config - .0 - .settings - .key_package_extensions - .set(LastResortKeyPackageExt.into_extension().unwrap()) - }, + vec![LastResortKeyPackageExt.into_extension().unwrap()].into(), + Default::default(), + |_| {}, ) .await; let mut carla_group = test_group(TEST_PROTOCOL_VERSION, TEST_CIPHER_SUITE).await; @@ -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()) + .create_group( + core::iter::once(required_caps.into_extension().unwrap()).collect(), + Default::default(), + ) .await } @@ -2550,7 +2554,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 +2957,7 @@ mod tests { Some((bob_identity, TEST_CIPHER_SUITE)), TEST_PROTOCOL_VERSION, ) - .generate_key_package_message() + .generate_key_package_message(Default::default(), Default::default()) .await .unwrap(); @@ -3472,7 +3476,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 +3512,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 +3544,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 +3895,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 +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().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().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().await.unwrap()) + .add_member( + dave_client + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(), + ) .unwrap() .build() .await @@ -4041,7 +4060,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 +4068,7 @@ mod tests { let kp = client_with_custom_rules(b"bob", mls_rules) .await - .generate_key_package_message() + .generate_key_package_message(Default::default(), Default::default()) .await .unwrap(); @@ -4095,7 +4114,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 +4149,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(); @@ -4276,12 +4295,17 @@ 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; 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..f6180d81 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()?.ungreased_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,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().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 @@ -178,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(), @@ -193,6 +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(), + &new_leaf_node_extensions, #[cfg(any(feature = "private_message", feature = "psk"))] self.psk_input, ) @@ -236,6 +242,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 +253,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..0cee427f 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)] @@ -79,6 +79,8 @@ impl TestGroup { self.protocol_version(), self.cipher_suite(), name, + Default::default(), + Default::default(), &mut config, ) .await @@ -244,16 +246,14 @@ 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() - .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 +291,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 +346,23 @@ 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(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 9ec143ef..acade019 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,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(ExtensionList::new()).unwrap(); + let mut alice = alice + .create_group(Default::default(), Default::default()) + .unwrap(); alice .commit_builder() - .add_member(bob.generate_key_package_message().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 d7c238b2..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()).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().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/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/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/test_harness_integration/src/by_ref_proposal.rs b/mls-rs/test_harness_integration/src/by_ref_proposal.rs index ae51d504..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![]) + .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 e7f890d3..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()) + .create_group_with_id( + request.group_id, + ExtensionList::default(), + Default::default(), + ) .map_err(abort)?; client.group = Some(group); @@ -236,7 +240,7 @@ impl MlsClient for MlsClientImpl { let key_package = client .client - .generate_key_package_message() + .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 5c976022..745251ce 100644 --- a/mls-rs/tests/client_tests.rs +++ b/mls-rs/tests/client_tests.rs @@ -164,11 +164,14 @@ 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(), 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 +493,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 +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(ExtensionList::new()).await.unwrap(); - let kp = bob1.generate_key_package_message().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() @@ -688,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); @@ -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().await.unwrap(); + let kp = carol + .generate_key_package_message(Default::default(), Default::default()) + .await + .unwrap(); let commit_output = alice_group .commit_builder() @@ -806,7 +818,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(), Default::default()) .await .unwrap() }