Skip to content

Commit 21f4abf

Browse files
committed
fixing the check secret part
1 parent f0f87bc commit 21f4abf

File tree

5 files changed

+65
-39
lines changed

5 files changed

+65
-39
lines changed

MatrixSDK/Crypto/CryptoMachine/MXCryptoMachine.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -611,11 +611,12 @@ extension MXCryptoMachine: MXCryptoCrossSigning {
611611
}
612612
}
613613

614-
func importCrossSigningKeys(export: CrossSigningKeyExport) {
614+
func importCrossSigningKeys(export: CrossSigningKeyExport) throws {
615615
do {
616616
try machine.importCrossSigningKeys(export: export)
617617
} catch {
618618
log.error("Failed importing cross signing keys", context: error)
619+
throw error
619620
}
620621
}
621622

MatrixSDK/Crypto/CryptoMachine/MXCryptoProtocols.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ protocol MXCryptoCrossSigning: MXCryptoUserIdentitySource, MXCryptoDevicesSource
8989
func crossSigningStatus() -> CrossSigningStatus
9090
func bootstrapCrossSigning(authParams: [AnyHashable: Any]) async throws
9191
func exportCrossSigningKeys() -> CrossSigningKeyExport?
92-
func importCrossSigningKeys(export: CrossSigningKeyExport)
92+
func importCrossSigningKeys(export: CrossSigningKeyExport) throws
9393

9494
func queryMissingSecretsFromOtherSessions() async throws
9595
}

MatrixSDK/Crypto/Data/Store/MXCryptoSecretStore.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ NS_ASSUME_NONNULL_BEGIN
3131
@param secret the secret.
3232
@param secretId the id of the secret.
3333
*/
34-
- (void)storeSecret:(NSString *)secret withSecretId:(NSString *)secretId;
34+
- (void)storeSecret:(NSString *)secret withSecretId:(NSString *)secretId errorHandler:(void (^)(NSError *error))errorHandler;
3535

