From e2692ec6045ae62c40e46019f3ce7810579f4041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 17 Feb 2021 15:50:49 +0100 Subject: [PATCH] crypto: Forward sync crypto chagnes to the rust side --- .../internal/crypto/DefaultCryptoService.kt | 14 ++++++-- .../matrix/android/sdk/internal/newCrypto.kt | 32 ++++++++++++++++--- .../session/sync/SyncResponseHandler.kt | 14 ++++---- rust-sdk/Cargo.toml | 4 +++ rust-sdk/src/machine.rs | 13 ++++++-- rust-sdk/src/olm.udl | 2 +- 6 files changed, 61 insertions(+), 18 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt index de73e04f12..fdbfc8148f 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt @@ -98,6 +98,9 @@ import org.matrix.android.sdk.internal.extensions.foldToCallback import org.matrix.android.sdk.internal.session.SessionScope import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask import org.matrix.android.sdk.internal.session.sync.model.SyncResponse +import org.matrix.android.sdk.internal.session.sync.model.DeviceListResponse +import org.matrix.android.sdk.internal.session.sync.model.DeviceOneTimeKeysCountSyncResponse +import org.matrix.android.sdk.internal.session.sync.model.ToDeviceSyncResponse import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.task.TaskThread import org.matrix.android.sdk.internal.task.configureWith @@ -321,9 +324,7 @@ internal class DefaultCryptoService @Inject constructor( * */ suspend fun start() { - cryptoCoroutineScope.launch(coroutineDispatchers.crypto) { - internalStart() - } + internalStart() // Just update fetchDevicesList(NoOpMatrixCallback()) @@ -939,6 +940,13 @@ internal class DefaultCryptoService @Inject constructor( } } + suspend fun receiveSyncChanges( + toDevice: ToDeviceSyncResponse?, + deviceChanges: DeviceListResponse?, + keyCounts: DeviceOneTimeKeysCountSyncResponse?) { + olmMachine!!.receiveSyncChanges(toDevice, deviceChanges, keyCounts) + } + private suspend fun sendOutgoingRequests() { // TODO these requests should be sent out in parallel for (outgoingRequest in olmMachine!!.outgoingRequests()) { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/newCrypto.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/newCrypto.kt index 20bde0ca1d..d654fa5520 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/newCrypto.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/newCrypto.kt @@ -19,17 +19,21 @@ package org.matrix.android.sdk.internal import java.io.File import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import org.matrix.android.sdk.internal.di.MoshiProvider +import org.matrix.android.sdk.internal.session.sync.model.DeviceListResponse +import org.matrix.android.sdk.internal.session.sync.model.DeviceOneTimeKeysCountSyncResponse +import org.matrix.android.sdk.internal.session.sync.model.ToDeviceSyncResponse +import timber.log.Timber import uniffi.olm.Device as InnerDevice +import uniffi.olm.DeviceLists +import uniffi.olm.Logger import uniffi.olm.OlmMachine as InnerMachine import uniffi.olm.Request import uniffi.olm.RequestType import uniffi.olm.Sas as InnerSas -import uniffi.olm.Logger import uniffi.olm.setLogger -import timber.log.Timber - -class CryptoLogger(): Logger { +class CryptoLogger() : Logger { override fun log(logLine: String) { Timber.d(logLine) } @@ -60,7 +64,7 @@ class Device(inner: InnerDevice, machine: InnerMachine) { } } -class OlmMachine(user_id: String, device_id: String, path: File) { +internal class OlmMachine(user_id: String, device_id: String, path: File) { private val inner: InnerMachine = InnerMachine(user_id, device_id, path.toString()) fun userId(): String { @@ -79,6 +83,24 @@ class OlmMachine(user_id: String, device_id: String, path: File) { inner.outgoingRequests() } + suspend fun receiveSyncChanges( + toDevice: ToDeviceSyncResponse?, + deviceChanges: DeviceListResponse?, + keyCounts: DeviceOneTimeKeysCountSyncResponse? + ) = withContext(Dispatchers.IO) { + var counts: MutableMap = mutableMapOf() + + if (keyCounts?.signedCurve25519 != null) { + counts.put("signed_curve25519", keyCounts.signedCurve25519) + } + + val devices = DeviceLists(deviceChanges?.changed ?: listOf(), deviceChanges?.left ?: listOf()) + val adapter = MoshiProvider.providesMoshi().adapter(ToDeviceSyncResponse::class.java) + val events = adapter.toJson(toDevice ?: ToDeviceSyncResponse())!! + + inner.receiveSyncChanges(events, devices, counts) + } + suspend fun markRequestAsSent( request_id: String, request_type: RequestType, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt index a80b062427..e306c1ad4c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt @@ -62,9 +62,10 @@ internal class SyncResponseHandler @Inject constructor(@SessionDatabase private measureTimeMillis { if (!cryptoService.isStarted()) { Timber.v("Should start cryptoService") + // TODO shirley there's a better place for this than the sync + // loop? cryptoService.start() } - cryptoService.onSyncWillProcess(isInitialSync) }.also { Timber.v("Finish handling start cryptoService in $it ms") } @@ -73,11 +74,12 @@ internal class SyncResponseHandler @Inject constructor(@SessionDatabase private // to ensure to decrypt them properly measureTimeMillis { Timber.v("Handle toDevice") - reportSubtask(reporter, R.string.initial_sync_start_importing_account_crypto, 100, 0.1f) { - if (syncResponse.toDevice != null) { - cryptoSyncHandler.handleToDevice(syncResponse.toDevice, reporter) - } - } + + cryptoService.receiveSyncChanges( + syncResponse.toDevice, + syncResponse.deviceLists, + syncResponse.deviceOneTimeKeysCount + ) }.also { Timber.v("Finish handling toDevice in $it ms") } diff --git a/rust-sdk/Cargo.toml b/rust-sdk/Cargo.toml index 25030e115b..b82f8ef7ff 100644 --- a/rust-sdk/Cargo.toml +++ b/rust-sdk/Cargo.toml @@ -18,6 +18,10 @@ thiserror = "1.0.23" tracing = "0.1.23" tracing-subscriber = "0.2.15" +[dependencies.js_int] +version = "0.2.0" +features = ["lax_deserialize"] + [dependencies.matrix-sdk-crypto] git = "https://github.com/matrix-org/matrix-rust-sdk/" features = ["sled_cryptostore"] diff --git a/rust-sdk/src/machine.rs b/rust-sdk/src/machine.rs index e1a9d01b8c..b96bb653af 100644 --- a/rust-sdk/src/machine.rs +++ b/rust-sdk/src/machine.rs @@ -1,6 +1,6 @@ use std::{ collections::{BTreeMap, HashMap}, - convert::TryFrom, + convert::{TryFrom, TryInto}, }; use http::Response; @@ -301,13 +301,20 @@ impl OlmMachine { &self, events: &str, device_changes: DeviceLists, - key_counts: HashMap, + key_counts: HashMap, ) { let events: ToDevice = serde_json::from_str(events).unwrap(); let device_changes: RumaDeviceLists = device_changes.into(); let key_counts: BTreeMap = key_counts .into_iter() - .map(|(k, v)| (DeviceKeyAlgorithm::from(k), v.into())) + .map(|(k, v)| { + ( + DeviceKeyAlgorithm::from(k), + v.clamp(0, i32::MAX) + .try_into() + .expect("Couldn't convert key counts into an UInt"), + ) + }) .collect(); self.runtime diff --git a/rust-sdk/src/olm.udl b/rust-sdk/src/olm.udl index 8d90cbadd4..b863641dfc 100644 --- a/rust-sdk/src/olm.udl +++ b/rust-sdk/src/olm.udl @@ -56,7 +56,7 @@ interface OlmMachine { void receive_sync_changes([ByRef] string events, DeviceLists device_changes, - record key_counts); + record key_counts); record identity_keys();