[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r11408: fixed return code of storing v2 descs to hs dirs to avoid fa (in tor/branches/114-dist-storage/src: common or)



Author: kloesing
Date: 2007-09-10 04:23:18 -0400 (Mon, 10 Sep 2007)
New Revision: 11408

Modified:
   tor/branches/114-dist-storage/src/common/crypto.c
   tor/branches/114-dist-storage/src/or/directory.c
   tor/branches/114-dist-storage/src/or/or.h
   tor/branches/114-dist-storage/src/or/rendcommon.c
   tor/branches/114-dist-storage/src/or/routerlist.c
   tor/branches/114-dist-storage/src/or/routerparse.c
   tor/branches/114-dist-storage/src/or/test.c
Log:
fixed return code of storing v2 descs to hs dirs to avoid false negatives; store only correct substring when storing replicas of v2 descs; return correct validity in seconds when encoding v2 descs for future time periods; update hs dir routing table after every network status change

Modified: tor/branches/114-dist-storage/src/common/crypto.c
===================================================================
--- tor/branches/114-dist-storage/src/common/crypto.c	2007-09-08 20:25:57 UTC (rev 11407)
+++ tor/branches/114-dist-storage/src/common/crypto.c	2007-09-10 08:23:18 UTC (rev 11408)
@@ -1232,8 +1232,8 @@
  * symmetric key <b>key</b> of 16 bytes length to <b>to</b> of length
  * <b>tolen</b> which may be <b>fromlen</b> minus 16 for the initialization
  * vector (the size of padding cannot be determined in advance). On success,
- * return the number of bytes written, on failure (including providing the
- * wrong key), return -1.
+ * return the number of bytes written, on failure (NOT including providing
+ * the wrong key, which occasionally returns the correct length!), return -1.
  */
 int
 crypto_cipher_decrypt_cbc(const char *key, char *to, size_t tolen,

Modified: tor/branches/114-dist-storage/src/or/directory.c
===================================================================
--- tor/branches/114-dist-storage/src/or/directory.c	2007-09-08 20:25:57 UTC (rev 11407)
+++ tor/branches/114-dist-storage/src/or/directory.c	2007-09-10 08:23:18 UTC (rev 11408)
@@ -2256,7 +2256,7 @@
   if (options->HidServDirectoryV2 &&
       !strcmpstart(url,"/tor/rendezvous2/publish")) {
     log_info(LD_REND, "Handling v2 rendezvous descriptor post");
-    if (rend_cache_store_v2_dir(body) <= 0) {
+    if (rend_cache_store_v2_dir(body) < 0) {
       log_warn(LD_REND, "Rejected rend descriptor (length %d) from %s.",
              (int)body_len, conn->_base.address);
       write_http_status_line(conn, 400, "Invalid service descriptor rejected");
@@ -2722,10 +2722,9 @@
                                           ROUTER_PURPOSE_GENERAL, 0,
                                           request, NULL, 0);
   log_info(LD_REND, "Sending replication request for v2 descriptors in "
-                    "interval '%s' to '%s' from hidden service "
+                    "interval '%s' from hidden service "
                     "directory '%s' on port %d.",
-           from_id,
-           to_id,
+           request,
            hs_dir->nickname,
            hs_dir->dir_port);
 }
@@ -2781,7 +2780,7 @@
     base32_encode(to_id_base32, REND_DESC_ID_V2_LEN + 1, predecessor0,
                   DIGEST_LEN);
     log_info(LD_REND, "Requesting descriptors in interval %s to %s as "
-                       "replicas from predecessor.",
+                      "replicas from predecessor.",
               from_id_base32,
               to_id_base32);
     hs_dir_fetch_replicas(pred_status, from_id_base32, to_id_base32);
@@ -2789,6 +2788,10 @@
   /* Get descriptors for which I am primarily responsible from
    * NUMBER_OF_CONSECUTIVE_REPLICAS - 1 successors. */
   direct_predecessor = previous_hs_dir(me);
+  base32_encode(from_id_base32, REND_DESC_ID_V2_LEN + 1,
+                direct_predecessor, DIGEST_LEN);
+if (!predecessor1) log_warn(LD_REND, "direct_predecessor is NULL!");
+  base32_encode(to_id_base32, REND_DESC_ID_V2_LEN + 1, me, DIGEST_LEN);
   successor = next_hs_dir(me);
   for (i = 0; i < NUMBER_OF_CONSECUTIVE_REPLICAS - 1;
        i++, successor = next_hs_dir(successor)) {
@@ -2804,20 +2807,16 @@
                         "Skipping router for replication.");
       return;
     }
-    base32_encode(from_id_base32, REND_DESC_ID_V2_LEN + 1,
-                  direct_predecessor, DIGEST_LEN);
-    base32_encode(to_id_base32, REND_DESC_ID_V2_LEN + 1,
-                  me, DIGEST_LEN);
-    log_debug(LD_REND, "Requesting descriptors in interval %s to %s for "
-                       "which I am primarily responsible from successor.",
+    log_info(LD_REND, "Requesting descriptors in interval %s to %s for "
+                      "which I am primarily responsible from successor.",
              from_id_base32,
              to_id_base32);
     hs_dir_fetch_replicas(succ_status, from_id_base32, to_id_base32);
   }
   /* Clean up descriptors for which I am not reponsible (neither primarily
    * nor for replication). */
-  log_debug(LD_REND, "Cleaning up all descriptors that are not (any more) "
-                     "in the interval for which i am responsible.");
+  log_info(LD_REND, "Cleaning up all descriptors that are not (any more) "
+                     "in the interval for which I am responsible.");
   rend_cache_clean_up();
 }
 

Modified: tor/branches/114-dist-storage/src/or/or.h
===================================================================
--- tor/branches/114-dist-storage/src/or/or.h	2007-09-08 20:25:57 UTC (rev 11407)
+++ tor/branches/114-dist-storage/src/or/or.h	2007-09-10 08:23:18 UTC (rev 11408)
@@ -3649,6 +3649,7 @@
                                  char *desc_id,
                                  char **intro_points_encrypted,
                                  size_t *intro_points_encrypted_size,
+                                 size_t *encoded_size,
                                  const char **next, const char *desc);
 int rend_decrypt_introduction_points(rend_service_descriptor_t *parsed,
                                  const char *secret_cookie,

Modified: tor/branches/114-dist-storage/src/or/rendcommon.c
===================================================================
--- tor/branches/114-dist-storage/src/or/rendcommon.c	2007-09-08 20:25:57 UTC (rev 11407)
+++ tor/branches/114-dist-storage/src/or/rendcommon.c	2007-09-10 08:23:18 UTC (rev 11408)
@@ -245,10 +245,12 @@
   char test_desc_id[DIGEST_LEN];
   char *test_intro_content;
   size_t test_intro_size;
+  size_t test_encoded_size;
   const char *test_next;
   int res = rend_parse_v2_service_descriptor(&test_parsed, test_desc_id,
                                          &test_intro_content,
                                          &test_intro_size,
+                                         &test_encoded_size,
                                          &test_next, desc_str);
   tor_free(test_parsed);
   tor_free(test_intro_content);
@@ -293,7 +295,8 @@
   /* Calculate current time-period. */
   get_time_period_bytes(time_period, now, period, service_id);
   /* Determine how many seconds the descriptor will be valid. */
-  seconds_valid = get_seconds_valid(now, service_id);
+  seconds_valid = period * TIME_PERIOD_LENGTH +
+                  get_seconds_valid(now, service_id);
   /* Encode and encrypt introduction points. */
   rend_encode_v2_intro_points(&ipos_base64, desc, secret_cookie);
   /* Encode NUMBER_OF_NON_CONSECUTIVE_REPLICAS descriptors. */
@@ -597,6 +600,11 @@
     digestmap_iter_get(iter, &key, &val);
     ent = (rend_cache_entry_t*)val;
     if (ent->parsed->timestamp < cutoff) {
+      char key_base32[REND_DESC_ID_V2_LEN+1];
+      base32_encode(key_base32, REND_DESC_ID_V2_LEN+1, key, DIGEST_LEN);
+      log_info(LD_REND, "Removing descriptor with ID '%s' from cache, "
+                        "because it is too old!",
+               key_base32);
       iter = digestmap_iter_next_rmv(rend_cache_v2_dir, iter);
       _rend_cache_entry_free(ent);
     } else {
@@ -643,6 +651,10 @@
     digestmap_iter_get(iter, &key, &val);
     ent = (rend_cache_entry_t*)val;
     if (!responsible_for_desc_id(key)) {
+      char key_base32[REND_DESC_ID_V2_LEN+1];
+      base32_encode(key_base32, REND_DESC_ID_V2_LEN+1, key, DIGEST_LEN);
+      log_info(LD_REND, "Removing descriptor with ID '%s' from cache, "
+                        "because we are not reponsible for it!", key_base32);
       iter = digestmap_iter_next_rmv(rend_cache_v2_dir, iter);
       _rend_cache_entry_free(ent);
     } else {
@@ -717,24 +729,8 @@
 {
   rend_cache_entry_t *e;
   char desc_id_digest[20];
-
-  digestmap_iter_t *iter;
-  const char *key;
-  void *val;
-
+  tor_assert(rend_cache_v2_dir);
   base32_decode(desc_id_digest, 20, desc_id, 32);
-
-  //rend_cache_entry_t *ent;
-  for (iter = digestmap_iter_init(rend_cache_v2_dir);
-       !digestmap_iter_done(iter); ) {
-    char stored[32+1];
-    digestmap_iter_get(iter, &key, &val);
-        base32_encode(stored, 32+1, key, 20);
-        log_info(LD_REND, "stored: %s", stored);
-      iter = digestmap_iter_next(rend_cache_v2_dir, iter);
-  }
-
-  tor_assert(rend_cache_v2_dir);
   /* Determine if we are responsible. */
   if (responsible_for_desc_id(desc_id_digest) < 0) {
     log_info(LD_REND, "Could not answer fetch request for v2 descriptor; "
@@ -818,6 +814,9 @@
     written += strlen(*descs + written);
     *(*descs + written++) = '\n';
   });
+  log_info(LD_REND, "Received fetch request for replicas in interval '%s'. "
+                    "Answering with %d descriptors.",
+           query, results->num_used);
   smartlist_free(results);
   return 0;
 }
@@ -921,6 +920,7 @@
   char desc_id[DIGEST_LEN];
   char *intro_content;
   size_t intro_size;
+  size_t encoded_size;
   char desc_id_base32[REND_DESC_ID_V2_LEN+1];
   int number_stored = 0;
   const char *current_desc = desc;
@@ -936,8 +936,8 @@
     return -1;
   }
   while (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content,
-                                          &intro_size, &next_desc,
-                                          current_desc) >= 0) {
+                                          &intro_size, &encoded_size,
+                                          &next_desc, current_desc) >= 0) {
     tor_assert(parsed);
     /* We don't care about the introduction points. */
     tor_free(intro_content);
@@ -994,15 +994,19 @@
     }
     e->received = time(NULL);
     e->parsed = parsed;
