- Ed25519 inheritance

- Renamed Private/PublicKey to Signing/VerifyingKey
This commit is contained in:
diminator 2016-03-18 22:23:32 +01:00
parent bdc2475bdd
commit f273e48c11
17 changed files with 157 additions and 138 deletions

View File

@ -96,7 +96,7 @@ class Bigchain(object):
signature = data.pop('signature') signature = data.pop('signature')
public_key_base58 = signed_transaction['transaction']['current_owner'] public_key_base58 = signed_transaction['transaction']['current_owner']
public_key = asymmetric.PublicKey(public_key_base58) public_key = asymmetric.VerifyingKey(public_key_base58)
return public_key.verify(util.serialize(data), signature) return public_key.verify(util.serialize(data), signature)
@monitor.timer('write_transaction', rate=bigchaindb.config['statsd']['rate']) @monitor.timer('write_transaction', rate=bigchaindb.config['statsd']['rate'])
@ -330,7 +330,7 @@ class Bigchain(object):
# Calculate the hash of the new block # Calculate the hash of the new block
block_data = util.serialize(block) block_data = util.serialize(block)
block_hash = asymmetric.hash_data(block_data) block_hash = asymmetric.hash_data(block_data)
block_signature = asymmetric.PrivateKey(self.me_private).sign(block_data) block_signature = asymmetric.SigningKey(self.me_private).sign(block_data)
block = { block = {
'id': block_hash, 'id': block_hash,
@ -450,7 +450,7 @@ class Bigchain(object):
} }
vote_data = util.serialize(vote) vote_data = util.serialize(vote)
signature = asymmetric.PrivateKey(self.me_private).sign(vote_data) signature = asymmetric.SigningKey(self.me_private).sign(vote_data)
vote_signed = { vote_signed = {
'node_pubkey': self.me, 'node_pubkey': self.me,

View File

@ -4,7 +4,7 @@ from abc import ABCMeta, abstractmethod
import sha3 import sha3
class PrivateKey(metaclass=ABCMeta): class SigningKey(metaclass=ABCMeta):
""" """
PrivateKey instance PrivateKey instance
""" """
@ -13,6 +13,9 @@ class PrivateKey(metaclass=ABCMeta):
def sign(self, data): def sign(self, data):
""" """
Sign data with private key Sign data with private key
Args:
data:
""" """
raise NotImplementedError raise NotImplementedError
@ -20,20 +23,26 @@ class PrivateKey(metaclass=ABCMeta):
@abstractmethod @abstractmethod
def encode(private_value): def encode(private_value):
""" """
Encode the decimal number private_value to base58 Encode the internal private_value to base58
Args:
private_value:
""" """
raise NotImplementedError raise NotImplementedError
@staticmethod @staticmethod
@abstractmethod @abstractmethod
def decode(key): def decode(private_base58):
""" """
Decode the base58 private_value to decimale Decode the base58 private value to internal value
Args:
private_base58 (base58):
""" """
raise NotImplementedError raise NotImplementedError
class PublicKey(metaclass=ABCMeta): class VerifyingKey(metaclass=ABCMeta):
@abstractmethod @abstractmethod
def verify(self, data, signature): def verify(self, data, signature):
@ -41,17 +50,23 @@ class PublicKey(metaclass=ABCMeta):
@staticmethod @staticmethod
@abstractmethod @abstractmethod
def encode(public_value_x, public_value_y): def encode(public_value):
""" """
Encode the public key represented by the decimal values x and y to base58 Encode the public key to base58 represented by the internal values
Args:
public_value
""" """
raise NotImplementedError raise NotImplementedError
@staticmethod @staticmethod
@abstractmethod @abstractmethod
def decode(public_value_compressed_base58): def decode(public_base58):
""" """
Decode the base58 public_value to the decimal x and y values Decode the base58 public_value to internal value
Args:
public_base58 (base58):
""" """
raise NotImplementedError raise NotImplementedError
@ -62,8 +77,8 @@ def hash_data(data):
return sha3.sha3_256(data.encode()).hexdigest() return sha3.sha3_256(data.encode()).hexdigest()
from bigchaindb.crypto.ecdsa import ECDSAPrivateKey, ECDSAPublicKey, ecdsa_generate_key_pair from bigchaindb.crypto.ecdsa import EcdsaSigningKey, EcdsaVerifyingKey, ecdsa_generate_key_pair
PrivateKey = ECDSAPrivateKey SigningKey = EcdsaSigningKey
PublicKey = ECDSAPublicKey VerifyingKey = EcdsaVerifyingKey
generate_key_pair = ecdsa_generate_key_pair generate_key_pair = ecdsa_generate_key_pair

View File

@ -1,4 +1,4 @@
from bigchaindb.crypto.iostream import MAX_SAFE_INTEGER from bigchaindb.crypto.buffer import MAX_SAFE_INTEGER
class BitmaskRegistry: class BitmaskRegistry:

View File

@ -4,7 +4,7 @@ from abc import ABCMeta
from six import string_types from six import string_types
from bigchaindb.crypto.iostream import base64_add_padding, base64_remove_padding, Writer, Reader from bigchaindb.crypto.buffer import base64_add_padding, base64_remove_padding, Writer, Reader
CONDITION_REGEX = r'^cc:1:[1-9a-f][0-9a-f]{0,2}:[a-zA-Z0-9_-]{43}:[1-9][0-9]{0,50}$' CONDITION_REGEX = r'^cc:1:[1-9a-f][0-9a-f]{0,2}:[a-zA-Z0-9_-]{43}:[1-9][0-9]{0,50}$'
@ -123,9 +123,6 @@ class Condition(metaclass=ABCMeta):
Args: Args:
value (Buffer): Hash as binary. value (Buffer): Hash as binary.
""" """
# TODO: value must be Buffer
# if not isinstance(value, Buffer):
# raise ValueError
self._hash = value self._hash = value
@property @property

View File

@ -9,10 +9,10 @@ from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives.asymmetric import ec
from bigchaindb.crypto.asymmetric import PrivateKey, PublicKey from bigchaindb.crypto.asymmetric import SigningKey, VerifyingKey
class ECDSAPrivateKey(PrivateKey): class EcdsaSigningKey(SigningKey):
""" """
PrivateKey instance PrivateKey instance
""" """
@ -34,7 +34,6 @@ class ECDSAPrivateKey(PrivateKey):
signature = signer.finalize() signature = signer.finalize()
return binascii.hexlify(signature).decode('utf-8') return binascii.hexlify(signature).decode('utf-8')
@staticmethod @staticmethod
def encode(private_value): def encode(private_value):
""" """
@ -65,7 +64,7 @@ class ECDSAPrivateKey(PrivateKey):
Return an instance of cryptography PrivateNumbers from the decimal private_value Return an instance of cryptography PrivateNumbers from the decimal private_value
""" """
public_value_x, public_value_y = self._private_value_to_public_values(private_value) public_value_x, public_value_y = self._private_value_to_public_values(private_value)
public_numbers = ECDSAPublicKey._public_values_to_cryptography_public_numbers(public_value_x, public_value_y) public_numbers = EcdsaVerifyingKey._public_values_to_cryptography_public_numbers(public_value_x, public_value_y)
private_numbers = ec.EllipticCurvePrivateNumbers(private_value, public_numbers) private_numbers = ec.EllipticCurvePrivateNumbers(private_value, public_numbers)
return private_numbers return private_numbers
@ -77,11 +76,14 @@ class ECDSAPrivateKey(PrivateKey):
return private_numbers.private_key(default_backend()) return private_numbers.private_key(default_backend())
class ECDSAPublicKey(PublicKey): class EcdsaVerifyingKey(VerifyingKey):
def __init__(self, key): def __init__(self, key):
""" """
Instantiate the public key with the compressed public value encoded in base58 Instantiate the public key with the compressed public value encoded in base58
Args:
key
""" """
public_value_x, public_value_y = self.decode(key) public_value_x, public_value_y = self.decode(key)
public_numbers = self._public_values_to_cryptography_public_numbers(public_value_x, public_value_y) public_numbers = self._public_values_to_cryptography_public_numbers(public_value_x, public_value_y)
@ -101,6 +103,10 @@ class ECDSAPublicKey(PublicKey):
def encode(public_value_x, public_value_y): def encode(public_value_x, public_value_y):
""" """
Encode the public key represented by the decimal values x and y to base58 Encode the public key represented by the decimal values x and y to base58
Args:
public_value_x:
public_value_y:
""" """
public_value_compressed_hex = bitcoin.encode_pubkey([public_value_x, public_value_y], 'hex_compressed') public_value_compressed_hex = bitcoin.encode_pubkey([public_value_x, public_value_y], 'hex_compressed')
public_value_compressed_base58 = base58.b58encode(bytes.fromhex(public_value_compressed_hex)) public_value_compressed_base58 = base58.b58encode(bytes.fromhex(public_value_compressed_hex))
@ -110,6 +116,9 @@ class ECDSAPublicKey(PublicKey):
def decode(public_value_compressed_base58): def decode(public_value_compressed_base58):
""" """
Decode the base58 public_value to the decimal x and y values Decode the base58 public_value to the decimal x and y values
Args:
public_value_compressed_base58:
""" """
public_value_compressed_hex = binascii.hexlify(base58.b58decode(public_value_compressed_base58)) public_value_compressed_hex = binascii.hexlify(base58.b58decode(public_value_compressed_base58))
public_value_x, public_value_y = bitcoin.decode_pubkey(public_value_compressed_hex.decode()) public_value_x, public_value_y = bitcoin.decode_pubkey(public_value_compressed_hex.decode())
@ -126,6 +135,9 @@ class ECDSAPublicKey(PublicKey):
def _cryptography_public_key_from_public_numbers(self, public_numbers): def _cryptography_public_key_from_public_numbers(self, public_numbers):
""" """
Return an instance of cryptography PublicKey from a cryptography instance of PublicNumbers Return an instance of cryptography PublicKey from a cryptography instance of PublicNumbers
Args:
public_numbers
""" """
return public_numbers.public_key(default_backend()) return public_numbers.public_key(default_backend())
@ -137,11 +149,11 @@ def ecdsa_generate_key_pair():
# Private key # Private key
private_key = ec.generate_private_key(ec.SECP256K1, default_backend()) private_key = ec.generate_private_key(ec.SECP256K1, default_backend())
private_value = private_key.private_numbers().private_value private_value = private_key.private_numbers().private_value
private_value_base58 = ECDSAPrivateKey.encode(private_value) private_value_base58 = EcdsaSigningKey.encode(private_value)
# Public key # Public key
public_key = private_key.public_key() public_key = private_key.public_key()
public_value_x, public_value_y = public_key.public_numbers().x, public_key.public_numbers().y public_value_x, public_value_y = public_key.public_numbers().x, public_key.public_numbers().y
public_value_compressed_base58 = ECDSAPublicKey.encode(public_value_x, public_value_y) public_value_compressed_base58 = EcdsaVerifyingKey.encode(public_value_x, public_value_y)
return (private_value_base58, public_value_compressed_base58) return (private_value_base58, public_value_compressed_base58)

View File

@ -5,10 +5,10 @@ import base64
import base58 import base58
import ed25519 import ed25519
from bigchaindb.crypto.asymmetric import PrivateKey, PublicKey from bigchaindb.crypto.asymmetric import SigningKey, VerifyingKey
class ED25519PrivateKey(PrivateKey): class Ed25519SigningKey(ed25519.SigningKey, SigningKey):
""" """
PrivateKey instance PrivateKey instance
""" """
@ -16,22 +16,31 @@ class ED25519PrivateKey(PrivateKey):
def __init__(self, key): def __init__(self, key):
""" """
Instantiate the private key with the private_value encoded in base58 Instantiate the private key with the private_value encoded in base58
Args:
key (base58): base58 encoded private key
""" """
private_base64 = self.decode(key) private_base64 = self.decode(key)
self.private_key = self._private_key_from_private_base64(private_base64) super().__init__(private_base64, encoding='base64')
def sign(self, data, encoding="base64"): def sign(self, data, encoding="base64"):
""" """
Sign data with private key Sign data with private key
Args:
data (str, bytes): data to sign
encoding (str): base64, hex
""" """
if not isinstance(data, bytes): if not isinstance(data, bytes):
data = data.encode('utf-8') data = data.encode('utf-8')
return self.private_key.sign(data, encoding=encoding) return super().sign(data, encoding=encoding)
@staticmethod @staticmethod
def encode(private_base64): def encode(private_base64):
""" """
Encode the base64 number private_base64 to base58 Encode the base64 number private_base64 to base58
Args:
private_base64:
""" """
return base58.b58encode(base64.b64decode(private_base64)) return base58.b58encode(base64.b64decode(private_base64))
@ -39,31 +48,27 @@ class ED25519PrivateKey(PrivateKey):
def decode(key): def decode(key):
""" """
Decode the base58 private_value to base64 Decode the base58 private_value to base64
Args:
key:
""" """
return base64.b64encode(base58.b58decode(key)) return base64.b64encode(base58.b58decode(key))
@staticmethod
def _private_key_from_private_base64(private_base64):
"""
Return an instance of a ED25519 SignigKey from a base64 key
"""
return ed25519.SigningKey(private_base64, encoding='base64')
class Ed25519VerifyingKey(ed25519.VerifyingKey, VerifyingKey):
class ED25519PublicKey(PublicKey):
def __init__(self, key): def __init__(self, key):
""" """
Instantiate the public key with the compressed public value encoded in base58 Instantiate the public key with the compressed public value encoded in base58
""" """
public_base64 = self.decode(key) public_base64 = self.decode(key)
self.public_key = self._public_key_from_public_base64(public_base64) super().__init__(public_base64, encoding='base64')
def verify(self, data, signature, encoding='base64'): def verify(self, data, signature, encoding='base64'):
try: try:
if encoding: if encoding:
data = data.encode('utf-8') data = data.encode('utf-8')
self.public_key.verify(signature, data, encoding=encoding) super().verify(signature, data, encoding=encoding)
except ed25519.BadSignatureError: except ed25519.BadSignatureError:
return False return False
@ -73,21 +78,21 @@ class ED25519PublicKey(PublicKey):
def encode(public_base64): def encode(public_base64):
""" """
Encode the public key represented by base64 to base58 Encode the public key represented by base64 to base58
Args:
public_base64
""" """
return ED25519PrivateKey.encode(public_base64) return Ed25519SigningKey.encode(public_base64)
@staticmethod @staticmethod
def decode(public_value_compressed_base58): def decode(public_base58):
""" """
Decode the base58 public_value to base64 Decode the base58 public_value to base64
"""
return ED25519PrivateKey.decode(public_value_compressed_base58)
def _public_key_from_public_base64(self, public_base64): Args:
public_base58
""" """
Return an instance of ED25519 VerifyingKey from a base64 return Ed25519SigningKey.decode(public_base58)
"""
return ed25519.VerifyingKey(public_base64, encoding='base64')
def ed25519_generate_key_pair(): def ed25519_generate_key_pair():

View File

@ -5,7 +5,7 @@ from abc import ABCMeta, abstractmethod
from six import string_types from six import string_types
from bigchaindb.crypto.condition import Condition from bigchaindb.crypto.condition import Condition
from bigchaindb.crypto.iostream import Writer, base64_remove_padding, Reader, base64_add_padding, Predictor from bigchaindb.crypto.buffer import Writer, base64_remove_padding, Reader, base64_add_padding, Predictor
FULFILLMENT_REGEX = r'^cf:1:[1-9a-f][0-9a-f]{0,2}:[a-zA-Z0-9_-]+$' FULFILLMENT_REGEX = r'^cf:1:[1-9a-f][0-9a-f]{0,2}:[a-zA-Z0-9_-]+$'

View File

@ -1,7 +1,7 @@
from abc import abstractmethod from abc import abstractmethod
from bigchaindb.crypto.fulfillment import Fulfillment from bigchaindb.crypto.fulfillment import Fulfillment
from bigchaindb.crypto.iostream import Hasher from bigchaindb.crypto.buffer import Hasher
class BaseSha256Fulfillment(Fulfillment): class BaseSha256Fulfillment(Fulfillment):

View File

@ -1,8 +1,8 @@
import base58 import base58
from bigchaindb.crypto.ed25519 import ED25519PublicKey from bigchaindb.crypto.ed25519 import Ed25519VerifyingKey
from bigchaindb.crypto.fulfillments.base_sha256 import BaseSha256Fulfillment from bigchaindb.crypto.fulfillments.base_sha256 import BaseSha256Fulfillment
from bigchaindb.crypto.iostream import Predictor from bigchaindb.crypto.buffer import Predictor
class Ed25519Sha256Fulfillment(BaseSha256Fulfillment): class Ed25519Sha256Fulfillment(BaseSha256Fulfillment):
@ -70,10 +70,7 @@ class Ed25519Sha256Fulfillment(BaseSha256Fulfillment):
Args: Args:
value (Buffer): publicKey Public Ed25519 publicKey value (Buffer): publicKey Public Ed25519 publicKey
""" """
# TODO: Buffer if not isinstance(value, Ed25519VerifyingKey):
# if not isinstance(value, Buffer):
# raise ValueError("public key must be a Buffer")
if not isinstance(value, ED25519PublicKey):
raise TypeError raise TypeError
self._public_key = value self._public_key = value
@ -93,9 +90,6 @@ class Ed25519Sha256Fulfillment(BaseSha256Fulfillment):
Args: Args:
value (Buffer): Binary form of dynamic message. value (Buffer): Binary form of dynamic message.
""" """
# TODO: Buffer
# if not isinstance(value, Buffer):
# raise ValueError("message must be a Buffer")
if not isinstance(value, bytes): if not isinstance(value, bytes):
value = value.encode() value = value.encode()
self._message = value self._message = value
@ -115,9 +109,6 @@ class Ed25519Sha256Fulfillment(BaseSha256Fulfillment):
Args: Args:
value (Buffer): 64-byte signature. value (Buffer): 64-byte signature.
""" """
# TODO: Buffer
# if not isinstance(value, Buffer):
# raise ValueError("signature must be a Buffer")
self._signature = value self._signature = value
def write_common_header(self, writer): def write_common_header(self, writer):
@ -135,7 +126,7 @@ class Ed25519Sha256Fulfillment(BaseSha256Fulfillment):
if not self.public_key: if not self.public_key:
raise ValueError raise ValueError
writer.write_var_bytes(bytearray(self.public_key.public_key.to_bytes())) writer.write_var_bytes(bytearray(self.public_key.to_bytes()))
writer.write_var_bytes(self.message_prefix) writer.write_var_bytes(self.message_prefix)
writer.write_var_uint(self.max_dynamic_message_length) writer.write_var_uint(self.max_dynamic_message_length)
return writer return writer
@ -150,7 +141,7 @@ class Ed25519Sha256Fulfillment(BaseSha256Fulfillment):
reader (Reader): Source to read the fulfillment payload from. reader (Reader): Source to read the fulfillment payload from.
""" """
self.public_key = \ self.public_key = \
ED25519PublicKey( Ed25519VerifyingKey(
base58.b58encode( base58.b58encode(
reader.read_var_bytes())) reader.read_var_bytes()))
self.message_prefix = reader.read_var_bytes() self.message_prefix = reader.read_var_bytes()
@ -229,7 +220,7 @@ class Ed25519Sha256Fulfillment(BaseSha256Fulfillment):
predictor.skip(self.max_dynamic_message_length) predictor.skip(self.max_dynamic_message_length)
# Signature # Signature
predictor.write_var_bytes(self.public_key.public_key.to_bytes()) predictor.write_var_bytes(self.public_key.to_bytes())
return predictor.size return predictor.size
@ -243,11 +234,10 @@ class Ed25519Sha256Fulfillment(BaseSha256Fulfillment):
Args: Args:
private_key (string) Ed25519 private key private_key (string) Ed25519 private key
""" """
# TODO: Buffer
sk = private_key sk = private_key
vk = ED25519PublicKey( vk = Ed25519VerifyingKey(
base58.b58encode( base58.b58encode(
sk.private_key.get_verifying_key().to_bytes())) sk.get_verifying_key().to_bytes()))
self.public_key = vk self.public_key = vk

View File

@ -1,5 +1,5 @@
from bigchaindb.crypto.fulfillments.base_sha256 import BaseSha256Fulfillment from bigchaindb.crypto.fulfillments.base_sha256 import BaseSha256Fulfillment
from bigchaindb.crypto.iostream import Hasher, Reader, Writer, Predictor from bigchaindb.crypto.buffer import Hasher, Reader, Writer, Predictor
class Sha256Fulfillment(BaseSha256Fulfillment): class Sha256Fulfillment(BaseSha256Fulfillment):

View File

@ -1,7 +1,7 @@
from bigchaindb.crypto.condition import Condition from bigchaindb.crypto.condition import Condition
from bigchaindb.crypto.fulfillment import Fulfillment from bigchaindb.crypto.fulfillment import Fulfillment
from bigchaindb.crypto.fulfillments.base_sha256 import BaseSha256Fulfillment from bigchaindb.crypto.fulfillments.base_sha256 import BaseSha256Fulfillment
from bigchaindb.crypto.iostream import Predictor, Reader, Writer from bigchaindb.crypto.buffer import Predictor, Reader, Writer
class ThresholdSha256Fulfillment(BaseSha256Fulfillment): class ThresholdSha256Fulfillment(BaseSha256Fulfillment):

View File

@ -5,7 +5,7 @@ from datetime import datetime
import bigchaindb import bigchaindb
from bigchaindb import exceptions from bigchaindb import exceptions
from bigchaindb.crypto.asymmetric import PrivateKey, PublicKey, hash_data from bigchaindb.crypto.asymmetric import SigningKey, VerifyingKey, hash_data
class ProcessGroup(object): class ProcessGroup(object):
@ -157,7 +157,7 @@ def sign_tx(transaction, private_key):
dict: transaction with the `signature` field included. dict: transaction with the `signature` field included.
""" """
private_key = PrivateKey(private_key) private_key = SigningKey(private_key)
signature = private_key.sign(serialize(transaction)) signature = private_key.sign(serialize(transaction))
signed_transaction = transaction.copy() signed_transaction = transaction.copy()
signed_transaction.update({'signature': signature}) signed_transaction.update({'signature': signature})
@ -200,7 +200,7 @@ def verify_signature(signed_transaction):
signature = data.pop('signature') signature = data.pop('signature')
public_key_base58 = signed_transaction['transaction']['current_owner'] public_key_base58 = signed_transaction['transaction']['current_owner']
public_key = PublicKey(public_key_base58) public_key = VerifyingKey(public_key_base58)
return public_key.verify(serialize(data), signature) return public_key.verify(serialize(data), signature)

View File

@ -1,7 +1,7 @@
import base64 import base64
from bigchaindb.crypto.ecdsa import ECDSAPrivateKey, ECDSAPublicKey, ecdsa_generate_key_pair from bigchaindb.crypto.ecdsa import EcdsaSigningKey, EcdsaVerifyingKey, ecdsa_generate_key_pair
from bigchaindb.crypto.ed25519 import ED25519PrivateKey, ED25519PublicKey, ed25519_generate_key_pair from bigchaindb.crypto.ed25519 import Ed25519SigningKey, Ed25519VerifyingKey, ed25519_generate_key_pair
class TestBigchainCryptoED25519(object): class TestBigchainCryptoED25519(object):
@ -18,67 +18,67 @@ class TestBigchainCryptoED25519(object):
SIG_B64_ILP = 'sd0RahwuJJgeNfg8HvWHtYf4uqNgCOqIbseERacqs8G0kXNQQnhfV6gWAnMb+0RIlY3e0mqbrQiUwbRYJvRBAw==' SIG_B64_ILP = 'sd0RahwuJJgeNfg8HvWHtYf4uqNgCOqIbseERacqs8G0kXNQQnhfV6gWAnMb+0RIlY3e0mqbrQiUwbRYJvRBAw=='
def test_private_key_encode(self): def test_private_key_encode(self):
private_value_base58 = ED25519PrivateKey.encode(self.PRIVATE_B64) private_value_base58 = Ed25519SigningKey.encode(self.PRIVATE_B64)
assert private_value_base58 == self.PRIVATE_B58 assert private_value_base58 == self.PRIVATE_B58
def test_private_key_init(self): def test_private_key_init(self):
sk = ED25519PrivateKey(self.PRIVATE_B58) sk = Ed25519SigningKey(self.PRIVATE_B58)
assert sk.private_key.to_ascii(encoding='base64') == self.PRIVATE_B64[:-1] assert sk.to_ascii(encoding='base64') == self.PRIVATE_B64[:-1]
assert sk.private_key.to_bytes() == self.PRIVATE_BYTES assert sk.to_bytes() == self.PRIVATE_BYTES
def test_private_key_decode(self): def test_private_key_decode(self):
private_value = ED25519PrivateKey.decode(self.PRIVATE_B58) private_value = Ed25519SigningKey.decode(self.PRIVATE_B58)
assert private_value == self.PRIVATE_B64 assert private_value == self.PRIVATE_B64
def test_public_key_encode(self): def test_public_key_encode(self):
public_value_base58 = ED25519PublicKey.encode(self.PUBLIC_B64) public_value_base58 = Ed25519VerifyingKey.encode(self.PUBLIC_B64)
assert public_value_base58 == self.PUBLIC_B58 assert public_value_base58 == self.PUBLIC_B58
def test_public_key_init(self): def test_public_key_init(self):
vk = ED25519PublicKey(self.PUBLIC_B58) vk = Ed25519VerifyingKey(self.PUBLIC_B58)
assert vk.public_key.to_ascii(encoding='base64') == self.PUBLIC_B64[:-1] assert vk.to_ascii(encoding='base64') == self.PUBLIC_B64[:-1]
assert vk.public_key.to_bytes() == self.PUBLIC_BYTES assert vk.to_bytes() == self.PUBLIC_BYTES
def test_public_key_decode(self): def test_public_key_decode(self):
public_value = ED25519PublicKey.decode(self.PUBLIC_B58) public_value = Ed25519VerifyingKey.decode(self.PUBLIC_B58)
assert public_value == self.PUBLIC_B64 assert public_value == self.PUBLIC_B64
def test_sign_verify(self): def test_sign_verify(self):
message = 'Hello World!' message = 'Hello World!'
sk = ED25519PrivateKey(self.PRIVATE_B58) sk = Ed25519SigningKey(self.PRIVATE_B58)
vk = ED25519PublicKey(self.PUBLIC_B58) vk = Ed25519VerifyingKey(self.PUBLIC_B58)
assert vk.verify(message, sk.sign(message)) is True assert vk.verify(message, sk.sign(message)) is True
assert vk.verify(message, sk.sign(message + 'dummy')) is False assert vk.verify(message, sk.sign(message + 'dummy')) is False
assert vk.verify(message + 'dummy', sk.sign(message)) is False assert vk.verify(message + 'dummy', sk.sign(message)) is False
vk = ED25519PublicKey(ED25519PublicKey.encode(self.PUBLIC_B64_ILP)) vk = Ed25519VerifyingKey(Ed25519VerifyingKey.encode(self.PUBLIC_B64_ILP))
assert vk.verify(message, sk.sign(message)) is False assert vk.verify(message, sk.sign(message)) is False
def test_valid_condition_valid_signature_ilp(self): def test_valid_condition_valid_signature_ilp(self):
vk = ED25519PublicKey(ED25519PublicKey.encode(self.PUBLIC_B64_ILP)) vk = Ed25519VerifyingKey(Ed25519VerifyingKey.encode(self.PUBLIC_B64_ILP))
msg = self.MSG_SHA512_ILP msg = self.MSG_SHA512_ILP
sig = self.SIG_B64_ILP sig = self.SIG_B64_ILP
assert vk.verify(base64.b64decode(msg), base64.b64decode(sig), encoding=None) is True assert vk.verify(base64.b64decode(msg), base64.b64decode(sig), encoding=None) is True
def test_valid_condition_invalid_signature_ilp(self): def test_valid_condition_invalid_signature_ilp(self):
vk = ED25519PublicKey(ED25519PublicKey.encode(self.PUBLIC_B64_ILP)) vk = Ed25519VerifyingKey(Ed25519VerifyingKey.encode(self.PUBLIC_B64_ILP))
msg = self.MSG_SHA512_ILP msg = self.MSG_SHA512_ILP
sig = self.MSG_SHA512_ILP sig = self.MSG_SHA512_ILP
assert vk.verify(base64.b64decode(msg), base64.b64decode(sig), encoding=None) is False assert vk.verify(base64.b64decode(msg), base64.b64decode(sig), encoding=None) is False
def test_generate_key_pair(self): def test_generate_key_pair(self):
sk, vk = ed25519_generate_key_pair() sk, vk = ed25519_generate_key_pair()
assert ED25519PrivateKey.encode(ED25519PrivateKey.decode(sk)) == sk assert Ed25519SigningKey.encode(Ed25519SigningKey.decode(sk)) == sk
assert ED25519PublicKey.encode(ED25519PublicKey.decode(vk)) == vk assert Ed25519VerifyingKey.encode(Ed25519VerifyingKey.decode(vk)) == vk
def test_generate_sign_verify(self): def test_generate_sign_verify(self):
sk, vk = ed25519_generate_key_pair() sk, vk = ed25519_generate_key_pair()
sk = ED25519PrivateKey(sk) sk = Ed25519SigningKey(sk)
vk = ED25519PublicKey(vk) vk = Ed25519VerifyingKey(vk)
message = 'Hello World!' message = 'Hello World!'
assert vk.verify(message, sk.sign(message)) is True assert vk.verify(message, sk.sign(message)) is True
assert vk.verify(message, sk.sign(message + 'dummy')) is False assert vk.verify(message, sk.sign(message + 'dummy')) is False
assert vk.verify(message + 'dummy', sk.sign(message)) is False assert vk.verify(message + 'dummy', sk.sign(message)) is False
vk = ED25519PublicKey(ED25519PublicKey.encode(self.PUBLIC_B64_ILP)) vk = Ed25519VerifyingKey(Ed25519VerifyingKey.encode(self.PUBLIC_B64_ILP))
assert vk.verify(message, sk.sign(message)) is False assert vk.verify(message, sk.sign(message)) is False
@ -91,31 +91,31 @@ class TestBigchainCryptoECDSA(object):
PUBLIC_VALUE_COMPRESSED_B58 = 'ifEi3UuTDT4CqUUKiS5omgeDodhu2aRFHVp6LoahbEVe' PUBLIC_VALUE_COMPRESSED_B58 = 'ifEi3UuTDT4CqUUKiS5omgeDodhu2aRFHVp6LoahbEVe'
def test_private_key_encode(self): def test_private_key_encode(self):
private_value_base58 = ECDSAPrivateKey.encode(self.PRIVATE_VALUE) private_value_base58 = EcdsaSigningKey.encode(self.PRIVATE_VALUE)
assert private_value_base58 == self.PRIVATE_VALUE_B58 assert private_value_base58 == self.PRIVATE_VALUE_B58
def test_private_key_decode(self): def test_private_key_decode(self):
private_value = ECDSAPrivateKey.decode(self.PRIVATE_VALUE_B58) private_value = EcdsaSigningKey.decode(self.PRIVATE_VALUE_B58)
assert private_value == self.PRIVATE_VALUE assert private_value == self.PRIVATE_VALUE
def test_public_key_encode(self): def test_public_key_encode(self):
public_value_compressed_base58 = ECDSAPublicKey.encode(self.PUBLIC_VALUE_X, self.PUBLIC_VALUE_Y) public_value_compressed_base58 = EcdsaVerifyingKey.encode(self.PUBLIC_VALUE_X, self.PUBLIC_VALUE_Y)
assert public_value_compressed_base58 == self.PUBLIC_VALUE_COMPRESSED_B58 assert public_value_compressed_base58 == self.PUBLIC_VALUE_COMPRESSED_B58
def test_public_key_decode(self): def test_public_key_decode(self):
public_value_x, public_value_y = ECDSAPublicKey.decode(self.PUBLIC_VALUE_COMPRESSED_B58) public_value_x, public_value_y = EcdsaVerifyingKey.decode(self.PUBLIC_VALUE_COMPRESSED_B58)
assert public_value_x == self.PUBLIC_VALUE_X assert public_value_x == self.PUBLIC_VALUE_X
assert public_value_y == self.PUBLIC_VALUE_Y assert public_value_y == self.PUBLIC_VALUE_Y
def test_sign_verify(self): def test_sign_verify(self):
message = 'Hello World!' message = 'Hello World!'
public_key = ECDSAPublicKey(self.PUBLIC_VALUE_COMPRESSED_B58) public_key = EcdsaVerifyingKey(self.PUBLIC_VALUE_COMPRESSED_B58)
private_key = ECDSAPrivateKey(self.PRIVATE_VALUE_B58) private_key = EcdsaSigningKey(self.PRIVATE_VALUE_B58)
assert public_key.verify(message, private_key.sign(message)) is True assert public_key.verify(message, private_key.sign(message)) is True
def test_generate_key_pair(self): def test_generate_key_pair(self):
private_value_base58, public_value_compressed_base58 = ecdsa_generate_key_pair() private_value_base58, public_value_compressed_base58 = ecdsa_generate_key_pair()
assert ECDSAPrivateKey.encode( assert EcdsaSigningKey.encode(
ECDSAPrivateKey.decode(private_value_base58)) == private_value_base58 EcdsaSigningKey.decode(private_value_base58)) == private_value_base58
assert ECDSAPublicKey.encode( assert EcdsaVerifyingKey.encode(
*ECDSAPublicKey.decode(public_value_compressed_base58)) == public_value_compressed_base58 *EcdsaVerifyingKey.decode(public_value_compressed_base58)) == public_value_compressed_base58

View File

@ -5,7 +5,7 @@ from math import ceil
import pytest import pytest
from bigchaindb.crypto.condition import Condition from bigchaindb.crypto.condition import Condition
from bigchaindb.crypto.ed25519 import ED25519PrivateKey, ED25519PublicKey from bigchaindb.crypto.ed25519 import Ed25519SigningKey, Ed25519VerifyingKey
from bigchaindb.crypto.fulfillment import Fulfillment from bigchaindb.crypto.fulfillment import Fulfillment
from bigchaindb.crypto.fulfillments.ed25519_sha256 import Ed25519Sha256Fulfillment from bigchaindb.crypto.fulfillments.ed25519_sha256 import Ed25519Sha256Fulfillment
from bigchaindb.crypto.fulfillments.sha256 import Sha256Fulfillment from bigchaindb.crypto.fulfillments.sha256 import Sha256Fulfillment
@ -56,11 +56,11 @@ class TestBigchainILPSha256Fulfillment:
class TestBigchainILPEd25519Sha256Fulfillment: class TestBigchainILPEd25519Sha256Fulfillment:
PUBLIC_HEX_ILP = b'ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf' PUBLIC_HEX_ILP = b'ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf'
PUBLIC_B64_ILP = b'7Bcrk61eVjv0kyxw4SRQNMNUZ+8u/U1k6/gZaDRn4r8' PUBLIC_B64_ILP = b'7Bcrk61eVjv0kyxw4SRQNMNUZ+8u/U1k6/gZaDRn4r8'
PUBLIC_B58_ILP = 'Gtbi6WQDB6wUePiZm8aYs5XZ5pUqx9jMMLvRVHPESTjU' PUBLIC_B58_ILP = b'Gtbi6WQDB6wUePiZm8aYs5XZ5pUqx9jMMLvRVHPESTjU'
PRIVATE_HEX_ILP = b'833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42' PRIVATE_HEX_ILP = b'833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42'
PRIVATE_B64_ILP = b'gz/mJAkje51i7HdYdSCRHpp1nOwdGXVbfakBuW3KPUI' PRIVATE_B64_ILP = b'gz/mJAkje51i7HdYdSCRHpp1nOwdGXVbfakBuW3KPUI'
PRIVATE_B58_ILP = '9qLvREC54mhKYivr88VpckyVWdAFmifJpGjbvV5AiTRs' PRIVATE_B58_ILP = b'9qLvREC54mhKYivr88VpckyVWdAFmifJpGjbvV5AiTRs'
CONDITION_ED25519_ILP = 'cc:1:8:qQINW2um59C4DB9JSVXH1igqAmaYGGqryllHUgCpfPU:113' CONDITION_ED25519_ILP = 'cc:1:8:qQINW2um59C4DB9JSVXH1igqAmaYGGqryllHUgCpfPU:113'
FULFILLMENT_ED25519_ILP = \ FULFILLMENT_ED25519_ILP = \
@ -69,17 +69,17 @@ class TestBigchainILPEd25519Sha256Fulfillment:
HASH_ED25519_HEX_ILP = b'a9020d5b6ba6e7d0b80c1f494955c7d6282a026698186aabca59475200a97cf5' HASH_ED25519_HEX_ILP = b'a9020d5b6ba6e7d0b80c1f494955c7d6282a026698186aabca59475200a97cf5'
def test_ilp_keys(self): def test_ilp_keys(self):
sk = ED25519PrivateKey(self.PRIVATE_B58_ILP) sk = Ed25519SigningKey(self.PRIVATE_B58_ILP)
assert sk.private_key.to_ascii(encoding='base64') == self.PRIVATE_B64_ILP assert sk.to_ascii(encoding='base64') == self.PRIVATE_B64_ILP
assert binascii.hexlify(sk.private_key.to_bytes()[:32]) == self.PRIVATE_HEX_ILP assert binascii.hexlify(sk.to_bytes()[:32]) == self.PRIVATE_HEX_ILP
vk = ED25519PublicKey(self.PUBLIC_B58_ILP) vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP)
assert vk.public_key.to_ascii(encoding='base64') == self.PUBLIC_B64_ILP assert vk.to_ascii(encoding='base64') == self.PUBLIC_B64_ILP
assert binascii.hexlify(vk.public_key.to_bytes()) == self.PUBLIC_HEX_ILP assert binascii.hexlify(vk.to_bytes()) == self.PUBLIC_HEX_ILP
def test_serialize_condition_and_validate_fulfillment(self): def test_serialize_condition_and_validate_fulfillment(self):
sk = ED25519PrivateKey(self.PRIVATE_B58_ILP) sk = Ed25519SigningKey(self.PRIVATE_B58_ILP)
vk = ED25519PublicKey(self.PUBLIC_B58_ILP) vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP)
fulfillment = Ed25519Sha256Fulfillment() fulfillment = Ed25519Sha256Fulfillment()
fulfillment.public_key = vk fulfillment.public_key = vk
@ -107,7 +107,7 @@ class TestBigchainILPEd25519Sha256Fulfillment:
assert binascii.hexlify(deserialized_condition.hash) == self.HASH_ED25519_HEX_ILP assert binascii.hexlify(deserialized_condition.hash) == self.HASH_ED25519_HEX_ILP
def test_serialize_deserialize_condition(self): def test_serialize_deserialize_condition(self):
vk = ED25519PublicKey(self.PUBLIC_B58_ILP) vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP)
fulfillment = Ed25519Sha256Fulfillment() fulfillment = Ed25519Sha256Fulfillment()
fulfillment.public_key = vk fulfillment.public_key = vk
@ -129,12 +129,12 @@ class TestBigchainILPEd25519Sha256Fulfillment:
assert fulfillment.serialize_uri() == self.FULFILLMENT_ED25519_ILP assert fulfillment.serialize_uri() == self.FULFILLMENT_ED25519_ILP
assert fulfillment.condition.serialize_uri() == self.CONDITION_ED25519_ILP assert fulfillment.condition.serialize_uri() == self.CONDITION_ED25519_ILP
assert binascii.hexlify(fulfillment.condition.hash) == self.HASH_ED25519_HEX_ILP assert binascii.hexlify(fulfillment.condition.hash) == self.HASH_ED25519_HEX_ILP
assert fulfillment.public_key.public_key.to_ascii(encoding='hex') == self.PUBLIC_HEX_ILP assert fulfillment.public_key.to_ascii(encoding='hex') == self.PUBLIC_HEX_ILP
assert fulfillment.validate() assert fulfillment.validate()
def test_serialize_deserialize_fulfillment(self): def test_serialize_deserialize_fulfillment(self):
sk = ED25519PrivateKey(self.PRIVATE_B58_ILP) sk = Ed25519SigningKey(self.PRIVATE_B58_ILP)
vk = ED25519PublicKey(self.PUBLIC_B58_ILP) vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP)
fulfillment = Ed25519Sha256Fulfillment() fulfillment = Ed25519Sha256Fulfillment()
fulfillment.public_key = vk fulfillment.public_key = vk
@ -149,7 +149,7 @@ class TestBigchainILPEd25519Sha256Fulfillment:
assert isinstance(deserialized_fulfillment, Ed25519Sha256Fulfillment) assert isinstance(deserialized_fulfillment, Ed25519Sha256Fulfillment)
assert deserialized_fulfillment.serialize_uri() == fulfillment.serialize_uri() assert deserialized_fulfillment.serialize_uri() == fulfillment.serialize_uri()
assert deserialized_fulfillment.condition.serialize_uri() == fulfillment.condition.serialize_uri() assert deserialized_fulfillment.condition.serialize_uri() == fulfillment.condition.serialize_uri()
assert deserialized_fulfillment.public_key.public_key.to_bytes() == fulfillment.public_key.public_key.to_bytes() assert deserialized_fulfillment.public_key.to_bytes() == fulfillment.public_key.to_bytes()
assert deserialized_fulfillment.validate() assert deserialized_fulfillment.validate()
@ -178,8 +178,8 @@ class TestBigchainILPThresholdSha256Fulfillment:
'AClmekN4N2NA7t2ltNZyLGgLIqPdA' 'AClmekN4N2NA7t2ltNZyLGgLIqPdA'
def create_fulfillment_ed25519sha256(self): def create_fulfillment_ed25519sha256(self):
sk = ED25519PrivateKey(self.PRIVATE_B58_ILP) sk = Ed25519SigningKey(self.PRIVATE_B58_ILP)
vk = ED25519PublicKey(self.PUBLIC_B58_ILP) vk = Ed25519VerifyingKey(self.PUBLIC_B58_ILP)
fulfillment = Ed25519Sha256Fulfillment() fulfillment = Ed25519Sha256Fulfillment()
fulfillment.public_key = vk fulfillment.public_key = vk

