Beispiel #1
0
// Supporting functions
void free_msg_head_fields(syslog_msg_head *head) {
    if (head->timestamp != NULL) {
        cstr_free(head->timestamp);
        head->timestamp = NULL;
    }

    if (head->hostname != NULL) {
        cstr_free(head->hostname);
        head->hostname = NULL;
    }

    if (head->appname != NULL) {
        cstr_free(head->appname);
        head->appname = NULL;
    }

    if (head->processid != NULL) {
        cstr_free(head->processid);
        head->processid = NULL;
    }

    if (head->messageid != NULL) {
        cstr_free(head->messageid);
        head->messageid = NULL;
    }
}
Beispiel #2
0
cstring *ser_wallet(const struct wallet *wlt)
{
	struct bp_key *key;

	cstring *rs = cstr_new_sz(20 * 1024);

	/*
	 * ser "root" record
	 */
	{
	cstring *s_root = ser_wallet_root(wlt);
	cstring *recdata = message_str(wlt->chain->netmagic,
				       "root", s_root->str, s_root->len);
	cstr_append_buf(rs, recdata->str, recdata->len);
	cstr_free(recdata, true);
	cstr_free(s_root, true);
	}

	/* ser "privkey" records */
	wallet_for_each_key(wlt, key) {
		void *privkey = NULL;
		size_t pk_len = 0;

		bp_privkey_get(key, &privkey, &pk_len);

		cstring *recdata = message_str(wlt->chain->netmagic,
					       "privkey",
					       privkey, pk_len);
		free(privkey);

		cstr_append_buf(rs, recdata->str, recdata->len);
		cstr_free(recdata, true);
	}
Beispiel #3
0
static void tl_expression_free (struct tl_expression *E) {
  cstr_free (&E->text);
  cstr_free (&E->right_name);
  tl_list_token_free (E->left); E->left = NULL;
  tl_list_token_free (E->right); E->right = NULL;
  zfree (E, sizeof (*E));
}
Beispiel #4
0
static void runtest(bool is_valid, const char *basefn)
{
	char *fn = test_filename(basefn);
	json_t *tests = read_json(fn);
	assert(json_is_array(tests));

	unsigned int idx;
	for (idx = 0; idx < json_array_size(tests); idx++) {
		json_t *test = json_array_get(tests, idx);
		assert(json_is_array(test));

		const char *scriptSigEnc =
			json_string_value(json_array_get(test, 0));
		const char *scriptPubKeyEnc =
			json_string_value(json_array_get(test, 1));
		assert(scriptSigEnc != NULL);
		assert(scriptPubKeyEnc != NULL);

		cstring *scriptSig = parse_script_str(scriptSigEnc);
		cstring *scriptPubKey = parse_script_str(scriptPubKeyEnc);
		assert(scriptSig != NULL);
		assert(scriptPubKey != NULL);

		test_script(is_valid, scriptSig, scriptPubKey,
			    idx, scriptSigEnc, scriptPubKeyEnc);

		cstr_free(scriptSig, true);
		cstr_free(scriptPubKey, true);
	}

	json_decref(tests);
	free(fn);
}
Beispiel #5
0
static void test_privkey_valid_enc(const char *base58_str,
				cstring *payload,
				bool compress, bool is_testnet)
{
	assert(payload != NULL);

	cstring *pl = cstr_new_sz(payload->len + 1);
	cstr_append_buf(pl, payload->str, payload->len);
	if (compress)
		cstr_append_c(pl, 1);

	cstring *b58 = base58_encode_check(
		is_testnet ? PRIVKEY_ADDRESS_TEST : PRIVKEY_ADDRESS, true,
		pl->str, pl->len);
	assert(b58 != NULL);
	if (strcmp(b58->str, base58_str)) {
		fprintf(stderr, "base58: have %s, expected %s\n",
			b58->str, base58_str);
		assert(!strcmp(b58->str, base58_str));
	}

	cstr_free(b58, true);
	cstr_free(pl, true);
	cstr_free(payload, true);
}
Beispiel #6
0
void test_examples()
{
    cstring *value;
    cstring *key;
    logdb_log_db *db;
    enum logdb_error error = 0;
    int create_database = 1;

    /* create a new database object */
    db = logdb_new();

    /* create a database file (will overwrite existing) */
    logdb_load(db, "/tmp/test.logdb", create_database, &error);

    /* append a record */
    value = cstr_new("testkey");
    key = cstr_new("somevalue");
    /* second parameter NULL means we don't use a transaction */
    logdb_append(db, NULL, key, value);

    /* flush database (write its state to disk) */
    logdb_flush(db);

    /* cleanup */
    logdb_free(db);
    cstr_free(key, true);
    cstr_free(value, true);
}
Beispiel #7
0
void btc_node_send_version(btc_node *node)
{
    if (!node)
        return;

    /* get new string buffer */
    cstring *version_msg_cstr = cstr_new_sz(256);

    /* copy socket_addr to p2p addr */
    btc_p2p_address fromAddr;
    btc_p2p_address_init(&fromAddr);
    btc_p2p_address toAddr;
    btc_p2p_address_init(&toAddr);
    btc_addr_to_p2paddr(&node->addr, &toAddr);

    /* create a version message struct */
    btc_p2p_version_msg version_msg;
    memset(&version_msg, 0, sizeof(version_msg));

    /* create a serialized version message */
    btc_p2p_msg_version_init(&version_msg, &fromAddr, &toAddr, node->nodegroup->clientstr);
    btc_p2p_msg_version_ser(&version_msg, version_msg_cstr);

    /* create p2p message */
    cstring *p2p_msg = btc_p2p_message_new(node->nodegroup->chainparams->netmagic, BTC_MSG_VERSION, version_msg_cstr->str, version_msg_cstr->len);

    /* send message */
    btc_node_send(node, p2p_msg);

    /* cleanup */
    cstr_free(version_msg_cstr, true);
    cstr_free(p2p_msg, true);
}
Beispiel #8
0
static void test_privkey_valid_dec(const char *base58_str,
				cstring *payload,
				bool compress, bool is_testnet)
{
	assert(payload != NULL);

	cstring *pl = cstr_new_sz(payload->len + 1);
	cstr_append_buf(pl, payload->str, payload->len);
	if (compress)
		cstr_append_c(pl, 1);

	unsigned char addrtype;
	cstring *dec = base58_decode_check(&addrtype, base58_str);
	assert(dec != NULL);

	if (is_testnet)
		assert(addrtype == PRIVKEY_ADDRESS_TEST);
	else
		assert(addrtype == PRIVKEY_ADDRESS);

	if (compress) {
		assert(dec->len == 33);
		assert(dec->str[32] == 1);
	} else
		assert(dec->len == 32);

	assert(dec->len == pl->len);
	assert(memcmp(dec->str, pl->str, pl->len) == 0);

	cstr_free(dec, true);
	cstr_free(pl, true);
	cstr_free(payload, true);
}
Beispiel #9
0
static void test_extended_key()
{
	printf("TEST: test_extended_key\n");

	// Check we get sensible results when parsing some test vector data

	struct hd_extended_key pub;
	assert(hd_extended_key_init(&pub));
	{
		cstring *tv1data = base58_decode(s_tv1_m_xpub);
		assert(hd_extended_key_deser(&pub, tv1data->str, tv1data->len));
		cstr_free(tv1data, true);
	}

	struct hd_extended_key priv;
	assert(hd_extended_key_init(&priv));
	{
		cstring *tv1data = base58_decode(s_tv1_m_xprv);
		assert(hd_extended_key_deser(&priv, tv1data->str, tv1data->len));
		cstr_free(tv1data, true);
	}

	printf("PUB:\n");
	print_ek_public(&pub);

	printf("PRV:\n");
	print_ek_public(&priv);

	// Check we get the same codechains

	assert(0 == memcmp(pub.chaincode.data, priv.chaincode.data, 32));

	hd_extended_key_free(&priv);
	hd_extended_key_free(&pub);
}
Beispiel #10
0
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);
}
Beispiel #11
0
void logdb_record_free(logdb_record* rec)
{
    if (!rec)
        return;

    cstr_free(rec->key, true);
    cstr_free(rec->value, true);
    rec->next = NULL;
    rec->prev = NULL;

    free(rec);
}
Beispiel #12
0
static struct wallet *load_wallet(void)
{
	char *passphrase = getenv("PICOCOIN_PASSPHRASE");
	if (!passphrase) {
		fprintf(stderr, "missing PICOCOIN_PASSPHRASE\n");
		return NULL;
	}

