Skip to content

Commit 8d7c6e9

Browse files
committed
crypto: Move some test helpers out from sender_data_finder
1 parent 5268bc3 commit 8d7c6e9

File tree

2 files changed

+85
-54
lines changed

2 files changed

+85
-54
lines changed

crates/matrix-sdk-crypto/src/machine/test_helpers.rs

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
//! A set of helper functions for creating [`OlmMachine`]s, and pairs of
1616
//! interconnected machines.
1717
18-
use std::collections::BTreeMap;
18+
use std::{collections::BTreeMap, ops::Deref, sync::Arc};
1919

2020
use as_variant::as_variant;
2121
use matrix_sdk_test::{ruma_response_from_json, test_json};
@@ -32,11 +32,14 @@ use ruma::{
3232
user_id, DeviceId, OwnedOneTimeKeyId, TransactionId, UserId,
3333
};
3434
use serde_json::json;
35+
use tokio::sync::Mutex;
3536

3637
use crate::{
37-
store::{Changes, MemoryStore},
38-
types::{events::ToDeviceEvent, requests::AnyOutgoingRequest},
39-
CrossSigningBootstrapRequests, DeviceData, OlmMachine,
38+
olm::PrivateCrossSigningIdentity,
39+
store::{Changes, CryptoStoreWrapper, MemoryStore},
40+
types::{events::ToDeviceEvent, requests::AnyOutgoingRequest, DeviceKeys},
41+
verification::VerificationMachine,
42+
Account, CrossSigningBootstrapRequests, Device, DeviceData, OlmMachine, OtherUserIdentityData,
4043
};
4144

4245
/// These keys need to be periodically uploaded to the server.
@@ -276,3 +279,69 @@ pub fn bootstrap_requests_to_keys_query_response(
276279

277280
ruma_response_from_json(&kq_response)
278281
}
282+
283+
/// Create a [`VerificationMachine`] which won't do any useful verification.
284+
///
285+
/// Helper for [`create_signed_device_of_unverified_user`] and
286+
/// [`create_unsigned_device`].
287+
fn dummy_verification_machine() -> VerificationMachine {
288+
let account = Account::new(user_id!("@TEST_USER:example.com"));
289+
VerificationMachine::new(
290+
account.deref().clone(),
291+
Arc::new(Mutex::new(PrivateCrossSigningIdentity::new(account.user_id().to_owned()))),
292+
Arc::new(CryptoStoreWrapper::new(
293+
account.user_id(),
294+
account.device_id(),
295+
MemoryStore::new(),
296+
)),
297+
)
298+
}
299+
300+
/// Wrap the given [`DeviceKeys`] into a [`Device`], with no known owner
301+
/// identity.
302+
pub fn create_unsigned_device(device_keys: DeviceKeys) -> Device {
303+
Device {
304+
inner: DeviceData::try_from(&device_keys).unwrap(),
305+
verification_machine: dummy_verification_machine(),
306+
own_identity: None,
307+
device_owner_identity: None,
308+
}
309+
}
310+
311+
/// Sign the given [`DeviceKeys`] with a cross-signing identity, and wrap it up
312+
/// as a [`Device`] with that identity.
313+
pub async fn create_signed_device_of_unverified_user(
314+
mut device_keys: DeviceKeys,
315+
device_owner_identity: &PrivateCrossSigningIdentity,
316+
) -> Device {
317+
{
318+
let self_signing = device_owner_identity.self_signing_key.lock().await;
319+
let self_signing = self_signing.as_ref().unwrap();
320+
self_signing.sign_device(&mut device_keys).unwrap();
321+
}
322+
323+
let public_identity = OtherUserIdentityData::from_private(device_owner_identity).await;
324+
325+
let device = Device {
326+
inner: DeviceData::try_from(&device_keys).unwrap(),
327+
verification_machine: dummy_verification_machine(),
328+
own_identity: None,
329+
device_owner_identity: Some(public_identity.into()),
330+
};
331+
assert!(device.is_cross_signed_by_owner());
332+
device
333+
}
334+
335+
/// Sign a public user identity with our own user-signing key.
336+
pub async fn sign_user_identity_data(
337+
signer_private_identity: &PrivateCrossSigningIdentity,
338+
other_user_identity: &mut OtherUserIdentityData,
339+
) {
340+
let user_signing = signer_private_identity.user_signing_key.lock().await;
341+
342+
let user_signing = user_signing.as_ref().unwrap();
343+
let master = user_signing.sign_user(&*other_user_identity).unwrap();
344+
other_user_identity.master_key = Arc::new(master.try_into().unwrap());
345+
346+
user_signing.public_key().verify_master_key(other_user_identity.master_key()).unwrap();
347+
}

