Skip to content
Merged
12 changes: 8 additions & 4 deletions crypto/utils/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()

Expand All @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion tests/fixtures/message-sign.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"message": "Hello, world!",
"publicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
"signature": "0e2e53409be748834cac44052817ecef569b429a0492aa6bbc0d934eb71a09547e77aeef33d45669bbcba0498149f0e2b637fe8905186e08a5410c6f2b013bb400"
"signature": "0x2bdd0c58ff8a25f456065fb731c73308a25d0a09f351f23e3c7dd3882776d33d626b0cafc0b99dd7504b24f6ecd2e036a267c8e5e005f36dcbc03b2e33fa7fc31c"
}
4 changes: 2 additions & 2 deletions tests/utils/test_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'],
)

Expand All @@ -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']

Expand Down