From d042bcce04deaa6814c9f332e2abfeb4549ec427 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Tue, 31 Oct 2023 12:57:46 +0100 Subject: [PATCH] crypto: Optimize OutboundGroupSession::encrypt --- .../src/olm/group_sessions/outbound.rs | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/crates/matrix-sdk-crypto/src/olm/group_sessions/outbound.rs b/crates/matrix-sdk-crypto/src/olm/group_sessions/outbound.rs index 641d28cf7..b2ef1e048 100644 --- a/crates/matrix-sdk-crypto/src/olm/group_sessions/outbound.rs +++ b/crates/matrix-sdk-crypto/src/olm/group_sessions/outbound.rs @@ -33,7 +33,6 @@ use ruma::{ SecondsSinceUnixEpoch, TransactionId, UserId, }; use serde::{Deserialize, Serialize}; -use serde_json::json; use tokio::sync::RwLock; use tracing::{debug, error, info}; use vodozemac::{megolm::SessionConfig, Curve25519PublicKey}; @@ -373,16 +372,23 @@ impl OutboundGroupSession { event_type: &str, content: &Raw, ) -> Raw { - let json_content = json!({ - "content": content, - "room_id": &*self.room_id, - "type": event_type, - }); + #[derive(Serialize)] + struct Payload<'a> { + #[serde(rename = "type")] + event_type: &'a str, + content: &'a Raw, + room_id: &'a RoomId, + } - let plaintext = json_content.to_string(); - let relates_to = json_content["content"].get("m.relates_to").cloned(); + let payload = Payload { event_type, content, room_id: &self.room_id }; + let payload_json = + serde_json::to_string(&payload).expect("payload serialization never fails"); - let ciphertext = self.encrypt_helper(plaintext).await; + let relates_to = content + .get_field::("m.relates_to") + .expect("serde_json::Value deserialization with valid JSON input never fails"); + + let ciphertext = self.encrypt_helper(payload_json).await; let scheme: RoomEventEncryptionScheme = match self.settings.algorithm { EventEncryptionAlgorithm::MegolmV1AesSha2 => MegolmV1AesSha2Content { ciphertext,