Skip to content

Commit

Permalink
Fix interop test generation (#113)
Browse files Browse the repository at this point in the history
* Fix interop test generation

* Fixup

* Update mls-rs/src/client_builder.rs

Co-authored-by: Stephane Raux <94983192+stefunctional@users.noreply.github.com>

* Fixup

---------

Co-authored-by: Marta Mularczyk <mulmarta@amazon.com>
Co-authored-by: Stephane Raux <94983192+stefunctional@users.noreply.github.com>
  • Loading branch information
3 people authored Mar 14, 2024
1 parent 23189d0 commit 4383d08
Show file tree
Hide file tree
Showing 8 changed files with 19,578 additions and 3,964 deletions.
22 changes: 22 additions & 0 deletions mls-rs/src/client_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,16 @@ impl<C: IntoConfig> ClientBuilder<C> {
c.0.signer = Some(signer);
ClientBuilder(c)
}

#[cfg(any(test, feature = "test_util"))]
pub(crate) fn key_package_not_before(
self,
key_package_not_before: u64,
) -> ClientBuilder<IntoConfigOutput<C>> {
let mut c = self.0.into_config();
c.0.settings.key_package_not_before = Some(key_package_not_before);
ClientBuilder(c)
}
}

impl<C: IntoConfig> ClientBuilder<C>
Expand Down Expand Up @@ -738,6 +748,12 @@ where
#[cfg(not(feature = "std"))]
let now_timestamp = 0;

#[cfg(test)]
let now_timestamp = self
.settings
.key_package_not_before
.unwrap_or(now_timestamp);

Lifetime {
not_before: now_timestamp,
not_after: now_timestamp + self.settings.lifetime_in_s,
Expand Down Expand Up @@ -857,6 +873,8 @@ pub(crate) struct Settings {
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<u64>,
}

impl Default for Settings {
Expand All @@ -868,6 +886,8 @@ impl Default for Settings {
leaf_node_extensions: Default::default(),
lifetime_in_s: 365 * 24 * 3600,
custom_proposal_types: Default::default(),
#[cfg(any(test, feature = "test_util"))]
key_package_not_before: None,
}
}
}
Expand All @@ -889,6 +909,8 @@ pub(crate) fn recreate_config<T: ClientConfig>(
let l = c.lifetime();
l.not_after - l.not_before
},
#[cfg(any(test, feature = "test_util"))]
key_package_not_before: None,
},
key_package_repo: c.key_package_repo(),
psk_store: c.secret_store(),
Expand Down
79 changes: 66 additions & 13 deletions mls-rs/src/group/interop_test_vectors/passive_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use mls_rs_core::{
identity::SigningIdentity,
protocol_version::ProtocolVersion,
psk::ExternalPskId,
time::MlsTime,
};
use rand::{seq::IteratorRandom, Rng, SeedableRng};

Expand All @@ -26,11 +27,17 @@ use crate::{
all_process_message, generate_basic_client, get_test_basic_credential, get_test_groups,
make_test_ext_psk, TEST_EXT_PSK_ID,
},
tree_kem::Lifetime,
Client, Group, MlsMessage,
};

const VERSION: ProtocolVersion = ProtocolVersion::MLS_10;

const ETERNAL_LIFETIME: Lifetime = Lifetime {
not_before: 0,
not_after: u64::MAX,
};

#[derive(serde::Serialize, serde::Deserialize, Debug, Default, Clone)]
pub struct TestCase {
pub cipher_suite: u16,
Expand Down Expand Up @@ -198,11 +205,19 @@ async fn interop_passive_client() {
for epoch in test_case.epochs {
for proposal in epoch.proposals.iter() {
let message = MlsMessage::from_bytes(&proposal.0).unwrap();
group.process_incoming_message(message).await.unwrap();

group
.process_incoming_message_with_time(message, MlsTime::now())
.await
.unwrap();
}

let message = MlsMessage::from_bytes(&epoch.commit).unwrap();
group.process_incoming_message(message).await.unwrap();

group
.process_incoming_message_with_time(message, MlsTime::now())
.await
.unwrap();

assert_eq!(
epoch.epoch_authenticator,
Expand Down Expand Up @@ -230,6 +245,8 @@ async fn invite_passive_client<P: CipherSuiteProvider>(
.crypto_provider(crypto_provider)
.identity_provider(BasicIdentityProvider::new())
.key_package_repo(key_package_repo.clone())
.key_package_lifetime(ETERNAL_LIFETIME.not_after - ETERNAL_LIFETIME.not_before)
.key_package_not_before(ETERNAL_LIFETIME.not_before)
.signing_identity(identity.clone(), secret_key.clone(), cs.cipher_suite())
.build();

Expand Down Expand Up @@ -273,7 +290,7 @@ async fn invite_passive_client<P: CipherSuiteProvider>(

#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
#[cfg_attr(coverage_nightly, coverage(off))]
pub async fn generate_passive_client_proposal_tests() {
pub async fn generate_passive_client_proposal_tests() -> Vec<TestCase> {
let mut test_cases: Vec<TestCase> = vec![];

for cs in CipherSuite::all() {
Expand All @@ -285,7 +302,7 @@ pub async fn generate_passive_client_proposal_tests() {
let mut groups =
get_test_groups(VERSION, cs.cipher_suite(), 7, None, false, &crypto_provider).await;

let mut partial_test_case = invite_passive_client(&mut groups, false, &cs).await;
let mut partial_test_case = invite_passive_client(&mut groups, true, &cs).await;

// Create a new epoch s.t. the passive member can process resumption PSK from the current one
let commit = groups[0].commit(vec![]).await.unwrap();
Expand Down Expand Up @@ -434,6 +451,8 @@ pub async fn generate_passive_client_proposal_tests() {
test_case.epochs.push(epoch);
test_cases.push(test_case);
}

test_cases
}

#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
Expand All @@ -459,15 +478,23 @@ where
#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
#[cfg_attr(coverage_nightly, coverage(off))]
async fn create_key_package(cs: CipherSuite) -> MlsMessage {
let client =
generate_basic_client(cs, VERSION, 0xbeef, None, false, &TestCryptoProvider::new()).await;
let client = generate_basic_client(
cs,
VERSION,
0xbeef,
None,
false,
&TestCryptoProvider::new(),
Some(ETERNAL_LIFETIME),
)
.await;

client.generate_key_package_message().await.unwrap()
}

#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
#[cfg_attr(coverage_nightly, coverage(off))]
pub async fn generate_passive_client_welcome_tests() {
pub async fn generate_passive_client_welcome_tests() -> Vec<TestCase> {
let mut test_cases: Vec<TestCase> = vec![];

for cs in CipherSuite::all() {
Expand Down Expand Up @@ -508,11 +535,13 @@ pub async fn generate_passive_client_welcome_tests() {
}
}
}

test_cases
}

#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
#[cfg_attr(coverage_nightly, coverage(off))]
pub async fn generate_passive_client_random_tests() {
pub async fn generate_passive_client_random_tests() -> Vec<TestCase> {
let mut test_cases: Vec<TestCase> = vec![];

for cs in CipherSuite::all() {
Expand All @@ -521,15 +550,29 @@ pub async fn generate_passive_client_random_tests() {
continue;
};

let creator = generate_basic_client(cs, VERSION, 0, None, false, &crypto).await;
let creator =
generate_basic_client(cs, VERSION, 0, None, false, &crypto, Some(ETERNAL_LIFETIME))
.await;

let creator_group = creator.create_group(Default::default()).await.unwrap();

let mut groups = vec![creator_group];

let mut new_clients = Vec::new();

for i in 0..10 {
new_clients.push(generate_basic_client(cs, VERSION, i + 1, None, false, &crypto).await)
new_clients.push(
generate_basic_client(
cs,
VERSION,
i + 1,
None,
false,
&crypto,
Some(ETERNAL_LIFETIME),
)
.await,
)
}

add_random_members(0, &mut groups, new_clients, None).await;
Expand All @@ -543,7 +586,7 @@ pub async fn generate_passive_client_random_tests() {
#[cfg(feature = "std")]
println!("generating random commits for seed {}", hex::encode(seed));

let mut next_free_idx = 0;
let mut next_free_idx = 11;
for _ in 0..100 {
// We keep the passive client and another member to send
let num_removed = rng.gen_range(0..groups.len() - 2);
Expand All @@ -566,8 +609,16 @@ pub async fn generate_passive_client_random_tests() {

for i in 0..num_added {
new_clients.push(
generate_basic_client(cs, VERSION, next_free_idx + i, None, false, &crypto)
.await,
generate_basic_client(
cs,
VERSION,
next_free_idx + i,
None,
false,
&crypto,
Some(ETERNAL_LIFETIME),
)
.await,
);
}

Expand All @@ -578,6 +629,8 @@ pub async fn generate_passive_client_random_tests() {

test_cases.push(test_case);
}

test_cases
}

#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
Expand Down
2 changes: 2 additions & 0 deletions mls-rs/src/test_utils/benchmarks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ pub async fn join_group(cs: CipherSuite, group_info: MlsMessage) -> GroupStates<
None,
false,
&MlsCryptoProvider::new(),
None,
);

let mut sender = client.commit_external(group_info).await.unwrap().0;
Expand All @@ -124,6 +125,7 @@ pub async fn join_group(cs: CipherSuite, group_info: MlsMessage) -> GroupStates<
None,
false,
&MlsCryptoProvider::new(),
None,
);

let group_info = sender
Expand Down
17 changes: 14 additions & 3 deletions mls-rs/src/test_utils/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use crate::{
client_builder::{ClientBuilder, MlsConfig},
identity::basic::BasicIdentityProvider,
mls_rules::{CommitOptions, DefaultMlsRules},
tree_kem::Lifetime,
Client, Group, MlsMessage,
};

Expand Down Expand Up @@ -59,6 +60,7 @@ pub async fn generate_basic_client<C: CryptoProvider + Clone>(
#[cfg(feature = "private_message")] encrypt_controls: bool,
#[cfg(not(feature = "private_message"))] _encrypt_controls: bool,
crypto: &C,
lifetime: Option<Lifetime>,
) -> Client<impl MlsConfig> {
let cs = crypto.cipher_suite_provider(cipher_suite).unwrap();

Expand All @@ -77,7 +79,7 @@ pub async fn generate_basic_client<C: CryptoProvider + Clone>(
mls_rules
};

ClientBuilder::new()
let mut builder = ClientBuilder::new()
.crypto_provider(crypto.clone())
.identity_provider(BasicIdentityProvider::new())
.mls_rules(mls_rules)
Expand All @@ -86,8 +88,15 @@ pub async fn generate_basic_client<C: CryptoProvider + Clone>(
make_test_ext_psk().into(),
)
.used_protocol_version(protocol_version)
.signing_identity(identity, secret_key, cipher_suite)
.build()
.signing_identity(identity, secret_key, cipher_suite);

if let Some(lifetime) = lifetime {
builder = builder
.key_package_lifetime(lifetime.not_after - lifetime.not_before)
.key_package_not_before(lifetime.not_before);
}

builder.build()
}

#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
Expand All @@ -108,6 +117,7 @@ pub async fn get_test_groups<C: CryptoProvider + Clone>(
commit_options,
encrypt_controls,
crypto,
None,
)
.await;

Expand All @@ -124,6 +134,7 @@ pub async fn get_test_groups<C: CryptoProvider + Clone>(
commit_options,
encrypt_controls,
crypto,
None,
)
.await;
let kp = client.generate_key_package_message().await.unwrap();
Expand Down
Loading

0 comments on commit 4383d08

Please sign in to comment.