From f2f8a8bece52ade30f2e667110a01a90757a5dc4 Mon Sep 17 00:00:00 2001 From: tuxxy Date: Fri, 14 Sep 2018 13:34:43 -0600 Subject: [PATCH 1/2] Add timestamp to Ursula for serialization Add timestamp to deserialized vars in verify_node Add timestamp when deserializing from batch --- nucypher/characters/lawful.py | 11 ++++++++--- nucypher/network/nodes.py | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/nucypher/characters/lawful.py b/nucypher/characters/lawful.py index 16ef63cb9..947ceb5af 100644 --- a/nucypher/characters/lawful.py +++ b/nucypher/characters/lawful.py @@ -558,7 +558,10 @@ class Ursula(Character, VerifiableNode, Miner): certificate = self.rest_server_certificate() cert_vbytes = VariableLengthBytestring(certificate.public_bytes(Encoding.PEM)) - as_bytes = bytes().join((bytes(self._interface_signature), + timestamp = maya.now().epoch.to_bytes(4, 'big') + + as_bytes = bytes().join((timestamp, + bytes(self._interface_signature), bytes(identity_evidence), bytes(self.public_keys(SigningPower)), bytes(self.public_keys(EncryptingPower)), @@ -592,7 +595,8 @@ class Ursula(Character, VerifiableNode, Miner): federated_only: bool = False, ) -> 'Ursula': - (signature, + (timestamp, + signature, identity_evidence, verifying_key, encrypting_key, @@ -623,7 +627,8 @@ class Ursula(Character, VerifiableNode, Miner): stranger_ursulas = [] ursulas_attrs = cls._internal_splitter.repeat(ursulas_as_bytes) - for (signature, + for (timestamp, + signature, identity_evidence, verifying_key, encrypting_key, diff --git a/nucypher/network/nodes.py b/nucypher/network/nodes.py index 82a068ef9..b32b45e8c 100644 --- a/nucypher/network/nodes.py +++ b/nucypher/network/nodes.py @@ -117,7 +117,7 @@ class VerifiableNode: port=self.rest_information()[0].port) if not response.status_code == 200: raise RuntimeError("Or something.") # TODO: Raise an error here? Or return False? Or something? - signature, identity_evidence, verifying_key, encrypting_key, public_address, certificate_vbytes, rest_info = self._internal_splitter(response.content) + timestamp, signature, identity_evidence, verifying_key, encrypting_key, public_address, certificate_vbytes, rest_info = self._internal_splitter(response.content) verifying_keys_match = verifying_key == self.public_keys(SigningPower) encrypting_keys_match = encrypting_key == self.public_keys(EncryptingPower) From bd3f19c7e71220c5a58babe7182a3aa147b4d7ac Mon Sep 17 00:00:00 2001 From: tuxxy Date: Thu, 20 Sep 2018 11:03:59 -0600 Subject: [PATCH 2/2] Add test for Ursula serialization --- nucypher/characters/lawful.py | 3 ++- tests/characters/test_character_serialization.py | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/nucypher/characters/lawful.py b/nucypher/characters/lawful.py index 947ceb5af..e518553af 100644 --- a/nucypher/characters/lawful.py +++ b/nucypher/characters/lawful.py @@ -368,7 +368,8 @@ class Bob(Character): class Ursula(Character, VerifiableNode, Miner): - _internal_splitter = BytestringSplitter(Signature, + _internal_splitter = BytestringSplitter((int, 4, {'byteorder': 'big'}), + Signature, VariableLengthBytestring, (UmbralPublicKey, PUBLIC_KEY_LENGTH), (UmbralPublicKey, PUBLIC_KEY_LENGTH), diff --git a/tests/characters/test_character_serialization.py b/tests/characters/test_character_serialization.py index 68bf7e5ed..594b75ec4 100644 --- a/tests/characters/test_character_serialization.py +++ b/tests/characters/test_character_serialization.py @@ -1,6 +1,9 @@ import pytest +from nucypher.characters.lawful import Ursula -@pytest.mark.skip("To be implemented.") -def test_serialize_ursula(ursulas): - assert False +def test_serialize_ursula(federated_ursulas): + ursula = federated_ursulas.pop() + ursula_as_bytes = bytes(ursula) + ursula_object = Ursula.from_bytes(ursula_as_bytes, federated_only=True) + assert ursula == ursula_object