diff --git a/crypto/utils/message.py b/crypto/utils/message.py index 246f8c2..2fbcd8b 100644 --- a/crypto/utils/message.py +++ b/crypto/utils/message.py @@ -7,6 +7,8 @@ from crypto.identity.private_key import PrivateKey from crypto.identity.public_key import PublicKey +MESSAGE_PREFIX = b"\x19Ethereum Signed Message:\n" + class Message(object): public_key: bytes message: bytes @@ -62,9 +64,9 @@ def sign(cls, message: Union[bytes, str], passphrase: Union[bytes, str]): private_key = PrivateKey.from_passphrase(passphrase) public_key = private_key.public_key - transaction_signature = private_key.sign(message) + transaction_signature = private_key.sign(MESSAGE_PREFIX + (str(len(message))).encode() + message) - signature_v = bytes([transaction_signature[0]]).hex() + signature_v = bytes([int(transaction_signature[0]) + 27]).hex() signature_r = transaction_signature[1:33].hex() signature_s = transaction_signature[33:].hex() @@ -84,13 +86,15 @@ def verify(self): """ signature = unhexlify(self.signature) - message_hash = keccak.new(data=self.message, digest_bits=256).digest() + + message = MESSAGE_PREFIX + (str(len(self.message))).encode() + self.message + message_hash = keccak.new(data=message, digest_bits=256).digest() signature_r = signature[0:32] signature_s = signature[32:64] signature_v = signature[64] - signature = signature_r + signature_s + bytes([signature_v]) + signature = signature_r + signature_s + bytes([signature_v - 27]) public_key = PublicKey.recover(message_hash, signature) 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" } diff --git a/tests/utils/test_message.py b/tests/utils/test_message.py index 2ffc6b3..5ac627c 100644 --- a/tests/utils/test_message.py +++ b/tests/utils/test_message.py @@ -7,7 +7,7 @@ def test_verify_with_publicKey(load_transaction_fixture): result = Message( message=fixture['message'], - signature=fixture['signature'], + signature=fixture['signature'][2:], public_key=fixture['publicKey'], ) @@ -20,7 +20,7 @@ def test_message_sign_verification(load_transaction_fixture, passphrase): message: Message = Message.sign(fixture['message'], passphrase) - assert message.signature.decode() == fixture['signature'] + assert message.signature.decode() == fixture['signature'][2:] assert message.public_key.decode() == fixture['publicKey'] assert message.message.decode() == fixture['message']