From 3bedac0e912adb3fc442005d8ee0ff254e8a4b82 Mon Sep 17 00:00:00 2001 From: Skye Elliot Date: Fri, 3 Jul 2026 12:56:30 +0100 Subject: [PATCH] refactor(crypto): Inline Account::sign_master_key Co-Authored-By: Richard van der Hoff Co-Authored-By: Andy Balaam Signed-off-by: Skye Elliot --- .../matrix-sdk-crypto/src/identities/user.rs | 23 +++++++++++++--- crates/matrix-sdk-crypto/src/olm/account.rs | 26 ++----------------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/crates/matrix-sdk-crypto/src/identities/user.rs b/crates/matrix-sdk-crypto/src/identities/user.rs index 70c934404..706c5c3f8 100644 --- a/crates/matrix-sdk-crypto/src/identities/user.rs +++ b/crates/matrix-sdk-crypto/src/identities/user.rs @@ -25,7 +25,7 @@ use as_variant::as_variant; use matrix_sdk_common::locks::RwLock; use ruma::{ DeviceId, EventId, OwnedDeviceId, OwnedUserId, RoomId, UserId, - api::client::keys::upload_signatures::v3::Request as SignatureUploadRequest, + api::client::keys::upload_signatures::v3::{Request as SignatureUploadRequest, SignedKeys}, events::{key::verification::VerificationMethod, room::message::MessageType}, }; use serde::{Deserialize, Deserializer, Serialize}; @@ -40,7 +40,8 @@ use crate::{ types::{Changes, IdentityChanges}, }, types::{ - MasterPubkey, SelfSigningPubkey, UserSigningPubkey, requests::OutgoingVerificationRequest, + CrossSigningKey, MasterPubkey, SelfSigningPubkey, UserSigningPubkey, + requests::OutgoingVerificationRequest, }, verification::VerificationMachine, }; @@ -230,7 +231,23 @@ impl OwnUserIdentity { let cache = self.store.cache().await?; let account = cache.account().await?; - account.sign_master_key(&self.master_key) + + let public_key = self + .master_key + .get_first_key() + .ok_or(SignatureError::MissingSigningKey)? + .to_base64() + .into(); + + let mut cross_signing_key: CrossSigningKey = (*self.master_key).as_ref().clone(); + cross_signing_key.signatures.clear(); + account.sign_cross_signing_key(&mut cross_signing_key)?; + + let mut user_signed_keys = SignedKeys::new(); + user_signed_keys.add_cross_signing_keys(public_key, cross_signing_key.to_raw()); + + let signed_keys = [(self.user_id().to_owned(), user_signed_keys)].into(); + Ok(SignatureUploadRequest::new(signed_keys)) } /// Send a verification request to our other devices. diff --git a/crates/matrix-sdk-crypto/src/olm/account.rs b/crates/matrix-sdk-crypto/src/olm/account.rs index 4df1cbb03..e460d7115 100644 --- a/crates/matrix-sdk-crypto/src/olm/account.rs +++ b/crates/matrix-sdk-crypto/src/olm/account.rs @@ -31,10 +31,7 @@ use ruma::{ OwnedUserId, RoomId, SecondsSinceUnixEpoch, UInt, UserId, api::client::{ dehydrated_device::{DehydratedDeviceData, DehydratedDeviceV2}, - keys::{ - upload_keys, - upload_signatures::v3::{Request as SignatureUploadRequest, SignedKeys}, - }, + keys::{upload_keys, upload_signatures::v3::Request as SignatureUploadRequest}, }, canonical_json::to_canonical_value, events::{AnyToDeviceEvent, room::history_visibility::HistoryVisibility}, @@ -70,7 +67,7 @@ use crate::{ types::{Changes, DeviceChanges}, }, types::{ - CrossSigningKey, DeviceKeys, EventEncryptionAlgorithm, MasterPubkey, OneTimeKey, SignedKey, + CrossSigningKey, DeviceKeys, EventEncryptionAlgorithm, OneTimeKey, SignedKey, events::{ olm_v1::AnyDecryptedOlmEvent, room::encrypted::{ @@ -846,25 +843,6 @@ impl Account { Ok(()) } - /// Sign the given Master Key - pub fn sign_master_key( - &self, - master_key: &MasterPubkey, - ) -> Result { - let public_key = - master_key.get_first_key().ok_or(SignatureError::MissingSigningKey)?.to_base64().into(); - - let mut cross_signing_key: CrossSigningKey = master_key.as_ref().clone(); - cross_signing_key.signatures.clear(); - self.sign_cross_signing_key(&mut cross_signing_key)?; - - let mut user_signed_keys = SignedKeys::new(); - user_signed_keys.add_cross_signing_keys(public_key, cross_signing_key.to_raw()); - - let signed_keys = [(self.user_id().to_owned(), user_signed_keys)].into(); - Ok(SignatureUploadRequest::new(signed_keys)) - } - /// Convert a JSON value to the canonical representation and sign the JSON /// string. ///