crypto: Connect the room key requesting to the rust side

This commit is contained in:
Damir Jelić 2021-04-20 13:29:52 +02:00
parent 0db07011b1
commit 8bfb7a6e0c
5 changed files with 68 additions and 6 deletions

View File

@ -952,7 +952,23 @@ internal class DefaultCryptoService @Inject constructor(
* @param event the event to decrypt again. * @param event the event to decrypt again.
*/ */
override fun reRequestRoomKeyForEvent(event: Event) { override fun reRequestRoomKeyForEvent(event: Event) {
// TODO cryptoCoroutineScope.launch(coroutineDispatchers.crypto) {
val requestPair = olmMachine!!.requestRoomKey(event)
if (requestPair.cancellation != null) {
when (requestPair.cancellation) {
is Request.ToDevice -> {
sendToDevice(requestPair.cancellation)
}
}
}
when(requestPair.keyRequest) {
is Request.ToDevice -> {
sendToDevice(requestPair.keyRequest)
}
}
}
} }
/** /**

View File

@ -40,8 +40,10 @@ import org.matrix.android.sdk.internal.session.sync.model.DeviceOneTimeKeysCount
import org.matrix.android.sdk.internal.session.sync.model.ToDeviceSyncResponse import org.matrix.android.sdk.internal.session.sync.model.ToDeviceSyncResponse
import timber.log.Timber import timber.log.Timber
import uniffi.olm.CryptoStoreErrorException import uniffi.olm.CryptoStoreErrorException
import uniffi.olm.DecryptionErrorException
import uniffi.olm.Device import uniffi.olm.Device
import uniffi.olm.DeviceLists import uniffi.olm.DeviceLists
import uniffi.olm.KeyRequestPair
import uniffi.olm.Logger import uniffi.olm.Logger
import uniffi.olm.OlmMachine as InnerMachine import uniffi.olm.OlmMachine as InnerMachine
import uniffi.olm.ProgressListener as RustProgressListener import uniffi.olm.ProgressListener as RustProgressListener
@ -370,6 +372,14 @@ internal class OlmMachine(user_id: String, device_id: String, path: File, device
} }
} }
@Throws(DecryptionErrorException::class)
suspend fun requestRoomKey(event: Event): KeyRequestPair = withContext(Dispatchers.IO) {
val adapter = MoshiProvider.providesMoshi().adapter<Event>(Event::class.java)
val serializedEvent = adapter.toJson(event)
inner.requestRoomKey(serializedEvent, event.roomId!!)
}
/** /**
* Export all of our room keys. * Export all of our room keys.
* *

View File

@ -7,7 +7,7 @@ mod responses;
pub use device::Device; pub use device::Device;
pub use error::{CryptoStoreError, DecryptionError, KeyImportError, MachineCreationError}; pub use error::{CryptoStoreError, DecryptionError, KeyImportError, MachineCreationError};
pub use logger::{set_logger, Logger}; pub use logger::{set_logger, Logger};
pub use machine::{OlmMachine, Sas}; pub use machine::{OlmMachine, Sas, KeyRequestPair};
pub use responses::{DeviceLists, KeysImportResult, Request, RequestType}; pub use responses::{DeviceLists, KeysImportResult, Request, RequestType};
pub trait ProgressListener { pub trait ProgressListener {

View File

@ -47,6 +47,11 @@ pub struct Sas {
pub request: Request, pub request: Request,
} }
pub struct KeyRequestPair {
pub cancellation: Option<Request>,
pub key_request: Request,
}
impl OlmMachine { impl OlmMachine {
/// Create a new `OlmMachine` /// Create a new `OlmMachine`
/// ///
@ -133,12 +138,13 @@ impl OlmMachine {
/// [mark_request_as_sent()](#method.mark_request_as_sent) method. /// [mark_request_as_sent()](#method.mark_request_as_sent) method.
/// ///
/// **Note**: This method call should be locked per call. /// **Note**: This method call should be locked per call.
pub fn outgoing_requests(&self) -> Vec<Request> { pub fn outgoing_requests(&self) -> Result<Vec<Request>, CryptoStoreError> {
self.runtime Ok(self
.block_on(self.inner.outgoing_requests()) .runtime
.block_on(self.inner.outgoing_requests())?
.into_iter() .into_iter()
.map(|r| r.into()) .map(|r| r.into())
.collect() .collect())
} }
/// Mark a request that was sent to the server as sent. /// Mark a request that was sent to the server as sent.
@ -418,6 +424,27 @@ impl OlmMachine {
}) })
} }
pub fn request_room_key(
&self,
event: &str,
room_id: &str,
) -> Result<KeyRequestPair, DecryptionError> {
let event: SyncMessageEvent<EncryptedEventContent> = serde_json::from_str(event)?;
let room_id = RoomId::try_from(room_id)?;
let (cancel, request) = self
.runtime
.block_on(self.inner.request_room_key(&event, &room_id))?;
let cancellation = cancel.map(|r| r.into());
let key_request = request.into();
Ok(KeyRequestPair {
cancellation,
key_request,
})
}
/// Export all of our room keys. /// Export all of our room keys.
/// ///
/// # Arguments /// # Arguments

View File

@ -70,6 +70,11 @@ dictionary Sas {
Request request; Request request;
}; };
dictionary KeyRequestPair {
Request? cancellation;
Request key_request;
};
[Enum] [Enum]
interface Request { interface Request {
ToDevice(string request_id, string event_type, string body); ToDevice(string request_id, string event_type, string body);
@ -98,6 +103,7 @@ interface OlmMachine {
string receive_sync_changes([ByRef] string events, string receive_sync_changes([ByRef] string events,
DeviceLists device_changes, DeviceLists device_changes,
record<DOMString, i32> key_counts); record<DOMString, i32> key_counts);
[Throws=CryptoStoreError]
sequence<Request> outgoing_requests(); sequence<Request> outgoing_requests();
[Throws=CryptoStoreError] [Throws=CryptoStoreError]
void mark_request_as_sent( void mark_request_as_sent(
@ -125,6 +131,9 @@ interface OlmMachine {
[Throws=CryptoStoreError] [Throws=CryptoStoreError]
Sas start_verification([ByRef] Device device); Sas start_verification([ByRef] Device device);
[Throws=DecryptionError]
KeyRequestPair request_room_key([ByRef] string event, [ByRef] string room_id);
[Throws=CryptoStoreError] [Throws=CryptoStoreError]
string export_keys([ByRef] string passphrase, i32 rounds); string export_keys([ByRef] string passphrase, i32 rounds);
[Throws=KeyImportError] [Throws=KeyImportError]