From 8142b658796a0279f3f322569175dd8b8f4b7d3a Mon Sep 17 00:00:00 2001 From: Brad Murray Date: Tue, 7 Jun 2022 21:42:22 +0100 Subject: [PATCH 1/4] Accept key backups as usable if they're signed with the master cross-signing key --- MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m b/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m index e4cbb12f3d..44abb8d64b 100644 --- a/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m +++ b/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m @@ -1178,6 +1178,8 @@ - (MXKeyBackupVersionTrust *)trustForKeyBackupVersionFromCryptoQueue:(MXKeyBacku } else { + keyBackupVersionTrust.usable = YES; + MXKeyBackupVersionTrustSignature *signature = [MXKeyBackupVersionTrustSignature new]; signature.keys = deviceId; signature.valid = valid; From 606ee86dd7bbca3af1aa39e6c7e168c4255fd77f Mon Sep 17 00:00:00 2001 From: Brad Murray Date: Tue, 7 Jun 2022 21:47:49 +0100 Subject: [PATCH 2/4] Add a changelog entry --- changelog.d/pr-1492.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/pr-1492.bugfix diff --git a/changelog.d/pr-1492.bugfix b/changelog.d/pr-1492.bugfix new file mode 100644 index 0000000000..3aa5eb2ce7 --- /dev/null +++ b/changelog.d/pr-1492.bugfix @@ -0,0 +1 @@ +Accept key backups as usable if they're signed with the master cross-signing key. Contributed by Brad @ Beeper From 71256d0121cf04033f8bb3e90ba529e1416c1c40 Mon Sep 17 00:00:00 2001 From: Brad Murray Date: Mon, 25 Jul 2022 16:22:22 -0400 Subject: [PATCH 3/4] Only accept MSK signatures, update unit test to validate --- MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m b/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m index 44abb8d64b..fc6459141d 100644 --- a/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m +++ b/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m @@ -1167,24 +1167,28 @@ - (MXKeyBackupVersionTrust *)trustForKeyBackupVersionFromCryptoQueue:(MXKeyBacku signature.valid = valid; [signatures addObject:signature]; } - else // Try interpreting it as the MSK public key + else if ([deviceId isEqualToString:crypto.crossSigning.myUserCrossSigningKeys.masterKeys.keys]) { NSError *error; BOOL valid = [crypto.crossSigning.crossSigningTools pkVerifyObject:authData.JSONDictionary userId:myUserId publicKey:deviceId error:&error]; if (!valid) { - MXLogDebug(@"[MXKeyBackup] trustForKeyBackupVersion: Signature with unknown key %@", deviceId); + MXLogDebug(@"[MXKeyBackup] trustForKeyBackupVersion: Signature with cross-signing master key is invalid"); } else { keyBackupVersionTrust.usable = YES; - - MXKeyBackupVersionTrustSignature *signature = [MXKeyBackupVersionTrustSignature new]; - signature.keys = deviceId; - signature.valid = valid; - [signatures addObject:signature]; } + + MXKeyBackupVersionTrustSignature *signature = [MXKeyBackupVersionTrustSignature new]; + signature.keys = deviceId; + signature.valid = valid; + [signatures addObject:signature]; + } + else + { + MXLogDebug(@"[MXKeyBackup] trustForKeyBackupVersion: Signature with unknown key %@", deviceId); } } } From 43c107e5b55c3b19fa9a54b58303ae316e7630df Mon Sep 17 00:00:00 2001 From: Brad Murray Date: Mon, 25 Jul 2022 17:04:57 -0400 Subject: [PATCH 4/4] Rename to deviceIdOrCrossSigningKey --- MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m b/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m index fc6459141d..abc0f7f7d1 100644 --- a/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m +++ b/MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m @@ -1139,18 +1139,18 @@ - (MXKeyBackupVersionTrust *)trustForKeyBackupVersionFromCryptoQueue:(MXKeyBacku for (NSString *keyId in mySigs) { // XXX: is this how we're supposed to get the device id? - NSString *deviceId; + NSString *deviceIdOrCrossSigningKey; NSArray *components = [keyId componentsSeparatedByString:@":"]; if (components.count == 2) { - deviceId = components[1]; + deviceIdOrCrossSigningKey = components[1]; } - if (deviceId) + if (deviceIdOrCrossSigningKey) { BOOL valid = NO; - MXDeviceInfo *device = [self->crypto.deviceList storedDevice:myUserId deviceId:deviceId]; + MXDeviceInfo *device = [self->crypto.deviceList storedDevice:myUserId deviceId:deviceIdOrCrossSigningKey]; if (device) { NSError *error; @@ -1162,15 +1162,15 @@ - (MXKeyBackupVersionTrust *)trustForKeyBackupVersionFromCryptoQueue:(MXKeyBacku } MXKeyBackupVersionTrustSignature *signature = [MXKeyBackupVersionTrustSignature new]; - signature.deviceId = deviceId; + signature.deviceId = device.deviceId; signature.device = device; signature.valid = valid; [signatures addObject:signature]; } - else if ([deviceId isEqualToString:crypto.crossSigning.myUserCrossSigningKeys.masterKeys.keys]) + else if ([deviceIdOrCrossSigningKey isEqualToString:crypto.crossSigning.myUserCrossSigningKeys.masterKeys.keys]) { NSError *error; - BOOL valid = [crypto.crossSigning.crossSigningTools pkVerifyObject:authData.JSONDictionary userId:myUserId publicKey:deviceId error:&error]; + BOOL valid = [crypto.crossSigning.crossSigningTools pkVerifyObject:authData.JSONDictionary userId:myUserId publicKey:deviceIdOrCrossSigningKey error:&error]; if (!valid) { @@ -1182,13 +1182,13 @@ - (MXKeyBackupVersionTrust *)trustForKeyBackupVersionFromCryptoQueue:(MXKeyBacku } MXKeyBackupVersionTrustSignature *signature = [MXKeyBackupVersionTrustSignature new]; - signature.keys = deviceId; + signature.keys = deviceIdOrCrossSigningKey; signature.valid = valid; [signatures addObject:signature]; } else { - MXLogDebug(@"[MXKeyBackup] trustForKeyBackupVersion: Signature with unknown key %@", deviceId); + MXLogDebug(@"[MXKeyBackup] trustForKeyBackupVersion: Signature with unknown key %@", deviceIdOrCrossSigningKey); } } }