Cross-platform Python CFFI bindings for libsecp256k1
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

106 lines
2.4 KiB

from os import urandom
import pytest
from coincurve.utils import (
GROUP_ORDER,
ZERO,
bytes_to_int,
chunk_data,
der_to_pem,
get_valid_secret,
int_to_bytes,
int_to_bytes_padded,
pad_scalar,
pem_to_der,
validate_secret,
verify_signature,
)
from .samples import MESSAGE, PRIVATE_KEY_DER, PUBLIC_KEY_COMPRESSED, PUBLIC_KEY_UNCOMPRESSED, SIGNATURE
class TestPadScalar:
def test_correct(self):
assert pad_scalar(b'\x01') == b'\x00' * 31 + b'\x01'
def test_pad_limit(self):
n = urandom(32)
assert len(pad_scalar(n)) == len(n)
def test_empty_scalar(self):
assert len(pad_scalar(b'')) == 32
def test_get_valid_secret():
secret = get_valid_secret()
assert len(secret) == 32 and ZERO < secret < GROUP_ORDER
class TestValidateSecret:
def test_valid(self):
secret = validate_secret(b'\x01')
assert len(secret) == 32 and ZERO < secret < GROUP_ORDER
def test_bytes_greater_than_group_order(self):
secret = (
b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xfe\xba\xae\xdc\xe6\xafH\xa0;\xbf\xd2^\x8d'
)
assert secret > GROUP_ORDER
secret = validate_secret(secret)
assert len(secret) == 32 and ZERO < secret < GROUP_ORDER
def test_out_of_range(self):
with pytest.raises(ValueError):
validate_secret(ZERO)
with pytest.raises(ValueError):
validate_secret(GROUP_ORDER)
def test_bytes_int_conversion():
bytestr = b'\x00' + urandom(31)
assert pad_scalar(int_to_bytes(bytes_to_int(bytestr))) == bytestr
def test_bytes_int_conversion_padded():
bytestr = b'\x00' + urandom(31)
assert int_to_bytes_padded(bytes_to_int(bytestr)) == bytestr
def test_der_conversion():
assert pem_to_der(der_to_pem(PRIVATE_KEY_DER)) == PRIVATE_KEY_DER
def test_verify_signature():
assert verify_signature(SIGNATURE, MESSAGE, PUBLIC_KEY_COMPRESSED)
assert verify_signature(SIGNATURE, MESSAGE, PUBLIC_KEY_UNCOMPRESSED)
def test_chunk_data():
assert list(chunk_data('4fadd1977328c11efc1c1d8a781aa6b9677984d3e0b', 2)) == [
'4f',
'ad',
'd1',
'97',
'73',
'28',
'c1',
'1e',
'fc',
'1c',
'1d',
'8a',
'78',
'1a',
'a6',
'b9',
'67',
'79',
'84',
'd3',
'e0',
'b',
]