updated cryptoconditions

replaced get_subcondition_from_vk
This commit is contained in:
diminator 2016-04-15 16:32:27 +02:00
parent 7576dc3937
commit 85353f7002
No known key found for this signature in database
GPG Key ID: C3D8590E6D0D439A
4 changed files with 57 additions and 62 deletions

View File

@ -1,7 +1,7 @@
# Separate all crypto code so that we can easily test several implementations
import sha3
from cryptoconditions import ed25519
from cryptoconditions import crypto
def hash_data(data):
@ -10,8 +10,8 @@ def hash_data(data):
def generate_key_pair():
sk, pk = ed25519.ed25519_generate_key_pair()
sk, pk = crypto.ed25519_generate_key_pair()
return sk.decode(), pk.decode()
SigningKey = ed25519.SigningKey
VerifyingKey = ed25519.VerifyingKey
SigningKey = crypto.Ed25519SigningKey
VerifyingKey = crypto.Ed25519VerifyingKey

View File

@ -4,8 +4,7 @@ import time
import multiprocessing as mp
from datetime import datetime
from cryptoconditions import Ed25519Fulfillment, ThresholdSha256Fulfillment
from cryptoconditions.fulfillment import Fulfillment
import cryptoconditions as cc
import bigchaindb
from bigchaindb import exceptions
@ -194,11 +193,11 @@ def create_tx(current_owners, new_owners, inputs, operation, payload=None):
conditions = []
for fulfillment in fulfillments:
if len(new_owners) > 1:
condition = ThresholdSha256Fulfillment(threshold=len(new_owners))
condition = cc.ThresholdSha256Fulfillment(threshold=len(new_owners))
for new_owner in new_owners:
condition.add_subfulfillment(Ed25519Fulfillment(public_key=new_owner))
condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=new_owner))
elif len(new_owners) == 1:
condition = Ed25519Fulfillment(public_key=new_owners[0])
condition = cc.Ed25519Fulfillment(public_key=new_owners[0])
conditions.append({
'new_owners': new_owners,
'condition': {
@ -258,10 +257,10 @@ def sign_tx(transaction, sks):
for fulfillment in tx['transaction']['fulfillments']:
fulfillment_message = get_fulfillment_message(transaction, fulfillment)
parsed_fulfillment = Fulfillment.from_json(fulfillment_message['condition']['condition']['details'])
parsed_fulfillment = cc.Fulfillment.from_json(fulfillment_message['condition']['condition']['details'])
parsed_fulfillment_copy = copy.deepcopy(parsed_fulfillment)
# single current owner
if isinstance(parsed_fulfillment, Ed25519Fulfillment):
if isinstance(parsed_fulfillment, cc.Ed25519Fulfillment):
current_owner = fulfillment['current_owners'][0]
try:
parsed_fulfillment.sign(serialize(fulfillment_message), key_pairs[current_owner])
@ -269,11 +268,15 @@ def sign_tx(transaction, sks):
raise exceptions.KeypairMismatchException('Public key {} is not a pair to any of the private keys'
.format(current_owner))
# multiple current owners
elif isinstance(parsed_fulfillment, ThresholdSha256Fulfillment):
elif isinstance(parsed_fulfillment, cc.ThresholdSha256Fulfillment):
# replace the fulfillments with the signed fulfillments
parsed_fulfillment.subconditions = []
for current_owner in fulfillment['current_owners']:
subfulfillment = get_subcondition_from_vk(fulfillment_message['condition'], current_owner)
try:
subfulfillment = parsed_fulfillment_copy.get_subcondition_from_vk(current_owner)[0]
except IndexError:
exceptions.KeypairMismatchException('Public key {} cannot be found in the fulfillment'
.format(current_owner))
try:
subfulfillment.sign(serialize(fulfillment_message), key_pairs[current_owner])
except KeyError:
@ -320,7 +323,7 @@ def verify_signature(signed_transaction):
fulfillment_message = get_fulfillment_message(signed_transaction, fulfillment)
# verify the fulfillment (for now lets assume there is only one owner)
try:
parsed_fulfillment = Fulfillment.from_uri(fulfillment['fulfillment'])
parsed_fulfillment = cc.Fulfillment.from_uri(fulfillment['fulfillment'])
except Exception:
return False
is_valid = parsed_fulfillment.validate(serialize(fulfillment_message))
@ -372,7 +375,7 @@ def get_fulfillment_message(transaction, fulfillment, serialized=False):
# there is no previous transaction so we need to create one on the fly
else:
current_owner = transaction['transaction']['fulfillments'][0]['current_owners'][0]
condition = json.loads(Ed25519Fulfillment(public_key=current_owner).serialize_json())
condition = json.loads(cc.Ed25519Fulfillment(public_key=current_owner).serialize_json())
fulfillment_message['condition'] = {'condition': {'details': condition}}
if serialized:
return serialize(fulfillment_message)
@ -399,13 +402,6 @@ def get_hash_data(transaction):
return crypto.hash_data(serialize(tx))
def get_subcondition_from_vk(condition, vk):
threshold_fulfillment = Fulfillment.from_json(condition['condition']['details'])
for subcondition in threshold_fulfillment.subconditions:
if subcondition['body'].public_key.to_ascii().decode() == vk:
return subcondition['body']
def transform_create(tx):
"""Change the owner and signature for a ``CREATE`` transaction created by a node"""

View File

@ -71,7 +71,7 @@ setup(
'rethinkdb==2.2.0.post4',
'pysha3==0.3',
'pytz==2015.7',
'cryptoconditions==0.1.6',
'cryptoconditions==0.2.0',
'statsd==3.2.1',
'python-rapidjson==0.0.6',
'logstats==0.2.1',

View File

@ -6,9 +6,7 @@ import json
import pytest
import rethinkdb as r
from cryptoconditions import Ed25519Fulfillment, ThresholdSha256Fulfillment
from cryptoconditions.condition import Condition
from cryptoconditions.fulfillment import Fulfillment
import cryptoconditions as cc
import bigchaindb
from bigchaindb import util
@ -330,7 +328,7 @@ class TestTransactionValidation(object):
# create a correctly signed transaction and change the signature
tx_signed = b.sign_transaction(tx_valid, user_sk)
fulfillment = tx_signed['transaction']['fulfillments'][0]['fulfillment']
changed_fulfillment = Ed25519Fulfillment().from_uri(fulfillment)
changed_fulfillment = cc.Ed25519Fulfillment().from_uri(fulfillment)
changed_fulfillment.signature = b'0' * 64
tx_signed['transaction']['fulfillments'][0]['fulfillment'] = changed_fulfillment.serialize_uri()
@ -1178,15 +1176,15 @@ class TestCryptoconditions(object):
def test_fulfillment_transaction_create(self, b, user_vk):
tx = b.create_transaction(b.me, user_vk, None, 'CREATE')
condition = tx['transaction']['conditions'][0]['condition']
condition_from_uri = Condition.from_uri(condition['uri'])
condition_from_json = Fulfillment.from_json(condition['details']).condition
condition_from_uri = cc.Condition.from_uri(condition['uri'])
condition_from_json = cc.Fulfillment.from_json(condition['details']).condition
assert condition_from_uri.serialize_uri() == condition_from_json.serialize_uri()
assert condition['details']['public_key'] == user_vk
tx_signed = b.sign_transaction(tx, b.me_private)
fulfillment = tx_signed['transaction']['fulfillments'][0]
fulfillment_from_uri = Fulfillment.from_uri(fulfillment['fulfillment'])
fulfillment_from_uri = cc.Fulfillment.from_uri(fulfillment['fulfillment'])
assert fulfillment['current_owners'][0] == b.me
assert fulfillment_from_uri.public_key.to_ascii().decode() == b.me
@ -1202,22 +1200,22 @@ class TestCryptoconditions(object):
prev_tx = b.get_transaction(prev_tx_id['txid'])
prev_condition = prev_tx['transaction']['conditions'][0]['condition']
prev_condition_from_uri = Condition.from_uri(prev_condition['uri'])
prev_condition_from_json = Fulfillment.from_json(prev_condition['details']).condition
prev_condition_from_uri = cc.Condition.from_uri(prev_condition['uri'])
prev_condition_from_json = cc.Fulfillment.from_json(prev_condition['details']).condition
assert prev_condition_from_uri.serialize_uri() == prev_condition_from_json.serialize_uri()
assert prev_condition['details']['public_key'] == user_vk
condition = tx['transaction']['conditions'][0]['condition']
condition_from_uri = Condition.from_uri(condition['uri'])
condition_from_json = Fulfillment.from_json(condition['details']).condition
condition_from_uri = cc.Condition.from_uri(condition['uri'])
condition_from_json = cc.Fulfillment.from_json(condition['details']).condition
assert condition_from_uri.serialize_uri() == condition_from_json.serialize_uri()
assert condition['details']['public_key'] == other_vk
tx_signed = b.sign_transaction(tx, user_sk)
fulfillment = tx_signed['transaction']['fulfillments'][0]
fulfillment_from_uri = Fulfillment.from_uri(fulfillment['fulfillment'])
fulfillment_from_uri = cc.Fulfillment.from_uri(fulfillment['fulfillment'])
assert fulfillment['current_owners'][0] == user_vk
assert fulfillment_from_uri.public_key.to_ascii().decode() == user_vk
@ -1227,7 +1225,7 @@ class TestCryptoconditions(object):
def test_override_condition_create(self, b, user_vk):
tx = b.create_transaction(b.me, user_vk, None, 'CREATE')
fulfillment = Ed25519Fulfillment(public_key=user_vk)
fulfillment = cc.Ed25519Fulfillment(public_key=user_vk)
tx['transaction']['conditions'][0]['condition'] = {
'details': json.loads(fulfillment.serialize_json()),
'uri': fulfillment.condition.serialize_uri()
@ -1236,7 +1234,7 @@ class TestCryptoconditions(object):
tx_signed = b.sign_transaction(tx, b.me_private)
fulfillment = tx_signed['transaction']['fulfillments'][0]
fulfillment_from_uri = Fulfillment.from_uri(fulfillment['fulfillment'])
fulfillment_from_uri = cc.Fulfillment.from_uri(fulfillment['fulfillment'])
assert fulfillment['current_owners'][0] == b.me
assert fulfillment_from_uri.public_key.to_ascii().decode() == b.me
@ -1250,7 +1248,7 @@ class TestCryptoconditions(object):
prev_tx_id = b.get_owned_ids(user_vk).pop()
tx = b.create_transaction(user_vk, other_vk, prev_tx_id, 'TRANSFER')
fulfillment = Ed25519Fulfillment(public_key=other_vk)
fulfillment = cc.Ed25519Fulfillment(public_key=other_vk)
tx['transaction']['conditions'][0]['condition'] = {
'details': json.loads(fulfillment.serialize_json()),
'uri': fulfillment.condition.serialize_uri()
@ -1258,7 +1256,7 @@ class TestCryptoconditions(object):
tx_signed = b.sign_transaction(tx, user_sk)
fulfillment = tx_signed['transaction']['fulfillments'][0]
fulfillment_from_uri = Fulfillment.from_uri(fulfillment['fulfillment'])
fulfillment_from_uri = cc.Fulfillment.from_uri(fulfillment['fulfillment'])
assert fulfillment['current_owners'][0] == user_vk
assert fulfillment_from_uri.public_key.to_ascii().decode() == user_vk
@ -1269,7 +1267,7 @@ class TestCryptoconditions(object):
tx = b.create_transaction(b.me, user_vk, None, 'CREATE')
original_fulfillment = tx['transaction']['fulfillments'][0]
fulfillment_message = util.get_fulfillment_message(tx, original_fulfillment, serialized=True)
fulfillment = Ed25519Fulfillment(public_key=b.me)
fulfillment = cc.Ed25519Fulfillment(public_key=b.me)
fulfillment.sign(fulfillment_message, crypto.SigningKey(b.me_private))
tx['transaction']['fulfillments'][0]['fulfillment'] = fulfillment.serialize_uri()
@ -1286,7 +1284,7 @@ class TestCryptoconditions(object):
original_fulfillment = tx['transaction']['fulfillments'][0]
fulfillment_message = util.get_fulfillment_message(tx, original_fulfillment, serialized=True)
fulfillment = Ed25519Fulfillment(public_key=user_vk)
fulfillment = cc.Ed25519Fulfillment(public_key=user_vk)
fulfillment.sign(fulfillment_message, crypto.SigningKey(user_sk))
tx['transaction']['fulfillments'][0]['fulfillment'] = fulfillment.serialize_uri()
@ -1300,7 +1298,7 @@ class TestCryptoconditions(object):
first_input_tx = b.get_owned_ids(user_vk).pop()
first_tx = b.create_transaction(user_vk, other_vk, first_input_tx, 'TRANSFER')
first_tx_condition = Ed25519Fulfillment(public_key=other_vk)
first_tx_condition = cc.Ed25519Fulfillment(public_key=other_vk)
first_tx['transaction']['conditions'][0]['condition'] = {
'details': json.loads(first_tx_condition.serialize_json()),
'uri': first_tx_condition.condition.serialize_uri()
@ -1308,7 +1306,7 @@ class TestCryptoconditions(object):
first_tx_fulfillment = first_tx['transaction']['fulfillments'][0]
first_tx_fulfillment_message = util.get_fulfillment_message(first_tx, first_tx_fulfillment, serialized=True)
first_tx_fulfillment = Ed25519Fulfillment(public_key=user_vk)
first_tx_fulfillment = cc.Ed25519Fulfillment(public_key=user_vk)
first_tx_fulfillment.sign(first_tx_fulfillment_message, crypto.SigningKey(user_sk))
first_tx['transaction']['fulfillments'][0]['fulfillment'] = first_tx_fulfillment.serialize_uri()
@ -1327,7 +1325,7 @@ class TestCryptoconditions(object):
next_tx_fulfillment = next_tx['transaction']['fulfillments'][0]
next_tx_fulfillment_message = util.get_fulfillment_message(next_tx, next_tx_fulfillment, serialized=True)
next_tx_fulfillment = Ed25519Fulfillment(public_key=other_vk)
next_tx_fulfillment = cc.Ed25519Fulfillment(public_key=other_vk)
next_tx_fulfillment.sign(next_tx_fulfillment_message, crypto.SigningKey(other_sk))
next_tx['transaction']['fulfillments'][0]['fulfillment'] = next_tx_fulfillment.serialize_uri()
@ -1342,9 +1340,9 @@ class TestCryptoconditions(object):
first_input_tx = b.get_owned_ids(user_vk).pop()
first_tx = b.create_transaction(user_vk, [other1_vk, other2_vk], first_input_tx, 'TRANSFER')
first_tx_condition = ThresholdSha256Fulfillment(threshold=2)
first_tx_condition.add_subfulfillment(Ed25519Fulfillment(public_key=other1_vk))
first_tx_condition.add_subfulfillment(Ed25519Fulfillment(public_key=other2_vk))
first_tx_condition = cc.ThresholdSha256Fulfillment(threshold=2)
first_tx_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=other1_vk))
first_tx_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=other2_vk))
first_tx['transaction']['conditions'][0]['condition'] = {
'details': json.loads(first_tx_condition.serialize_json()),
@ -1370,11 +1368,11 @@ class TestCryptoconditions(object):
next_tx_fulfillment = next_tx['transaction']['fulfillments'][0]
next_tx_fulfillment_message = util.get_fulfillment_message(next_tx, next_tx_fulfillment, serialized=True)
next_tx_fulfillment = ThresholdSha256Fulfillment(threshold=2)
next_tx_subfulfillment1 = Ed25519Fulfillment(public_key=other1_vk)
next_tx_fulfillment = cc.ThresholdSha256Fulfillment(threshold=2)
next_tx_subfulfillment1 = cc.Ed25519Fulfillment(public_key=other1_vk)
next_tx_subfulfillment1.sign(next_tx_fulfillment_message, crypto.SigningKey(other1_sk))
next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment1)
next_tx_subfulfillment2 = Ed25519Fulfillment(public_key=other2_vk)
next_tx_subfulfillment2 = cc.Ed25519Fulfillment(public_key=other2_vk)
next_tx_subfulfillment2.sign(next_tx_fulfillment_message, crypto.SigningKey(other2_sk))
next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment2)
next_tx['transaction']['fulfillments'][0]['fulfillment'] = next_tx_fulfillment.serialize_uri()
@ -1390,9 +1388,9 @@ class TestCryptoconditions(object):
first_input_tx = b.get_owned_ids(user_vk).pop()
first_tx = b.create_transaction(user_vk, [other1_vk, other2_vk], first_input_tx, 'TRANSFER')
first_tx_condition = ThresholdSha256Fulfillment(threshold=2)
first_tx_condition.add_subfulfillment(Ed25519Fulfillment(public_key=other1_vk))
first_tx_condition.add_subfulfillment(Ed25519Fulfillment(public_key=other2_vk))
first_tx_condition = cc.ThresholdSha256Fulfillment(threshold=2)
first_tx_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=other1_vk))
first_tx_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=other2_vk))
first_tx['transaction']['conditions'][0]['condition'] = {
'details': json.loads(first_tx_condition.serialize_json()),
@ -1418,13 +1416,13 @@ class TestCryptoconditions(object):
next_tx_fulfillment = next_tx['transaction']['fulfillments'][0]
next_tx_fulfillment_message = util.get_fulfillment_message(next_tx, next_tx_fulfillment, serialized=True)
next_tx_fulfillment = ThresholdSha256Fulfillment(threshold=2)
next_tx_subfulfillment1 = Ed25519Fulfillment(public_key=other1_vk)
next_tx_fulfillment = cc.ThresholdSha256Fulfillment(threshold=2)
next_tx_subfulfillment1 = cc.Ed25519Fulfillment(public_key=other1_vk)
next_tx_subfulfillment1.sign(next_tx_fulfillment_message, crypto.SigningKey(other1_sk))
next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment1)
# Wrong signing happens here
next_tx_subfulfillment2 = Ed25519Fulfillment(public_key=other1_vk)
next_tx_subfulfillment2 = cc.Ed25519Fulfillment(public_key=other1_vk)
next_tx_subfulfillment2.sign(next_tx_fulfillment_message, crypto.SigningKey(other1_sk))
next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment2)
next_tx['transaction']['fulfillments'][0]['fulfillment'] = next_tx_fulfillment.serialize_uri()
@ -1443,9 +1441,9 @@ class TestCryptoconditions(object):
assert len(tx['transaction']['conditions'][0]['condition']['details']['subfulfillments']) == 2
# expected condition subfulfillments
expected_condition = ThresholdSha256Fulfillment(threshold=2)
expected_condition.add_subfulfillment(Ed25519Fulfillment(public_key=user_vk))
expected_condition.add_subfulfillment(Ed25519Fulfillment(public_key=user2_vk))
expected_condition = cc.ThresholdSha256Fulfillment(threshold=2)
expected_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=user_vk))
expected_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=user2_vk))
tx_expected_condition = {
'details': json.loads(expected_condition.serialize_json()),
'uri': expected_condition.condition.serialize_uri()
@ -1469,7 +1467,7 @@ class TestCryptoconditions(object):
tx_transfer_signed = b.sign_transaction(tx_transfer, [user_sk, user2_sk])
# expected fulfillment
expected_fulfillment = Fulfillment.from_json(tx_create['transaction']['conditions'][0]['condition']['details'])
expected_fulfillment = cc.Fulfillment.from_json(tx_create['transaction']['conditions'][0]['condition']['details'])
subfulfillment1 = expected_fulfillment.subconditions[0]['body']
subfulfillment2 = expected_fulfillment.subconditions[1]['body']
@ -1493,7 +1491,8 @@ class TestCryptoconditions(object):
# create a transaction with multiple new_owners
tx = b.create_transaction(b.me, new_owners, None, 'CREATE')
condition = cc.Fulfillment.from_json(tx['transaction']['conditions'][0]['condition']['details'])
for new_owner in new_owners:
subcondition = util.get_subcondition_from_vk(tx['transaction']['conditions'][0], new_owner)
subcondition = condition.get_subcondition_from_vk(new_owner)[0]
assert subcondition.public_key.to_ascii().decode() == new_owner