summaryrefslogtreecommitdiff
path: root/src/or/rendcommon.c
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2007-12-15 20:28:09 +0000
committerRoger Dingledine <arma@torproject.org>2007-12-15 20:28:09 +0000
commit31324f3e7fc3edcf47f4dac83e687fc50242f2b2 (patch)
tree8f7432d6b78c60ba704500638e276a4e1411ec40 /src/or/rendcommon.c
parent5864b43e02da7fd0c4684579efa51b5bad051c88 (diff)
downloadtor-31324f3e7fc3edcf47f4dac83e687fc50242f2b2.tar.gz
tor-31324f3e7fc3edcf47f4dac83e687fc50242f2b2.zip
apply karsten's "patch 12"
svn:r12825
Diffstat (limited to 'src/or/rendcommon.c')
-rw-r--r--src/or/rendcommon.c65
1 files changed, 35 insertions, 30 deletions
diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c
index 651c4926ab..dd2a63bca2 100644
--- a/src/or/rendcommon.c
+++ b/src/or/rendcommon.c
@@ -296,7 +296,7 @@ rend_encode_v2_intro_points(char **ipos_base64,
/** Attempt to parse the given <b>desc_str</b> and return true if this
* succeeds, false otherwise. */
static int
-rend_desc_v2_is_parsable(const char *desc_str)
+rend_desc_v2_is_parsable(rend_encoded_v2_service_descriptor_t *desc)
{
rend_service_descriptor_t *test_parsed = NULL;
char test_desc_id[DIGEST_LEN];
@@ -308,25 +308,31 @@ rend_desc_v2_is_parsable(const char *desc_str)
&test_intro_content,
&test_intro_size,
&test_encoded_size,
- &test_next, desc_str);
+ &test_next, desc->desc_str);
if (test_parsed)
rend_service_descriptor_free(test_parsed);
tor_free(test_intro_content);
return (res >= 0);
}
-/** Encode a set of new service descriptors for <b>desc</b> at time
- * <b>now</b> using <b>descriptor_cookie</b> (may be <b>NULL</b> if
+/** Free the storage held by an encoded v2 service descriptor. */
+void
+rend_encoded_v2_service_descriptor_free(
+ rend_encoded_v2_service_descriptor_t *desc)
+{
+ if (desc->desc_str) tor_free(desc->desc_str);
+ tor_free(desc);
+}
+
+/** Encode a set of rend_encoded_v2_service_descriptor_t's for <b>desc</b>
+ * at time <b>now</b> using <b>descriptor_cookie</b> (may be <b>NULL</b> if
* introduction points shall not be encrypted) and <b>period</b> (e.g. 0
- * for the current period, 1 for the next period, etc.), write the
- * ASCII-encoded outputs to newly allocated strings and add them to the
- * existing <b>desc_strs</b>, and write the descriptor IDs to newly
- * allocated strings and add them to the existing <b>desc_ids</b>; return
- * the number of seconds that the descriptors will be found under those
- * <b>desc_ids</b> by clients, or -1 if the encoding was not successful. */
+ * for the current period, 1 for the next period, etc.) and add them to
+ * the existing list <b>descs_out</b>; return the number of seconds that
+ * the descriptors will be found by clients, or -1 if the encoding was not
+ * successful. */
int
-rend_encode_v2_descriptors(smartlist_t *desc_strs_out,
- smartlist_t *desc_ids_out,
+rend_encode_v2_descriptors(smartlist_t *descs_out,
rend_service_descriptor_t *desc, time_t now,
const char *descriptor_cookie, uint8_t period)
{
@@ -356,7 +362,6 @@ rend_encode_v2_descriptors(smartlist_t *desc_strs_out,
for (k = 0; k < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; k++) {
char secret_id_part[DIGEST_LEN];
char secret_id_part_base32[REND_SECRET_ID_PART_LEN_BASE32 + 1];
- char *desc_id;
char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
char *permanent_key = NULL;
size_t permanent_key_len;
@@ -369,21 +374,22 @@ rend_encode_v2_descriptors(smartlist_t *desc_strs_out,
int result = 0;
size_t written = 0;
char desc_digest[DIGEST_LEN];
+ rend_encoded_v2_service_descriptor_t *enc =
+ tor_malloc_zero(sizeof(rend_encoded_v2_service_descriptor_t));
/* Calculate secret-id-part = h(time-period + cookie + replica). */
get_secret_id_part_bytes(secret_id_part, time_period, descriptor_cookie,
k);
base32_encode(secret_id_part_base32, sizeof(secret_id_part_base32),
secret_id_part, DIGEST_LEN);
/* Calculate descriptor ID. */
- desc_id = tor_malloc_zero(DIGEST_LEN);
- rend_get_descriptor_id_bytes(desc_id, service_id, secret_id_part);
- smartlist_add(desc_ids_out, desc_id);
+ rend_get_descriptor_id_bytes(enc->desc_id, service_id, secret_id_part);
base32_encode(desc_id_base32, sizeof(desc_id_base32),
- desc_id, DIGEST_LEN);
+ enc->desc_id, DIGEST_LEN);
/* PEM-encode the public key */
if (crypto_pk_write_public_key_to_string(desc->pk, &permanent_key,
&permanent_key_len) < 0) {
log_warn(LD_BUG, "Could not write public key to string.");
+ rend_encoded_v2_service_descriptor_free(enc);
goto err;
}
/* Encode timestamp. */
@@ -403,7 +409,7 @@ rend_encode_v2_descriptors(smartlist_t *desc_strs_out,
protocol_versions_string[0]= '\0';
/* Assemble complete descriptor. */
desc_len = 2000 + desc->n_intro_points * 1000; /* far too long, but ok. */
- desc_str = tor_malloc_zero(desc_len);
+ enc->desc_str = desc_str = tor_malloc_zero(desc_len);
result = tor_snprintf(desc_str, desc_len,
"rendezvous-service-descriptor %s\n"
"version 2\n"
@@ -419,7 +425,7 @@ rend_encode_v2_descriptors(smartlist_t *desc_strs_out,
tor_free(permanent_key);
if (result < 0) {
log_warn(LD_BUG, "Descriptor ran out of room.");
- tor_free(desc_str);
+ rend_encoded_v2_service_descriptor_free(enc);
goto err;
}
written = result;
@@ -432,7 +438,7 @@ rend_encode_v2_descriptors(smartlist_t *desc_strs_out,
ipos_base64);
if (result < 0) {
log_warn(LD_BUG, "could not write introduction points.");
- tor_free(desc_str);
+ rend_encoded_v2_service_descriptor_free(enc);
goto err;
}
written += result;
@@ -442,31 +448,31 @@ rend_encode_v2_descriptors(smartlist_t *desc_strs_out,
written += strlen(desc_str + written);
if (crypto_digest(desc_digest, desc_str, written) < 0) {
log_warn(LD_BUG, "could not create digest.");
- tor_free(desc_str);
+ rend_encoded_v2_service_descriptor_free(enc);
goto err;
}
if (router_append_dirobj_signature(desc_str + written,
desc_len - written,
desc_digest, desc->pk) < 0) {
log_warn(LD_BUG, "Couldn't sign desc.");
- tor_free(desc_str);
+ rend_encoded_v2_service_descriptor_free(enc);
goto err;
}
written += strlen(desc_str+written);
if (written+2 > desc_len) {
log_warn(LD_BUG, "Could not finish desc.");
- tor_free(desc_str);
+ rend_encoded_v2_service_descriptor_free(enc);
goto err;
}
desc_str[written++] = '\n';
desc_str[written++] = 0;
/* Check if we can parse our own descriptor. */
- if (!rend_desc_v2_is_parsable(desc_str)) {
+ if (!rend_desc_v2_is_parsable(enc)) {
log_warn(LD_BUG, "Could not parse my own descriptor: %s", desc_str);
- tor_free(desc_str);
+ rend_encoded_v2_service_descriptor_free(enc);
goto err;
}
- smartlist_add(desc_strs_out, desc_str);
+ smartlist_add(descs_out, enc);
}
log_info(LD_REND, "Successfully encoded a v2 descriptor and "
@@ -474,10 +480,9 @@ rend_encode_v2_descriptors(smartlist_t *desc_strs_out,
goto done;
err:
- SMARTLIST_FOREACH(desc_ids_out, void *, id, tor_free(id));
- smartlist_clear(desc_ids_out);
- SMARTLIST_FOREACH(desc_strs_out, void *, str, tor_free(str));
- smartlist_clear(desc_strs_out);
+ SMARTLIST_FOREACH(descs_out, rend_encoded_v2_service_descriptor_t *, d,
+ rend_encoded_v2_service_descriptor_free(d););
+ smartlist_clear(descs_out);
seconds_valid = -1;
done: