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.

227 lines
6.7 KiB

#ifndef LIBWALLY_CORE_BIP32_H
#define LIBWALLY_CORE_BIP32_H
#include "wally_core.h"
#include <stdint.h>
/** The required lengths of entropy for @bip32_key_from_seed */
#define BIP32_ENTROPY_LEN_128 16
#define BIP32_ENTROPY_LEN_256 32
#define BIP32_ENTROPY_LEN_512 64
/** Length of an ext_key serialized using BIP32 format */
#define BIP32_SERIALIZED_LEN 78
/** Child number of the first hardened child */
#define BIP32_INITIAL_HARDENED_CHILD 0x80000000
/** Indicate that we want to derive a private key in @bip32_key_from_parent */
#define BIP32_FLAG_KEY_PRIVATE 0x0
/** Indicate that we want to derive a public key in @bip32_key_from_parent */
#define BIP32_FLAG_KEY_PUBLIC 0x1
/** Indicate that we want to skip hash calculation when deriving a key in @bip32_key_from_parent */
#define BIP32_FLAG_SKIP_HASH 0x2
/** Version codes for extended keys */
#define BIP32_VER_MAIN_PUBLIC 0x0488B21E
#define BIP32_VER_MAIN_PRIVATE 0x0488ADE4
#define BIP32_VER_TEST_PUBLIC 0x043587CF
#define BIP32_VER_TEST_PRIVATE 0x04358394
#ifdef SWIG
struct ext_key;
#else
/** An extended key */
struct ext_key {
/** The chain code for this key */
unsigned char chain_code[32];
/** The Hash160 of this keys parent */
unsigned char parent160[20];
/** The depth of this key */
uint8_t depth;
unsigned char pad1[10];
/** The private key with prefix byte 0 */
unsigned char priv_key[33];
/** The child number of the parent key that this key represents */
uint32_t child_num;
/** The Hash160 of this key */
unsigned char hash160[20];
/** The child number of the parent key that this key represents */
uint32_t version;
unsigned char pad2[3];
/** The public key with prefix byte 0x2 or 0x3 */
unsigned char pub_key[33];
};
#endif /* SWIG */
#ifndef SWIG_PYTHON
/**
* Free a key allocated by @bip32_key_from_seed_alloc
* or @bip32_key_unserialize_alloc.
*
* @key_in Key to free.
*/
WALLY_CORE_API int bip32_key_free(
const struct ext_key *key_in);
#endif /* SWIG_PYTHON */
/**
*/
WALLY_CORE_API int bip32_key_init_alloc(
uint32_t version,
uint32_t depth,
uint32_t child_num,
const unsigned char *chain_code,
size_t chain_code_len,
const unsigned char *pub_key,
size_t pub_key_len,
const unsigned char *priv_key,
size_t priv_key_len,
const unsigned char *hash160,
size_t hash160_len,
const unsigned char *parent160,
size_t parent160_len,
const struct ext_key **output);
#ifndef SWIG
/**
* Create a new master extended key from entropy.
*
* This creates a new master key, i.e. the root of a new HD tree.
* @bytes_in Entropy to use.
* @len_in Size of @bytes_in in bytes. Must be one of @BIP32_ENTROPY_LEN_128,
* @BIP32_ENTROPY_LEN_256 or @BIP32_ENTROPY_LEN_512.
* @version Either @BIP32_VER_MAIN_PRIVATE or @BIP32_VER_TEST_PRIVATE,
* indicating mainnet or testnet/regtest respectively.
* @flags Either BIP32_FLAG_SKIP_HASH to skip hash160 calculation, or 0.
* @output Destination for the resulting master extended key.
*
* The entropy passed in may produce an invalid key. If this happens,
* WALLY_ERROR will be returned and the caller should retry with
* new entropy.
*/
WALLY_CORE_API int bip32_key_from_seed(
const unsigned char *bytes_in,
size_t len_in,
uint32_t version,
uint32_t flags,
struct ext_key *output);
#endif
/**
* As per @bip32_key_from_seed, but allocates the key.
*
* @note The returned key should be freed with @bip32_key_free.
*/
WALLY_CORE_API int bip32_key_from_seed_alloc(
const unsigned char *bytes_in,
size_t len_in,
uint32_t version,
uint32_t flags,
const struct ext_key **output);
/**
* Serialize an extended key to memory using BIP32 format.
*
* @key_in The extended key to serialize.
* @flags BIP32_FLAG_KEY_ Flags indicating which key to serialize. You can not
* serialize a private extended key from a public extended key.
* @bytes_out Destination for the serialized key.
* @len Size of @bytes_out in bytes. Must be @BIP32_SERIALIZED_LEN.
*/
WALLY_CORE_API int bip32_key_serialize(
const struct ext_key *key_in,
uint32_t flags,
unsigned char *bytes_out,
size_t len);
#ifndef SWIG
/**
* Un-serialize an extended key from memory.
*
* @bytes_in Storage holding the serialized key.
* @len_in Size of @bytes_in in bytes. Must be @BIP32_SERIALIZED_LEN.
* @output Destination for the resulting extended key.
*/
WALLY_CORE_API int bip32_key_unserialize(
const unsigned char *bytes_in,
size_t len_in,
struct ext_key *output);
#endif
/**
* As per @bip32_key_unserialize, but allocates the key.
*
* @note The returned key should be freed with @bip32_key_free.
*/
WALLY_CORE_API int bip32_key_unserialize_alloc(
const unsigned char *bytes_in,
size_t len_in,
const struct ext_key **output);
#ifndef SWIG
/**
* Create a new child extended key from a parent extended key.
*
* @key_in The parent extended key.
* @child_num The child number to create. Numbers greater
* than or equal to @BIP32_INITIAL_HARDENED_CHILD represent
* hardened keys that cannot be created from public parent
* extended keys.
* @flags BIP32_FLAG_KEY_ Flags indicating the type of derivation wanted.
* You can not derive a private child extended key from a public
* parent extended key.
* @output Destination for the resulting child extended key.
*/
WALLY_CORE_API int bip32_key_from_parent(
const struct ext_key *key_in,
uint32_t child_num,
uint32_t flags,
struct ext_key *output);
#endif
/**
* As per @bip32_key_from_parent, but allocates the key.
*
* @note The returned key should be freed with @bip32_key_free.
*/
WALLY_CORE_API int bip32_key_from_parent_alloc(
const struct ext_key *key_in,
uint32_t child_num,
uint32_t flags,
const struct ext_key **output);
#endif /* LIBWALLY_CORE_BIP32_H */
#ifndef SWIG
/**
* Create a new child extended key from a parent extended key and a path.
*
* @key_in The parent extended key.
* @child_path_in The path of child numbers to create.
* @child_path_len The number of child numbers in @child_path_in.
* @flags BIP32_KEY_ Flags indicating the type of derivation wanted.
* @output Destination for the resulting child extended key.
*/
WALLY_CORE_API int bip32_key_from_parent_path(
const struct ext_key *key_in,
const uint32_t *child_num_in,
size_t child_num_len,
uint32_t flags,
struct ext_key *output);
#endif
/**
* As per @bip32_key_from_parent_path, but allocates the key.
*
* @note The returned key should be freed with @bip32_key_free.
*/
WALLY_CORE_API int bip32_key_from_parent_path_alloc(
const struct ext_key *key_in,
const uint32_t *child_num_in,
size_t child_num_len,
uint32_t flags,
const struct ext_key **output);