Skip to content

Commit 2b91995

Browse files
authored
refactor: update message signing (#158)
1 parent f92b94a commit 2b91995

35 files changed

Lines changed: 112 additions & 121 deletions

crypto/identity/private_key.py

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@
77
from crypto.configuration.network import get_network
88
from crypto.enums.constants import Constants
99

10-
def keccak256(data: bytes) -> bytes:
11-
"""Keccak256 hash function"""
12-
13-
return bytes.fromhex(keccak.new(data=data, digest_bits=256).hexdigest())
14-
1510
class PrivateKey(object):
1611
def __init__(self, private_key: str):
1712
self.private_key = PvtKey.from_hex(private_key)
@@ -26,20 +21,10 @@ def sign(self, message: bytes) -> bytes:
2621
Returns:
2722
bytes: signature of the signed message
2823
"""
29-
signature = self.private_key.sign(message)
30-
31-
return hexlify(signature)
32-
33-
def sign_compact(self, message: bytes) -> bytes:
34-
"""Sign a message with this private key object
3524

36-
Args:
37-
message (bytes): bytes data you want to sign
25+
message_hash = bytes.fromhex(keccak.new(data=message, digest_bits=256).hexdigest())
3826

39-
Returns:
40-
bytes: signature of the signed message
41-
"""
42-
der = self.private_key.sign_recoverable(message, hasher=keccak256)
27+
der = self.private_key.sign_recoverable(message_hash, hasher=None)
4328

4429
return bytes([der[64] + Constants.ETHEREUM_RECOVERY_ID_OFFSET.value]) + der[0:64]
4530

crypto/transactions/signature.py

Lines changed: 0 additions & 19 deletions
This file was deleted.

crypto/transactions/types/abstract_transaction.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def sign(self, private_key: PrivateKey):
2929

3030
message = bytes.fromhex(transaction_hash)
3131

32-
transaction_signature = private_key.sign_compact(message)
32+
transaction_signature = private_key.sign(message)
3333

3434
self.data['v'] = transaction_signature[0]
3535
self.data['r'] = transaction_signature[1:33].hex()

crypto/utils/message.py

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
11
import json
22
from binascii import unhexlify
3+
from typing import Union
4+
5+
from Cryptodome.Hash import keccak
6+
from coincurve import PublicKey
37

48
from crypto.identity.private_key import PrivateKey
5-
from crypto.transactions.signature import Signature
6-
from typing import Union
79

810
class Message(object):
911
public_key: bytes
1012
message: bytes
1113
signature: bytes
1214

13-
def __init__(self, public_key: bytes, message: bytes, signature: bytes):
14-
if type(public_key) is bytes:
15-
self.public_key = public_key
16-
else:
15+
def __init__(self, public_key: Union[bytes, str], message: Union[bytes, str], signature: Union[bytes, str]):
16+
if isinstance(public_key, str):
1717
self.public_key = public_key.encode()
18-
19-
if type(message) is bytes:
20-
self.message = message
2118
else:
22-
self.message = message.encode()
19+
self.public_key = public_key
2320

24-
if type(signature) is bytes:
25-
self.signature = signature
21+
if isinstance(message, str):
22+
self.message = message.encode()
2623
else:
24+
self.message = message
25+
26+
if isinstance(signature, str):
2727
self.signature = signature.encode()
28+
else:
29+
self.signature = signature
2830

2931
@classmethod
30-
def sign(cls, message: Union[bytes, str], passphrase: bytes):
32+
def sign(cls, message: Union[bytes, str], passphrase: Union[bytes, str]):
3133
"""Signs a message
3234
3335
Args:
@@ -38,13 +40,22 @@ def sign(cls, message: Union[bytes, str], passphrase: bytes):
3840
Message: returns a message object
3941
"""
4042

41-
if type(message) is str:
43+
if isinstance(message, str):
4244
message = message.encode()
4345

46+
if not isinstance(passphrase, str):
47+
passphrase = passphrase.hex()
4448

4549
private_key = PrivateKey.from_passphrase(passphrase)
4650
public_key = private_key.public_key
47-
signature = Signature.sign(message, private_key)
51+
52+
transaction_signature = private_key.sign(message)
53+
54+
signature_v = bytes([transaction_signature[0]]).hex()
55+
signature_r = transaction_signature[1:33].hex()
56+
signature_s = transaction_signature[33:].hex()
57+
58+
signature = signature_r + signature_s + signature_v
4859

4960
return cls(
5061
message=message,
@@ -59,10 +70,18 @@ def verify(self):
5970
bool: returns a boolean - true if verified, false if not
6071
"""
6172

62-
public_key = unhexlify(self.public_key)
6373
signature = unhexlify(self.signature)
74+
message_hash = keccak.new(data=self.message, digest_bits=256).digest()
75+
76+
signature_r = signature[0:32]
77+
signature_s = signature[32:64]
78+
signature_v = signature[64]
79+
80+
signature = signature_r + signature_s + bytes([signature_v - 27])
81+
82+
public_key = PublicKey.from_signature_and_message(signature, message_hash, hasher=None)
6483

65-
return Signature.verify(signature, self.message, public_key)
84+
return public_key.format() == unhexlify(self.public_key)
6685

6786
def to_dict(self):
6887
"""Return a dictionary of the message

tests/conftest.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -236,14 +236,3 @@ def transaction_type_9():
236236
'serialized': 'ff011e0100000009000900000000000000023efc1da7f315f3c533a4080e491f32cd4219731cef008976c3876539e1f192d300f902950000000000728c2c5d5f090e8c5dfd433bb2b15b30442cbafb9b882117f7b6f284da4093c6a96e8456f764628ec809514ac4e8b06d5450978b9b763f7d01f696b8881f702a'
237237
}
238238
return data
239-
240-
241-
@pytest.fixture
242-
def message():
243-
data = {
244-
'publicKey': '034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed192',
245-
'signature': '22ff2371becb58439efdb95d116215f75bc41a380e1491605cc4874dd0d2c7d7958e4072da22fd307fe419c8864ba313a28bdb6fecbc6407839b6ba472395fe9', # noqa
246-
'message': 'Hello World',
247-
'passphrase': 'this is a top secret passphrase',
248-
}
249-
return data

tests/fixtures/message-sign.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"message": "Hello, world!",
3+
"publicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
4+
"signature": "0e2e53409be748834cac44052817ecef569b429a0492aa6bbc0d934eb71a09547e77aeef33d45669bbcba0498149f0e2b637fe8905186e08a5410c6f2b013bb41b"
5+
}
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)