crates/matrix-sdk-crypto/src/olm/group_sessions/sender_data_finder.rs

Lines changed: 12 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,10 @@ mod tests {
381381
use super::SenderDataFinder;
382382
use crate::{
383383
error::MismatchedIdentityKeysError,
384+
machine::test_helpers::{
385+
create_signed_device_of_unverified_user, create_unsigned_device,
386+
sign_user_identity_data,
387+
},
384388
olm::{
385389
group_sessions::sender_data_finder::SessionDeviceKeysCheckError, InboundGroupSession,
386390
KnownSenderData, PrivateCrossSigningIdentity, SenderData,
@@ -394,7 +398,7 @@ mod tests {
394398
EventEncryptionAlgorithm,
395399
},
396400
verification::VerificationMachine,
397-
Account, Device, DeviceData, OtherUserIdentityData, OwnUserIdentityData, UserIdentityData,
401+
Account, Device, OtherUserIdentityData, OwnUserIdentityData, UserIdentityData,
398402
};
399403

400404
impl<'a> SenderDataFinder<'a> {
@@ -828,9 +832,13 @@ mod tests {
828832
let sender = TestUser::other(&me, &options).await;
829833

830834
let sender_device = if options.device_is_signed {
831-
create_signed_device(&sender.account, &*sender.private_identity.lock().await).await
835+
create_signed_device_of_unverified_user(
836+
sender.account.device_keys().clone(),
837+
&*sender.private_identity.lock().await,
838+
)
839+
.await
832840
} else {
833-
create_unsigned_device(&sender.account)
841+
create_unsigned_device(sender.account.device_keys().clone())
834842
};
835843

836844
let store = create_store(&me);
@@ -1008,14 +1016,7 @@ mod tests {
10081016
) {
10091017
if let Some(signer) = signer {
10101018
let signer_private_identity = signer.private_identity.lock().await;
1011-
1012-
let user_signing = signer_private_identity.user_signing_key.lock().await;
1013-
1014-
let user_signing = user_signing.as_ref().unwrap();
1015-
let master = user_signing.sign_user(&*other_user_identity).unwrap();
1016-
other_user_identity.master_key = Arc::new(master.try_into().unwrap());
1017-
1018-
user_signing.public_key().verify_master_key(other_user_identity.master_key()).unwrap();
1019+
sign_user_identity_data(signer_private_identity.deref(), other_user_identity).await;
10191020
} else {
10201021
panic!("You must provide a `signer` if you want an Other to be verified!");
10211022
}
@@ -1025,45 +1026,6 @@ mod tests {
10251026
PrivateCrossSigningIdentity::with_account(account).await.0
10261027
}
10271028

1028-
async fn create_signed_device(
1029-
account: &Account,
1030-
private_identity: &PrivateCrossSigningIdentity,
1031-
) -> Device {
1032-
let mut read_only_device = DeviceData::from_account(account);
1033-
1034-
let self_signing = private_identity.self_signing_key.lock().await;
1035-
let self_signing = self_signing.as_ref().unwrap();
1036-
1037-
let mut device_keys = read_only_device.as_device_keys().to_owned();
1038-
self_signing.sign_device(&mut device_keys).unwrap();
1039-
read_only_device.update_device(&device_keys).unwrap();
1040-
1041-
wrap_device(account, read_only_device)
1042-
}
1043-
1044-
fn create_unsigned_device(account: &Account) -> Device {
1045-
wrap_device(account, DeviceData::from_account(account))
1046-
}
1047-
1048-
fn wrap_device(account: &Account, read_only_device: DeviceData) -> Device {
1049-
Device {
1050-
inner: read_only_device,
1051-
verification_machine: VerificationMachine::new(
1052-
account.deref().clone(),
1053-
Arc::new(Mutex::new(PrivateCrossSigningIdentity::new(
1054-
account.user_id().to_owned(),
1055-
))),
1056-
Arc::new(CryptoStoreWrapper::new(
1057-
account.user_id(),
1058-
account.device_id(),
1059-
MemoryStore::new(),
1060-
)),
1061-
),
1062-
own_identity: None,
1063-
device_owner_identity: None,
1064-
}
1065-
}
1066-
10671029
fn create_room_key_event(
10681030
sender: &UserId,
10691031
receiver: &UserId,

0 commit comments

Comments
 (0)