View File

@ -9,7 +9,7 @@ import bigchaindb
from bigchaindb import exceptions from bigchaindb import exceptions
from bigchaindb import util from bigchaindb import util
from bigchaindb.block import Block from bigchaindb.block import Block
from bigchaindb.crypto.asymmetric import PrivateKey, PublicKey, generate_key_pair, hash_data from bigchaindb.crypto.asymmetric import SigningKey, VerifyingKey, generate_key_pair, hash_data
from bigchaindb.voter import Voter from bigchaindb.voter import Voter
@ -188,7 +188,7 @@ class TestBigchainApi(object):
assert new_block['block']['voters'] == [b.me] assert new_block['block']['voters'] == [b.me]
assert new_block['block']['node_pubkey'] == b.me assert new_block['block']['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(new_block['block']), new_block['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(new_block['block']), new_block['signature']) is True
assert new_block['id'] == block_hash assert new_block['id'] == block_hash
assert new_block['votes'] == [] assert new_block['votes'] == []
@ -371,7 +371,7 @@ class TestBlockValidation(object):
block_data = util.serialize(block) block_data = util.serialize(block)
block_hash = hash_data(block_data) block_hash = hash_data(block_data)
block_signature = PrivateKey(b.me_private).sign(block_data) block_signature = SigningKey(b.me_private).sign(block_data)
block = { block = {
'id': block_hash, 'id': block_hash,
@ -443,7 +443,7 @@ class TestBigchainVoter(object):
assert vote['vote']['is_block_valid'] is True assert vote['vote']['is_block_valid'] is True
assert vote['vote']['invalid_reason'] is None assert vote['vote']['invalid_reason'] is None
assert vote['node_pubkey'] == b.me assert vote['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True
def test_invalid_block_voting(self, b, user_public_key): def test_invalid_block_voting(self, b, user_public_key):
# create queue and voter # create queue and voter
@ -484,7 +484,7 @@ class TestBigchainVoter(object):
assert vote['vote']['is_block_valid'] is False assert vote['vote']['is_block_valid'] is False
assert vote['vote']['invalid_reason'] is None assert vote['vote']['invalid_reason'] is None
assert vote['node_pubkey'] == b.me assert vote['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True
def test_vote_creation_valid(self, b): def test_vote_creation_valid(self, b):
# create valid block # create valid block
@ -498,7 +498,7 @@ class TestBigchainVoter(object):
assert vote['vote']['is_block_valid'] is True assert vote['vote']['is_block_valid'] is True
assert vote['vote']['invalid_reason'] is None assert vote['vote']['invalid_reason'] is None
assert vote['node_pubkey'] == b.me assert vote['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True
def test_vote_creation_invalid(self, b): def test_vote_creation_invalid(self, b):
# create valid block # create valid block
@ -512,7 +512,7 @@ class TestBigchainVoter(object):
assert vote['vote']['is_block_valid'] is False assert vote['vote']['is_block_valid'] is False
assert vote['vote']['invalid_reason'] is None assert vote['vote']['invalid_reason'] is None
assert vote['node_pubkey'] == b.me assert vote['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True
class TestBigchainBlock(object): class TestBigchainBlock(object):

View File

@ -5,7 +5,7 @@ import pytest
import rethinkdb as r import rethinkdb as r
from bigchaindb import util from bigchaindb import util
from bigchaindb.crypto.asymmetric import PublicKey, generate_key_pair from bigchaindb.crypto.asymmetric import VerifyingKey, generate_key_pair
from bigchaindb.voter import Voter, BlockStream from bigchaindb.voter import Voter, BlockStream
@ -45,7 +45,7 @@ class TestBigchainVoter(object):
assert vote['vote']['is_block_valid'] is True assert vote['vote']['is_block_valid'] is True
assert vote['vote']['invalid_reason'] is None assert vote['vote']['invalid_reason'] is None
assert vote['node_pubkey'] == b.me assert vote['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True
def test_valid_block_voting_with_create_transaction(self, b): def test_valid_block_voting_with_create_transaction(self, b):
q_new_block = mp.Queue() q_new_block = mp.Queue()
@ -87,7 +87,7 @@ class TestBigchainVoter(object):
assert vote['vote']['is_block_valid'] is True assert vote['vote']['is_block_valid'] is True
assert vote['vote']['invalid_reason'] is None assert vote['vote']['invalid_reason'] is None
assert vote['node_pubkey'] == b.me assert vote['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True
def test_valid_block_voting_with_transfer_transactions(self, b): def test_valid_block_voting_with_transfer_transactions(self, b):
q_new_block = mp.Queue() q_new_block = mp.Queue()
@ -158,7 +158,7 @@ class TestBigchainVoter(object):
assert vote['vote']['is_block_valid'] is True assert vote['vote']['is_block_valid'] is True
assert vote['vote']['invalid_reason'] is None assert vote['vote']['invalid_reason'] is None
assert vote['node_pubkey'] == b.me assert vote['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True
def test_invalid_block_voting(self, b, user_public_key): def test_invalid_block_voting(self, b, user_public_key):
# create queue and voter # create queue and voter
@ -197,7 +197,7 @@ class TestBigchainVoter(object):
assert vote['vote']['is_block_valid'] is False assert vote['vote']['is_block_valid'] is False
assert vote['vote']['invalid_reason'] is None assert vote['vote']['invalid_reason'] is None
assert vote['node_pubkey'] == b.me assert vote['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True
def test_vote_creation_valid(self, b): def test_vote_creation_valid(self, b):
# create valid block # create valid block
@ -211,7 +211,7 @@ class TestBigchainVoter(object):
assert vote['vote']['is_block_valid'] is True assert vote['vote']['is_block_valid'] is True
assert vote['vote']['invalid_reason'] is None assert vote['vote']['invalid_reason'] is None
assert vote['node_pubkey'] == b.me assert vote['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True
def test_vote_creation_invalid(self, b): def test_vote_creation_invalid(self, b):
# create valid block # create valid block
@ -225,7 +225,7 @@ class TestBigchainVoter(object):
assert vote['vote']['is_block_valid'] is False assert vote['vote']['is_block_valid'] is False
assert vote['vote']['invalid_reason'] is None assert vote['vote']['invalid_reason'] is None
assert vote['node_pubkey'] == b.me assert vote['node_pubkey'] == b.me
assert PublicKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True assert VerifyingKey(b.me).verify(util.serialize(vote['vote']), vote['signature']) is True
def test_voter_considers_unvoted_blocks_when_single_node(self, b): def test_voter_considers_unvoted_blocks_when_single_node(self, b):
# simulate a voter going donw in a single node environment # simulate a voter going donw in a single node environment