@@ -9,17 +9,18 @@ import CryptoSwift
9
9
import Foundation
10
10
11
11
public class EthereumKeystoreV3 : AbstractKeystore {
12
+ typealias Params = KeystoreParamsV3
12
13
public var keystoreParams : KeystoreParamsV3 ?
13
14
14
- public func giveKeystoreParams( ) -> AbstractKeystoreParams {
15
+ public func giveKeystoreParams( ) -> Params {
15
16
keystoreParams
16
17
}
17
18
18
19
19
20
// Protocol
20
21
private var address : EthereumAddress ?
21
22
public var isHDKeystore : Bool = false
22
-
23
+
23
24
public var addresses : [ EthereumAddress ] ? {
24
25
get {
25
26
if self . address != nil {
@@ -28,34 +29,34 @@ public class EthereumKeystoreV3: AbstractKeystore {
28
29
return nil
29
30
}
30
31
}
31
-
32
+
32
33
public func UNSAFE_getPrivateKeyData( password: String , account: EthereumAddress ) throws -> Data {
33
34
if self . addresses? . count == 1 && account == self . addresses? . last {
34
35
guard let privateKey = try ? self . getKeyData ( password) else { throw AbstractKeystoreError . invalidPasswordError}
35
36
return privateKey
36
37
}
37
38
throw AbstractKeystoreError . invalidAccountError
38
39
}
39
-
40
+
40
41
// Class
41
-
42
+
42
43
public func getAddress( ) -> EthereumAddress ? {
43
44
return self . address
44
45
}
45
-
46
+
46
47
// --------------
47
-
48
+
48
49
public convenience init ? ( _ jsonString: String ) {
49
50
let lowercaseJSON = jsonString. lowercased ( )
50
51
guard let jsonData = lowercaseJSON. data ( using: . utf8) else { return nil }
51
52
self . init ( jsonData)
52
53
}
53
-
54
+
54
55
public convenience init ? ( _ jsonData: Data ) {
55
56
guard let keystoreParams = try ? JSONDecoder ( ) . decode ( KeystoreParamsV3 . self, from: jsonData) else { return nil }
56
57
self . init ( keystoreParams)
57
58
}
58
-
59
+
59
60
public init ? ( _ keystoreParams: KeystoreParamsV3 ) {
60
61
if ( keystoreParams. version != 3 ) { return nil }
61
62
if ( keystoreParams. crypto. version != nil && keystoreParams. crypto. version != " 1 " ) { return nil }
@@ -66,19 +67,19 @@ public class EthereumKeystoreV3: AbstractKeystore {
66
67
return nil
67
68
}
68
69
}
69
-
70
+
70
71
public init ? ( password: String = " web3swift " , aesMode: String = " aes-128-cbc " ) throws {
71
72
guard var newPrivateKey = SECP256K1 . generatePrivateKey ( ) else { return nil }
72
73
defer { Data . zero ( & newPrivateKey) }
73
74
try encryptDataToStorage ( password, keyData: newPrivateKey, aesMode: aesMode)
74
75
}
75
-
76
+
76
77
public init ? ( privateKey: Data , password: String = " web3swift " , aesMode: String = " aes-128-cbc " ) throws {
77
78
guard privateKey. count == 32 else { return nil }
78
79
guard SECP256K1 . verifyPrivateKey ( privateKey: privateKey) else { return nil }
79
80
try encryptDataToStorage ( password, keyData: privateKey, aesMode: aesMode)
80
81
}
81
-
82
+
82
83
fileprivate func encryptDataToStorage( _ password: String , keyData: Data ? , dkLen: Int = 32 , N: Int = 4096 , R: Int = 6 , P: Int = 1 , aesMode: String = " aes-128-cbc " ) throws {
83
84
if ( keyData == nil ) {
84
85
throw AbstractKeystoreError . encryptionError ( " Encryption without key data " )
@@ -117,7 +118,7 @@ public class EthereumKeystoreV3: AbstractKeystore {
117
118
let keystoreparams = KeystoreParamsV3 ( address: addr. address. lowercased ( ) , crypto: crypto, id: UUID ( ) . uuidString. lowercased ( ) , version: 3 )
118
119
self . keystoreParams = keystoreparams
119
120
}
120
-
121
+
121
122
public func regenerate( oldPassword: String , newPassword: String , dkLen: Int = 32 , N: Int = 4096 , R: Int = 6 , P: Int = 1 ) throws {
122
123
var keyData = try self . getKeyData ( oldPassword)
123
124
if keyData == nil {
@@ -126,7 +127,7 @@ public class EthereumKeystoreV3: AbstractKeystore {
126
127
defer { Data . zero ( & keyData!) }
127
128
try self . encryptDataToStorage ( newPassword, keyData: keyData!, aesMode: self . keystoreParams!. crypto. cipher)
128
129
}
129
-
130
+
130
131
fileprivate func getKeyData( _ password: String ) throws -> Data ? {
131
132
guard let keystoreParams = self . keystoreParams else { return nil }
132
133
guard let saltData = Data . fromHex ( keystoreParams. crypto. kdfparams. salt) else { return nil }
@@ -187,7 +188,7 @@ public class EthereumKeystoreV3: AbstractKeystore {
187
188
// return Data(bytes:decryptedPK!)
188
189
return Data ( decryptedPK!)
189
190
}
190
-
191
+
191
192
public func serialize( ) throws -> Data ? {
192
193
guard let params = self . keystoreParams else { return nil }
193
194
let data = try JSONEncoder ( ) . encode ( params)
0 commit comments