Skip to content

Commit 4b0aaa8

Browse files
authored
refactor: sign messages eip191 (#176)
1 parent 5a9fd5a commit 4b0aaa8

File tree

3 files changed

+11
-7
lines changed

3 files changed

+11
-7
lines changed

crypto/utils/message.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from crypto.identity.private_key import PrivateKey
88
from crypto.identity.public_key import PublicKey
99

10+
MESSAGE_PREFIX = b"\x19Ethereum Signed Message:\n"
11+
1012
class Message(object):
1113
public_key: bytes
1214
message: bytes
@@ -62,9 +64,9 @@ def sign(cls, message: Union[bytes, str], passphrase: Union[bytes, str]):
6264
private_key = PrivateKey.from_passphrase(passphrase)
6365
public_key = private_key.public_key
6466

65-
transaction_signature = private_key.sign(message)
67+
transaction_signature = private_key.sign(MESSAGE_PREFIX + (str(len(message))).encode() + message)
6668

67-
signature_v = bytes([transaction_signature[0]]).hex()
69+
signature_v = bytes([int(transaction_signature[0]) + 27]).hex()
6870
signature_r = transaction_signature[1:33].hex()
6971
signature_s = transaction_signature[33:].hex()
7072

@@ -84,13 +86,15 @@ def verify(self):
8486
"""
8587

8688
signature = unhexlify(self.signature)
87-
message_hash = keccak.new(data=self.message, digest_bits=256).digest()
89+
90+
message = MESSAGE_PREFIX + (str(len(self.message))).encode() + self.message
91+
message_hash = keccak.new(data=message, digest_bits=256).digest()
8892

8993
signature_r = signature[0:32]
9094
signature_s = signature[32:64]
9195
signature_v = signature[64]
9296

93-
signature = signature_r + signature_s + bytes([signature_v])
97+
signature = signature_r + signature_s + bytes([signature_v - 27])
9498

9599
public_key = PublicKey.recover(message_hash, signature)
96100

tests/fixtures/message-sign.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"message": "Hello, world!",
33
"publicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
4-
"signature": "0e2e53409be748834cac44052817ecef569b429a0492aa6bbc0d934eb71a09547e77aeef33d45669bbcba0498149f0e2b637fe8905186e08a5410c6f2b013bb400"
4+
"signature": "0x2bdd0c58ff8a25f456065fb731c73308a25d0a09f351f23e3c7dd3882776d33d626b0cafc0b99dd7504b24f6ecd2e036a267c8e5e005f36dcbc03b2e33fa7fc31c"
55
}

tests/utils/test_message.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ def test_verify_with_publicKey(load_transaction_fixture):
77

88
result = Message(
99
message=fixture['message'],
10-
signature=fixture['signature'],
10+
signature=fixture['signature'][2:],
1111
public_key=fixture['publicKey'],
1212
)
1313

@@ -20,7 +20,7 @@ def test_message_sign_verification(load_transaction_fixture, passphrase):
2020

2121
message: Message = Message.sign(fixture['message'], passphrase)
2222

23-
assert message.signature.decode() == fixture['signature']
23+
assert message.signature.decode() == fixture['signature'][2:]
2424
assert message.public_key.decode() == fixture['publicKey']
2525
assert message.message.decode() == fixture['message']
2626

0 commit comments

Comments
 (0)