diff --git a/bigchaindb/crypto/asymmetric.py b/bigchaindb/crypto/asymmetric.py index 15d5c5f3..bd499878 100644 --- a/bigchaindb/crypto/asymmetric.py +++ b/bigchaindb/crypto/asymmetric.py @@ -17,15 +17,25 @@ class SigningKey(metaclass=ABCMeta): Args: data: """ - raise NotImplementedError @abstractmethod def get_verifying_key(self): - raise NotImplementedError + """ + Get the associated verifying key + + Returns: + A VerifyingKey object + """ @abstractmethod def to_ascii(self, prefix, encoding): - raise NotImplementedError + """ + Encode the external value + + Args: + prefix: + encoding: + """ @staticmethod @abstractmethod @@ -36,7 +46,6 @@ class SigningKey(metaclass=ABCMeta): Args: private_value: """ - raise NotImplementedError @staticmethod @abstractmethod @@ -54,11 +63,26 @@ class VerifyingKey(metaclass=ABCMeta): @abstractmethod def verify(self, data, signature): - raise NotImplementedError + """ + Check the if the signature matches the data and this verifyingkey + + Args: + data: + signature: + + Returns: + boolean: + """ @abstractmethod def to_ascii(self, prefix, encoding): - raise NotImplementedError + """ + Encode the external value + + Args: + prefix: + encoding: + """ @staticmethod @abstractmethod @@ -69,7 +93,6 @@ class VerifyingKey(metaclass=ABCMeta): Args: public_value """ - raise NotImplementedError @staticmethod @abstractmethod @@ -80,7 +103,6 @@ class VerifyingKey(metaclass=ABCMeta): Args: public_base58 (base58): """ - raise NotImplementedError def hash_data(data): diff --git a/bigchaindb/crypto/condition.py b/bigchaindb/crypto/condition.py index 94ee4f89..fe28e28b 100644 --- a/bigchaindb/crypto/condition.py +++ b/bigchaindb/crypto/condition.py @@ -2,6 +2,7 @@ import base64 import re from abc import ABCMeta +import binascii from six import string_types from bigchaindb.crypto.buffer import base64_add_padding, base64_remove_padding, Writer, Reader @@ -41,7 +42,7 @@ class Condition(metaclass=ABCMeta): raise ValueError('Invalid condition format') condition = Condition() - condition.bitmask = int(pieces[2]) + condition.bitmask = int(pieces[2], 16) condition.hash = base64.urlsafe_b64decode(base64_add_padding(pieces[3])) condition.max_fulfillment_length = int(pieces[4]) diff --git a/tests/crypto/conftest.py b/tests/crypto/conftest.py new file mode 100644 index 00000000..8d246c24 --- /dev/null +++ b/tests/crypto/conftest.py @@ -0,0 +1,87 @@ + +import pytest + + +VK_HEX_ILP = b'ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf' +VK_B64_ILP = b'7Bcrk61eVjv0kyxw4SRQNMNUZ+8u/U1k6/gZaDRn4r8' +VK_B58_ILP = b'Gtbi6WQDB6wUePiZm8aYs5XZ5pUqx9jMMLvRVHPESTjU' + +SK_HEX_ILP = b'833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42' +SK_B64_ILP = b'gz/mJAkje51i7HdYdSCRHpp1nOwdGXVbfakBuW3KPUI' +SK_B58_ILP = b'9qLvREC54mhKYivr88VpckyVWdAFmifJpGjbvV5AiTRs' + +CONDITION_SHA256_URI = 'cc:1:1:47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU:1' +CONDITION_SHA256_HASH = b'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' +FULFILLMENT_SHA256_URI = 'cf:1:1:AA' + +CONDITION_ED25519_URI = 'cc:1:8:qQINW2um59C4DB9JSVXH1igqAmaYGGqryllHUgCpfPU:113' +CONDITION_ED25519_HASH = b'a9020d5b6ba6e7d0b80c1f494955c7d6282a026698186aabca59475200a97cf5' +FULFILLMENT_ED25519_URI = \ + 'cf:1:8:IOwXK5OtXlY79JMscOEkUDTDVGfvLv1NZOv4GWg0Z-K_DEhlbGxvIHdvcmxkISAVIENvbmRpdGlvbnMgYXJlIGhlcmUhQENbql531' \ + 'PbCJlRUvKjP56k0XKJMOrIGo2F66ueuTtRnYrJB2t2ZttdfXM4gzD_87eH1nZTpu4rTkAx81hSdpwI' + +CONDITION_ED25519_URI_2 = 'cc:1:8:_WzTrHvFnv4I-H0cAKWZ6Q3g3Y0Du3aW01nIsaAsio8:116' +CONDITION_ED25519_HASH_2 = b'a9020d5b6ba6e7d0b80c1f494955c7d6282a026698186aabca59475200a97cf5' +FULFILLMENT_ED25519_URI_2 = \ + 'cf:1:8:IOwXK5OtXlY79JMscOEkUDTDVGfvLv1NZOv4GWg0Z-K_D0hlbGxvIHVuaXZlcnNlISAbIENvbmRpdGlvbnMgYXJlIGV2ZXJ5d2hlc' \ + 'mUhQNmD2Cvk7e3EFOo-arA2TKYTP-474Z4okhbYmKij6XxObIbRsDScjXILAJ6mV5hP7Xyqkg5fcSsZbfRYypzlsAM' + +CONDITION_THRESHOLD_ED25519_URI = 'cc:1:d:fDM51fekeLlbeF9yj9W1KT76jtqa7u0vMlJAbM4EyiE:230' +FULFILLMENT_THRESHOLD_ED25519_URI = \ + 'cf:1:4:AgIBAQABCCDsFyuTrV5WO_STLHDhJFA0w1Rn7y79TWTr-BloNGfivwxIZWxsbyB3b3JsZCEgFSBDb25kaXRpb25zIGFyZSBoZXJlI' \ + 'UBDW6ped9T2wiZUVLyoz-epNFyiTDqyBqNheurnrk7UZ2KyQdrdmbbXX1zOIMw__O3h9Z2U6buK05AMfNYUnacCAQEIIP1s06x7xZ7-CPh9H' \ + 'AClmekN4N2NA7t2ltNZyLGgLIqPdA' + + +@pytest.fixture(scope='module') +def vk_ilp(): + return { + 'hex': VK_HEX_ILP, + 'b64': VK_B64_ILP, + 'b58': VK_B58_ILP + } + + +@pytest.fixture(scope='module') +def sk_ilp(): + return { + 'hex': SK_HEX_ILP, + 'b64': SK_B64_ILP, + 'b58': SK_B58_ILP + } + + +@pytest.fixture(scope='module') +def fulfillment_sha256(): + return { + 'condition_uri': CONDITION_SHA256_URI, + 'condition_hash': CONDITION_SHA256_HASH, + 'fulfillment_uri': FULFILLMENT_SHA256_URI + } + + +@pytest.fixture(scope='module') +def fulfillment_ed25519(): + return { + 'condition_uri': CONDITION_ED25519_URI, + 'condition_hash': CONDITION_ED25519_HASH, + 'fulfillment_uri': FULFILLMENT_ED25519_URI + } + + +@pytest.fixture(scope='module') +def fulfillment_ed25519_2(): + return { + 'condition_uri': CONDITION_ED25519_URI_2, + 'condition_hash': CONDITION_ED25519_HASH_2, + 'fulfillment_uri': FULFILLMENT_ED25519_URI_2 + } + + +@pytest.fixture(scope='module') +def fulfillment_threshold(): + return { + 'condition_uri': CONDITION_THRESHOLD_ED25519_URI, + 'condition_hash': None, + 'fulfillment_uri': FULFILLMENT_THRESHOLD_ED25519_URI + } diff --git a/tests/crypto/test_fulfillment.py b/tests/crypto/test_fulfillment.py index 1452aa59..9c5bc71c 100644 --- a/tests/crypto/test_fulfillment.py +++ b/tests/crypto/test_fulfillment.py @@ -13,37 +13,33 @@ from bigchaindb.crypto.fulfillments.threshold_sha256 import ThresholdSha256Fulfi class TestBigchainILPSha256Condition: - CONDITION_SHA256_ILP = 'cc:1:1:47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU:1' - CONDITION_SHA256_HASH = b'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' - def test_deserialize_condition(self): - example_condition = self.CONDITION_SHA256_ILP + def test_deserialize_condition(self, fulfillment_sha256): + example_condition = fulfillment_sha256['condition_uri'] condition = Condition.from_uri(example_condition) - assert condition.serialize_uri() == self.CONDITION_SHA256_ILP + assert condition.serialize_uri() == fulfillment_sha256['condition_uri'] - def test_create_condition(self): + def test_create_condition(self, fulfillment_sha256): sha256condition = Condition() sha256condition.bitmask = Sha256Fulfillment._bitmask - sha256condition.hash = binascii.unhexlify(self.CONDITION_SHA256_HASH) + sha256condition.hash = binascii.unhexlify(fulfillment_sha256['condition_hash']) sha256condition.max_fulfillment_length = 1 - assert sha256condition.serialize_uri() == self.CONDITION_SHA256_ILP + assert sha256condition.serialize_uri() == fulfillment_sha256['condition_uri'] class TestBigchainILPSha256Fulfillment: - CONDITION_SHA256_ILP = 'cc:1:1:47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU:1' - FULFILLMENT_SHA256_ILP = 'cf:1:1:AA' - def test_deserialize_and_validate_fulfillment(self): - fulfillment = Fulfillment.from_uri(self.FULFILLMENT_SHA256_ILP) - assert fulfillment.serialize_uri() == self.FULFILLMENT_SHA256_ILP - assert fulfillment.condition.serialize_uri() == self.CONDITION_SHA256_ILP + def test_deserialize_and_validate_fulfillment(self, fulfillment_sha256): + fulfillment = Fulfillment.from_uri(fulfillment_sha256['fulfillment_uri']) + assert fulfillment.serialize_uri() == fulfillment_sha256['fulfillment_uri'] + assert fulfillment.condition.serialize_uri() == fulfillment_sha256['condition_uri'] assert fulfillment.validate() - def test_deserialize_condition_and_validate_fulfillment(self): - condition = Condition.from_uri(self.CONDITION_SHA256_ILP) + def test_deserialize_condition_and_validate_fulfillment(self, fulfillment_sha256): + condition = Condition.from_uri(fulfillment_sha256['condition_uri']) fulfillment = Sha256Fulfillment() fulfillment.preimage = '' - assert fulfillment.serialize_uri() == self.FULFILLMENT_SHA256_ILP + assert fulfillment.serialize_uri() == fulfillment_sha256['fulfillment_uri'] assert fulfillment.condition.serialize_uri() == condition.serialize_uri() assert fulfillment.validate() assert fulfillment.validate() \ @@ -64,40 +60,27 @@ class TestBigchainILPSha256Fulfillment: class TestBigchainILPEd25519Sha256Fulfillment: - PUBLIC_HEX_ILP = b'ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf' - PUBLIC_B64_ILP = b'7Bcrk61eVjv0kyxw4SRQNMNUZ+8u/U1k6/gZaDRn4r8' - PUBLIC_B58_ILP = b'Gtbi6WQDB6wUePiZm8aYs5XZ5pUqx9jMMLvRVHPESTjU' - PRIVATE_HEX_ILP = b'833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42' - PRIVATE_B64_ILP = b'gz/mJAkje51i7HdYdSCRHpp1nOwdGXVbfakBuW3KPUI' - PRIVATE_B58_ILP = b'9qLvREC54mhKYivr88VpckyVWdAFmifJpGjbvV5AiTRs' + def test_ilp_keys(self, sk_ilp, vk_ilp): + sk = Ed25519SigningKey(sk_ilp['b58']) + assert sk.to_ascii(encoding='base64') == sk_ilp['b64'] + assert binascii.hexlify(sk.to_bytes()[:32]) == sk_ilp['hex'] - CONDITION_ED25519_ILP = 'cc:1:8:qQINW2um59C4DB9JSVXH1igqAmaYGGqryllHUgCpfPU:113' - FULFILLMENT_ED25519_ILP = \ - 'cf:1:8:IOwXK5OtXlY79JMscOEkUDTDVGfvLv1NZOv4GWg0Z-K_DEhlbGxvIHdvcmxkISAVIENvbmRpdGlvbnMgYXJlIGhlcmUhQENbql531' \ - 'PbCJlRUvKjP56k0XKJMOrIGo2F66ueuTtRnYrJB2t2ZttdfXM4gzD_87eH1nZTpu4rTkAx81hSdpwI' - HASH_ED25519_HEX_ILP = b'a9020d5b6ba6e7d0b80c1f494955c7d6282a026698186aabca59475200a97cf5' + vk = Ed25519VerifyingKey(vk_ilp['b58']) + assert vk.to_ascii(encoding='base64') == vk_ilp['b64'] + assert binascii.hexlify(vk.to_bytes()) == vk_ilp['hex'] - def test_ilp_keys(self): - sk = Ed25519SigningKey(self.PRIVATE_B58_ILP) - assert sk.to_ascii(encoding='base64') == self.PRIVATE_B64_ILP - assert binascii.hexlify(sk.to_bytes()[:32]) == self.PRIVATE_HEX_ILP - - vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP) - assert vk.to_ascii(encoding='base64') == self.PUBLIC_B64_ILP - assert binascii.hexlify(vk.to_bytes()) == self.PUBLIC_HEX_ILP - - def test_serialize_condition_and_validate_fulfillment(self): - sk = Ed25519SigningKey(self.PRIVATE_B58_ILP) - vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP) + def test_serialize_condition_and_validate_fulfillment(self, sk_ilp, vk_ilp, fulfillment_ed25519): + sk = Ed25519SigningKey(sk_ilp['b58']) + vk = Ed25519VerifyingKey(vk_ilp['b58']) fulfillment = Ed25519Sha256Fulfillment() fulfillment.public_key = vk fulfillment.message_prefix = 'Hello world!' fulfillment.max_dynamic_message_length = 32 # defaults to 0 - assert fulfillment.condition.serialize_uri() == self.CONDITION_ED25519_ILP - assert binascii.hexlify(fulfillment.condition.hash) == self.HASH_ED25519_HEX_ILP + assert fulfillment.condition.serialize_uri() == fulfillment_ed25519['condition_uri'] + assert binascii.hexlify(fulfillment.condition.hash) == fulfillment_ed25519['condition_hash'] fulfillment.message = ' Conditions are here!' @@ -107,17 +90,17 @@ class TestBigchainILPEd25519Sha256Fulfillment: # Fulfill an ED25519-SHA256 condition fulfillment.sign(sk) - assert fulfillment.serialize_uri() == self.FULFILLMENT_ED25519_ILP + assert fulfillment.serialize_uri() == fulfillment_ed25519['fulfillment_uri'] assert fulfillment.validate() - def test_deserialize_condition(self): - deserialized_condition = Condition.from_uri(self.CONDITION_ED25519_ILP) + def test_deserialize_condition(self, fulfillment_ed25519): + deserialized_condition = Condition.from_uri(fulfillment_ed25519['condition_uri']) - assert deserialized_condition.serialize_uri() == self.CONDITION_ED25519_ILP - assert binascii.hexlify(deserialized_condition.hash) == self.HASH_ED25519_HEX_ILP + assert deserialized_condition.serialize_uri() == fulfillment_ed25519['condition_uri'] + assert binascii.hexlify(deserialized_condition.hash) == fulfillment_ed25519['condition_hash'] - def test_serialize_deserialize_condition(self): - vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP) + def test_serialize_deserialize_condition(self, vk_ilp): + vk = Ed25519VerifyingKey(vk_ilp['b58']) fulfillment = Ed25519Sha256Fulfillment() fulfillment.public_key = vk @@ -132,19 +115,19 @@ class TestBigchainILPEd25519Sha256Fulfillment: assert deserialized_condition.max_fulfillment_length == condition.max_fulfillment_length assert deserialized_condition.serialize_uri() == condition.serialize_uri() - def test_deserialize_fulfillment(self): - fulfillment = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP) + def test_deserialize_fulfillment(self, vk_ilp, fulfillment_ed25519): + fulfillment = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri']) assert isinstance(fulfillment, Ed25519Sha256Fulfillment) - assert fulfillment.serialize_uri() == self.FULFILLMENT_ED25519_ILP - assert fulfillment.condition.serialize_uri() == self.CONDITION_ED25519_ILP - assert binascii.hexlify(fulfillment.condition.hash) == self.HASH_ED25519_HEX_ILP - assert fulfillment.public_key.to_ascii(encoding='hex') == self.PUBLIC_HEX_ILP + assert fulfillment.serialize_uri() == fulfillment_ed25519['fulfillment_uri'] + assert fulfillment.condition.serialize_uri() == fulfillment_ed25519['condition_uri'] + assert binascii.hexlify(fulfillment.condition.hash) == fulfillment_ed25519['condition_hash'] + assert fulfillment.public_key.to_ascii(encoding='hex') == vk_ilp['hex'] assert fulfillment.validate() - def test_serialize_deserialize_fulfillment(self): - sk = Ed25519SigningKey(self.PRIVATE_B58_ILP) - vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP) + def test_serialize_deserialize_fulfillment(self, sk_ilp, vk_ilp): + sk = Ed25519SigningKey(sk_ilp['b58']) + vk = Ed25519VerifyingKey(vk_ilp['b58']) fulfillment = Ed25519Sha256Fulfillment() fulfillment.public_key = vk @@ -164,32 +147,10 @@ class TestBigchainILPEd25519Sha256Fulfillment: class TestBigchainILPThresholdSha256Fulfillment: - PUBLIC_B58_ILP = 'Gtbi6WQDB6wUePiZm8aYs5XZ5pUqx9jMMLvRVHPESTjU' - PRIVATE_B58_ILP = '9qLvREC54mhKYivr88VpckyVWdAFmifJpGjbvV5AiTRs' - CONDITION_ED25519_ILP = 'cc:1:8:qQINW2um59C4DB9JSVXH1igqAmaYGGqryllHUgCpfPU:113' - FULFILLMENT_ED25519_ILP = \ - 'cf:1:8:IOwXK5OtXlY79JMscOEkUDTDVGfvLv1NZOv4GWg0Z-K_DEhlbGxvIHdvcmxkISAVIENvbmRpdGlvbnMgYXJlIGhlcmUhQENbql531' \ - 'PbCJlRUvKjP56k0XKJMOrIGo2F66ueuTtRnYrJB2t2ZttdfXM4gzD_87eH1nZTpu4rTkAx81hSdpwI' - - CONDITION_ED25519_ILP_2 = 'cc:1:8:_WzTrHvFnv4I-H0cAKWZ6Q3g3Y0Du3aW01nIsaAsio8:116' - FULFILLMENT_ED25519_ILP_2 = \ - 'cf:1:8:IOwXK5OtXlY79JMscOEkUDTDVGfvLv1NZOv4GWg0Z-K_D0hlbGxvIHVuaXZlcnNlISAbIENvbmRpdGlvbnMgYXJlIGV2ZXJ5d2hlc' \ - 'mUhQNmD2Cvk7e3EFOo-arA2TKYTP-474Z4okhbYmKij6XxObIbRsDScjXILAJ6mV5hP7Xyqkg5fcSsZbfRYypzlsAM' - HASH_ED25519_HEX_ILP = b'a9020d5b6ba6e7d0b80c1f494955c7d6282a026698186aabca59475200a97cf5' - - CONDITION_SHA256_ILP = 'cc:1:1:47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU:1' - FULFILLMENT_SHA256_ILP = 'cf:1:1:AA' - - CONDITION_THRESHOLD_ED25519_ILP_2 = 'cc:1:d:fDM51fekeLlbeF9yj9W1KT76jtqa7u0vMlJAbM4EyiE:230' - FULFILLMENT_THRESHOLD_ED25519_ILP_2 = \ - 'cf:1:4:AgIBAQABCCDsFyuTrV5WO_STLHDhJFA0w1Rn7y79TWTr-BloNGfivwxIZWxsbyB3b3JsZCEgFSBDb25kaXRpb25zIGFyZSBoZXJlI' \ - 'UBDW6ped9T2wiZUVLyoz-epNFyiTDqyBqNheurnrk7UZ2KyQdrdmbbXX1zOIMw__O3h9Z2U6buK05AMfNYUnacCAQEIIP1s06x7xZ7-CPh9H' \ - 'AClmekN4N2NA7t2ltNZyLGgLIqPdA' - - def create_fulfillment_ed25519sha256(self): - sk = Ed25519SigningKey(self.PRIVATE_B58_ILP) - vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP) + def create_fulfillment_ed25519sha256(self, sk_ilp, vk_ilp): + sk = Ed25519SigningKey(sk_ilp['b58']) + vk = Ed25519VerifyingKey(vk_ilp['b58']) fulfillment = Ed25519Sha256Fulfillment() fulfillment.public_key = vk @@ -199,10 +160,14 @@ class TestBigchainILPThresholdSha256Fulfillment: fulfillment.sign(sk) return fulfillment - def test_serialize_condition_and_validate_fulfillment(self): - ilp_fulfillment = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP_2) - ilp_fulfillment_2 = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP) - ilp_fulfillment_3 = Fulfillment.from_uri(self.FULFILLMENT_SHA256_ILP) + def test_serialize_condition_and_validate_fulfillment(self, + fulfillment_sha256, + fulfillment_ed25519, + fulfillment_ed25519_2, + fulfillment_threshold): + ilp_fulfillment = Fulfillment.from_uri(fulfillment_ed25519_2['fulfillment_uri']) + ilp_fulfillment_2 = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri']) + ilp_fulfillment_3 = Fulfillment.from_uri(fulfillment_sha256['fulfillment_uri']) assert ilp_fulfillment.validate() == True assert ilp_fulfillment_2.validate() == True @@ -216,31 +181,35 @@ class TestBigchainILPThresholdSha256Fulfillment: fulfillment.add_subfulfillment(ilp_fulfillment_3) fulfillment.threshold = threshold # defaults to subconditions.length - assert fulfillment.condition.serialize_uri() == self.CONDITION_THRESHOLD_ED25519_ILP_2 + assert fulfillment.condition.serialize_uri() == fulfillment_threshold['condition_uri'] # Note: If there are more than enough fulfilled subconditions, shorter # fulfillments will be chosen over longer ones. # thresholdFulfillmentUri.length === 65 - assert fulfillment.serialize_uri() == self.FULFILLMENT_THRESHOLD_ED25519_ILP_2 + assert fulfillment.serialize_uri() == fulfillment_threshold['fulfillment_uri'] assert fulfillment.validate() - def test_deserialize_fulfillment(self): + def test_deserialize_fulfillment(self, + fulfillment_sha256, + fulfillment_ed25519, + fulfillment_threshold): num_fulfillments = 3 threshold = 2 - fulfillment = Fulfillment.from_uri(self.FULFILLMENT_THRESHOLD_ED25519_ILP_2) + fulfillment = Fulfillment.from_uri(fulfillment_threshold['fulfillment_uri']) assert isinstance(fulfillment, ThresholdSha256Fulfillment) assert fulfillment.threshold == threshold assert len(fulfillment.subfulfillments) == threshold assert len(fulfillment.get_all_subconditions()) == num_fulfillments - assert fulfillment.serialize_uri() == self.FULFILLMENT_THRESHOLD_ED25519_ILP_2 + assert fulfillment.serialize_uri() == fulfillment_threshold['fulfillment_uri'] assert fulfillment.validate() assert isinstance(fulfillment.subfulfillments[0], Sha256Fulfillment) assert isinstance(fulfillment.subfulfillments[1], Ed25519Sha256Fulfillment) - assert fulfillment.subfulfillments[0].condition.serialize_uri() == self.CONDITION_SHA256_ILP - assert fulfillment.subfulfillments[1].condition.serialize_uri() == self.CONDITION_ED25519_ILP + assert fulfillment.subfulfillments[0].condition.serialize_uri() == fulfillment_sha256['condition_uri'] + assert fulfillment.subfulfillments[1].condition.serialize_uri() == fulfillment_ed25519['condition_uri'] - def test_serialize_deserialize_fulfillment(self): - ilp_fulfillment = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP) + def test_serialize_deserialize_fulfillment(self, + fulfillment_ed25519): + ilp_fulfillment = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri']) num_fulfillments = 100 threshold = ceil(num_fulfillments * 2 / 3) @@ -262,8 +231,8 @@ class TestBigchainILPThresholdSha256Fulfillment: assert deserialized_fulfillment.serialize_uri() == fulfillment_uri assert deserialized_fulfillment.validate() - def test_fulfillment_didnt_reach_threshold(self): - ilp_fulfillment = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP) + def test_fulfillment_didnt_reach_threshold(self, fulfillment_ed25519): + ilp_fulfillment = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri']) threshold = 10 # Create a threshold condition @@ -292,10 +261,13 @@ class TestBigchainILPThresholdSha256Fulfillment: assert deserialized_fulfillment.serialize_uri() == fulfillment_uri assert deserialized_fulfillment.validate() - def test_fulfillment_nested_and_or(self): - ilp_fulfillment_sha = Fulfillment.from_uri(self.FULFILLMENT_SHA256_ILP) - ilp_fulfillment_ed1 = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP_2) - ilp_fulfillment_ed2 = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP) + def test_fulfillment_nested_and_or(self, + fulfillment_sha256, + fulfillment_ed25519, + fulfillment_ed25519_2): + ilp_fulfillment_sha = Fulfillment.from_uri(fulfillment_sha256['fulfillment_uri']) + ilp_fulfillment_ed1 = Fulfillment.from_uri(fulfillment_ed25519_2['fulfillment_uri']) + ilp_fulfillment_ed2 = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri']) # 2-of-2 (AND with 2 inputs) fulfillment = ThresholdSha256Fulfillment() @@ -318,6 +290,9 @@ class TestBigchainILPThresholdSha256Fulfillment: fulfillment_uri = fulfillment.serialize_uri() deserialized_fulfillment = Fulfillment.from_uri(fulfillment_uri) + condition_uri = fulfillment.condition.serialize_uri() + deserialized_condition = Condition.from_uri(condition_uri) + assert isinstance(deserialized_fulfillment, ThresholdSha256Fulfillment) assert deserialized_fulfillment.threshold == 2 assert len(deserialized_fulfillment.subfulfillments) == 2 @@ -325,10 +300,13 @@ class TestBigchainILPThresholdSha256Fulfillment: assert len(deserialized_fulfillment.get_all_subconditions()) == 2 assert deserialized_fulfillment.serialize_uri() == fulfillment_uri assert deserialized_fulfillment.validate() + assert deserialized_condition.serialize_uri() == condition_uri - def test_fulfillment_nested(self): - ilp_fulfillment_sha = Fulfillment.from_uri(self.FULFILLMENT_SHA256_ILP) - ilp_fulfillment_ed1 = Fulfillment.from_uri(self.FULFILLMENT_ED25519_ILP_2) + def test_fulfillment_nested(self, + fulfillment_sha256, + fulfillment_ed25519_2,): + ilp_fulfillment_sha = Fulfillment.from_uri(fulfillment_sha256['fulfillment_uri']) + ilp_fulfillment_ed1 = Fulfillment.from_uri(fulfillment_ed25519_2['fulfillment_uri']) # 2-of-2 (AND with 2 inputs) fulfillment = ThresholdSha256Fulfillment() @@ -353,4 +331,14 @@ class TestBigchainILPThresholdSha256Fulfillment: assert fulfillment.validate() is True assert len(fulfillment.subfulfillments) == 2 assert isinstance(fulfillment.subfulfillments[1], ThresholdSha256Fulfillment) - assert isinstance(fulfillment.subfulfillments[1].subfulfillments[0], ThresholdSha256Fulfillment) \ No newline at end of file + assert isinstance(fulfillment.subfulfillments[1].subfulfillments[0], ThresholdSha256Fulfillment) + + fulfillment_uri = fulfillment.serialize_uri() + deserialized_fulfillment = Fulfillment.from_uri(fulfillment_uri) + + condition_uri = fulfillment.condition.serialize_uri() + deserialized_condition = Condition.from_uri(condition_uri) + + assert deserialized_fulfillment.serialize_uri() == fulfillment_uri + assert deserialized_fulfillment.validate() is True + assert deserialized_condition.serialize_uri() == condition_uri