	char *filename = wallet_filename();
	if (!filename) {
		fprintf(stderr, "wallet: no filename\n");
		return NULL;
	}

	cstring *data = read_aes_file(filename, passphrase, strlen(passphrase),
				      100 * 1024 * 1024);
	if (!data) {
		fprintf(stderr, "wallet: missing or invalid\n");
		return NULL;
	}

	struct wallet *wlt = calloc(1, sizeof(*wlt));
	if (!wlt) {
		fprintf(stderr, "wallet: failed to allocate wallet\n");
		cstr_free(data, true);
		return NULL;
	}

	if (!wallet_init(wlt, chain)) {
		free(wlt);
		cstr_free(data, true);
		return NULL;
	}

	struct const_buffer buf = { data->str, data->len };

	if (!deser_wallet(wlt, &buf))
		goto err_out;

	if (chain != wlt->chain) {
		fprintf(stderr, "wallet root: foreign chain detected, aborting load.  Try 'chain-set' first.\n");
		goto err_out;
	}

	return wlt;

err_out:
	fprintf(stderr, "wallet: invalid data found\n");
	wallet_free(wlt);
	cstr_free(data, true);
	return NULL;
}
Beispiel #13
0
static bool read_ek_ser_from_base58(const char *base58,
				    struct hd_extended_key_serialized *out)
{
	cstring *str = base58_decode(base58);
	if (str->len == 82) {
		memcpy(out->data, str->str, 78);
		cstr_free(str, true);
		return true;
	}

