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

[or-cvs] r10589: Unit tests and debugging for generating and parsing consensu (in tor/trunk: . src/or)



Author: nickm
Date: 2007-06-13 15:06:23 -0400 (Wed, 13 Jun 2007)
New Revision: 10589

Modified:
   tor/trunk/
   tor/trunk/src/or/dirserv.c
   tor/trunk/src/or/dirvote.c
   tor/trunk/src/or/or.h
   tor/trunk/src/or/routerparse.c
   tor/trunk/src/or/test.c
   tor/trunk/src/or/test_data.c
Log:
 r13395@catbus:  nickm | 2007-06-13 15:01:23 -0400
 Unit tests and debugging for generating and parsing consensus networkstatus documents.  Still need to test actual contents.



Property changes on: tor/trunk
___________________________________________________________________
 svk:merge ticket from /tor/trunk [r13395] on 8246c3cf-6607-4228-993b-4d95d33730f1

Modified: tor/trunk/src/or/dirserv.c
===================================================================
--- tor/trunk/src/or/dirserv.c	2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/dirserv.c	2007-06-13 19:06:23 UTC (rev 10589)
@@ -1608,7 +1608,6 @@
   struct in_addr in;
   char *cp;
 
-  int f_authority;
   char published[ISO_TIME_LEN+1];
   char ipaddr[INET_NTOA_BUF_LEN];
   char identity64[BASE64_DIGEST_LEN+1];
@@ -1620,8 +1619,6 @@
   in.s_addr = htonl(rs->addr);
   tor_inet_ntoa(&in, ipaddr, sizeof(ipaddr));
 
