Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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;
}