From 664aac28479c8af22cca5ca7325fa78c2f8f7e9d Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 29 Nov 2018 13:33:41 +0300 Subject: [PATCH] Fixed invalid signature from web3.js --- Sources/Convenience/LibSecp256k1Extension.swift | 10 +++++++++- Tests/SECP256K1Tests.swift | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Sources/Convenience/LibSecp256k1Extension.swift b/Sources/Convenience/LibSecp256k1Extension.swift index 4acf514..96f53af 100644 --- a/Sources/Convenience/LibSecp256k1Extension.swift +++ b/Sources/Convenience/LibSecp256k1Extension.swift @@ -258,7 +258,15 @@ struct SECP256K1 { try signature.checkSignatureSize() var recoverableSignature = secp256k1_ecdsa_recoverable_signature() let serializedSignature = Data(signature[0 ..< 64]) - let v = Int32(signature[64]) + var v = Int32(signature[64]) + + /* + fix for web3.js signs + eth-lib code: vrs.v < 2 ? vrs.v : 1 - (vrs.v % 2) + https://github.com/MaiaVictor/eth-lib/blob/d959c54faa1e1ac8d474028ed1568c5dce27cc7a/src/account.js#L60 + */ + v = v < 2 ? v : 1 - (v % 2) + let result = serializedSignature.withUnsafeBytes { (serPtr: UnsafePointer) -> Int32 in withUnsafeMutablePointer(to: &recoverableSignature, { (signaturePointer: UnsafeMutablePointer) in secp256k1_ecdsa_recoverable_signature_parse_compact(context!, signaturePointer, serPtr, v) diff --git a/Tests/SECP256K1Tests.swift b/Tests/SECP256K1Tests.swift index 43f7793..12c546a 100644 --- a/Tests/SECP256K1Tests.swift +++ b/Tests/SECP256K1Tests.swift @@ -98,4 +98,18 @@ class SECP256K1Tests: XCTestCase { } } } + + func testSomeSignatures() throws { + + let password = "Your password" + let keystore = try! BIP32Keystore(mnemonics: Mnemonics(), password: password) + + for i in 1...3 { + print("Signing \(i)/10") + let message = "\(i) Hello World \(i)".data + let signature = try! Web3Signer.signPersonalMessage(message, keystore: keystore, account: keystore.addresses[0], password: password) + let address = try! Web3.default.personal.ecrecover(personalMessage: message, signature: signature) + XCTAssertEqual(address,keystore.addresses[0]) + } + } }