From be01ee2de0842f1f40a70a4339caf4e824253a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 4 Aug 2020 12:31:56 +0200 Subject: [PATCH] crypto: Cancel the verification if we find a MAC mismatch. --- matrix_sdk_crypto/src/verification/sas/helpers.rs | 12 ++++++------ matrix_sdk_crypto/src/verification/sas/sas_state.rs | 7 +++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/matrix_sdk_crypto/src/verification/sas/helpers.rs b/matrix_sdk_crypto/src/verification/sas/helpers.rs index 33e01a53..34032aad 100644 --- a/matrix_sdk_crypto/src/verification/sas/helpers.rs +++ b/matrix_sdk_crypto/src/verification/sas/helpers.rs @@ -8,7 +8,8 @@ use matrix_sdk_common::{ to_device::{send_event_to_device::Request as ToDeviceRequest, DeviceIdOrAllDevices}, }, events::{ - key::verification::mac::MacEventContent, AnyToDeviceEventContent, EventType, ToDeviceEvent, + key::verification::{cancel::CancelCode, mac::MacEventContent}, + AnyToDeviceEventContent, EventType, ToDeviceEvent, }, identifiers::{DeviceId, UserId}, uuid::Uuid, @@ -142,8 +143,7 @@ pub fn receive_mac_event( ids: &SasIds, flow_id: &str, event: &ToDeviceEvent, -) -> (Vec, Vec) { - // TODO check the event and cancel if it isn't ok (sender, transaction id) +) -> Result<(Vec, Vec), CancelCode> { let mut verified_devices = Vec::new(); let info = extra_mac_info_receive(&ids, flow_id); @@ -155,7 +155,7 @@ pub fn receive_mac_event( .expect("Can't calculate SAS MAC"); if keys != event.content.keys { - panic!("Keys mac mismatch") + return Err(CancelCode::KeyMismatch); } for (key_id, key_mac) in &event.content.mac { @@ -182,13 +182,13 @@ pub fn receive_mac_event( { verified_devices.push(ids.other_device.clone()); } else { - // TODO cancel here + return Err(CancelCode::KeyMismatch); } } // TODO add an else branch for the master key here } - (verified_devices, vec![]) + Ok((verified_devices, vec![])) } /// Get the extra info that will be used when we generate a MAC and need to send diff --git a/matrix_sdk_crypto/src/verification/sas/sas_state.rs b/matrix_sdk_crypto/src/verification/sas/sas_state.rs index ec09f8b7..d6c75fbb 100644 --- a/matrix_sdk_crypto/src/verification/sas/sas_state.rs +++ b/matrix_sdk_crypto/src/verification/sas/sas_state.rs @@ -562,7 +562,8 @@ impl SasState { &self.ids, &self.verification_flow_id, event, - ); + ) + .map_err(|c| self.clone().cancel(c))?; Ok(SasState { inner: self.inner, @@ -606,12 +607,14 @@ impl SasState { ) -> Result, SasState> { self.check_sender_and_txid(&event.sender, &event.content.transaction_id) .map_err(|c| self.clone().cancel(c))?; + let (devices, master_keys) = receive_mac_event( &self.inner.lock().unwrap(), &self.ids, &self.verification_flow_id, event, - ); + ) + .map_err(|c| self.clone().cancel(c))?; Ok(SasState { inner: self.inner,