Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crypto/transactions/transaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ def verify(self):
will happen.
"""
transaction = self.to_bytes()
message = Message(transaction, self.signature, self.senderPublicKey)
message = Message(message=transaction, signature=self.signature, publickey=self.senderPublicKey)
is_valid = message.verify()
if not is_valid:
raise ArkInvalidTransaction('Transaction could not be verified')
Expand Down
21 changes: 11 additions & 10 deletions crypto/utils/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@


class Message(object):

def __init__(self, message, signature, public_key):
self.public_key = public_key
self.signature = signature
self.message = message
def __init__(self, **kwargs):
for k in kwargs.keys():
if k in ['message', 'signature', 'publickey', 'publicKey']:
self.__setattr__(k, kwargs[k])
else:
raise TypeError('Invalid keyword argument %s' % k)

@classmethod
def sign(cls, message, passphrase):
Expand All @@ -23,11 +24,11 @@ def sign(cls, message, passphrase):
Returns:
Message: returns a message object
"""
message_byes = message if isinstance(message, bytes) else message.encode()
message_bytes = message if isinstance(message, bytes) else message.encode()
passphrase = passphrase.decode() if isinstance(passphrase, bytes) else passphrase
private_key = PrivateKey.from_passphrase(passphrase)
signature = private_key.sign(message_byes)
return cls(message, signature, private_key.public_key)
signature = private_key.sign(message_bytes)
return cls(message=message, signature=signature, publicKey=private_key.public_key)

def verify(self):
"""Verify the Message object
Expand All @@ -36,7 +37,7 @@ def verify(self):
bool: returns a boolean - true if verified, false if not
"""
message = self.message if isinstance(self.message, bytes) else self.message.encode()
key = PublicKey.from_hex(self.public_key)
key = PublicKey.from_hex(self.publickey) if hasattr(self, 'publickey') else PublicKey.from_hex(self.publicKey)
signature = unhexlify(self.signature)
is_verified = key.public_key.verify(signature, message)
return is_verified
Expand All @@ -48,7 +49,7 @@ def to_dict(self):
dict: dictionary consiting of public_key, signature and message
"""
data = {
'public_key': self.public_key,
('publicKey' if hasattr(self, 'publicKey') else 'publickey'): (self.publicKey if hasattr(self, 'publicKey') else self.publickey),
'signature': self.signature,
'message': self.message,
}
Expand Down
10 changes: 8 additions & 2 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,11 +179,17 @@ def transaction_type_8():
@pytest.fixture
def message():
data = {
'data': {
'public_key': '034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed192',
'camelCase_pk': {
'publicKey': '034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed192',
'signature': '304402200fb4adddd1f1d652b544ea6ab62828a0a65b712ed447e2538db0caebfa68929e02205ecb2e1c63b29879c2ecf1255db506d671c8b3fa6017f67cfd1bf07e6edd1cc8', # noqa
'message': 'Hello World'
},

'snake_case_pk': {
'publickey': '034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed192',
'signature': '304402200fb4adddd1f1d652b544ea6ab62828a0a65b712ed447e2538db0caebfa68929e02205ecb2e1c63b29879c2ecf1255db506d671c8b3fa6017f67cfd1bf07e6edd1cc8', # noqa
'message': 'Hello World'
},
'passphrase': 'this is a top secret passphrase'
}
return data
36 changes: 25 additions & 11 deletions tests/utils/test_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,38 @@


def test_signing(message):
result = Message.sign(message['data']['message'], message['passphrase'])
assert result.to_dict() == message['data']
result = Message.sign(message['camelCase_pk']['message'], message['passphrase'])
assert result.to_dict() == message['camelCase_pk']


def test_verify(message):
result = Message(**message['data'])
def test_verify_with_publickey(message):
result = Message(**message['snake_case_pk'])
assert result.verify() is True


def test_verify_with_publicKey(message):
result = Message(**message['camelCase_pk'])
assert result.verify() is True


def test_to_dict(message):
result = Message(**message['data'])
assert result.to_dict() == message['data']
result = Message(**message['camelCase_pk'])
assert result.to_dict() == message['camelCase_pk']


def test_to_json_with_publicKey(message):
result = Message(**message['camelCase_pk'])
json_data = result.to_json()
data = json.loads(json_data)
assert data['signature'] == message['camelCase_pk']['signature']
assert data['publicKey'] == message['camelCase_pk']['publicKey']
assert data['message'] == message['camelCase_pk']['message']


def test_to_json(message):
result = Message(**message['data'])
def test_to_json_with_publickey(message):
result = Message(**message['snake_case_pk'])
json_data = result.to_json()
data = json.loads(json_data)
assert data['signature'] == message['data']['signature']
assert data['public_key'] == message['data']['public_key']
assert data['message'] == message['data']['message']
assert data['signature'] == message['snake_case_pk']['signature']
assert data['publickey'] == message['snake_case_pk']['publickey']
assert data['message'] == message['snake_case_pk']['message']