mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-25 07:07:52 +01:00
hs: Implement constructor for hs_desc_intro_point_t
Add a new and free function for hs_desc_intro_point_t so the service can use them to setup those objects properly. Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
parent
c9927ce4d5
commit
44e3255c4d
4 changed files with 40 additions and 32 deletions
|
@ -146,29 +146,6 @@ static token_rule_t hs_desc_intro_point_v3_token_table[] = {
|
|||
END_OF_TABLE
|
||||
};
|
||||
|
||||
/* Free a descriptor intro point object. */
|
||||
STATIC void
|
||||
desc_intro_point_free(hs_desc_intro_point_t *ip)
|
||||
{
|
||||
if (!ip) {
|
||||
return;
|
||||
}
|
||||
if (ip->link_specifiers) {
|
||||
SMARTLIST_FOREACH(ip->link_specifiers, hs_desc_link_specifier_t *,
|
||||
ls, tor_free(ls));
|
||||
smartlist_free(ip->link_specifiers);
|
||||
}
|
||||
tor_cert_free(ip->auth_key_cert);
|
||||
tor_cert_free(ip->enc_key_cert);
|
||||
if (ip->legacy.key) {
|
||||
crypto_pk_free(ip->legacy.key);
|
||||
}
|
||||
if (ip->legacy.cert.encoded) {
|
||||
tor_free(ip->legacy.cert.encoded);
|
||||
}
|
||||
tor_free(ip);
|
||||
}
|
||||
|
||||
/* Free the content of the plaintext section of a descriptor. */
|
||||
static void
|
||||
desc_plaintext_data_free_contents(hs_desc_plaintext_data_t *desc)
|
||||
|
@ -199,7 +176,7 @@ desc_encrypted_data_free_contents(hs_desc_encrypted_data_t *desc)
|
|||
}
|
||||
if (desc->intro_points) {
|
||||
SMARTLIST_FOREACH(desc->intro_points, hs_desc_intro_point_t *, ip,
|
||||
desc_intro_point_free(ip));
|
||||
hs_desc_intro_point_free(ip));
|
||||
smartlist_free(desc->intro_points);
|
||||
}
|
||||
memwipe(desc, 0, sizeof(*desc));
|
||||
|
@ -1683,11 +1660,13 @@ decode_introduction_point(const hs_descriptor_t *desc, const char *start)
|
|||
|
||||
/* Ok we seem to have a well formed section containing enough tokens to
|
||||
* parse. Allocate our IP object and try to populate it. */
|
||||
ip = tor_malloc_zero(sizeof(hs_desc_intro_point_t));
|
||||
ip = hs_desc_intro_point_new();
|
||||
|
||||
/* "introduction-point" SP link-specifiers NL */
|
||||
tok = find_by_keyword(tokens, R3_INTRODUCTION_POINT);
|
||||
tor_assert(tok->n_args == 1);
|
||||
/* Our constructor creates this list by default so free it. */
|
||||
smartlist_free(ip->link_specifiers);
|
||||
ip->link_specifiers = decode_link_specifiers(tok->args[0]);
|
||||
if (!ip->link_specifiers) {
|
||||
log_warn(LD_REND, "Introduction point has invalid link specifiers");
|
||||
|
@ -1782,7 +1761,7 @@ decode_introduction_point(const hs_descriptor_t *desc, const char *start)
|
|||
goto done;
|
||||
|
||||
err:
|
||||
desc_intro_point_free(ip);
|
||||
hs_desc_intro_point_free(ip);
|
||||
ip = NULL;
|
||||
|
||||
done:
|
||||
|
@ -2401,3 +2380,31 @@ hs_desc_plaintext_obj_size(const hs_desc_plaintext_data_t *data)
|
|||
data->superencrypted_blob_size);
|
||||
}
|
||||
|
||||
/* Return a newly allocated descriptor intro point. */
|
||||
hs_desc_intro_point_t *
|
||||
hs_desc_intro_point_new(void)
|
||||
{
|
||||
hs_desc_intro_point_t *ip = tor_malloc_zero(sizeof(*ip));
|
||||
ip->link_specifiers = smartlist_new();
|
||||
return ip;
|
||||
}
|
||||
|
||||
/* Free a descriptor intro point object. */
|
||||
void
|
||||
hs_desc_intro_point_free(hs_desc_intro_point_t *ip)
|
||||
{
|
||||
if (ip == NULL) {
|
||||
return;
|
||||
}
|
||||
if (ip->link_specifiers) {
|
||||
SMARTLIST_FOREACH(ip->link_specifiers, hs_desc_link_specifier_t *,
|
||||
ls, tor_free(ls));
|
||||
smartlist_free(ip->link_specifiers);
|
||||
}
|
||||
tor_cert_free(ip->auth_key_cert);
|
||||
tor_cert_free(ip->enc_key_cert);
|
||||
crypto_pk_free(ip->legacy.key);
|
||||
tor_free(ip->legacy.cert.encoded);
|
||||
tor_free(ip);
|
||||
}
|
||||
|
||||
|
|
|
@ -215,6 +215,9 @@ int hs_desc_decode_encrypted(const hs_descriptor_t *desc,
|
|||
|
||||
size_t hs_desc_plaintext_obj_size(const hs_desc_plaintext_data_t *data);
|
||||
|
||||
hs_desc_intro_point_t *hs_desc_intro_point_new(void);
|
||||
void hs_desc_intro_point_free(hs_desc_intro_point_t *ip);
|
||||
|
||||
#ifdef HS_DESCRIPTOR_PRIVATE
|
||||
|
||||
/* Encoding. */
|
||||
|
@ -233,7 +236,6 @@ STATIC int cert_is_valid(tor_cert_t *cert, uint8_t type,
|
|||
STATIC int desc_sig_is_valid(const char *b64_sig,
|
||||
const ed25519_public_key_t *signing_pubkey,
|
||||
const char *encoded_desc, size_t encoded_len);
|
||||
STATIC void desc_intro_point_free(hs_desc_intro_point_t *ip);
|
||||
STATIC size_t decode_superencrypted(const char *message, size_t message_len,
|
||||
uint8_t **encrypted_out);
|
||||
#endif /* HS_DESCRIPTOR_PRIVATE */
|
||||
|
|
|
@ -15,8 +15,7 @@ hs_helper_build_intro_point(const ed25519_keypair_t *signing_kp, time_t now,
|
|||
int ret;
|
||||
ed25519_keypair_t auth_kp;
|
||||
hs_desc_intro_point_t *intro_point = NULL;
|
||||
hs_desc_intro_point_t *ip = tor_malloc_zero(sizeof(*ip));
|
||||
ip->link_specifiers = smartlist_new();
|
||||
hs_desc_intro_point_t *ip = hs_desc_intro_point_new();
|
||||
|
||||
{
|
||||
hs_desc_link_specifier_t *ls = tor_malloc_zero(sizeof(*ls));
|
||||
|
|
|
@ -427,7 +427,7 @@ test_decode_invalid_intro_point(void *arg)
|
|||
const char *junk = "this is not a descriptor";
|
||||
ip = decode_introduction_point(desc, junk);
|
||||
tt_assert(!ip);
|
||||
desc_intro_point_free(ip);
|
||||
hs_desc_intro_point_free(ip);
|
||||
ip = NULL;
|
||||
}
|
||||
|
||||
|
@ -445,7 +445,7 @@ test_decode_invalid_intro_point(void *arg)
|
|||
tt_assert(!ip);
|
||||
tor_free(encoded_ip);
|
||||
smartlist_free(lines);
|
||||
desc_intro_point_free(ip);
|
||||
hs_desc_intro_point_free(ip);
|
||||
ip = NULL;
|
||||
}
|
||||
|
||||
|
@ -545,7 +545,7 @@ test_decode_invalid_intro_point(void *arg)
|
|||
|
||||
done:
|
||||
hs_descriptor_free(desc);
|
||||
desc_intro_point_free(ip);
|
||||
hs_desc_intro_point_free(ip);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Add table
Reference in a new issue