Revision control
Copy as Markdown
Other Tools
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<BasicIdentityProvider, WithCryptoProvider<MlsCryptoProvider, BaseConfig>>;
pub static GROUP: Lazy<Mutex<Group<TestClientConfig>>> = Lazy::new(|| Mutex::new(create_group()));
pub fn create_group() -> Group<TestClientConfig> {
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<u8>,
epoch: u64,
authenticated_data: Vec<u8>,
) -> Result<MlsMessage, MlsError> {
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<TestClientConfig> {
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)
}