|
| 1 | +import os |
| 2 | + |
1 | 3 | from bip32 import BIP32, HARDENED_INDEX |
2 | 4 |
|
3 | 5 |
|
@@ -57,3 +59,40 @@ def test_vector_3(): |
57 | 59 | # Chain m/0H |
58 | 60 | assert (bip32.get_xpub_from_path([HARDENED_INDEX]) == "xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y") |
59 | 61 | assert (bip32.get_xpriv_from_path([HARDENED_INDEX]) == "xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L") |
| 62 | + |
| 63 | + |
| 64 | +def test_sanity_tests(): |
| 65 | + seed = bytes.fromhex("1077a46dc8545d372f22d9e110ae6c5c2bf7620fe9c4c911f5404d112233e1aa270567dd3554092e051ba3ba86c303590b0309116ac89964ff284db2219d7511") |
| 66 | + first_bip32 = BIP32.from_seed(seed) |
| 67 | + sec_bip32 = BIP32.from_xpriv("xprv9s21ZrQH143K3o4KUs47P2x9afhH31ekMo2foNTYwrU9wwZ8g5EatR9bn6YmCacdvnHWMnPFUqieQrnunrzuF5UfgGbhbEW43zRnhpPDBUL") |
| 68 | + assert first_bip32.get_master_xpriv() == sec_bip32.get_master_xpriv() |
| 69 | + assert first_bip32.get_master_xpub() == sec_bip32.get_master_xpub() |
| 70 | + # Fuzz it a bit |
| 71 | + for i in range(50): |
| 72 | + path = [int.from_bytes(os.urandom(3), "big") for _ in range(5)] |
| 73 | + h_path = [HARDENED_INDEX + int.from_bytes(os.urandom(3), "big") for _ in range(5)] |
| 74 | + mixed_path = [int.from_bytes(os.urandom(3), "big") for _ in range(5)] |
| 75 | + for i in mixed_path: |
| 76 | + if int.from_bytes(os.urandom(32), "big") % 2: |
| 77 | + i += HARDENED_INDEX |
| 78 | + assert first_bip32.get_xpriv_from_path(path) == sec_bip32.get_xpriv_from_path(path) |
| 79 | + assert first_bip32.get_xpub_from_path(path) == sec_bip32.get_xpub_from_path(path) |
| 80 | + assert first_bip32.get_xpriv_from_path(h_path) == sec_bip32.get_xpriv_from_path(h_path) |
| 81 | + assert first_bip32.get_xpub_from_path(h_path) == sec_bip32.get_xpub_from_path(h_path) |
| 82 | + assert first_bip32.get_xpriv_from_path(mixed_path) == sec_bip32.get_xpriv_from_path(mixed_path) |
| 83 | + assert first_bip32.get_xpub_from_path(mixed_path) == sec_bip32.get_xpub_from_path(mixed_path) |
| 84 | + # Taken from iancoleman's website |
| 85 | + bip32 = BIP32.from_seed(bytes.fromhex("ac8c2377e5cde867d7e420fbe04d8906309b70d51b8fe58d6844930621a9bc223929155dcfebb4da9d62c86ec0d15adf936a663f4f0cf39cbb0352e7dac073d6")) |
| 86 | + assert bip32.get_master_xpriv() == bip32.get_xpriv_from_path([]) == "xprv9s21ZrQH143K2GzaKJsW7DQsxeDpY3zqgusaSx6owWGC19k4mhwnVAsm4qPsCw43NkY2h1BzVLyxWHt9NKF86QRyBj53vModdGcNxtpD6KX" |
| 87 | + assert bip32.get_master_xpub() == bip32.get_xpub_from_path([]) == "xpub661MyMwAqRbcEm53RLQWUMMcWg4JwWih48oBFLWRVqoAsx5DKFG32yCEv8iH29TWpmo5KTcpsjXcea6Zx4Hc6PAbGnHjEDCf3yHbj7qdpnf" |
| 88 | + # Sanity checks for m/0'/0'/14/0'/18 |
| 89 | + xpriv = bip32.get_xpriv_from_path([HARDENED_INDEX, HARDENED_INDEX, 14, |
| 90 | + HARDENED_INDEX, 18]) |
| 91 | + xpub = bip32.get_xpub_from_path([HARDENED_INDEX, HARDENED_INDEX, 14, |
| 92 | + HARDENED_INDEX, 18]) |
| 93 | + assert xpriv == "xprvA2YVbLvEeKaPedw7F6RLwG3RgYnTq1xGCyDNMgZNWdEQnSUBQmKEuLyA6TSPsggt5xvyJHLD9L25tNLpQiP4Q8ZkQNo8ueAgeYj5zYq8hSm" |
| 94 | + assert xpub == "xpub6FXqzrT8Uh8gs81aM7xMJPzAEacxEUg7aC8yA4xz4xmPfEoKxJdVT9Hdwm3LwVQrSos2rhGDt8aGGHvdLr5LLAjK8pXFkbSpzGoGTXjd4z9" |
| 95 | + # Now if we our master is m/0'/0'/14, we should derive the same keys for |
| 96 | + # m/0'/18 ! |
| 97 | + bip32 = BIP32.from_xpriv(bip32.get_xpriv_from_path([HARDENED_INDEX, |
| 98 | + HARDENED_INDEX, 14])) |
0 commit comments