11import json
22from binascii import unhexlify
3+ from typing import Union
4+
5+ from Cryptodome .Hash import keccak
6+ from coincurve import PublicKey
37
48from crypto .identity .private_key import PrivateKey
5- from crypto .transactions .signature import Signature
6- from typing import Union
79
810class 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
0 commit comments