test_dir_common.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. /* Copyright (c) 2001-2004, Roger Dingledine.
  2. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
  3. * Copyright (c) 2007-2014, The Tor Project, Inc. */
  4. /* See LICENSE for licensing information */
  5. #include "orconfig.h"
  6. #define DIRVOTE_PRIVATE
  7. #include "crypto.h"
  8. #include "test.h"
  9. #include "container.h"
  10. #include "or.h"
  11. #include "dirvote.h"
  12. #include "nodelist.h"
  13. #include "routerlist.h"
  14. #include "test_dir_common.h"
  15. void dir_common_setup_vote(networkstatus_t **vote, time_t now);
  16. networkstatus_t * dir_common_add_rs_and_parse(networkstatus_t *vote,
  17. networkstatus_t **vote_out,
  18. vote_routerstatus_t * (*vrs_gen)(int idx, time_t now),
  19. crypto_pk_t *sign_skey, int *n_vrs,
  20. time_t now, int clear_rl);
  21. extern const char AUTHORITY_CERT_1[];
  22. extern const char AUTHORITY_SIGNKEY_1[];
  23. extern const char AUTHORITY_CERT_2[];
  24. extern const char AUTHORITY_SIGNKEY_2[];
  25. extern const char AUTHORITY_CERT_3[];
  26. extern const char AUTHORITY_SIGNKEY_3[];
  27. /** Initialize and set auth certs and keys
  28. * Returns 0 on success, -1 on failure. Clean up handled by caller.
  29. */
  30. int
  31. dir_common_authority_pk_init(authority_cert_t **cert1,
  32. authority_cert_t **cert2,
  33. authority_cert_t **cert3,
  34. crypto_pk_t **sign_skey_1,
  35. crypto_pk_t **sign_skey_2,
  36. crypto_pk_t **sign_skey_3)
  37. {
  38. /* Parse certificates and keys. */
  39. authority_cert_t *cert;
  40. cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL);
  41. tt_assert(cert);
  42. tt_assert(cert->identity_key);
  43. *cert1 = cert;
  44. tt_assert(*cert1);
  45. *cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL);
  46. tt_assert(*cert2);
  47. *cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL);
  48. tt_assert(*cert3);
  49. *sign_skey_1 = crypto_pk_new();
  50. *sign_skey_2 = crypto_pk_new();
  51. *sign_skey_3 = crypto_pk_new();
  52. tt_assert(!crypto_pk_read_private_key_from_string(*sign_skey_1,
  53. AUTHORITY_SIGNKEY_1, -1));
  54. tt_assert(!crypto_pk_read_private_key_from_string(*sign_skey_2,
  55. AUTHORITY_SIGNKEY_2, -1));
  56. tt_assert(!crypto_pk_read_private_key_from_string(*sign_skey_3,
  57. AUTHORITY_SIGNKEY_3, -1));
  58. tt_assert(!crypto_pk_cmp_keys(*sign_skey_1, (*cert1)->signing_key));
  59. tt_assert(!crypto_pk_cmp_keys(*sign_skey_2, (*cert2)->signing_key));
  60. return 0;
  61. done:
  62. return -1;
  63. }
  64. /**
  65. * Generate a routerstatus for v3_networkstatus test.
  66. */
  67. vote_routerstatus_t *
  68. dir_common_gen_routerstatus_for_v3ns(int idx, time_t now)
  69. {
  70. vote_routerstatus_t *vrs=NULL;
  71. routerstatus_t *rs = NULL;
  72. tor_addr_t addr_ipv6;
  73. char *method_list = NULL;
  74. switch (idx) {
  75. case 0:
  76. /* Generate the first routerstatus. */
  77. vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
  78. rs = &vrs->status;
  79. vrs->version = tor_strdup("0.1.2.14");
  80. rs->published_on = now-1500;
  81. strlcpy(rs->nickname, "router2", sizeof(rs->nickname));
  82. memset(rs->identity_digest, TEST_DIR_ROUTER_ID_1, DIGEST_LEN);
  83. memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_1, DIGEST_LEN);
  84. rs->addr = 0x99008801;
  85. rs->or_port = 443;
  86. rs->dir_port = 8000;
  87. /* all flags but running and v2dir cleared */
  88. rs->is_flagged_running = 1;
  89. rs->is_v2_dir = 1;
  90. break;
  91. case 1:
  92. /* Generate the second routerstatus. */
  93. vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
  94. rs = &vrs->status;
  95. vrs->version = tor_strdup("0.2.0.5");
  96. rs->published_on = now-1000;
  97. strlcpy(rs->nickname, "router1", sizeof(rs->nickname));
  98. memset(rs->identity_digest, TEST_DIR_ROUTER_ID_2, DIGEST_LEN);
  99. memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_2, DIGEST_LEN);
  100. rs->addr = 0x99009901;
  101. rs->or_port = 443;
  102. rs->dir_port = 0;
  103. tor_addr_parse(&addr_ipv6, "[1:2:3::4]");
  104. tor_addr_copy(&rs->ipv6_addr, &addr_ipv6);
  105. rs->ipv6_orport = 4711;
  106. rs->is_exit = rs->is_stable = rs->is_fast = rs->is_flagged_running =
  107. rs->is_valid = rs->is_possible_guard = rs->is_v2_dir = 1;
  108. break;
  109. case 2:
  110. /* Generate the third routerstatus. */
  111. vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
  112. rs = &vrs->status;
  113. vrs->version = tor_strdup("0.1.0.3");
  114. rs->published_on = now-1000;
  115. strlcpy(rs->nickname, "router3", sizeof(rs->nickname));
  116. memset(rs->identity_digest, TEST_DIR_ROUTER_ID_3, DIGEST_LEN);
  117. memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_3, DIGEST_LEN);
  118. rs->addr = 0xAA009901;
  119. rs->or_port = 400;
  120. rs->dir_port = 9999;
  121. rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast =
  122. rs->is_flagged_running = rs->is_valid = rs->is_v2_dir =
  123. rs->is_possible_guard = 1;
  124. break;
  125. case 3:
  126. /* Generate a fourth routerstatus that is not running. */
  127. vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
  128. rs = &vrs->status;
  129. vrs->version = tor_strdup("0.1.6.3");
  130. rs->published_on = now-1000;
  131. strlcpy(rs->nickname, "router4", sizeof(rs->nickname));
  132. memset(rs->identity_digest, TEST_DIR_ROUTER_ID_4, DIGEST_LEN);
  133. memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_4, DIGEST_LEN);
  134. rs->addr = 0xC0000203;
  135. rs->or_port = 500;
  136. rs->dir_port = 1999;
  137. /* Running flag (and others) cleared */
  138. break;
  139. case 4:
  140. /* No more for this test; return NULL */
  141. vrs = NULL;
  142. break;
  143. default:
  144. /* Shouldn't happen */
  145. tt_assert(0);
  146. }
  147. if (vrs) {
  148. vrs->microdesc = tor_malloc_zero(sizeof(vote_microdesc_hash_t));
  149. method_list = make_consensus_method_list(MIN_SUPPORTED_CONSENSUS_METHOD,
  150. MAX_SUPPORTED_CONSENSUS_METHOD,
  151. ",");
  152. tor_asprintf(&vrs->microdesc->microdesc_hash_line,
  153. "m %s "
  154. "sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa%d\n",
  155. method_list, idx);
  156. }
  157. done:
  158. tor_free(method_list);
  159. return vrs;
  160. }
  161. /** Initialize networkstatus vote object attributes. */
  162. void
  163. dir_common_setup_vote(networkstatus_t **vote, time_t now)
  164. {
  165. *vote = tor_malloc_zero(sizeof(networkstatus_t));
  166. (*vote)->type = NS_TYPE_VOTE;
  167. (*vote)->published = now;
  168. (*vote)->supported_methods = smartlist_new();
  169. (*vote)->known_flags = smartlist_new();
  170. (*vote)->net_params = smartlist_new();
  171. (*vote)->routerstatus_list = smartlist_new();
  172. (*vote)->voters = smartlist_new();
  173. }
  174. /** Helper: Make a new routerinfo containing the right information for a
  175. * given vote_routerstatus_t. */
  176. routerinfo_t *
  177. dir_common_generate_ri_from_rs(const vote_routerstatus_t *vrs)
  178. {
  179. routerinfo_t *r;
  180. const routerstatus_t *rs = &vrs->status;
  181. static time_t published = 0;
  182. r = tor_malloc_zero(sizeof(routerinfo_t));
  183. r->cert_expiration_time = TIME_MAX;
  184. memcpy(r->cache_info.identity_digest, rs->identity_digest, DIGEST_LEN);
  185. memcpy(r->cache_info.signed_descriptor_digest, rs->descriptor_digest,
  186. DIGEST_LEN);
  187. r->cache_info.do_not_cache = 1;
  188. r->cache_info.routerlist_index = -1;
  189. r->cache_info.signed_descriptor_body =
  190. tor_strdup("123456789012345678901234567890123");
  191. r->cache_info.signed_descriptor_len =
  192. strlen(r->cache_info.signed_descriptor_body);
  193. r->exit_policy = smartlist_new();
  194. r->cache_info.published_on = ++published + time(NULL);
  195. if (rs->has_bandwidth) {
  196. /*
  197. * Multiply by 1000 because the routerinfo_t and the routerstatus_t
  198. * seem to use different units (*sigh*) and because we seem stuck on
  199. * icky and perverse decimal kilobytes (*double sigh*) - see
  200. * router_get_advertised_bandwidth_capped() of routerlist.c and
  201. * routerstatus_format_entry() of dirserv.c.
  202. */
  203. r->bandwidthrate = rs->bandwidth_kb * 1000;
  204. r->bandwidthcapacity = rs->bandwidth_kb * 1000;
  205. }
  206. return r;
  207. }
  208. /** Create routerstatuses and signed vote.
  209. * Create routerstatuses using *vrs_gen* and add them to global routerlist.
  210. * Next, create signed vote using *sign_skey* and *vote*, which should have
  211. * predefined header fields.
  212. * Setting *clear_rl* clears the global routerlist before adding the new
  213. * routers.
  214. * Return the signed vote, same as *vote_out*. Save the number of routers added
  215. * in *n_vrs*.
  216. */
  217. networkstatus_t *
  218. dir_common_add_rs_and_parse(networkstatus_t *vote, networkstatus_t **vote_out,
  219. vote_routerstatus_t * (*vrs_gen)(int idx, time_t now),
  220. crypto_pk_t *sign_skey, int *n_vrs, time_t now,
  221. int clear_rl)
  222. {
  223. vote_routerstatus_t *vrs;
  224. char *v_text=NULL;
  225. const char *msg=NULL;
  226. int idx;
  227. was_router_added_t router_added = -1;
  228. *vote_out = NULL;
  229. if (clear_rl) {
  230. nodelist_free_all();
  231. routerlist_free_all();
  232. }
  233. idx = 0;
  234. do {
  235. vrs = vrs_gen(idx, now);
  236. if (vrs) {
  237. smartlist_add(vote->routerstatus_list, vrs);
  238. router_added =
  239. router_add_to_routerlist(dir_common_generate_ri_from_rs(vrs),
  240. &msg,0,0);
  241. tt_assert(router_added >= 0);
  242. ++idx;
  243. }
  244. } while (vrs);
  245. *n_vrs = idx;
  246. /* dump the vote and try to parse it. */
  247. v_text = format_networkstatus_vote(sign_skey, vote);
  248. tt_assert(v_text);
  249. *vote_out = networkstatus_parse_vote_from_string(v_text, NULL, NS_TYPE_VOTE);
  250. done:
  251. if (v_text)
  252. tor_free(v_text);
  253. return *vote_out;
  254. }
  255. /** Create a fake *vote* where *cert* describes the signer, *sign_skey*
  256. * is the signing key, and *vrs_gen* is the function we'll use to create the
  257. * routers on which we're voting.
  258. * We pass *vote_out*, *n_vrs*, and *clear_rl* directly to vrs_gen().
  259. * Return 0 on success, return -1 on failure.
  260. */
  261. int
  262. dir_common_construct_vote_1(networkstatus_t **vote, authority_cert_t *cert,
  263. crypto_pk_t *sign_skey,
  264. vote_routerstatus_t * (*vrs_gen)(int idx, time_t now),
  265. networkstatus_t **vote_out, int *n_vrs,
  266. time_t now, int clear_rl)
  267. {
  268. networkstatus_voter_info_t *voter;
  269. dir_common_setup_vote(vote, now);
  270. (*vote)->valid_after = now+1000;
  271. (*vote)->fresh_until = now+2000;
  272. (*vote)->valid_until = now+3000;
  273. (*vote)->vote_seconds = 100;
  274. (*vote)->dist_seconds = 200;
  275. smartlist_split_string((*vote)->supported_methods, "1 2 3", NULL, 0, -1);
  276. (*vote)->client_versions = tor_strdup("0.1.2.14,0.1.2.15");
  277. (*vote)->server_versions = tor_strdup("0.1.2.14,0.1.2.15,0.1.2.16");
  278. smartlist_split_string((*vote)->known_flags,
  279. "Authority Exit Fast Guard Running Stable V2Dir Valid",
  280. 0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
  281. voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t));
  282. voter->nickname = tor_strdup("Voter1");
  283. voter->address = tor_strdup("1.2.3.4");
  284. voter->addr = 0x01020304;
  285. voter->dir_port = 80;
  286. voter->or_port = 9000;
  287. voter->contact = tor_strdup("voter@example.com");
  288. crypto_pk_get_digest(cert->identity_key, voter->identity_digest);
  289. /*
  290. * Set up a vote; generate it; try to parse it.
  291. */
  292. smartlist_add((*vote)->voters, voter);
  293. (*vote)->cert = authority_cert_dup(cert);
  294. smartlist_split_string((*vote)->net_params, "circuitwindow=101 foo=990",
  295. NULL, 0, 0);
  296. *n_vrs = 0;
  297. /* add routerstatuses */
  298. if (!dir_common_add_rs_and_parse(*vote, vote_out, vrs_gen, sign_skey,
  299. n_vrs, now, clear_rl))
  300. return -1;
  301. return 0;
  302. }
  303. /** See dir_common_construct_vote_1.
  304. * Produces a vote with slightly different values.
  305. */
  306. int
  307. dir_common_construct_vote_2(networkstatus_t **vote, authority_cert_t *cert,
  308. crypto_pk_t *sign_skey,
  309. vote_routerstatus_t * (*vrs_gen)(int idx, time_t now),
  310. networkstatus_t **vote_out, int *n_vrs,
  311. time_t now, int clear_rl)
  312. {
  313. networkstatus_voter_info_t *voter;
  314. dir_common_setup_vote(vote, now);
  315. (*vote)->type = NS_TYPE_VOTE;
  316. (*vote)->published += 1;
  317. (*vote)->valid_after = now+1000;
  318. (*vote)->fresh_until = now+3005;
  319. (*vote)->valid_until = now+3000;
  320. (*vote)->vote_seconds = 100;
  321. (*vote)->dist_seconds = 300;
  322. smartlist_split_string((*vote)->supported_methods, "1 2 3", NULL, 0, -1);
  323. smartlist_split_string((*vote)->known_flags,
  324. "Authority Exit Fast Guard MadeOfCheese MadeOfTin "
  325. "Running Stable V2Dir Valid", 0,
  326. SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
  327. voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t));
  328. voter->nickname = tor_strdup("Voter2");
  329. voter->address = tor_strdup("2.3.4.5");
  330. voter->addr = 0x02030405;
  331. voter->dir_port = 80;
  332. voter->or_port = 9000;
  333. voter->contact = tor_strdup("voter@example.com");
  334. crypto_pk_get_digest(cert->identity_key, voter->identity_digest);
  335. /*
  336. * Set up a vote; generate it; try to parse it.
  337. */
  338. smartlist_add((*vote)->voters, voter);
  339. (*vote)->cert = authority_cert_dup(cert);
  340. (*vote)->net_params = smartlist_new();
  341. smartlist_split_string((*vote)->net_params,
  342. "bar=2000000000 circuitwindow=20",
  343. NULL, 0, 0);
  344. /* add routerstatuses */
  345. /* dump the vote and try to parse it. */
  346. dir_common_add_rs_and_parse(*vote, vote_out, vrs_gen, sign_skey,
  347. n_vrs, now, clear_rl);
  348. return 0;
  349. }
  350. /** See dir_common_construct_vote_1.
  351. * Produces a vote with slightly different values. Adds a legacy key.
  352. */
  353. int
  354. dir_common_construct_vote_3(networkstatus_t **vote, authority_cert_t *cert,
  355. crypto_pk_t *sign_skey,
  356. vote_routerstatus_t * (*vrs_gen)(int idx, time_t now),
  357. networkstatus_t **vote_out, int *n_vrs,
  358. time_t now, int clear_rl)
  359. {
  360. networkstatus_voter_info_t *voter;
  361. dir_common_setup_vote(vote, now);
  362. (*vote)->valid_after = now+1000;
  363. (*vote)->fresh_until = now+2003;
  364. (*vote)->valid_until = now+3000;
  365. (*vote)->vote_seconds = 100;
  366. (*vote)->dist_seconds = 250;
  367. smartlist_split_string((*vote)->supported_methods, "1 2 3 4", NULL, 0, -1);
  368. (*vote)->client_versions = tor_strdup("0.1.2.14,0.1.2.17");
  369. (*vote)->server_versions = tor_strdup("0.1.2.10,0.1.2.15,0.1.2.16");
  370. smartlist_split_string((*vote)->known_flags,
  371. "Authority Exit Fast Guard Running Stable V2Dir Valid",
  372. 0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
  373. voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t));
  374. voter->nickname = tor_strdup("Voter2");
  375. voter->address = tor_strdup("3.4.5.6");
  376. voter->addr = 0x03040506;
  377. voter->dir_port = 80;
  378. voter->or_port = 9000;
  379. voter->contact = tor_strdup("voter@example.com");
  380. crypto_pk_get_digest(cert->identity_key, voter->identity_digest);
  381. memset(voter->legacy_id_digest, (int)'A', DIGEST_LEN);
  382. /*
  383. * Set up a vote; generate it; try to parse it.
  384. */
  385. smartlist_add((*vote)->voters, voter);
  386. (*vote)->cert = authority_cert_dup(cert);
  387. smartlist_split_string((*vote)->net_params, "circuitwindow=80 foo=660",
  388. NULL, 0, 0);
  389. /* add routerstatuses */
  390. /* dump the vote and try to parse it. */
  391. dir_common_add_rs_and_parse(*vote, vote_out, vrs_gen, sign_skey,
  392. n_vrs, now, clear_rl);
  393. return 0;
  394. }