I'm trying to use ethereumjs to verify a signature. The signature verifies successfully with https://etherscan.io/verifySig using the following parameters:
- [Step 1] Address: 0x817A8d457bF4bFcDB833a0C72eb2f879C857e1E5
- [Step 2] Message Signature Hash: 0xa3ea6f0c3302f82103a62bb31bdbd9ea5a25436d2a3414d0cb1f60e7fc8cf0fb337c1205ad5e6180015e1fbb9fecffe956e519b6f4af79a08df7a1275fb8abc71c
- [Step 3] Enter the original message that was signed: lol:18006416246562465
Unfortunately, it's not verifying with ethereumjs. Here's my code:
import assert from 'assert'
import { ecrecover, pubToAddress, keccak } from 'ethereumjs-util'
var signature = "a3ea6f0c3302f82103a62bb31bdbd9ea5a25436d2a3414d0cb1f60e7fc8cf0fb337c1205ad5e6180015e1fbb9fecffe956e519b6f4af79a08df7a1275fb8abc71c";
var message = 'lol:18006416246562465';
message = keccak(new Buffer(message));
var messageBuffer = new Buffer(message);
var r = new Buffer(signature.substring(0, 64), 'hex')
var s = new Buffer(signature.substring(64, 128), 'hex')
var v = parseInt(signature.substring(128, 130), 16);
var pub = ecrecover(messageBuffer, v, r, s);
var recoveredAddress = '0x' + pubToAddress(pub).toString('hex')
console.log(recoveredAddress);
If I'm understanding it correctly the recovered address should be equal to the original address but it isn't.
Is my understanding simply incorrect or am I doing something wrong?