Skip to content

Commit dda6477

Browse files
committed
Only accept MSK signatures, update unit test to validate
1 parent ede5a03 commit dda6477

2 files changed

Lines changed: 28 additions & 22 deletions

File tree

MatrixSDK/Crypto/KeyBackup/MXKeyBackup.m

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,24 +1143,28 @@ - (MXKeyBackupVersionTrust *)trustForKeyBackupVersionFromCryptoQueue:(MXKeyBacku
11431143
signature.valid = valid;
11441144
[signatures addObject:signature];
11451145
}
1146-
else // Try interpreting it as the MSK public key
1146+
else if ([deviceId isEqualToString:crypto.crossSigning.myUserCrossSigningKeys.masterKeys.keys])
11471147
{
11481148
NSError *error;
11491149
BOOL valid = [crypto.crossSigning.crossSigningTools pkVerifyObject:authData.JSONDictionary userId:myUserId publicKey:deviceId error:&error];
11501150

11511151
if (!valid)
11521152
{
1153-
MXLogDebug(@"[MXKeyBackup] trustForKeyBackupVersion: Signature with unknown key %@", deviceId);
1153+
MXLogDebug(@"[MXKeyBackup] trustForKeyBackupVersion: Signature with cross-signing master key is invalid");
11541154
}
11551155
else
11561156
{
11571157
keyBackupVersionTrust.usable = YES;
1158-
1159-
MXKeyBackupVersionTrustSignature *signature = [MXKeyBackupVersionTrustSignature new];
1160-
signature.keys = deviceId;
1161-
signature.valid = valid;
1162-
[signatures addObject:signature];
11631158
}
1159+
1160+
MXKeyBackupVersionTrustSignature *signature = [MXKeyBackupVersionTrustSignature new];
1161+
signature.keys = deviceId;
1162+
signature.valid = valid;
1163+
[signatures addObject:signature];
1164+
}
1165+
else
1166+
{
1167+
MXLogDebug(@"[MXKeyBackup] trustForKeyBackupVersion: Signature with unknown key %@", deviceId);
11641168
}
11651169
}
11661170
}

MatrixSDKTests/MXCryptoBackupTests.m

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -515,9 +515,9 @@ - (void)testTrustForKeyBackupVersion
515515
// - Alice and Bob have messages in a room
516516
// - Alice has cross-signing enabled
517517
// - Alice creates a backup
518+
// - Modify the backup to remove all signatures other than the MSK so we know that the MSK alone is enough for the device to be trusted
518519
// - Check the returned MXKeyBackupVersion is trusted
519-
// -> It must be trusted by 2 entities
520-
// -> Trusted by her device
520+
// -> It must be trusted by 1 entities
521521
// -> Trusted by her MSK
522522
- (void)testCrossSigningMSKTrustForKeyBackupVersion
523523
{
@@ -530,26 +530,28 @@ - (void)testCrossSigningMSKTrustForKeyBackupVersion
530530
// - Alice creates a backup
531531
[aliceSession.crypto.backup prepareKeyBackupVersionWithPassword:nil success:^(MXMegolmBackupCreationInfo *keyBackupCreationInfo) {
532532
[aliceSession.crypto.backup createKeyBackupVersion:keyBackupCreationInfo success:^(MXKeyBackupVersion *keyBackupVersion) {
533+
// De-serialize the authData, find the MSK signature, remove all other signatures from the authData, serialize it back in
534+
MXMegolmBackupAuthData *authData = [MXMegolmBackupAuthData modelFromJSON:keyBackupVersion.authData];
535+
NSString *myMSKSignatureKey = [NSString stringWithFormat:@"ed25519:%@", aliceSession.crypto.crossSigning.myUserCrossSigningKeys.masterKeys.keys];
536+
authData.signatures = @{
537+
aliceSession.myUserId: @{
538+
myMSKSignatureKey: authData.signatures[aliceSession.myUserId][myMSKSignatureKey]
539+
}
540+
};
541+
keyBackupVersion.authData = [authData JSONDictionary];
533542

534543
// - Check the returned MXKeyBackupVersion is trusted
535544
[aliceSession.crypto.backup trustForKeyBackupVersion:keyBackupVersion onComplete:^(MXKeyBackupVersionTrust *keyBackupVersionTrust) {
536-
537-
// -> It must be trusted by 2 entities
545+
// -> It must be trusted by 1 entity
538546
XCTAssertNotNil(keyBackupVersionTrust);
539547
XCTAssertTrue(keyBackupVersionTrust.usable);
540-
XCTAssertEqual(keyBackupVersionTrust.signatures.count, 2);
548+
XCTAssertEqual(keyBackupVersionTrust.signatures.count, 1);
541549

542550
[keyBackupVersionTrust.signatures enumerateObjectsUsingBlock:^(MXKeyBackupVersionTrustSignature *signature, NSUInteger idx, BOOL *stop) {
543-
if (signature.keys) {
544-
// Check if valid MSK signature
545-
XCTAssertTrue(signature.valid);
546-
XCTAssertEqualObjects(signature.keys, aliceSession.crypto.crossSigning.myUserCrossSigningKeys.masterKeys.keys);
547-
} else {
548-
// Check if valid device signature
549-
XCTAssertTrue(signature.valid);
550-
XCTAssertEqualObjects(signature.deviceId, aliceSession.matrixRestClient.credentials.deviceId);
551-
XCTAssertEqualObjects(signature.device.deviceId, aliceSession.matrixRestClient.credentials.deviceId);
552-
}
551+
// Check if valid MSK signature
552+
XCTAssertNotNil(signature.keys);
553+
XCTAssertTrue(signature.valid);
554+
XCTAssertEqualObjects(signature.keys, aliceSession.crypto.crossSigning.myUserCrossSigningKeys.masterKeys.keys);
553555
}];
554556

555557
[expectation fulfill];

0 commit comments

Comments
 (0)