-  f_authority = router_digest_is_trusted_dir(rs->identity_digest);
-
   r = tor_snprintf(buf, buf_len,
                    "r %s %s %s %s %s %d %d\n",
                    rs->nickname,
@@ -1641,7 +1638,7 @@
   r = tor_snprintf(cp, buf_len - (cp-buf),
                    "s%s%s%s%s%s%s%s%s%s%s\n",
                   /* These must stay in alphabetical order. */
-                   f_authority?" Authority":"",
+                   rs->is_authority?" Authority":"",
                    rs->is_bad_exit?" BadExit":"",
                    rs->is_exit?" Exit":"",
                    rs->is_fast?" Fast":"",
@@ -1690,6 +1687,8 @@
     !tor_version_as_new_as(ri->platform,"0.1.1.16-rc-cvs");
   memset(rs, 0, sizeof(routerstatus_t));
 
+  rs->is_authority = router_digest_is_trusted_dir(rs->identity_digest);
+
   /* Already set by compute_performance_thresholds. */
   rs->is_exit = ri->is_exit;
   rs->is_stable = ri->is_stable =

Modified: tor/trunk/src/or/dirvote.c
===================================================================
--- tor/trunk/src/or/dirvote.c	2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/dirvote.c	2007-06-13 19:06:23 UTC (rev 10589)
@@ -37,11 +37,16 @@
     authority_cert_free(ns->cert);
 
   if (ns->routerstatus_list) {
-    SMARTLIST_FOREACH(ns->routerstatus_list, vote_routerstatus_t *, rs,
-    {
-      tor_free(rs->version);
-      tor_free(rs);
-    });
+    if (ns->is_vote) {
+      SMARTLIST_FOREACH(ns->routerstatus_list, vote_routerstatus_t *, rs,
+      {
+        tor_free(rs->version);
+        tor_free(rs);
+      });
+    } else {
+      SMARTLIST_FOREACH(ns->routerstatus_list, routerstatus_t *, rs,
+                        tor_free(rs));
+    }
 
     smartlist_free(ns->routerstatus_list);
   }
@@ -442,6 +447,8 @@
       named_flag[i] = -1;
     SMARTLIST_FOREACH(votes, networkstatus_vote_t *, v,
     {
+      flag_map[v_sl_idx] = tor_malloc_zero(
+                           sizeof(int)*smartlist_len(v->known_flags));
       SMARTLIST_FOREACH(v->known_flags, const char *, fl,
       {
         int p = smartlist_string_pos(flags, fl);

Modified: tor/trunk/src/or/or.h
===================================================================
--- tor/trunk/src/or/or.h	2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/or.h	2007-06-13 19:06:23 UTC (rev 10589)
@@ -1205,6 +1205,7 @@
   uint32_t addr; /**< IPv4 address for this router. */
   uint16_t or_port; /**< OR port for this router. */
   uint16_t dir_port; /**< Directory port for this router. */
+  unsigned int is_authority:1; /**< True iff this router is an authority. */
   unsigned int is_exit:1; /**< True iff this router is a good exit. */
   unsigned int is_stable:1; /**< True iff this router stays up a long time. */
   unsigned int is_fast:1; /**< True iff this router has good bandwidth. */

Modified: tor/trunk/src/or/routerparse.c
===================================================================
--- tor/trunk/src/or/routerparse.c	2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/routerparse.c	2007-06-13 19:06:23 UTC (rev 10589)
@@ -1534,6 +1534,8 @@
         rs->is_bad_exit = 1;
       else if (!strcmp(tok->args[i], "BadDirectory"))
         rs->is_bad_directory = 1;
+      else if (!strcmp(tok->args[i], "Authority"))
+        rs->is_authority = 1;
     }
   }
   if ((tok = find_first_by_keyword(tokens, K_V))) {

Modified: tor/trunk/src/or/test.c
===================================================================
--- tor/trunk/src/or/test.c	2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/test.c	2007-06-13 19:06:23 UTC (rev 10589)
@@ -2133,41 +2133,53 @@
 extern const char AUTHORITY_CERT_2[];
 extern const char AUTHORITY_IDKEY_2[];
 extern const char AUTHORITY_SIGNKEY_2[];
+extern const char AUTHORITY_CERT_3[];
+extern const char AUTHORITY_IDKEY_3[];
+extern const char AUTHORITY_SIGNKEY_3[];
 
 static void
 test_v3_networkstatus(void)
 {
-  authority_cert_t *cert1, *cert2;//, *cert_tmp;
-  crypto_pk_env_t *id_skey_1, *id_skey_2;
-  crypto_pk_env_t *sign_skey_1, *sign_skey_2;
+  authority_cert_t *cert1, *cert2, *cert3;
+  crypto_pk_env_t *id_skey_1, *id_skey_2, *id_skey_3;
+  crypto_pk_env_t *sign_skey_1, *sign_skey_2, *sign_skey_3;
 
   time_t now = time(NULL);
   networkstatus_voter_info_t *voter;
-  networkstatus_vote_t *vote, *v1;
+  networkstatus_vote_t *vote, *v1, *v2, *v3, *consensus;
   vote_routerstatus_t *vrs;
   routerstatus_t *rs;
-  char *v1_text, *cp;
+  char *v1_text, *v2_text, *v3_text, *consensus_text, *cp;
+  smartlist_t *votes = smartlist_create();
 
-  add_stream_log(LOG_NOTICE, LOG_ERR, "", stdout);
+  add_stream_log(LOG_NOTICE, LOG_ERR, "", stdout);//XXXX020 remove me.
 
   /* Parse certificates and keys. */
   cert1 = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL);
   test_assert(cert1);
   cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL);
   test_assert(cert2);
+  cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL);
+  test_assert(cert3);
   id_skey_1 = crypto_new_pk_env();
   id_skey_2 = crypto_new_pk_env();
+  id_skey_3 = crypto_new_pk_env();
   sign_skey_1 = crypto_new_pk_env();
   sign_skey_2 = crypto_new_pk_env();
+  sign_skey_3 = crypto_new_pk_env();
 
   test_assert(!crypto_pk_read_private_key_from_string(id_skey_1,
                                                       AUTHORITY_IDKEY_1));
   test_assert(!crypto_pk_read_private_key_from_string(id_skey_2,
                                                       AUTHORITY_IDKEY_2));
+  test_assert(!crypto_pk_read_private_key_from_string(id_skey_3,
+                                                      AUTHORITY_IDKEY_3));
   test_assert(!crypto_pk_read_private_key_from_string(sign_skey_1,
                                                       AUTHORITY_SIGNKEY_1));
   test_assert(!crypto_pk_read_private_key_from_string(sign_skey_2,
                                                       AUTHORITY_SIGNKEY_2));
+  test_assert(!crypto_pk_read_private_key_from_string(sign_skey_3,
+                                                      AUTHORITY_SIGNKEY_3));
 
   test_assert(!crypto_pk_cmp_keys(id_skey_1, cert1->identity_key));
   test_assert(!crypto_pk_cmp_keys(sign_skey_1, cert1->signing_key));
@@ -2230,6 +2242,20 @@
   rs->is_exit = rs->is_stable = rs->is_fast = rs->is_running =
     rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1;
   smartlist_add(vote->routerstatus_list, vrs);
+  /* add the third routerstatus. */
+  vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
+  rs = &vrs->status;
+  vrs->version = tor_strdup("0.1.0.3");
+  rs->published_on = now-1000;
+  strlcpy(rs->nickname, "router3", sizeof(rs->nickname));
+  memset(rs->identity_digest, 33, DIGEST_LEN);
+  memset(rs->descriptor_digest, 78, DIGEST_LEN);
+  rs->addr = 0xAA009901;
+  rs->or_port = 400;
+  rs->dir_port = 9999;
+  rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast =
+    rs->is_running = rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1;
+  smartlist_add(vote->routerstatus_list, vrs);
 
   /* dump the vote and try to parse it. */
   v1_text = format_networkstatus_vote(sign_skey_1, vote);
@@ -2261,7 +2287,7 @@
   cp = smartlist_join_strings(v1->known_flags, ":", 0, NULL);
   test_streq(cp, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid");
   tor_free(cp);
-  test_eq(smartlist_len(v1->routerstatus_list), 2);
+  test_eq(smartlist_len(v1->routerstatus_list), 3);
   /* Check the first routerstatus. */
   vrs = smartlist_get(v1->routerstatus_list, 0);
   rs = &vrs->status;
@@ -2291,19 +2317,97 @@
   test_eq(rs->dir_port, 0);
   test_eq(vrs->flags, U64_LITERAL(254)); // all flags except "authority."
 
-  /* XXXXX020 Generate 2 more votes */
+  /* Generate second vote. It disagrees on some of the times,
+   * and doesn't list versions, and knows some crazy flags */
+  vote->published = now+1;
+  vote->fresh_until = now+205;
+  vote->dist_seconds = 300;
+  authority_cert_free(vote->cert);
+  vote->cert = authority_cert_dup(cert2);
+  tor_free(vote->client_versions);
+  tor_free(vote->server_versions);
+  voter = smartlist_get(vote->voters, 0);
+  tor_free(voter->nickname);
+  tor_free(voter->address);
+  voter->nickname = tor_strdup("Voter2");
+  voter->address = tor_strdup("2.3.4.5");
+  voter->addr = 0x02030405;
+  crypto_pk_get_digest(id_skey_2, voter->identity_digest);
+  smartlist_add(vote->known_flags, tor_strdup("MadeOfCheese"));
+  smartlist_add(vote->known_flags, tor_strdup("MadeOfTin"));
+  smartlist_sort_strings(vote->known_flags);
+  vrs = smartlist_get(vote->routerstatus_list, 2);
+  smartlist_del_keeporder(vote->routerstatus_list, 2);
+  tor_free(vrs->version);
+  tor_free(vrs);
+  /* XXXX020 set some flags in router0 */
+  /* generate and parse. */
+  v2_text = format_networkstatus_vote(sign_skey_2, vote);
+  test_assert(v2_text);
+  v2 = networkstatus_parse_vote_from_string(v2_text, 1);
+  test_assert(v2);
+  /* Check that flags come out right.*/
+  cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL);
+  test_streq(cp, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:"
+             "Running:Stable:V2Dir:Valid");
+  tor_free(cp);
+  vrs = smartlist_get(v2->routerstatus_list, 1);
+  /* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) */
+  test_eq(vrs->flags, U64_LITERAL(974));
 
-  /* XXXXX020 compute, write, and parse a consensus. */
+  /* XXXX Generate third vote. */
+  vote->published = now;
+  vote->fresh_until = now+203;
+  vote->dist_seconds = 250;
+  authority_cert_free(vote->cert);
+  vote->cert = authority_cert_dup(cert3);
+  vote->client_versions = tor_strdup("0.1.2.14,0.1.2.17");
+  vote->server_versions = tor_strdup("0.1.2.10,0.1.2.15,0.1.2.16");
+  voter = smartlist_get(vote->voters, 0);
+  tor_free(voter->nickname);
+  tor_free(voter->address);
+  voter->nickname = tor_strdup("Voter3");
+  voter->address = tor_strdup("3.4.5.6");
+  voter->addr = 0x03040506;
+  crypto_pk_get_digest(id_skey_3, voter->identity_digest);
+  vrs = smartlist_get(vote->routerstatus_list, 0);
+  smartlist_del_keeporder(vote->routerstatus_list, 0);
+  tor_free(vrs->version);
+  tor_free(vrs);
+  /* XXXX020 clear some flags in the remaining entry. */
+  v3_text = format_networkstatus_vote(sign_skey_3, vote);
+  test_assert(v3_text);
+  v3 = networkstatus_parse_vote_from_string(v3_text, 1);
+  test_assert(v3);
 
+  /* Compute a consensus as voter 3. */
+  smartlist_add(votes, v3);
+  smartlist_add(votes, v1);
+  smartlist_add(votes, v2);
+  consensus_text = networkstatus_compute_consensus(votes,
+                                                   id_skey_3, sign_skey_3);
+  test_assert(consensus_text);
+  consensus = networkstatus_parse_vote_from_string(consensus_text, 0);
+  test_assert(consensus);
+
+  /* XXXX020 check consensus contents. */
+
   tor_free(v1_text);
+  tor_free(v2_text);
+  tor_free(v3_text);
   networkstatus_vote_free(vote);
   networkstatus_vote_free(v1);
+  networkstatus_vote_free(v2);
+  networkstatus_vote_free(v3);
   crypto_free_pk_env(id_skey_1);
   crypto_free_pk_env(id_skey_2);
+  crypto_free_pk_env(id_skey_3);
   crypto_free_pk_env(sign_skey_1);
   crypto_free_pk_env(sign_skey_2);
+  crypto_free_pk_env(sign_skey_3);
   authority_cert_free(cert1);
   authority_cert_free(cert2);
+  authority_cert_free(cert3);
 }
 
 static void

Modified: tor/trunk/src/or/test_data.c
===================================================================
--- tor/trunk/src/or/test_data.c	2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/test_data.c	2007-06-13 19:06:23 UTC (rev 10589)
@@ -191,3 +191,95 @@
 "rjZyXmEZS3oe7TRCDD28GAGMmxSDvNfOOpyn14ishEs5AQ==\n"
 "-----END RSA PRIVATE KEY-----\n";
 
+const char AUTHORITY_CERT_3[] =
+"dir-key-certificate-version 3\n"
+"fingerprint ED3719BF554DE9D7D59F5CA5A4F5AD121D020ED9\n"
+"dir-key-published 2007-06-13 16:52:40\n"
+"dir-key-expires 2008-06-13 16:52:40\n"
+"dir-identity-key\n"
+"-----BEGIN RSA PUBLIC KEY-----\n"
+"MIIBigKCAYEAtB+yw4BNxtZAG4cPaedkhWNmeij7IuNWmXjh58ZYEGurvGyHs1w4\n"
+"QlwNYI2UftSIeIGdWZ5fJ17h9P3xvO6eeJuOt4KPrNOxUbSGrELEx1Lje1fDAJ1X\n"
+"SvN+dvptusxtyFUr8afgTPrFIvYuazQ6q/Rw+NDagjmDx3h/A/enihpBnjwzeH8j\n"
+"Xzu7b+HKnzFnNfveTDdvSy0NSC6tCOnrfXo31XbXRXtlesnMIpbJClUcAv55eyai\n"
+"/PrVPCCUz8mk0sQnn2Xhv1YJmwOlQTGMfg0a0kWLmh+UWcHsGQ4VWxBZJcuzgFHG\n"
+"hu2/Fz6DXSpX5Q6B9HKoGmnH1oBh24l0kUW1jL8BxPY4YDU1Lt5t3qgcDn9dXYcI\n"
+"o8VvyI0ecSc26Q2PYFWX1hpN4VIBZ8uGaW3IpyTdNiRq0g3iMGRFEXcDlWuyMB9E\n"
+"EbSM7m/79V/z7SjDd75EP8Z0qDPESEVB8a8LbuSJtzFVE0KHd7RzkIEN5sorXspZ\n"
+"/THukftSmkIvAgMBAAE=\n"
+"-----END RSA PUBLIC KEY-----\n"
+"dir-signing-key\n"
+"-----BEGIN RSA PUBLIC KEY-----\n"
+"MIGJAoGBANrSZlUq38Boz3iuUOydYTJV57rTbq1bz805FP2QG2Z+2bwpgKIOZag/\n"
+"gN2A1ySJaIYLgZIg9irxrLkqlY/UAjC23y6V9fJXP1S3TXoqLmHleW8PsaDLuwTo\n"
+"hCWaR61Mx9WG7IXcodn2Z7RiCfZpSW4Rztbk5WtjQa5jPXSFOuBJAgMBAAE=\n"
+"-----END RSA PUBLIC KEY-----\n"
+"dir-key-certification\n"
+"-----BEGIN SIGNATURE-----\n"
+"UNXZy+4OQ8iat+gw+vg2ynvKj2BYbqZt+EAZAV3rmw6gux44U9TLRECRd6LsA08N\n"
+"4+Vz01TU81xqMgfrUy94ei2YvcfpO8art9/muWHTP9SmOX8S1uqDqLWA+n723C9A\n"
+"HyVXn4aINncO2081gJcIW5+Ul8WTCeZe/n3LVPTCKbTdqxvmrPUdCWlJTQUmb19M\n"
+"T+kcCjaEfgQGLC+Y2MHqYe/nxz+aBKqpjiWUDdjc35va6r/2e3c0jGi1B1xRZxN1\n"
+"xThPZ+CifjDoWBxJdDGlIfZRK1lMnOCJY9w9ibTXQ1UnvE4whFvmB55/t9/XLq4q\n"
+"3pnZz0H7funey3+ilmTxDohoAYT1GX+4a+3xYH07UmAFqlTzqKClj84XEHn+Cer7\n"
+"Nun9kJlJFuBgUpQjwCkzedFZKKLOHgB2h7trJfnqcBpAM8Rup1Bb5u/RcBx9gy1q\n"
+"pMc65FviIrc/Q5TUku6NNbCbnGll1599PvWuUzkG42lJ17V6psKHIsqGtVdHlCUc\n"
+"-----END SIGNATURE-----\n";
+
+const char AUTHORITY_IDKEY_3[] =
+"-----BEGIN RSA PRIVATE KEY-----\n"
+"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\n"
+"-----END RSA PRIVATE KEY-----\n";
+
+const char AUTHORITY_SIGNKEY_3[] =
+"-----BEGIN RSA PRIVATE KEY-----\n"
+"MIICXgIBAAKBgQDa0mZVKt/AaM94rlDsnWEyVee6026tW8/NORT9kBtmftm8KYCi\n"
+"DmWoP4DdgNckiWiGC4GSIPYq8ay5KpWP1AIwtt8ulfXyVz9Ut016Ki5h5XlvD7Gg\n"
+"y7sE6IQlmketTMfVhuyF3KHZ9me0Ygn2aUluEc7W5OVrY0GuYz10hTrgSQIDAQAB\n"
+"AoGBAIyoeG1AnQmildKeQpiGZackf0uhg2BeRwpFKg//5Q0Sd0Wza+M/2+q1v1Ei\n"
+"86ihxxV7KfPTykk6hmuUSwVkI28Z+5J9NYTr35EzPiUlqpo0iclTkFqrlbqSPULx\n"
+"9fQhvcOGv1c0m5CnYrHsM8eu3tagLg+6OE4abLOYX4Az5pkxAkEA/NwHhVaVJrXH\n"
+"lGDrRAfGtaD5Tzeeg1H9DNZi5lmFiSNR0O11sgDLkiZNP5oM8knyqo8Gq08hwxEb\n"
+"yqMXM3XtJQJBAN2KJbFhOjDIkvJyYvbmcP6P7vV2c9j+oUTKkFMF7vvfWunxMi9j\n"
+"ghbdUKgl7tU0VFpw7ufDDD0pkN6sua3gp1UCQQCvNzTK861U7p/GtMYyFQVf9JTt\n"
+"jMf9jYHBNInBvwTme6AFG5bz6tMlif77dJ9GAXHzODrR2Hq3thJA/3RjR3M1AkBg\n"
+"+6M4ncmtpYC+5lhwob0Bk90WU/6vFflfdhXsYoKWfNb95vsDR9qhS82Nbt25NClh\n"
+"VmMfzoFDHTkwYgj/F4PpAkEA+RaaSRP7BmbvFNqvlm8J/m0RVdAH4+p/Q5Z5u6Yo\n"
+"N7xC/gFi0qFPGKsDvD2CncAYmt+KNsd8S0JGDN4eieKn+Q==\n"
+"-----END RSA PRIVATE KEY-----\n";