package com.blockstream.test; import com.blockstream.libwally.Wally; import static com.blockstream.libwally.Wally.BIP32_FLAG_KEY_PRIVATE; import static com.blockstream.libwally.Wally.BIP32_VER_MAIN_PRIVATE; public class test_bip32 { final byte[] mSeed; public test_bip32() { mSeed = h("000102030405060708090a0b0c0d0e0f"); } public void test() { final Object seedKey = Wally.bip32_key_from_seed(mSeed, BIP32_VER_MAIN_PRIVATE, 0); final String hex = "0488ade4000000000000000000873dff81c02f525623fd1fe5167eac3a55" + "a049de3d314bb42ee227ffed37d50800e8f32e723decf4051aefac8e2c93c9c5b214313817c" + "db01a1494b917c8436b35"; final Object unserialized = Wally.bip32_key_unserialize(h(hex)); final byte[] newSerialized = Wally.bip32_key_serialize(unserialized, BIP32_FLAG_KEY_PRIVATE); if (!h(newSerialized).equals(hex)) throw new RuntimeException("BIP32 serialization did not round-trip correctly"); final Object derivedKey = Wally.bip32_key_from_parent(seedKey, 0, BIP32_FLAG_KEY_PRIVATE); final String derivedChainCode = h(Wally.bip32_key_get_chain_code(derivedKey)); if (derivedChainCode.length() != 64) throw new RuntimeException("BIP32 incorrect chain code"); if (Wally.bip32_key_get_depth(derivedKey) != 1) throw new RuntimeException("BIP32 incorrect depth"); Object initKey = Wally.bip32_key_init(Wally.bip32_key_get_version(derivedKey), Wally.bip32_key_get_depth(derivedKey), Wally.bip32_key_get_child_num(derivedKey), Wally.bip32_key_get_chain_code(derivedKey), Wally.bip32_key_get_pub_key(derivedKey), Wally.bip32_key_get_priv_key(derivedKey), Wally.bip32_key_get_hash160(derivedKey), Wally.bip32_key_get_parent160(derivedKey)); final byte[] derivedSerialized = Wally.bip32_key_serialize(derivedKey, BIP32_FLAG_KEY_PRIVATE); final byte[] initSerialized = Wally.bip32_key_serialize(initKey, BIP32_FLAG_KEY_PRIVATE); if (!h(initSerialized).equals(h(derivedSerialized))) throw new RuntimeException("BIP32 initialisation by member failed"); Wally.bip32_key_free(initKey); Wally.bip32_key_free(derivedKey); Wally.bip32_key_free(unserialized); Wally.bip32_key_free(seedKey); } private String h(final byte[] bytes) { return Wally.hex_from_bytes(bytes); } private byte[] h(final String hex) { return Wally.hex_to_bytes(hex); } public static void main(final String[] args) { final test_bip32 t = new test_bip32(); t.test(); } }