diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-06-13 19:06:23 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-06-13 19:06:23 +0000 |
commit | c3626cdba7a438986f593b7b76be2399a24100ac (patch) | |
tree | e2b92c03a9c885f7a2150043395c4445273f4d61 /src | |
parent | 05cf945a1c540806fd7e3be14a52d6c4c01215ea (diff) | |
download | tor-c3626cdba7a438986f593b7b76be2399a24100ac.tar.gz tor-c3626cdba7a438986f593b7b76be2399a24100ac.zip |
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.
svn:r10589
Diffstat (limited to 'src')
-rw-r--r-- | src/or/dirserv.c | 7 | ||||
-rw-r--r-- | src/or/dirvote.c | 17 | ||||
-rw-r--r-- | src/or/or.h | 1 | ||||
-rw-r--r-- | src/or/routerparse.c | 2 | ||||
-rw-r--r-- | src/or/test.c | 122 | ||||
-rw-r--r-- | src/or/test_data.c | 92 |
6 files changed, 223 insertions, 18 deletions
diff --git a/src/or/dirserv.c b/src/or/dirserv.c index 01b6db731b..223067edf1 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -1608,7 +1608,6 @@ routerstatus_format_entry(char *buf, size_t buf_len, 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 @@ routerstatus_format_entry(char *buf, size_t buf_len, 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 @@ routerstatus_format_entry(char *buf, size_t buf_len, 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 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs, !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 = diff --git a/src/or/dirvote.c b/src/or/dirvote.c index 8eda6f03bb..4bd7cae2dd 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -37,11 +37,16 @@ networkstatus_vote_free(networkstatus_vote_t *ns) 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 @@ networkstatus_compute_consensus(smartlist_t *votes, 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); diff --git a/src/or/or.h b/src/or/or.h index a34a03bf93..64689d8c74 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1205,6 +1205,7 @@ typedef struct routerstatus_t { 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. */ diff --git a/src/or/routerparse.c b/src/or/routerparse.c index 96f4e3c542..e1b52e7198 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -1534,6 +1534,8 @@ routerstatus_parse_entry_from_string(const char **s, smartlist_t *tokens, 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))) { diff --git a/src/or/test.c b/src/or/test.c index 30870e32d6..4b637da983 100644 --- a/src/or/test.c +++ b/src/or/test.c @@ -2133,41 +2133,53 @@ extern const char AUTHORITY_SIGNKEY_1[]; 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 @@ test_v3_networkstatus(void) 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 @@ test_v3_networkstatus(void) 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_v3_networkstatus(void) 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 diff --git a/src/or/test_data.c b/src/or/test_data.c index 64993b6bbb..fc2d84fb89 100644 --- a/src/or/test_data.c +++ b/src/or/test_data.c @@ -191,3 +191,95 @@ const char AUTHORITY_SIGNKEY_2[] = "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"; |