int script_parse_pubkey_hash(const uint8 *scriptPubKey, size_t scriptLength, uint160 *pubkey) { enum script_txout_type type; struct buff buf; size_t datalen; uint8 *data; int res; uint160_zero_out(pubkey); buff_init(&buf, (uint8 *)scriptPubKey, scriptLength); res = script_match_type(&buf, &type, &data, &datalen); if (res) { NOT_TESTED(); return 1; } switch (type) { case TX_PUBKEY: Warning(LGPFX " script TX_PUBKEY\n"); NOT_TESTED(); hash160_calc(data, datalen, pubkey); break; case TX_PUBKEYHASH: ASSERT(datalen == sizeof(uint160)); memcpy(pubkey, data, sizeof(uint160)); break; default: NOT_TESTED(); res = 1; break; } free(data); return res; }
void key_get_pubkey_hash160(const struct key *k, uint160 *hash) { ASSERT(k->pub_key); ASSERT(k->pub_len > 0); Log_Bytes(LGPFX " pubkey: ", k->pub_key, k->pub_len); hash160_calc(k->pub_key, k->pub_len, hash); }
static bool wallet_alloc_key(struct wallet *wallet, const char *priv, const char *pub, const char *desc, time_t birth, bool spendable) { struct wallet_key *wkey; struct key *key; uint160 pub_key; size_t len; uint8 *buf; bool s; ASSERT(priv); key = NULL; buf = NULL; len = 0; memset(&pub_key, 0, sizeof pub_key); if (btc->wallet_state == WALLET_ENCRYPTED_LOCKED) { if (wallet->pass) { struct secure_area *sec_b58; uint8 *encPrivKey; size_t encLen; if (!wallet_verify_hmac(wallet, priv, &encPrivKey, &encLen)) { return 0; } s = crypt_decrypt(wallet->ckey, encPrivKey, encLen, &sec_b58); free(encPrivKey); ASSERT(s); /* * 'buf' is a sensitive buffer here. It should be backed by * a struct secure_area. */ s = b58_privkey_to_bytes((char *)sec_b58->buf, &buf, &len); secure_free(sec_b58); ASSERT(s); } else { uint8 *pkey; size_t plen; str_to_bytes(pub, &pkey, &plen); hash160_calc(pkey, plen, &pub_key); free(pkey); } } else { s = b58_privkey_to_bytes(priv, &buf, &len); ASSERT(s); } if (buf) { key = key_alloc(); key_set_privkey(key, buf, len); memset(buf, 0, len); free(buf); key_get_pubkey_hash160(key, &pub_key); } ASSERT(!uint160_iszero(&pub_key)); wkey = safe_calloc(1, sizeof *wkey); wkey->cfg_idx = hashtable_getnumentries(wallet->hash_keys); wkey->btc_addr = b58_pubkey_from_uint160(&pub_key); wkey->desc = desc ? safe_strdup(desc) : NULL; wkey->pub_key = pub_key; wkey->birth = birth; wkey->key = key; wkey->spendable = spendable; if (spendable == 0) { Log(LGPFX" funds on %s are not spendable.\n", wkey->btc_addr); } s = hashtable_insert(wallet->hash_keys, &pub_key, sizeof pub_key, wkey); ASSERT(s); return 1; }