diff --git a/src/Utils/Message.php b/src/Utils/Message.php index ca9ad07..bf08c3a 100644 --- a/src/Utils/Message.php +++ b/src/Utils/Message.php @@ -16,6 +16,8 @@ class Message { + public const MESSAGE_PREFIX = "\x19Ethereum Signed Message:\n"; + /** * The message signer public key. * @@ -99,13 +101,13 @@ public static function sign(string $message, string $passphrase): self { $privateKey = PrivateKey::fromPassphrase($passphrase); - $hash = Keccak::hash($message, 256); + $hash = Keccak::hash(static::MESSAGE_PREFIX.strlen($message).$message, 256); $signature = $privateKey->sign(Buffer::hex($hash)); $r = Helpers::gmpToHex($signature->getR()); $s = Helpers::gmpToHex($signature->getS()); - $v = str_pad(dechex($signature->getRecoveryId()), 2, '0', STR_PAD_LEFT); + $v = str_pad(dechex($signature->getRecoveryId() + 27), 2, '0', STR_PAD_LEFT); return static::new([ 'publicKey' => $privateKey->publicKey, @@ -125,10 +127,14 @@ public function verify(): bool $signature = $this->getSignature(); - return $factory->fromHex($this->publicKey)->verify( - Buffer::hex(Keccak::hash($this->message, 256)), - $signature, - ); + $message = static::MESSAGE_PREFIX.strlen($this->message).$this->message; + + return $factory + ->fromHex($this->publicKey) + ->verify( + Buffer::hex(Keccak::hash($message, 256)), + $signature, + ); } /** diff --git a/tests/Unit/Utils/MessageTest.php b/tests/Unit/Utils/MessageTest.php index 35093fe..b3049fe 100644 --- a/tests/Unit/Utils/MessageTest.php +++ b/tests/Unit/Utils/MessageTest.php @@ -10,7 +10,7 @@ $message = Message::sign($fixture['message'], $this->passphrase); expect($message->publicKey)->toBe($fixture['publicKey']); - expect($message->signature)->toBe($fixture['signature']); + expect($message->signature)->toBe(substr($fixture['signature'], 2)); expect($message->message)->toBe($fixture['message']); }); @@ -64,7 +64,9 @@ }); test('it should verify a message', function () { - $message = Message::new($this->getFixture('message-sign')); + $fixture = $this->getFixture('message-sign'); + $fixture['signature'] = substr($fixture['signature'], 2); + $message = Message::new($fixture); expect($message->verify())->toBeTrue(); }); diff --git a/tests/fixtures/message-sign.json b/tests/fixtures/message-sign.json index 88ad8ea..8cebbc5 100644 --- a/tests/fixtures/message-sign.json +++ b/tests/fixtures/message-sign.json @@ -1,5 +1,5 @@ { "message": "Hello, world!", "publicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d", - "signature": "0e2e53409be748834cac44052817ecef569b429a0492aa6bbc0d934eb71a09547e77aeef33d45669bbcba0498149f0e2b637fe8905186e08a5410c6f2b013bb400" + "signature": "0x2bdd0c58ff8a25f456065fb731c73308a25d0a09f351f23e3c7dd3882776d33d626b0cafc0b99dd7504b24f6ecd2e036a267c8e5e005f36dcbc03b2e33fa7fc31c" }