-    e->desc = tor_malloc(strlen(desc) + 1);
-    strcpy(e->desc, desc);
-    e->len = strlen(desc);
+    e->desc = tor_malloc(encoded_size + 1);
+    strlcpy(e->desc, desc, encoded_size + 1);
+    e->len = encoded_size;
     log_info(LD_REND, "Successfully stored service descriptor with desc ID "
-                       "'%s' and len %d.", desc_id_base32, strlen(desc));
+                      "'%s' and len %d.", desc_id_base32, encoded_size);
     number_stored++;
  skip:
     /* advance to next descriptor, if available. */
     current_desc = next_desc;
+    /* check if there is a next descriptor. */
+    if (strncmp(current_desc, "rendezvous-service-descriptor ",
+                strlen("rendezvous-service-descriptor ")))
+      break;
   }
   log_info(LD_REND, "Parsed and added %d descriptor%s.",
            number_stored, number_stored != 1 ? "s" : "");
@@ -1026,7 +1030,7 @@
   char desc_id[DIGEST_LEN];
   char *intro_content = NULL;
   size_t intro_size;
-  //const char **first_desc = (const char **)(&desc);
+  size_t encoded_size;
   const char *next_desc;
   time_t now = time(NULL);
   char key[REND_SERVICE_ID_LEN+2];
