1515//
1616
1717import 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.
2227class 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