	cstr_free(str, true);
	return false;
}
Beispiel #14
0
int main() {
  cstr c = cstr_cat_printf(NULL, "sdsd");
  int i;
  printf("%d %d %s\n", cstr_used(c), cstr_cap(c), c);
  cstr_free(c);

  c = cstr_create(0);
  for(i = 1; i < 100000; i++)
    c = cstr_cat_char(c, i);

  printf("cap %d, used %d ", cstr_cap(c), cstr_used(c));
  cstr_free(c);
  return 0;
}
Beispiel #15
0
static void cb_conn_read_cli(struct bufferevent *bev, void *user_data)
{
    void*    buffer  = NULL;
    uint32_t buf_len = 0;
    struct evbuffer *buf_in = bufferevent_get_input(bev);
    cli_cmd_t cmd;
    cstr *json = cstr_new();

    cli_cmd_init(&cmd);

    /* bufferevent_lock(bev); */

    /* read data frome buffer in */
    buf_len = evbuffer_get_length(buf_in);
    buffer = calloc(1, buf_len);
    bufferevent_read(bev, buffer, buf_len);

    /* bufferevent_unlock(bev); */

    log_dbg("recv command: %s", (char*)buffer);
    cli_parse(&cmd, (char*)buffer);
    cli_cmd_to_json(&cmd, json);
    log_dbg("cli response: %s", cstr_body(json));

    bufferevent_send(bev, cstr_body(json), cstr_len(json) + 1);

    /* put data to addr recv buffer, and translate to command format */
    cli_cmd_release(&cmd);
    cstr_free(json);
    free(buffer);
    /* bufferevent_free(bev); */
}
Beispiel #16
0
/* cleanup all static data used during compilation */
static void tcc_cleanup(void)
{
	int i, n;
	if (NULL == tcc_state) {
		return;
	}
	tcc_state = NULL;

	/* free -D defines */
	free_defines (NULL);

	/* free tokens */
	n = tok_ident - TOK_IDENT;
	for (i = 0; i < n; i++) {
		free (table_ident[i]);
	}
	free (table_ident);

	/* free sym_pools */
	dynarray_reset (&sym_pools, &nb_sym_pools);
	/* string buffer */
	cstr_free (&tokcstr);
	/* reset symbol stack */
	sym_free_first = NULL;
	/* cleanup from error/setjmp */
	macro_ptr = NULL;
}
Beispiel #17
0
void node_periodical_timer(int fd, short event, void *ctx) {
    UNUSED(fd);
    UNUSED(event);
    btc_node *node = (btc_node *)ctx;
    uint64_t now = time(NULL);

    /* pass data to the callback and give it a chance to cancle the call */
    if (node->nodegroup->periodic_timer_cb)
        if (!node->nodegroup->periodic_timer_cb(node, &now))
            return;

    if (node->time_started_con+BTC_CONNECT_TIMEOUT_S < now && ((node->state & NODE_CONNECTING) == NODE_CONNECTING))
    {
        node->state = 0;
        node->time_started_con = 0;
        node->state |= NODE_ERRORED;
        node->state |= NODE_TIMEOUT;
        btc_node_connection_state_changed(node);
    }

    if ( ((node->state & NODE_CONNECTED) == NODE_CONNECTED) && node->lastping + BTC_PING_INTERVAL_S < now)
    {
        //time for a ping
        uint64_t nonce;
        btc_cheap_random_bytes((uint8_t *)&nonce, sizeof(nonce));
        cstring *pingmsg = btc_p2p_message_new(node->nodegroup->chainparams->netmagic, BTC_MSG_PING, &nonce, sizeof(nonce));
        btc_node_send(node, pingmsg);
        cstr_free(pingmsg, true);
        node->lastping = now;
    }
}
Beispiel #18
0
void cstr_split_l(cstring*c,char*data,int size,vector *v)
{
    int n,len=0;
    cstring *st,*tx;

    tx = cstr_new();
    cstr_set_c(tx,c);

    while(1){
        n = cstr_find_l(tx,0,data,size);
/*
         if (n == 0){
            len = n+size;
            cstr_set_l(tx,tx->data+len,tx->size-len);
            continue;
        }else if (n > -1){
*/
        if (n > -1){
            st = cstr_new();
            cstr_add_l(st,tx->data,n);
            vector_add(v,st);
            len = n+size;
            cstr_set_l(tx,tx->data+len,tx->size-len);
        }else{
            st = cstr_new();
            cstr_add_l(st,tx->data,tx->size);
            vector_add(v,st);
            break;
        }
    }
    cstr_free(tx);
}
Beispiel #19
0
static void test_decode(const char *hexstr, const char *base58_str)
{
	size_t hs_len = strlen(hexstr) / 2;
	unsigned char *raw = calloc(1, hs_len);
	size_t out_len;

	bool rc = decode_hex(raw, hs_len, hexstr, &out_len);
	if (!rc) {
		fprintf(stderr, "raw %p, sizeof(raw) %lu, hexstr %p %s\n",
			raw, hs_len, hexstr, hexstr);
		assert(rc);
	}

	cstring *s = base58_decode(base58_str);
	if (memcmp(s->str, raw, out_len < s->len ? out_len : s->len)) {
		dumphex("decode have", s->str, s->len);
		dumphex("decode want", raw, out_len);
		assert(memcmp(s->str, raw, out_len) == 0);
	}
	if (s->len != out_len) {
		fprintf(stderr, "decode len: have %u, want %u\n",
			(unsigned int) s->len,
			(unsigned int) out_len);
		dumphex("decode have", s->str, s->len);
		dumphex("decode want", raw, out_len);
		assert(s->len == out_len);
	}

	free(raw);
	cstr_free(s, true);
}
Beispiel #20
0
void bp_tx_sighash(bu256_t *hash, const cstring *scriptCode,
		   const struct bp_tx *txTo, unsigned int nIn,
		   int nHashType)
{
	if (nIn >= txTo->vin->len) {
		//  nIn out of range
		bu256_set_u64(hash, 1);
		return;
	}

	// Check for invalid use of SIGHASH_SINGLE
	if ((nHashType & 0x1f) == SIGHASH_SINGLE) {
		if (nIn >= txTo->vout->len) {
			//  nOut out of range
			bu256_set_u64(hash, 1);
			return;
		}
	}

	cstring *s = cstr_new_sz(512);

	// Serialize only the necessary parts of the transaction being signed
	bp_tx_sigserializer(s, scriptCode, txTo, nIn, nHashType);

	ser_s32(s, nHashType);
	bu_Hash((unsigned char *) hash, s->str, s->len);

	cstr_free(s, true);
}
Beispiel #21
0
cstring *base58_decode_check(unsigned char *addrtype, const char *s_in)
{
	/* decode base58 string */
	cstring *s = base58_decode(s_in);
	if (!s)
		return NULL;
	if (s->len < 4)
		goto err_out;

	/* validate with trailing hash, then remove hash */
	unsigned char md32[4];
	bu_Hash4(md32, s->str, s->len - 4);

	if (memcmp(md32, &s->str[s->len - 4], 4))
		goto err_out;

	cstr_resize(s, s->len - 4);

	/* if addrtype requested, remove from front of data string */
	if (addrtype) {
		*addrtype = (unsigned char) s->str[0];
		cstr_erase(s, 0, 1);
	}

	return s;

err_out:
	cstr_free(s, true);
	return NULL;
}
Beispiel #22
0
cstring * logdb_record_find_desc(logdb_record* head, struct buffer *key)
{
    cstring *found_value = NULL;
    cstring *keycstr;
    logdb_record *rec;

    if (key == NULL)
        return NULL;

    keycstr = cstr_new_buf(key->p, key->len);
    rec = head;
    while (rec)
    {
        if (cstr_equal(rec->key, keycstr))
        {
            /* found */
            found_value = rec->value;

            /* found, but deleted */
            if (rec->mode == RECORD_TYPE_ERASE)
                found_value = NULL;

            break;
        }
        rec = rec->prev;
    }
    cstr_free(keycstr, true);
    return found_value;
}
Beispiel #23
0
static void print_from_base58(const char *str)
{
	cstring *out_str = base58_decode(str);
	/* *out= out_str->str; */
	/* *out_len = out_str->len; */
	print_n(out_str->str, out_str->len);
	cstr_free(out_str, true);
}
Beispiel #24
0
void cstr_vector_set(vector *v, int index, void *e)
{
	cstring *s;
    if (index >= v->count) return;
    s = vector_get(v, index);
    cstr_free(s);
    vector_set(v,index,e);
}
Beispiel #25
0
/********************* cleanup routines *********************/
void tl_list_token_free (struct tl_token *L) {
  struct tl_token *E, *T;
  for (E = L; E != NULL; E = T) {
    T = E->next;
    cstr_free (&E->text);
    zfree (E, sizeof (*E));
  }
}
Beispiel #26
0
/*  connection begins */
static void nc_conn_evt_connected(int fd, short events, void *priv)
{
	struct nc_conn *conn = priv;

	if ((events & EV_WRITE) == 0) {
		fprintf(plog, "net: %s connection timeout\n", conn->addr_str);
		goto err_out;
	}

	int err = 0;
	socklen_t len = sizeof(err);

	/* check success of connect(2) */
	if ((getsockopt(conn->fd, SOL_SOCKET, SO_ERROR, &err, &len) < 0) ||
	    (err != 0)) {
		fprintf(plog, "net: connect %s failed: %s\n",
			conn->addr_str, strerror(err));
		goto err_out;
	}

	if (debugging)
		fprintf(plog, "net: connected to %s\n", conn->addr_str);

	conn->connected = true;

	/* clear event used for watching connect(2) */
	event_free(conn->ev);
	conn->ev = NULL;

	/* build and send "version" message */

	cstring *msg_data = nc_version_build(conn);
	bool rc = nc_conn_send(conn, "version", msg_data->str, msg_data->len);
	cstr_free(msg_data, true);

	if (!rc) {
		fprintf(plog, "net: %s !conn_send\n", conn->addr_str);
		goto err_out;
	}

	/* switch to read-header state */
	conn->msg_p = conn->hdrbuf;
	/* from message.c #define P2P_HDR_SZ	(4 + 12 + 4 + 4)*/
	conn->expected = P2P_HDR_SZ;
	conn->reading_hdr = true;

	if (!nc_conn_read_enable(conn)) {
		fprintf(plog, "net: %s read not enabled\n", conn->addr_str);
		goto err_out;
	}

	return;

err_out:
	nc_conn_kill(conn);
}
Beispiel #27
0
void uconf_file_close(struct uconf_file *file)
{
	if (uconf_file_opened(file)) {
		UCONF_NO_EINTR(close(file->fd));
		file->fd = -1;
		cstr_free(file->name);
		file->name = NULL;
		file->flags = 0;
	}
}
Beispiel #28
0
void cstr_vector_data_free(vector*v)
{
    int i;
	cstring *s;
    for (i = 0; i < vector_count(v); i++){
        s = vector_get(v, i);
        cstr_free(s);
    }
    vector_data_free(v);
}
Beispiel #29
0
static cstring *blkdb_ser_rec(struct blkdb *db, const struct blkinfo *bi)
{
	cstring *data = ser_blkinfo(bi);

	cstring *rs = message_str(db->netmagic, "rec", data->str, data->len);

	cstr_free(data, true);

	return rs;
}
Beispiel #30
0
static void account_free(struct wallet_account *acct)
{
	if (!acct)
		return;

	cstr_free(acct->name, true);

	memset(acct, 0, sizeof(*acct));
	free(acct);
}