@@ -1038,8 +1042,8 @@
   tor_assert(strlen(secret_cookie) == REND_SECRET_COOKIE_LEN);
   /* Parse the descriptor. */
   if (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content,
-                                       &intro_size, &next_desc,
-                                       desc) < 0) {
+                                       &intro_size, &encoded_size,
+                                       &next_desc, desc) < 0) {
     log_warn(LD_REND, "Could not parse descriptor.");
     return -1;
   }
@@ -1101,10 +1105,11 @@
   }
   e->received = time(NULL);
   e->parsed = parsed;
-  e->desc = tor_malloc_zero(strlen(desc) + 1);
-  strncpy(e->desc, desc, strlen(desc));
+  e->desc = tor_malloc_zero(encoded_size + 1);
+  strlcpy(e->desc, desc, encoded_size + 1);
+  e->len = encoded_size;
   log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.",
-            service_id, strlen(desc));
+            service_id, encoded_size);
   return 1;
 }
 

Modified: tor/branches/114-dist-storage/src/or/routerlist.c
===================================================================
--- tor/branches/114-dist-storage/src/or/routerlist.c	2007-09-08 20:25:57 UTC (rev 11407)
+++ tor/branches/114-dist-storage/src/or/routerlist.c	2007-09-10 08:23:18 UTC (rev 11408)
@@ -3991,6 +3991,8 @@
 
   routers_update_status_from_networkstatus(routerlist->routers, 0);
 
