1 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2 // Copyright by contributors to this project.
3 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
4 
5 use criterion::{BatchSize, BenchmarkId, Criterion};
6 use mls_rs::{
7     client_builder::MlsConfig,
8     identity::{
9         basic::{BasicCredential, BasicIdentityProvider},
10         SigningIdentity,
11     },
12     mls_rules::{CommitOptions, DefaultMlsRules},
13     CipherSuite, CipherSuiteProvider, Client, CryptoProvider,
14 };
15 use mls_rs_crypto_openssl::OpensslCryptoProvider;
16 
bench(c: &mut Criterion)17 fn bench(c: &mut Criterion) {
18     let alice = make_client("alice")
19         .create_group(Default::default())
20         .unwrap();
21 
22     const MAX_ADD_COUNT: usize = 1000;
23 
24     let key_packages = (0..MAX_ADD_COUNT)
25         .map(|i| {
26             make_client(&format!("bob-{i}"))
27                 .generate_key_package_message()
28                 .unwrap()
29         })
30         .collect::<Vec<_>>();
31 
32     let mut group = c.benchmark_group("group_add");
33 
34     std::iter::successors(Some(1), |&i| Some(i * 10))
35         .take_while(|&i| i <= MAX_ADD_COUNT)
36         .for_each(|size| {
37             group.bench_with_input(BenchmarkId::from_parameter(size), &size, |b, &size| {
38                 b.iter_batched_ref(
39                     || alice.clone(),
40                     |alice| {
41                         key_packages[..size]
42                             .iter()
43                             .cloned()
44                             .fold(alice.commit_builder(), |builder, key_package| {
45                                 builder.add_member(key_package).unwrap()
46                             })
47                             .build()
48                             .unwrap();
49                     },
50                     BatchSize::SmallInput,
51                 );
52             });
53         });
54 
55     group.finish();
56 }
57 
58 criterion::criterion_group!(benches, bench);
59 criterion::criterion_main!(benches);
60 
make_client(name: &str) -> Client<impl MlsConfig>61 fn make_client(name: &str) -> Client<impl MlsConfig> {
62     let crypto_provider = OpensslCryptoProvider::new();
63     let cipher_suite = CipherSuite::CURVE25519_AES128;
64 
65     let (secret_key, public_key) = crypto_provider
66         .cipher_suite_provider(cipher_suite)
67         .unwrap()
68         .signature_key_generate()
69         .unwrap();
70 
71     Client::builder()
72         .crypto_provider(crypto_provider)
73         .identity_provider(BasicIdentityProvider)
74         .mls_rules(
75             DefaultMlsRules::new()
76                 .with_commit_options(CommitOptions::new().with_ratchet_tree_extension(false)),
77         )
78         .signing_identity(
79             SigningIdentity::new(
80                 BasicCredential::new(name.as_bytes().to_vec()).into_credential(),
81                 public_key,
82             ),
83             secret_key,
84             cipher_suite,
85         )
86         .build()
87 }
88