15
15
//
16
16
17
17
import Foundation
18
+ import MatrixSDKCrypto
19
+
20
+ enum MXCryptoError : Error {
21
+ case secretDoesNotMatch
22
+ }
18
23
19
24
/// Secret store compatible with Rust-based Crypto V2, where
20
25
/// backup secrets are stored internally in the Crypto machine
21
26
/// and others have to be managed manually.
22
27
class MXCryptoSecretStoreV2 : NSObject , MXCryptoSecretStore {
28
+
23
29
private let backup : MXKeyBackup ?
24
30
private let backupEngine : MXKeyBackupEngine ?
25
31
private let crossSigning : MXCryptoCrossSigning
@@ -31,44 +37,55 @@ class MXCryptoSecretStoreV2: NSObject, MXCryptoSecretStore {
31
37
self . crossSigning = crossSigning
32
38
}
33
39
34
- func storeSecret( _ secret: String , withSecretId secretId: String ) {
40
+ func storeSecret( _ secret: String , withSecretId secretId: String , errorHandler : @escaping ( Error ) -> Void ) {
35
41
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
+ )
44
51
)
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
+ )
52
59
)
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
+ )
60
67
)
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)
66
86
}
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)
72
89
}
73
90
}
74
91
0 commit comments