3636
/**
3737
Check if a given secret is stored

MatrixSDK/Crypto/Recovery/MXRecoveryService.m

+11-3
Original file line numberDiff line numberDiff line change
@@ -554,9 +554,17 @@ - (void)recoverSecrets:(nullable NSArray<NSString*>*)secrets
554554
[self.dependencies.secretStorage secretWithSecretId:secretId withSecretStorageKeyId:secretStorageKeyId privateKey:privateKey success:^(NSString * _Nonnull unpaddedBase64Secret) {
555555

556556
NSString *secret = unpaddedBase64Secret;
557-
558-
MXLogDebug(@"[MXRecoveryService] recoverSecrets: Secret %@ is invalid", secretId);
559-
[invalidSecrets addObject:secretId];
557+
// Validate the secret before storing it
558+
if (![secret isEqualToString:[self.dependencies.secretStore secretWithSecretId:secretId]])
559+
{
560+
MXLogDebug(@"[MXRecoveryService] recoverSecrets: Recovered secret %@", secretId);
561+
562+
[updatedSecrets addObject:secretId];
563+
[self.dependencies.secretStore storeSecret:secret withSecretId:secretId errorHandler:^(NSError * _Nonnull anError) {
564+
MXLogDebug(@"[MXRecoveryService] recoverSecrets: Secret %@ is invalid", secretId);
565+
[invalidSecrets addObject:secretId];
566+
}];
567+
}
560568

561569
dispatch_group_leave(dispatchGroup);
562570

MatrixSDK/Crypto/SecretStorage/MXCryptoSecretStoreV2.swift

+50-33
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,17 @@
1515
//
1616

1717
import Foundation
18+
import MatrixSDKCrypto
19+
20+
enum MXCryptoError: Error {
21+
case secretDoesNotMatch
22+
}
1823

1924
/// Secret store compatible with Rust-based Crypto V2, where
2025
/// backup secrets are stored internally in the Crypto machine
2126
/// and others have to be managed manually.
2227
class MXCryptoSecretStoreV2: NSObject, MXCryptoSecretStore {
28+
2329
private let backup: MXKeyBackup?
2430
private let backupEngine: MXKeyBackupEngine?
2531
private let crossSigning: MXCryptoCrossSigning
@@ -31,44 +37,55 @@ class MXCryptoSecretStoreV2: NSObject, MXCryptoSecretStore {
3137
self.crossSigning = crossSigning
3238
}
3339

34-
func storeSecret(_ secret: String, withSecretId secretId: String) {
40+
func storeSecret(_ secret: String, withSecretId secretId: String, errorHandler: @escaping (Error) -> Void) {
3541
log.debug("Storing new secret \(secretId)")
36-
37-
switch secretId as NSString {
38-
case MXSecretId.crossSigningMaster.takeUnretainedValue():
39-
crossSigning.importCrossSigningKeys(
40-
export: .init(
41-
masterKey: secret,
42-
selfSigningKey: nil,
43-
userSigningKey: nil
42+
do {
43+
switch secretId as NSString {
44+
case MXSecretId.crossSigningMaster.takeUnretainedValue():
45+
try crossSigning.importCrossSigningKeys(
46+
export: .init(
47+
masterKey: secret,
48+
selfSigningKey: nil,
49+
userSigningKey: nil
50+
)
4451
)
45-
)
46-
case MXSecretId.crossSigningSelfSigning.takeUnretainedValue():
47-
crossSigning.importCrossSigningKeys(
48-
export: .init(
49-
masterKey: nil,
50-
selfSigningKey: secret,
51-
userSigningKey: nil
52+
case MXSecretId.crossSigningSelfSigning.takeUnretainedValue():
53+
try crossSigning.importCrossSigningKeys(
54+
export: .init(
55+
masterKey: nil,
56+
selfSigningKey: secret,
57+
userSigningKey: nil
58+
)
5259
)
53-
)
54-
case MXSecretId.crossSigningUserSigning.takeUnretainedValue():
55-
crossSigning.importCrossSigningKeys(
56-
export: .init(
57-
masterKey: nil,
58-
selfSigningKey: nil,
59-
userSigningKey: secret
60+
case MXSecretId.crossSigningUserSigning.takeUnretainedValue():
61+
try crossSigning.importCrossSigningKeys(
62+
export: .init(
63+
masterKey: nil,
64+
selfSigningKey: nil,
65+
userSigningKey: secret
66+
)
6067
)
61-
)
62-
case MXSecretId.keyBackup.takeUnretainedValue():
63-
guard let version = backup?.keyBackupVersion?.version else {
64-
log.error("No key backup version available")
65-
return
68+
case MXSecretId.keyBackup.takeUnretainedValue():
69+
guard let version = backup?.keyBackupVersion?.version else {
70+
log.error("No key backup version available")
71+
return
72+
}
73+
74+
let expectedPublicKey = try BackupRecoveryKey.fromBase64(key: secret).megolmV1PublicKey().publicKey
75+
76+
guard let authData = backup?.keyBackupVersion?.authData,
77+
MXCurve25519BackupAuthData(fromJSON: authData).publicKey == expectedPublicKey else {
78+
errorHandler(MXCryptoError.secretDoesNotMatch)
79+
return
80+
}
81+
82+
let privateKey = MXBase64Tools.data(fromBase64: secret)
83+
backupEngine?.savePrivateKey(privateKey, version: version)
84+
default:
85+
log.error("Unsupported type of secret", context: secretId)
6686
}
67-
68-
let privateKey = MXBase64Tools.data(fromBase64: secret)
69-
backupEngine?.savePrivateKey(privateKey, version: version)
70-
default:
71-
log.error("Unsupported type of secret", context: secretId)
87+
} catch {
88+
errorHandler(error)
7289
}
7390
}
7491

0 commit comments

Comments
 (0)