Revision control

Copy as Markdown

Other Tools

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// Copyright by contributors to this project.
// SPDX-License-Identifier: (Apache-2.0 OR MIT)
use criterion::{BatchSize, BenchmarkId, Criterion};
use mls_rs::{
client_builder::MlsConfig,
identity::{
basic::{BasicCredential, BasicIdentityProvider},
SigningIdentity,
},
mls_rules::{CommitOptions, DefaultMlsRules},
CipherSuite, CipherSuiteProvider, Client, CryptoProvider,
};
use mls_rs_crypto_openssl::OpensslCryptoProvider;
fn bench(c: &mut Criterion) {
let alice = make_client("alice")
.create_group(Default::default())
.unwrap();
const MAX_ADD_COUNT: usize = 1000;
let key_packages = (0..MAX_ADD_COUNT)
.map(|i| {
make_client(&format!("bob-{i}"))
.generate_key_package_message()
.unwrap()
})
.collect::<Vec<_>>();
let mut group = c.benchmark_group("group_add");
std::iter::successors(Some(1), |&i| Some(i * 10))
.take_while(|&i| i <= MAX_ADD_COUNT)
.for_each(|size| {
group.bench_with_input(BenchmarkId::from_parameter(size), &size, |b, &size| {
b.iter_batched_ref(
|| alice.clone(),
|alice| {
key_packages[..size]
.iter()
.cloned()
.fold(alice.commit_builder(), |builder, key_package| {
builder.add_member(key_package).unwrap()
})
.build()
.unwrap();
},
BatchSize::SmallInput,
);
});
});
group.finish();
}
criterion::criterion_group!(benches, bench);
criterion::criterion_main!(benches);
fn make_client(name: &str) -> Client<impl MlsConfig> {
let crypto_provider = OpensslCryptoProvider::new();
let cipher_suite = CipherSuite::CURVE25519_AES128;
let (secret_key, public_key) = crypto_provider
.cipher_suite_provider(cipher_suite)
.unwrap()
.signature_key_generate()
.unwrap();
Client::builder()
.crypto_provider(crypto_provider)
.identity_provider(BasicIdentityProvider)
.mls_rules(
DefaultMlsRules::new()
.with_commit_options(CommitOptions::new().with_ratchet_tree_extension(false)),
)
.signing_identity(
SigningIdentity::new(
BasicCredential::new(name.as_bytes().to_vec()).into_credential(),
public_key,
),
secret_key,
cipher_suite,
)
.build()
}