def test_rsa(): bip85 = BIP85() test = bip85.bip39_mnemonic_to_entropy("m/83696968'/0'/0'", MNEMONIC) drng_reader = BIP85DRNG.new(test) rsa = RSA.generate(bits=2048, randfunc=drng_reader.read, e=65537) key = rsa.export_key(format='PEM', pkcs=1) key_hash = hashlib.sha256(key).hexdigest() expected = '64ff572798a6534c76eda9fd2d7e906a737a1bad893dec31ae3d0488e3f19ed9' assert key_hash == expected test = bip85.bip32_xprv_to_entropy("m/83696968'/0'/1'", XPRV) drng_reader = BIP85DRNG.new(test) rsa = RSA.generate(bits=2048, randfunc=drng_reader.read, e=65537) key = rsa.export_key(format='PEM', pkcs=1) key_hash = hashlib.sha256(key).hexdigest() expected = '54196fdcbb0cb55c56b14a7068ea633dc784dde21cbe4e7f30f857ec88f9ac36' assert key_hash == expected test = bip85.bip32_xprv_to_entropy("m/83696968'/0'/2'", XPRV) drng_reader = BIP85DRNG.new(test) rsa = RSA.generate(bits=4096, randfunc=drng_reader.read, e=65537) key = rsa.export_key(format='PEM', pkcs=1) key_hash = hashlib.sha256(key).hexdigest() expected = 'c03f358f4aad4a0216881ec258ed6923201d174f52069bc9bcd341bb611696d5' assert key_hash == expected
def bip39(xprv_string, language, words, index): # 83696968'/39'/language'/words'/index' lang_code = LANGUAGE_LOOKUP[language] bip85 = BIP85() path = f"83696968p/39p/{lang_code}p/{words}p/{index}p" entropy = bip85.bip32_xprv_to_entropy(path, xprv_string) return bip85.entropy_to_bip39(entropy, words, language)
def test_mnemonic_pwd(): bip85 = BIP85() mnemonic = 'install scatter logic circle pencil average fall shoe quantum disease suspect usage' # with password test = bip85.bip39_mnemonic_to_entropy("m/83696968'/0'/0'", mnemonic, 'TREZOR') expected = 'd24cee04c61c4a47751658d078ae9b0cc9550fe43eee643d5c10ac2e3f5edbca757b2bd74d55ff5bcc2b1608d567053660d9c7447ae1eb84b6619282fd391844' assert test.hex() == expected
def test_entropy_to_mnemonic(): bip85 = BIP85() entropy = bip85.bip32_xprv_to_entropy("m/83696968'/0'/0'", XPRV) words12 = 'useful guitar veteran zone perfect october explain grant clarify december flight recycle' assert bip85.entropy_to_bip39(entropy, 12) == words12 words15 = 'useful guitar veteran zone perfect october explain grant clarify december flight raw banana estate uncle' assert bip85.entropy_to_bip39(entropy, 15) == words15 words24 = 'useful guitar veteran zone perfect october explain grant clarify december flight raw banana estate unfair grow search witness echo market primary alley forward boring' assert bip85.entropy_to_bip39(entropy, 24) == words24
def test_lengths(): bip85 = BIP85() test = bip85.bip32_xprv_to_entropy("m/83696968'/0'/0'", XPRV) drng = BIP85DRNG.new(test) assert len(drng.read(1)) == 1 assert len(drng.read(10)) == 10 assert len(drng.read(100)) == 100 assert len(drng.read(1000)) == 1000 assert len(drng.read(10000)) == 10000 assert len(drng.read(100000)) == 100000 assert len(drng.read(10000001)) == 10000001
def test_determinism(): bip85 = BIP85() test = bip85.bip39_mnemonic_to_entropy("m/83696968'/0'/0'", MNEMONIC) drng1 = BIP85DRNG.new(test) drng2 = BIP85DRNG.new(test) drng3 = BIP85DRNG.new(test) result1 = drng1.read(10).hex() + drng1.read(20).hex() + drng1.read( 30).hex() + drng1.read(40).hex() result2 = drng2.read(40).hex() + drng2.read(30).hex() + drng2.read( 20).hex() + drng2.read(10).hex() result3 = drng3.read(100).hex() assert result1 == result2 assert result2 == result3
def test_mnemonic(): bip85 = BIP85() entropy = bip85.bip32_xprv_to_entropy("m/83696968'/39'/0'/12'/0'", XPRV) assert entropy[:16].hex() == '6250b68daf746d12a24d58b4787a714b' assert bip85.entropy_to_bip39(entropy, 12) == \ 'girl mad pet galaxy egg matter matrix prison refuse sense ordinary nose' entropy = bip85.bip32_xprv_to_entropy("m/83696968'/39'/0'/18'/0'", XPRV) assert entropy[:24].hex( ) == '938033ed8b12698449d4bbca3c853c66b293ea1b1ce9d9dc' assert bip85.entropy_to_bip39(entropy, 18) == \ 'near account window bike charge season chef number sketch tomorrow excuse sniff circle vital hockey outdoor supply token' entropy = bip85.bip32_xprv_to_entropy("m/83696968'/39'/0'/24'/0'", XPRV) assert entropy[:32].hex( ) == 'ae131e2312cdc61331542efe0d1077bac5ea803adf24b313a4f0e48e9c51f37f' assert bip85.entropy_to_bip39(entropy, 24) == \ 'puppy ocean match cereal symbol another shed magic wrap hammer bulb intact gadget divorce twin tonight reason outdoor destroy simple truth cigar social volcano'
def test_drng_exceptions(): bip85 = BIP85() test = bip85.bip39_mnemonic_to_entropy("m/83696968'/0'/1'", MNEMONIC) for i in range(64): with pytest.raises( ValueError, match="BIP85DRNG input entropy must be exactly 512 bits."): BIP85DRNG.new(test[:i]) for i in [ True, False, None, [], {}, (), '1234567890123456789012345678901234567890123456789012345678901234', int(123456789), ]: with pytest.raises(TypeError, match="BIP85DRNG input entropy must be bytes."): BIP85DRNG.new(i)
def test_drng(): bip85 = BIP85() test = bip85.bip39_mnemonic_to_entropy("m/83696968'/0'/0'", MNEMONIC) drng = BIP85DRNG.new(test) expected = 'b78b1ee6b345eae6836c2d53d33c64cdaf9a696487be81b03e822dc84b3f1cd883d7559e53d175f243e4c349e822a957bbff' assert drng.read(50).hex() == expected expected = '9224bc5dde9492ef54e8a439f6bc8c7355b87a925a37ee405a7502991111cd2dddaf1883f4e962abf4fb4b31cd28d5cf6b14f6ddcc9c19fd56d7f960a4b27f1d423a55dda4865aa6ddd6b4c26f18d400bb0a593e6c785d6d7e28c9c64608624318eddc01' assert drng.read(100).hex() == expected expected = '23750caa2a271f35faa6a3ca292b4be357404eca6842c69a3717dc3e41f7b38c67be492395b32221470aa08a2c489018c635a175f731245330e1f47091dbfb26f2923d10bd2e09280bffd1d94eb2a88f964aeb1774da04aad3bb1fdde0f77cd5ca79617ae317375417a51339523057bebef434c4400303890332e458425242f56a4293dad4f632b82713467b18ed6e1dab633220523d' assert drng.read(150).hex() == expected test = bip85.bip32_xprv_to_entropy("m/83696968'/0'/0'", XPRV) drng = BIP85DRNG.new(test) expected = 'b78b1ee6b345eae6836c2d53d33c64cdaf9a696487be81b03e822dc84b3f1cd883d7559e53d175f243e4c349e822a957bbff9224bc5dde9492ef54e8a439f6bc8c7355b87a925a37ee405a7502991111' assert drng.read(80).hex() == expected expected = 'cd2dddaf1883f4e962abf4fb4b31cd28d5cf6b14f6ddcc9c19' assert drng.read(25).hex() == expected test = bip85.bip32_xprv_to_entropy("m/83696968'/0'/0'", XPRV) drng = BIP85DRNG.new(test) expected = 'b78b1ee6b345eae6836c2d53d33c64cdaf9a6964' assert drng.read(20).hex() == expected expected = '87be81b03e822dc84b3f1cd883d7559e53d175f243e4c349e8' assert drng.read(25).hex() == expected
def test_xprv(): bip85 = BIP85() result = bip85.bip32_xprv_to_xprv("83696968'/32'/0'", XPRV) assert result == 'xprv9s21ZrQH143K2srSbCSg4m4kLvPMzcWydgmKEnMmoZUurYuBuYG46c6P71UGXMzmriLzCCBvKQWBUv3vPB3m1SATMhp3uEjXHJ42jFg7myX'
def test_wif_from_entropy(): bip85 = BIP85() entropy = bip85.bip32_xprv_to_entropy("m/83696968'/2'/0'", XPRV) entropy = entropy[:32] assert bip85.entropy_to_wif( entropy) == 'Kzyv4uF39d4Jrw2W7UryTHwZr1zQVNk4dAFyqE6BuMrMh1Za7uhp'
def test_xprv_to_entropy(): bip85 = BIP85() test = bip85.bip32_xprv_to_entropy("m/83696968'/0'/0'", XPRV) expected = 'efecfbccffea313214232d29e71563d941229afb4338c21f9517c41aaa0d16f00b83d2a09ef747e7a64e8e2bd5a14869e693da66ce94ac2da570ab7ee48618f7' assert test.hex() == expected
def test_mnemonic(): bip85 = BIP85() mnemonic = 'install scatter logic circle pencil average fall shoe quantum disease suspect usage' test = bip85.bip39_mnemonic_to_entropy("m/83696968'/0'/0'", mnemonic) expected = 'efecfbccffea313214232d29e71563d941229afb4338c21f9517c41aaa0d16f00b83d2a09ef747e7a64e8e2bd5a14869e693da66ce94ac2da570ab7ee48618f7' assert test.hex() == expected
def test_hex(path, width, expect): bip85 = BIP85() assert bip85.bip32_xprv_to_hex(path, width, XPRV) == expect
def wif(xprv_string, index): # m/83696968'/2'/index' bip85 = BIP85() path = f"83696968p/2p/{index}p" return bip85.entropy_to_wif(bip85.bip32_xprv_to_entropy(path, xprv_string))
def xprv(xprv_string, index): # 83696968'/32'/index' bip85 = BIP85() path = f"83696968p/32p/{index}p" return bip85.bip32_xprv_to_xprv(path, xprv_string)
def hex(xprv_string, index, width): # m/83696968'/128169p'/index' bip85 = BIP85() path = f"83696968p/128169p/{width}p/{index}p" return bip85.bip32_xprv_to_hex(path, width, xprv_string)