From 27d53ea1058bf952ea8361ea6f82e77bf3accdc5 Mon Sep 17 00:00:00 2001 From: Alexey Karyabkin Date: Wed, 13 Jun 2018 23:06:01 +0400 Subject: [PATCH] added tests for serialize/deserialize HDWallet keys & small changes --- tests/bip0032_fixtures.py | 17 ++++++++++++- tests/test_bip0032.py | 51 ++++++++++++++++++++++++++++++--------- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/tests/bip0032_fixtures.py b/tests/bip0032_fixtures.py index e01e0f3..f1ef765 100644 --- a/tests/bip0032_fixtures.py +++ b/tests/bip0032_fixtures.py @@ -29,9 +29,24 @@ def master_key_hdwallet(): @pytest.fixture def public_key_hdwallet(): return dict(version=b'\x04\x88\xB2\x1E', - key=b"Y\x9e'\xe00or'\xacD\x9c(l\x99\x0fxB\x03\xbd/]|+\xfd\xe89K!\x93\x0bN\x9b", + key=b"\x03F\xcd\x96\xd7-\xc4Q\xee\xfc\xadc\n\xe4\xd2Xe\x02\x99(\x0f\xf5\x1c'\x16\xab\xd0\x05_\xb4:8\xfa", depth=0, child=0, finger_print=b'\x00\x00\x00\x00', chain_code=b'B\xa8\xe9v>y\xe2\x82\x10\x80\xc2\xa91\x10E\xe0XJ\xe6\xc7\x18\x9eE~\xa0^\xd1\x820\xe7\x18\x0c', is_private=False) + +@pytest.fixture +def privkey_hdwallet_base58(): + return 'xprv9s21ZrQH143K2irFFw4cdtV8EicuR6Y5P2WqMpbLWhnZUADeKUi52Jh8Pzt8K9RqHanNsrVXf6VhNXQv2ypWxsTSWB8UsqjxkGPxHcjyXNC' + + +@pytest.fixture +def pubkey_hdwallet_base58(): + return 'xpub661MyMwAqRbcFCviMxbd12RrnkTPpZFvkFSSACzx53KYLxYns22Ka71cFHiMLQz3NaPYeN7EcdDUwH5QTWeS56jc2DzAzuKU2cfwp5cvyoR' + + +@pytest.fixture +def bad_key_hdwallet_base58(): + return 'xpeb661MyMwAq1ecFCviMxbd12RrnkTPpZFvkFSSACzx53KYLxYns22Ka71cFHiMLQz3NaPYeN7EcdDUwH5QTWeS56jc2DzAzuKU2cfwp5cvyoR' + diff --git a/tests/test_bip0032.py b/tests/test_bip0032.py index ff26384..7a2c125 100644 --- a/tests/test_bip0032.py +++ b/tests/test_bip0032.py @@ -5,10 +5,11 @@ import hmac from binascii import hexlify, unhexlify from pybtc.hdwallet import * +from pybtc.tools import encode_base58, decode_base58 -def test_create_master_key(mnemonic_256): +def test_create_master_key_hdwallet(mnemonic_256): passphrase = ' '.join(mnemonic_256) seed = create_seed(passphrase, 'P@ssw0rd') assert seed is not None @@ -26,10 +27,10 @@ def test_create_master_key(mnemonic_256): assert master_key['is_private'] -def test_create_public_key(master_key_hdwallet): - public_key = create_public_key_hdwallet(master_key_hdwallet['key']) +def test_create_public_key_hdwallet(master_key_hdwallet): + public_key = create_parent_pubkey_hdwallet(master_key_hdwallet) assert public_key is not None - assert len(public_key) == 33 + assert len(public_key['key']) == 33 def test_validate_private_key(fail_key1, fail_key2, good_key): @@ -38,16 +39,11 @@ def test_validate_private_key(fail_key1, fail_key2, good_key): assert validate_private_key(good_key) -def test_serialize_key(master_key_hdwallet): - serialize_key = serialize_key_hdwallet(master_key_hdwallet) - assert serialize_key is not None - assert isinstance(serialize_key, bytes) - assert len(serialize_key[:-4]) == 78 - - def test_create_expanded_key(master_key_hdwallet, public_key_hdwallet): result = create_expanded_key(b'asdasdasd', 0) assert result is None + result = create_expanded_key(master_key_hdwallet, 0x80000000) + assert result is None result = create_expanded_key(master_key_hdwallet, 0) assert result is not None assert len(result) == 64 @@ -69,3 +65,36 @@ def test_create_child_pubkey(master_key_hdwallet, public_key_hdwallet): assert result is not None assert isinstance(result, dict) assert not result.get('is_private') + + +def test_serialize_key_hdwallet(master_key_hdwallet, public_key_hdwallet): + serialize_mkey = serialize_key_hdwallet(master_key_hdwallet) + assert serialize_mkey is not None + assert isinstance(serialize_mkey, bytes) + assert len(serialize_mkey[:-4]) == 78 + ser_encode = encode_base58(serialize_mkey) + assert ser_encode[:4] in 'xprv' + + serialize_pkey = serialize_key_hdwallet(public_key_hdwallet) + assert serialize_pkey is not None + assert isinstance(serialize_pkey, bytes) + assert len(serialize_pkey[:-4]) == 78 + ser_encode = encode_base58(serialize_pkey) + assert ser_encode[:4] in 'xpub' + + +def test_deserialize_key(privkey_hdwallet_base58, pubkey_hdwallet_base58, bad_key_hdwallet_base58): + #десериализация приватного ключа + privkey = deserialize_key_hdwallet(privkey_hdwallet_base58) + assert privkey is not None + assert isinstance(privkey, dict) + assert privkey['is_private'] + #десериализация публичного ключа + pubkey = deserialize_key_hdwallet(pubkey_hdwallet_base58) + assert pubkey is not None + assert isinstance(pubkey, dict) + assert not pubkey['is_private'] + #десериализация некорретного ключа + pubkey = deserialize_key_hdwallet(bad_key_hdwallet_base58) + assert pubkey is None +