Skip to content

Commit 6c0d07c

Browse files
authored
Merge pull request #168 from BANKEX/develop
By default use deterministic signatures now Set V value to the range 0...4 in the library itself instead of in transaction signer Mark few functions as public
2 parents a993dd4 + 708a777 commit 6c0d07c

File tree

3 files changed

+20
-13
lines changed

3 files changed

+20
-13
lines changed

web3swift/Convenience/Classes/LibSecp256k1Extension.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public struct SECP256K1 {
1919
extension SECP256K1 {
2020
static var context = secp256k1_context_create(UInt32(SECP256K1_CONTEXT_SIGN|SECP256K1_CONTEXT_VERIFY))
2121

22-
static func signForRecovery(hash: Data, privateKey: Data, useExtraEntropy: Bool = true) -> (serializedSignature:Data?, rawSignature: Data?) {
22+
static func signForRecovery(hash: Data, privateKey: Data, useExtraEntropy: Bool = false) -> (serializedSignature:Data?, rawSignature: Data?) {
2323
if (hash.count != 32 || privateKey.count != 32) {return (nil, nil)}
2424
if !SECP256K1.verifyPrivateKey(privateKey: privateKey) {
2525
return (nil, nil)
@@ -266,7 +266,14 @@ extension SECP256K1 {
266266
let bytes = signatureData.bytes
267267
let r = Array(bytes[0..<32])
268268
let s = Array(bytes[32..<64])
269-
return UnmarshaledSignature(v: bytes[64], r: r, s: s)
269+
var v = bytes[64]
270+
if v >= 27 {
271+
v = v - 27
272+
}
273+
if v > 4 {
274+
return nil
275+
}
276+
return UnmarshaledSignature(v: v, r: r, s: s)
270277
}
271278

272279
static func marshalSignature(v: UInt8, r: [UInt8], s: [UInt8]) -> Data? {

web3swift/Transaction/Classes/TransactionSigner.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public enum TransactionSignerError: Error {
1515
}
1616

1717
public struct Web3Signer {
18-
public static func signTX(transaction:inout EthereumTransaction, keystore: AbstractKeystore, account: EthereumAddress, password: String, useExtraEntropy: Bool = true) throws {
18+
public static func signTX(transaction:inout EthereumTransaction, keystore: AbstractKeystore, account: EthereumAddress, password: String, useExtraEntropy: Bool = false) throws {
1919
var privateKey = try keystore.UNSAFE_getPrivateKeyData(password: password, account: account)
2020
defer {Data.zero(&privateKey)}
2121
if (transaction.chainID != nil) {
@@ -24,12 +24,12 @@ public struct Web3Signer {
2424
try FallbackSigner.sign(transaction: &transaction, privateKey: privateKey, useExtraEntropy: useExtraEntropy)
2525
}
2626
}
27-
public static func signIntermediate(intermediate:inout TransactionIntermediate, keystore: AbstractKeystore, account: EthereumAddress, password: String, useExtraEntropy: Bool = true) throws {
27+
public static func signIntermediate(intermediate:inout TransactionIntermediate, keystore: AbstractKeystore, account: EthereumAddress, password: String, useExtraEntropy: Bool = false) throws {
2828
var tx = intermediate.transaction
2929
try Web3Signer.signTX(transaction: &tx, keystore: keystore, account: account, password: password, useExtraEntropy: useExtraEntropy)
3030
intermediate.transaction = tx
3131
}
32-
public static func signPersonalMessage(_ personalMessage: Data, keystore: AbstractKeystore, account: EthereumAddress, password: String, useExtraEntropy: Bool = true) throws -> Data? {
32+
public static func signPersonalMessage(_ personalMessage: Data, keystore: AbstractKeystore, account: EthereumAddress, password: String, useExtraEntropy: Bool = false) throws -> Data? {
3333
var privateKey = try keystore.UNSAFE_getPrivateKeyData(password: password, account: account)
3434
defer {Data.zero(&privateKey)}
3535
guard let hash = Web3.Utils.hashPersonalMessage(personalMessage) else {return nil}
@@ -38,7 +38,7 @@ public struct Web3Signer {
3838
}
3939

4040
public struct EIP155Signer {
41-
public static func sign(transaction:inout EthereumTransaction, privateKey: Data, useExtraEntropy: Bool = true) throws {
41+
public static func sign(transaction:inout EthereumTransaction, privateKey: Data, useExtraEntropy: Bool = false) throws {
4242
for _ in 0..<1024 {
4343
let result = self.attemptSignature(transaction: &transaction, privateKey: privateKey, useExtraEntropy: useExtraEntropy)
4444
if (result) {
@@ -48,7 +48,7 @@ public struct Web3Signer {
4848
throw AbstractKeystoreError.invalidAccountError
4949
}
5050

51-
private static func attemptSignature(transaction:inout EthereumTransaction, privateKey: Data, useExtraEntropy: Bool = true) -> Bool {
51+
private static func attemptSignature(transaction:inout EthereumTransaction, privateKey: Data, useExtraEntropy: Bool = false) -> Bool {
5252
guard let chainID = transaction.chainID else {return false}
5353
guard let hash = transaction.hashForSignature(chainID: chainID) else {return false}
5454
let signature = SECP256K1.signForRecovery(hash: hash, privateKey: privateKey, useExtraEntropy: useExtraEntropy)
@@ -69,7 +69,7 @@ public struct Web3Signer {
6969
}
7070

7171
public struct FallbackSigner {
72-
public static func sign(transaction:inout EthereumTransaction, privateKey: Data, useExtraEntropy: Bool = true) throws {
72+
public static func sign(transaction:inout EthereumTransaction, privateKey: Data, useExtraEntropy: Bool = false) throws {
7373
for _ in 0..<1024 {
7474
let result = self.attemptSignature(transaction: &transaction, privateKey: privateKey)
7575
if (result) {
@@ -79,7 +79,7 @@ public struct Web3Signer {
7979
throw AbstractKeystoreError.invalidAccountError
8080
}
8181

82-
private static func attemptSignature(transaction:inout EthereumTransaction, privateKey: Data, useExtraEntropy: Bool = true) -> Bool {
82+
private static func attemptSignature(transaction:inout EthereumTransaction, privateKey: Data, useExtraEntropy: Bool = false) -> Bool {
8383
guard let hash = transaction.hashForSignature(chainID: nil) else {return false}
8484
let signature = SECP256K1.signForRecovery(hash: hash, privateKey: privateKey, useExtraEntropy: useExtraEntropy)
8585
guard let serializedSignature = signature.serializedSignature else {return false}

web3swift/Web3/Classes/Web3+Eth.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ extension web3.Eth {
2020
self.web3.queue.addOperation(operation)
2121
}
2222

23-
func sendTransaction(_ transaction: EthereumTransaction, options: Web3Options, password:String = "BANKEXFOUNDATION") -> Result<TransactionSendingResult, Web3Error> {
23+
public func sendTransaction(_ transaction: EthereumTransaction, options: Web3Options, password:String = "BANKEXFOUNDATION") -> Result<TransactionSendingResult, Web3Error> {
2424
do {
2525
let result = try self.sendTransactionPromise(transaction, options: options, password: password).wait()
2626
return Result(result)
@@ -154,14 +154,14 @@ extension web3.Eth {
154154
// }
155155

156156
@available(*, deprecated)
157-
func sendRawTransaction(_ transaction: EthereumTransaction, callback: @escaping Callback, queue: OperationQueue = OperationQueue.main) {
157+
public func sendRawTransaction(_ transaction: EthereumTransaction, callback: @escaping Callback, queue: OperationQueue = OperationQueue.main) {
158158
print(transaction)
159159
let operation = SendRawTransactionOperation.init(self.web3, queue: self.web3.queue, transaction: transaction)
160160
operation.next = OperationChainingType.callback(callback, queue)
161161
self.web3.queue.addOperation(operation)
162162
}
163163

164-
func sendRawTransaction(_ transaction: Data) -> Result<TransactionSendingResult, Web3Error> {
164+
public func sendRawTransaction(_ transaction: Data) -> Result<TransactionSendingResult, Web3Error> {
165165
do {
166166
let result = try self.sendRawTransactionPromise(transaction).wait()
167167
return Result(result)
@@ -173,7 +173,7 @@ extension web3.Eth {
173173
}
174174
}
175175

176-
func sendRawTransaction(_ transaction: EthereumTransaction) -> Result<TransactionSendingResult, Web3Error> {
176+
public func sendRawTransaction(_ transaction: EthereumTransaction) -> Result<TransactionSendingResult, Web3Error> {
177177
do {
178178
let result = try self.sendRawTransactionPromise(transaction).wait()
179179
return Result(result)

0 commit comments

Comments
 (0)