+  update_hs_dir_routing_table();
+
   me = router_get_my_routerinfo();
   if (me && !have_warned_about_invalid_status &&
       have_tried_downloading_all_statuses(N_NS_ATTEMPTS_TO_SET_ROUTERS)) {
@@ -5703,14 +5705,30 @@
 {
   const char *me = router_get_my_routerinfo()->cache_info.identity_digest;
   if (!get_options()->HidServDirectoryV2) {
+    log_info(LD_REND, "We are not acting as hidden service directory, "
+                      "because we have not been configured as such.");
     return 0;
   }
+  if (!routerlist->hs_dirs) {
+    /* routing table is NULL */
+    log_info(LD_REND, "We are not acting as hidden service directory, "
+                      "because our own routing table is NULL.");
+  }
   if (!smartlist_digest_isin(routerlist->hs_dirs, me)) {
     /* not acting as HS Dir */
+    char me_base32[REND_DESC_ID_V2_LEN + 1];
+    base32_encode(me_base32, REND_DESC_ID_V2_LEN + 1, me, DIGEST_LEN);
+    log_info(LD_REND, "We are not acting as hidden service directory, "
+                      "because we are not listed as such in our own "
+                      "routing table. me=%s, num entries in RT=%d",
+                      me_base32, routerlist->hs_dirs->num_used);
     return 0;
   }
   if (routerlist->hs_dirs->num_used <= NUMBER_OF_CONSECUTIVE_REPLICAS) {
     /* too few HS Dirs -- that won't work */
+    log_info(LD_REND, "We are not acting as hidden service directory, "
+                      "because there are too few hidden service "
+                      "directories in the routing table.");
     return 0;
   }
   return 1;

Modified: tor/branches/114-dist-storage/src/or/routerparse.c
===================================================================
--- tor/branches/114-dist-storage/src/or/routerparse.c	2007-09-08 20:25:57 UTC (rev 11407)
+++ tor/branches/114-dist-storage/src/or/routerparse.c	2007-09-10 08:23:18 UTC (rev 11408)
@@ -2986,7 +2986,8 @@
  * binary descriptor ID of length DIGEST_LEN to <b>desc_id</b>, the
  * encrypted introduction points to the newly allocated
  * <b>intro_points_encrypted</b>, their encrypted size to
- * <b>intro_points_encrypted_size</b>, and a pointer to the possibly next
+ * <b>intro_points_encrypted_size</b>, the size of the encoded descriptor
+ * to <b>encoded_size</b>, and a pointer to the possibly next
  * descriptor to <b>next</b>; return 0 for success (including validation)
  * and -1 for failure.
  */
@@ -2995,6 +2996,7 @@
                                  char *desc_id,
                                  char **intro_points_encrypted,
                                  size_t *intro_points_encrypted_size,
+                                 size_t *encoded_size,
                                  const char **next, const char *desc)
 {
   rend_service_descriptor_t *result =
@@ -3034,6 +3036,8 @@
   }
   /* Set next to next descriptor, if available. */
   *next = eos;
+  /* Set length of encoded descriptor. */
+  *encoded_size = eos - desc;
   /* Check min allowed length of token list. */
   if (smartlist_len(tokens) < 8) {
     log_warn(LD_REND, "Impossibly short descriptor.");

Modified: tor/branches/114-dist-storage/src/or/test.c
===================================================================
--- tor/branches/114-dist-storage/src/or/test.c	2007-09-08 20:25:57 UTC (rev 11407)
+++ tor/branches/114-dist-storage/src/or/test.c	2007-09-10 08:23:18 UTC (rev 11408)
@@ -3109,7 +3109,7 @@
   /* Decrypt with the wrong key. */
   decrypted_size = crypto_cipher_decrypt_cbc(key2, decrypted2, 4095 + 1,
                                              encrypted1, encrypted_size);
-  test_eq(decrypted_size, -1);
+  test_memneq(plain, decrypted2, encrypted_size);
   /* Alter the initialization vector. */
   encrypted1[0] += 42;
   decrypted_size = crypto_cipher_decrypt_cbc(key1, decrypted1, 4095 + 1,
@@ -3195,6 +3195,7 @@
   char secret_cookie_base32[24 + 1];
   char *intro_points_encrypted;
   size_t intro_points_size;
+  size_t encoded_size;
   int i;
   pk1 = pk_generate(0);
   crypto_rand(secret_cookie_bin, 15);
@@ -3235,6 +3236,7 @@
   test_assert(rend_parse_v2_service_descriptor(&parsed, parsed_desc_id,
                                                &intro_points_encrypted,
                                                &intro_points_size,
+                                               &encoded_size,
                                                &next_desc,
                                                desc_strs->list[0]) == 0);
   test_assert(parsed);