Skip to content

Commit 528edab

Browse files
committed
test: clients triggering duplicate signature error when adding members
1 parent ca6003c commit 528edab

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

crypto/src/mls/conversation/commit.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ mod tests {
110110
use std::sync::Arc;
111111

112112
use super::*;
113+
use crate::Credential;
113114

114115
#[apply(all_cred_cipher)]
115116
async fn can_add_members_to_conversation(case: TestContext) {
@@ -158,6 +159,50 @@ mod tests {
158159
.await
159160
}
160161

162+
#[apply(all_cred_cipher)]
163+
async fn should_fail_on_duplicate_signatures(case: TestContext) {
164+
let [alice, bob, carol] = case.sessions().await;
165+
Box::pin(async move {
166+
let conversation = case.create_conversation([&alice]).await;
167+
let id = conversation.id.clone();
168+
let bob_keypackage = bob.new_keypackage(&case).await;
169+
let signature_key_pair = bob
170+
.find_any_credential(case.ciphersuite(), case.credential_type)
171+
.await
172+
.signature_key_pair
173+
.clone();
174+
let credential = Credential {
175+
ciphersuite: case.ciphersuite(),
176+
credential_type: CredentialType::Basic,
177+
mls_credential: openmls::credentials::Credential::new_basic(
178+
carol.get_client_id().await.into_inner(),
179+
),
180+
signature_key_pair,
181+
earliest_validity: 0,
182+
};
183+
let cred_ref = carol.add_credential(credential).await.unwrap();
184+
let carol_key_package = carol.new_keypackage_from_ref(cred_ref, None).await;
185+
let _affected_clients = [(carol.get_client_id().await, bob.get_client_id().await)];
186+
187+
let error = alice
188+
.transaction
189+
.conversation(&id)
190+
.await
191+
.unwrap()
192+
.add_members(vec![bob_keypackage.clone().into(), carol_key_package.clone().into()])
193+
.await
194+
.unwrap_err();
195+
196+
assert!(matches!(
197+
error,
198+
Error::DuplicateSignature {
199+
affected_clients: _affected_clients
200+
}
201+
));
202+
})
203+
.await
204+
}
205+
161206
#[apply(all_cred_cipher)]
162207
async fn should_return_valid_welcome(case: TestContext) {
163208
let [alice, bob] = case.sessions().await;

crypto/src/test_utils/context.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@ impl SessionContext {
4444
.unwrap()
4545
}
4646

47+
pub async fn new_keypackage_from_ref(
48+
&self,
49+
credential_ref: CredentialRef,
50+
lifetime: Option<std::time::Duration>,
51+
) -> KeyPackage {
52+
self.transaction
53+
.generate_keypackage(&credential_ref, lifetime)
54+
.await
55+
.unwrap()
56+
}
57+
4758
pub async fn count_key_package(&self, cs: Ciphersuite, ct: Option<CredentialType>) -> usize {
4859
self.transaction
4960
.database()
@@ -125,6 +136,10 @@ impl SessionContext {
125136
self.session().await.find_credential_by_public_key(pk).await.ok()
126137
}
127138

139+
pub async fn add_credential(&self, credential: Credential) -> Option<CredentialRef> {
140+
self.transaction.add_credential(credential).await.ok()
141+
}
142+
128143
pub async fn find_hpke_private_key_from_keystore(&self, skp: &HpkePublicKey) -> Option<StoredHpkePrivateKey> {
129144
self.transaction
130145
.database()

0 commit comments

Comments
 (0)