use std::sync::Mutex; use mls_rs_core::{ crypto::{CipherSuiteProvider, CryptoProvider, SignatureSecretKey}, identity::BasicCredential, }; use once_cell::sync::Lazy; use crate::{ cipher_suite::CipherSuite, client::MlsError, client_builder::{BaseConfig, WithCryptoProvider, WithIdentityProvider}, group::{ framing::{Content, MlsMessage, Sender, WireFormat}, message_processor::MessageProcessor, message_signature::AuthenticatedContent, Commit, Group, }, identity::{basic::BasicIdentityProvider, SigningIdentity}, Client, ExtensionList, }; #[cfg(awslc)] pub use mls_rs_crypto_awslc::AwsLcCryptoProvider as MlsCryptoProvider; #[cfg(not(any(awslc, rustcrypto)))] pub use mls_rs_crypto_openssl::OpensslCryptoProvider as MlsCryptoProvider; #[cfg(rustcrypto)] pub use mls_rs_crypto_rustcrypto::RustCryptoProvider as MlsCryptoProvider; pub type TestClientConfig = WithIdentityProvider>; pub static GROUP: Lazy>> = Lazy::new(|| Mutex::new(create_group())); pub fn create_group() -> Group { let cipher_suite = CipherSuite::CURVE25519_AES128; let alice = make_client(cipher_suite, "alice"); let bob = make_client(cipher_suite, "bob"); let mut alice = alice.create_group(ExtensionList::new()).unwrap(); alice .commit_builder() .add_member(bob.generate_key_package_message().unwrap()) .unwrap() .build() .unwrap(); alice.apply_pending_commit().unwrap(); alice } pub fn create_fuzz_commit_message( group_id: Vec, epoch: u64, authenticated_data: Vec, ) -> Result { let mut group = GROUP.lock().unwrap(); let mut context = group.context().clone(); context.group_id = group_id; context.epoch = epoch; #[cfg(feature = "private_message")] let wire_format = WireFormat::PrivateMessage; #[cfg(not(feature = "private_message"))] let wire_format = WireFormat::PublicMessage; let auth_content = AuthenticatedContent::new_signed( group.cipher_suite_provider(), &context, Sender::Member(0), Content::Commit(alloc::boxed::Box::new(Commit { proposals: Vec::new(), path: None, })), &group.signer, wire_format, authenticated_data, )?; group.format_for_wire(auth_content) } fn make_client(cipher_suite: CipherSuite, name: &str) -> Client { let (secret, signing_identity) = make_identity(cipher_suite, name); // TODO : consider fuzzing on encrypted controls (doesn't seem very useful) Client::builder() .identity_provider(BasicIdentityProvider) .crypto_provider(MlsCryptoProvider::default()) .signing_identity(signing_identity, secret, cipher_suite) .build() } fn make_identity(cipher_suite: CipherSuite, name: &str) -> (SignatureSecretKey, SigningIdentity) { let cipher_suite = MlsCryptoProvider::new() .cipher_suite_provider(cipher_suite) .unwrap(); let (secret, public) = cipher_suite.signature_key_generate().unwrap(); let basic_identity = BasicCredential::new(name.as_bytes().to_vec()); let signing_identity = SigningIdentity::new(basic_identity.into_credential(), public); (secret, signing_identity) }