static void load_json_key(json_t *wallet, struct bp_key *key) { json_t *keys_a = json_object_get(wallet, "keys"); assert(json_is_array(keys_a)); json_t *key_o = json_array_get(keys_a, 0); assert(json_is_object(key_o)); const char *address_str = json_string_value(json_object_get(key_o, "address")); assert(address_str != NULL); const char *privkey_address_str = json_string_value(json_object_get(key_o, "privkey_address")); assert(privkey_address_str); const char *pubkey_str = json_string_value(json_object_get(key_o, "pubkey")); assert(pubkey_str != NULL); const char *privkey_str = json_string_value(json_object_get(key_o, "privkey")); assert(privkey_str != NULL); char rawbuf[strlen(privkey_str)]; size_t buf_len = 0; /* decode privkey */ assert(decode_hex(rawbuf, sizeof(rawbuf), privkey_str, &buf_len) == true); assert(bp_privkey_set(key, rawbuf, buf_len) == true); /* decode pubkey */ assert(decode_hex(rawbuf, sizeof(rawbuf), pubkey_str, &buf_len) == true); void *pk = NULL; size_t pk_len = 0; /* verify pubkey matches expected */ assert(bp_pubkey_get(key, &pk, &pk_len) == true); assert(pk_len == buf_len); assert(memcmp(rawbuf, pk, pk_len) == 0); free(pk); /* verify pubkey hash (bitcoin address) matches expected */ cstring *btc_addr = bp_pubkey_get_address(key, PUBKEY_ADDRESS_TEST); assert(strlen(address_str) == btc_addr->len); assert(memcmp(address_str, btc_addr->str, btc_addr->len) == 0); /* verify the private key address (WIF) */ cstring *privkey_addr = bp_privkey_get_address(key, PRIVKEY_ADDRESS_TEST); assert(strlen(privkey_address_str) == privkey_addr->len); assert(memcmp(privkey_address_str, privkey_addr->str, privkey_addr->len) == 0); cstr_free(privkey_addr, true); cstr_free(btc_addr, true); }
void cur_wallet_addresses(void) { if (!cur_wallet_load()) return; struct wallet *wlt = cur_wallet; struct bp_key *key; unsigned int i; printf("[\n"); wallet_for_each_key_numbered(wlt, key, i) { cstring *btc_addr; btc_addr = bp_pubkey_get_address(key, chain->addr_pubkey); printf(" \"%s\"%s\n", btc_addr->str, i == (wlt->keys->len - 1) ? "" : ","); cstr_free(btc_addr, true); }
cstring *wallet_new_address(struct wallet *wlt) { struct hd_path_seg hdpath[] = { { 44, true }, // BIP 44 { 0, true }, // chain: BTC { 0, true }, // acct# { 0, false }, // change? { 0, false }, // key index }; struct wallet_account *acct = account_byname(wlt, wlt->def_acct->str); if (!acct) return NULL; // patch HD path based on account settings hdpath[2].index = acct->acct_idx; hdpath[4].index = acct->next_key_idx; assert(wlt->hdmaster && (wlt->hdmaster->len > 0)); struct hd_extended_key *master = parr_idx(wlt->hdmaster, 0); assert(master != NULL); struct hd_extended_key child; hd_extended_key_init(&child); if (!hd_derive(&child, master, hdpath, ARRAY_SIZE(hdpath))) { hd_extended_key_free(&child); return NULL; } acct->next_key_idx++; cstring *rs = bp_pubkey_get_address(&child.key,wlt->chain->addr_pubkey); hd_extended_key_free(&child); return rs; }