test_controller.c 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485
  1. /* Copyright (c) 2015-2017, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #define CONTROL_PRIVATE
  4. #include "or.h"
  5. #include "bridges.h"
  6. #include "control.h"
  7. #include "entrynodes.h"
  8. #include "hs_common.h"
  9. #include "networkstatus.h"
  10. #include "rendservice.h"
  11. #include "routerlist.h"
  12. #include "test.h"
  13. #include "test_helpers.h"
  14. static void
  15. test_add_onion_helper_keyarg_v3(void *arg)
  16. {
  17. int ret, hs_version;
  18. add_onion_secret_key_t pk;
  19. char *key_new_blob = NULL;
  20. char *err_msg = NULL;
  21. const char *key_new_alg = NULL;
  22. (void) arg;
  23. memset(&pk, 0, sizeof(pk));
  24. /* Test explicit ED25519-V3 key generation. */
  25. ret = add_onion_helper_keyarg("NEW:ED25519-V3", 0, &key_new_alg,
  26. &key_new_blob, &pk, &hs_version,
  27. &err_msg);
  28. tt_int_op(ret, OP_EQ, 0);
  29. tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE);
  30. tt_assert(pk.v3);
  31. tt_str_op(key_new_alg, OP_EQ, "ED25519-V3");
  32. tt_assert(key_new_blob);
  33. tt_ptr_op(err_msg, OP_EQ, NULL);
  34. tor_free(pk.v3); pk.v3 = NULL;
  35. tor_free(key_new_blob);
  36. /* Test discarding the private key. */
  37. ret = add_onion_helper_keyarg("NEW:ED25519-V3", 1, &key_new_alg,
  38. &key_new_blob, &pk, &hs_version,
  39. &err_msg);
  40. tt_int_op(ret, OP_EQ, 0);
  41. tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE);
  42. tt_assert(pk.v3);
  43. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  44. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  45. tt_ptr_op(err_msg, OP_EQ, NULL);
  46. tor_free(pk.v3); pk.v3 = NULL;
  47. tor_free(key_new_blob);
  48. /* Test passing a key blob. */
  49. {
  50. /* The base64 key and hex key are the same. Hex key is 64 bytes long. The
  51. * sk has been generated randomly using python3. */
  52. const char *base64_sk =
  53. "a9bT19PqGC9Y+BmOo1IQvCGjjwxMiaaxEXZ+FKMxpEQW"
  54. "6AmSV5roThUGMRCaqQSCnR2jI1vL2QxHORzI4RxMmw==";
  55. const char *hex_sk =
  56. "\x6b\xd6\xd3\xd7\xd3\xea\x18\x2f\x58\xf8\x19\x8e\xa3\x52\x10\xbc"
  57. "\x21\xa3\x8f\x0c\x4c\x89\xa6\xb1\x11\x76\x7e\x14\xa3\x31\xa4\x44"
  58. "\x16\xe8\x09\x92\x57\x9a\xe8\x4e\x15\x06\x31\x10\x9a\xa9\x04\x82"
  59. "\x9d\x1d\xa3\x23\x5b\xcb\xd9\x0c\x47\x39\x1c\xc8\xe1\x1c\x4c\x9b";
  60. char *key_blob = NULL;
  61. tor_asprintf(&key_blob, "ED25519-V3:%s", base64_sk);
  62. tt_assert(key_blob);
  63. ret = add_onion_helper_keyarg(key_blob, 1, &key_new_alg,
  64. &key_new_blob, &pk, &hs_version,
  65. &err_msg);
  66. tor_free(key_blob);
  67. tt_int_op(ret, OP_EQ, 0);
  68. tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE);
  69. tt_assert(pk.v3);
  70. tt_mem_op(pk.v3, OP_EQ, hex_sk, 64);
  71. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  72. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  73. tt_ptr_op(err_msg, OP_EQ, NULL);
  74. tor_free(pk.v3); pk.v3 = NULL;
  75. tor_free(key_new_blob);
  76. }
  77. done:
  78. tor_free(pk.v3);
  79. tor_free(key_new_blob);
  80. tor_free(err_msg);
  81. }
  82. static void
  83. test_add_onion_helper_keyarg_v2(void *arg)
  84. {
  85. int ret, hs_version;
  86. add_onion_secret_key_t pk;
  87. crypto_pk_t *pk1 = NULL;
  88. const char *key_new_alg = NULL;
  89. char *key_new_blob = NULL;
  90. char *err_msg = NULL;
  91. char *encoded = NULL;
  92. char *arg_str = NULL;
  93. (void) arg;
  94. memset(&pk, 0, sizeof(pk));
  95. /* Test explicit RSA1024 key generation. */
  96. ret = add_onion_helper_keyarg("NEW:RSA1024", 0, &key_new_alg, &key_new_blob,
  97. &pk, &hs_version, &err_msg);
  98. tt_int_op(ret, OP_EQ, 0);
  99. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  100. tt_assert(pk.v2);
  101. tt_str_op(key_new_alg, OP_EQ, "RSA1024");
  102. tt_assert(key_new_blob);
  103. tt_ptr_op(err_msg, OP_EQ, NULL);
  104. /* Test "BEST" key generation (Assumes BEST = RSA1024). */
  105. crypto_pk_free(pk.v2); pk.v2 = NULL;
  106. tor_free(key_new_blob);
  107. ret = add_onion_helper_keyarg("NEW:BEST", 0, &key_new_alg, &key_new_blob,
  108. &pk, &hs_version, &err_msg);
  109. tt_int_op(ret, OP_EQ, 0);
  110. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  111. tt_assert(pk.v2);
  112. tt_str_op(key_new_alg, OP_EQ, "RSA1024");
  113. tt_assert(key_new_blob);
  114. tt_ptr_op(err_msg, OP_EQ, NULL);
  115. /* Test discarding the private key. */
  116. crypto_pk_free(pk.v2); pk.v2 = NULL;
  117. tor_free(key_new_blob);
  118. ret = add_onion_helper_keyarg("NEW:BEST", 1, &key_new_alg, &key_new_blob,
  119. &pk, &hs_version, &err_msg);
  120. tt_int_op(ret, OP_EQ, 0);
  121. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  122. tt_assert(pk.v2);
  123. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  124. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  125. tt_ptr_op(err_msg, OP_EQ, NULL);
  126. /* Test generating a invalid key type. */
  127. crypto_pk_free(pk.v2); pk.v2 = NULL;
  128. ret = add_onion_helper_keyarg("NEW:RSA512", 0, &key_new_alg, &key_new_blob,
  129. &pk, &hs_version, &err_msg);
  130. tt_int_op(ret, OP_EQ, -1);
  131. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  132. tt_assert(!pk.v2);
  133. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  134. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  135. tt_assert(err_msg);
  136. /* Test loading a RSA1024 key. */
  137. tor_free(err_msg);
  138. pk1 = pk_generate(0);
  139. tt_int_op(0, OP_EQ, crypto_pk_base64_encode(pk1, &encoded));
  140. tor_asprintf(&arg_str, "RSA1024:%s", encoded);
  141. ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  142. &pk, &hs_version, &err_msg);
  143. tt_int_op(ret, OP_EQ, 0);
  144. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  145. tt_assert(pk.v2);
  146. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  147. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  148. tt_ptr_op(err_msg, OP_EQ, NULL);
  149. tt_int_op(crypto_pk_cmp_keys(pk1, pk.v2), OP_EQ, 0);
  150. /* Test loading a invalid key type. */
  151. tor_free(arg_str);
  152. crypto_pk_free(pk1); pk1 = NULL;
  153. crypto_pk_free(pk.v2); pk.v2 = NULL;
  154. tor_asprintf(&arg_str, "RSA512:%s", encoded);
  155. ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  156. &pk, &hs_version, &err_msg);
  157. tt_int_op(ret, OP_EQ, -1);
  158. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  159. tt_assert(!pk.v2);
  160. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  161. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  162. tt_assert(err_msg);
  163. /* Test loading a invalid key. */
  164. tor_free(arg_str);
  165. crypto_pk_free(pk.v2); pk.v2 = NULL;
  166. tor_free(err_msg);
  167. encoded[strlen(encoded)/2] = '\0';
  168. tor_asprintf(&arg_str, "RSA1024:%s", encoded);
  169. ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  170. &pk, &hs_version, &err_msg);
  171. tt_int_op(ret, OP_EQ, -1);
  172. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  173. tt_assert(!pk.v2);
  174. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  175. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  176. tt_assert(err_msg);
  177. done:
  178. crypto_pk_free(pk1);
  179. crypto_pk_free(pk.v2);
  180. tor_free(key_new_blob);
  181. tor_free(err_msg);
  182. tor_free(encoded);
  183. tor_free(arg_str);
  184. }
  185. static void
  186. test_getinfo_helper_onion(void *arg)
  187. {
  188. (void)arg;
  189. control_connection_t dummy;
  190. /* Get results out */
  191. char *answer = NULL;
  192. const char *errmsg = NULL;
  193. char *service_id = NULL;
  194. int rt = 0;
  195. dummy.ephemeral_onion_services = NULL;
  196. /* successfully get an empty answer */
  197. rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg);
  198. tt_int_op(rt, OP_EQ, 0);
  199. tt_str_op(answer, OP_EQ, "");
  200. tor_free(answer);
  201. /* successfully get an empty answer */
  202. rt = getinfo_helper_onions(&dummy, "onions/detached", &answer, &errmsg);
  203. tt_int_op(rt, OP_EQ, 0);
  204. tt_str_op(answer, OP_EQ, "");
  205. tor_free(answer);
  206. /* get an answer for one onion service */
  207. service_id = tor_strdup("dummy_onion_id");
  208. dummy.ephemeral_onion_services = smartlist_new();
  209. smartlist_add(dummy.ephemeral_onion_services, service_id);
  210. rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg);
  211. tt_int_op(rt, OP_EQ, 0);
  212. tt_str_op(answer, OP_EQ, "dummy_onion_id");
  213. done:
  214. tor_free(answer);
  215. tor_free(service_id);
  216. smartlist_free(dummy.ephemeral_onion_services);
  217. }
  218. static void
  219. test_rend_service_parse_port_config(void *arg)
  220. {
  221. const char *sep = ",";
  222. rend_service_port_config_t *cfg = NULL;
  223. char *err_msg = NULL;
  224. (void)arg;
  225. /* Test "VIRTPORT" only. */
  226. cfg = rend_service_parse_port_config("80", sep, &err_msg);
  227. tt_assert(cfg);
  228. tt_ptr_op(err_msg, OP_EQ, NULL);
  229. /* Test "VIRTPORT,TARGET" (Target is port). */
  230. rend_service_port_config_free(cfg);
  231. cfg = rend_service_parse_port_config("80,8080", sep, &err_msg);
  232. tt_assert(cfg);
  233. tt_ptr_op(err_msg, OP_EQ, NULL);
  234. /* Test "VIRTPORT,TARGET" (Target is IPv4:port). */
  235. rend_service_port_config_free(cfg);
  236. cfg = rend_service_parse_port_config("80,192.0.2.1:8080", sep, &err_msg);
  237. tt_assert(cfg);
  238. tt_ptr_op(err_msg, OP_EQ, NULL);
  239. /* Test "VIRTPORT,TARGET" (Target is IPv6:port). */
  240. rend_service_port_config_free(cfg);
  241. cfg = rend_service_parse_port_config("80,[2001:db8::1]:8080", sep, &err_msg);
  242. tt_assert(cfg);
  243. tt_ptr_op(err_msg, OP_EQ, NULL);
  244. rend_service_port_config_free(cfg);
  245. cfg = NULL;
  246. /* XXX: Someone should add tests for AF_UNIX targets if supported. */
  247. /* Test empty config. */
  248. rend_service_port_config_free(cfg);
  249. cfg = rend_service_parse_port_config("", sep, &err_msg);
  250. tt_ptr_op(cfg, OP_EQ, NULL);
  251. tt_assert(err_msg);
  252. /* Test invalid port. */
  253. tor_free(err_msg);
  254. cfg = rend_service_parse_port_config("90001", sep, &err_msg);
  255. tt_ptr_op(cfg, OP_EQ, NULL);
  256. tt_assert(err_msg);
  257. tor_free(err_msg);
  258. /* unix port */
  259. cfg = NULL;
  260. /* quoted unix port */
  261. tor_free(err_msg);
  262. cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"",
  263. " ", &err_msg);
  264. tt_assert(cfg);
  265. tt_ptr_op(err_msg, OP_EQ, NULL);
  266. rend_service_port_config_free(cfg);
  267. cfg = NULL;
  268. /* quoted unix port */
  269. tor_free(err_msg);
  270. cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"",
  271. " ", &err_msg);
  272. tt_assert(cfg);
  273. tt_ptr_op(err_msg, OP_EQ, NULL);
  274. rend_service_port_config_free(cfg);
  275. cfg = NULL;
  276. /* quoted unix port, missing end quote */
  277. cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar",
  278. " ", &err_msg);
  279. tt_ptr_op(cfg, OP_EQ, NULL);
  280. tt_str_op(err_msg, OP_EQ, "Couldn't process address <unix:\"/tmp/foo bar> "
  281. "from hidden service configuration");
  282. tor_free(err_msg);
  283. /* bogus IP address */
  284. MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs);
  285. cfg = rend_service_parse_port_config("100 foo!!.example.com:9000",
  286. " ", &err_msg);
  287. UNMOCK(tor_addr_lookup);
  288. tt_ptr_op(cfg, OP_EQ, NULL);
  289. tt_str_op(err_msg, OP_EQ, "Unparseable address in hidden service port "
  290. "configuration.");
  291. tor_free(err_msg);
  292. /* bogus port port */
  293. cfg = rend_service_parse_port_config("100 99999",
  294. " ", &err_msg);
  295. tt_ptr_op(cfg, OP_EQ, NULL);
  296. tt_str_op(err_msg, OP_EQ, "Unparseable or out-of-range port \"99999\" "
  297. "in hidden service port configuration.");
  298. tor_free(err_msg);
  299. done:
  300. rend_service_port_config_free(cfg);
  301. tor_free(err_msg);
  302. }
  303. static void
  304. test_add_onion_helper_clientauth(void *arg)
  305. {
  306. rend_authorized_client_t *client = NULL;
  307. char *err_msg = NULL;
  308. int created = 0;
  309. (void)arg;
  310. /* Test "ClientName" only. */
  311. client = add_onion_helper_clientauth("alice", &created, &err_msg);
  312. tt_assert(client);
  313. tt_assert(created);
  314. tt_ptr_op(err_msg, OP_EQ, NULL);
  315. rend_authorized_client_free(client);
  316. /* Test "ClientName:Blob" */
  317. client = add_onion_helper_clientauth("alice:475hGBHPlq7Mc0cRZitK/B",
  318. &created, &err_msg);
  319. tt_assert(client);
  320. tt_assert(!created);
  321. tt_ptr_op(err_msg, OP_EQ, NULL);
  322. rend_authorized_client_free(client);
  323. /* Test invalid client names */
  324. client = add_onion_helper_clientauth("no*asterisks*allowed", &created,
  325. &err_msg);
  326. tt_ptr_op(client, OP_EQ, NULL);
  327. tt_assert(err_msg);
  328. tor_free(err_msg);
  329. /* Test invalid auth cookie */
  330. client = add_onion_helper_clientauth("alice:12345", &created, &err_msg);
  331. tt_ptr_op(client, OP_EQ, NULL);
  332. tt_assert(err_msg);
  333. tor_free(err_msg);
  334. /* Test invalid syntax */
  335. client = add_onion_helper_clientauth(":475hGBHPlq7Mc0cRZitK/B", &created,
  336. &err_msg);
  337. tt_ptr_op(client, OP_EQ, NULL);
  338. tt_assert(err_msg);
  339. tor_free(err_msg);
  340. done:
  341. rend_authorized_client_free(client);
  342. tor_free(err_msg);
  343. }
  344. /* Mocks and data/variables used for GETINFO download status tests */
  345. static const download_status_t dl_status_default =
  346. { 0, 0, 0, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER,
  347. DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 };
  348. static download_status_t ns_dl_status[N_CONSENSUS_FLAVORS];
  349. static download_status_t ns_dl_status_bootstrap[N_CONSENSUS_FLAVORS];
  350. static download_status_t ns_dl_status_running[N_CONSENSUS_FLAVORS];
  351. /*
  352. * These should explore all the possible cases of download_status_to_string()
  353. * in control.c
  354. */
  355. static const download_status_t dls_sample_1 =
  356. { 1467163900, 0, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER,
  357. DL_SCHED_INCREMENT_FAILURE, DL_SCHED_DETERMINISTIC, 0, 0 };
  358. static const char * dls_sample_1_str =
  359. "next-attempt-at 2016-06-29 01:31:40\n"
  360. "n-download-failures 0\n"
  361. "n-download-attempts 0\n"
  362. "schedule DL_SCHED_GENERIC\n"
  363. "want-authority DL_WANT_ANY_DIRSERVER\n"
  364. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  365. "backoff DL_SCHED_DETERMINISTIC\n";
  366. static const download_status_t dls_sample_2 =
  367. { 1467164400, 1, 2, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY,
  368. DL_SCHED_INCREMENT_FAILURE, DL_SCHED_DETERMINISTIC, 0, 0 };
  369. static const char * dls_sample_2_str =
  370. "next-attempt-at 2016-06-29 01:40:00\n"
  371. "n-download-failures 1\n"
  372. "n-download-attempts 2\n"
  373. "schedule DL_SCHED_CONSENSUS\n"
  374. "want-authority DL_WANT_AUTHORITY\n"
  375. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  376. "backoff DL_SCHED_DETERMINISTIC\n";
  377. static const download_status_t dls_sample_3 =
  378. { 1467154400, 12, 25, DL_SCHED_BRIDGE, DL_WANT_ANY_DIRSERVER,
  379. DL_SCHED_INCREMENT_ATTEMPT, DL_SCHED_DETERMINISTIC, 0, 0 };
  380. static const char * dls_sample_3_str =
  381. "next-attempt-at 2016-06-28 22:53:20\n"
  382. "n-download-failures 12\n"
  383. "n-download-attempts 25\n"
  384. "schedule DL_SCHED_BRIDGE\n"
  385. "want-authority DL_WANT_ANY_DIRSERVER\n"
  386. "increment-on DL_SCHED_INCREMENT_ATTEMPT\n"
  387. "backoff DL_SCHED_DETERMINISTIC\n";
  388. static const download_status_t dls_sample_4 =
  389. { 1467166600, 3, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER,
  390. DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 };
  391. static const char * dls_sample_4_str =
  392. "next-attempt-at 2016-06-29 02:16:40\n"
  393. "n-download-failures 3\n"
  394. "n-download-attempts 0\n"
  395. "schedule DL_SCHED_GENERIC\n"
  396. "want-authority DL_WANT_ANY_DIRSERVER\n"
  397. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  398. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  399. "last-backoff-position 0\n"
  400. "last-delay-used 0\n";
  401. static const download_status_t dls_sample_5 =
  402. { 1467164600, 3, 7, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER,
  403. DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 1, 2112, };
  404. static const char * dls_sample_5_str =
  405. "next-attempt-at 2016-06-29 01:43:20\n"
  406. "n-download-failures 3\n"
  407. "n-download-attempts 7\n"
  408. "schedule DL_SCHED_CONSENSUS\n"
  409. "want-authority DL_WANT_ANY_DIRSERVER\n"
  410. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  411. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  412. "last-backoff-position 1\n"
  413. "last-delay-used 2112\n";
  414. static const download_status_t dls_sample_6 =
  415. { 1467164200, 4, 9, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY,
  416. DL_SCHED_INCREMENT_ATTEMPT, DL_SCHED_RANDOM_EXPONENTIAL, 3, 432 };
  417. static const char * dls_sample_6_str =
  418. "next-attempt-at 2016-06-29 01:36:40\n"
  419. "n-download-failures 4\n"
  420. "n-download-attempts 9\n"
  421. "schedule DL_SCHED_CONSENSUS\n"
  422. "want-authority DL_WANT_AUTHORITY\n"
  423. "increment-on DL_SCHED_INCREMENT_ATTEMPT\n"
  424. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  425. "last-backoff-position 3\n"
  426. "last-delay-used 432\n";
  427. /* Simulated auth certs */
  428. static const char *auth_id_digest_1_str =
  429. "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061";
  430. static download_status_t auth_def_cert_download_status_1;
  431. static const char *auth_id_digest_2_str =
  432. "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99";
  433. static download_status_t auth_def_cert_download_status_2;
  434. /* Expected form of digest list returned for GETINFO downloads/cert/fps */
  435. static const char *auth_id_digest_expected_list =
  436. "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061\n"
  437. "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99\n";
  438. /* Signing keys for simulated auth 1 */
  439. static const char *auth_1_sk_1_str =
  440. "AA69566029B1F023BA09451B8F1B10952384EB58";
  441. static download_status_t auth_1_sk_1_dls;
  442. static const char *auth_1_sk_2_str =
  443. "710865C7F06B73C5292695A8C34F1C94F769FF72";
  444. static download_status_t auth_1_sk_2_dls;
  445. /*
  446. * Expected form of sk digest list for
  447. * GETINFO downloads/cert/<auth_id_digest_1_str>/sks
  448. */
  449. static const char *auth_1_sk_digest_expected_list =
  450. "AA69566029B1F023BA09451B8F1B10952384EB58\n"
  451. "710865C7F06B73C5292695A8C34F1C94F769FF72\n";
  452. /* Signing keys for simulated auth 2 */
  453. static const char *auth_2_sk_1_str =
  454. "4299047E00D070AD6703FE00BE7AA756DB061E62";
  455. static download_status_t auth_2_sk_1_dls;
  456. static const char *auth_2_sk_2_str =
  457. "9451B8F1B10952384EB58B5F230C0BB701626C9B";
  458. static download_status_t auth_2_sk_2_dls;
  459. /*
  460. * Expected form of sk digest list for
  461. * GETINFO downloads/cert/<auth_id_digest_2_str>/sks
  462. */
  463. static const char *auth_2_sk_digest_expected_list =
  464. "4299047E00D070AD6703FE00BE7AA756DB061E62\n"
  465. "9451B8F1B10952384EB58B5F230C0BB701626C9B\n";
  466. /* Simulated router descriptor digests or bridge identity digests */
  467. static const char *descbr_digest_1_str =
  468. "616408544C7345822696074A1A3DFA16AB381CBD";
  469. static download_status_t descbr_digest_1_dl;
  470. static const char *descbr_digest_2_str =
  471. "06E8067246967265DBCB6641631B530EFEC12DC3";
  472. static download_status_t descbr_digest_2_dl;
  473. /* Expected form of digest list returned for GETINFO downloads/desc/descs */
  474. static const char *descbr_expected_list =
  475. "616408544C7345822696074A1A3DFA16AB381CBD\n"
  476. "06E8067246967265DBCB6641631B530EFEC12DC3\n";
  477. /*
  478. * Flag to make all descbr queries fail, to simulate not being
  479. * configured such that such queries make sense.
  480. */
  481. static int disable_descbr = 0;
  482. static void
  483. reset_mocked_dl_statuses(void)
  484. {
  485. int i;
  486. for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) {
  487. memcpy(&(ns_dl_status[i]), &dl_status_default,
  488. sizeof(download_status_t));
  489. memcpy(&(ns_dl_status_bootstrap[i]), &dl_status_default,
  490. sizeof(download_status_t));
  491. memcpy(&(ns_dl_status_running[i]), &dl_status_default,
  492. sizeof(download_status_t));
  493. }
  494. memcpy(&auth_def_cert_download_status_1, &dl_status_default,
  495. sizeof(download_status_t));
  496. memcpy(&auth_def_cert_download_status_2, &dl_status_default,
  497. sizeof(download_status_t));
  498. memcpy(&auth_1_sk_1_dls, &dl_status_default,
  499. sizeof(download_status_t));
  500. memcpy(&auth_1_sk_2_dls, &dl_status_default,
  501. sizeof(download_status_t));
  502. memcpy(&auth_2_sk_1_dls, &dl_status_default,
  503. sizeof(download_status_t));
  504. memcpy(&auth_2_sk_2_dls, &dl_status_default,
  505. sizeof(download_status_t));
  506. memcpy(&descbr_digest_1_dl, &dl_status_default,
  507. sizeof(download_status_t));
  508. memcpy(&descbr_digest_2_dl, &dl_status_default,
  509. sizeof(download_status_t));
  510. }
  511. static download_status_t *
  512. ns_dl_status_mock(consensus_flavor_t flavor)
  513. {
  514. return &(ns_dl_status[flavor]);
  515. }
  516. static download_status_t *
  517. ns_dl_status_bootstrap_mock(consensus_flavor_t flavor)
  518. {
  519. return &(ns_dl_status_bootstrap[flavor]);
  520. }
  521. static download_status_t *
  522. ns_dl_status_running_mock(consensus_flavor_t flavor)
  523. {
  524. return &(ns_dl_status_running[flavor]);
  525. }
  526. static void
  527. setup_ns_mocks(void)
  528. {
  529. MOCK(networkstatus_get_dl_status_by_flavor, ns_dl_status_mock);
  530. MOCK(networkstatus_get_dl_status_by_flavor_bootstrap,
  531. ns_dl_status_bootstrap_mock);
  532. MOCK(networkstatus_get_dl_status_by_flavor_running,
  533. ns_dl_status_running_mock);
  534. reset_mocked_dl_statuses();
  535. }
  536. static void
  537. clear_ns_mocks(void)
  538. {
  539. UNMOCK(networkstatus_get_dl_status_by_flavor);
  540. UNMOCK(networkstatus_get_dl_status_by_flavor_bootstrap);
  541. UNMOCK(networkstatus_get_dl_status_by_flavor_running);
  542. }
  543. static smartlist_t *
  544. cert_dl_status_auth_ids_mock(void)
  545. {
  546. char digest[DIGEST_LEN], *tmp;
  547. int len;
  548. smartlist_t *list = NULL;
  549. /* Just pretend we have only the two hard-coded digests listed above */
  550. list = smartlist_new();
  551. len = base16_decode(digest, DIGEST_LEN,
  552. auth_id_digest_1_str, strlen(auth_id_digest_1_str));
  553. tt_int_op(len, OP_EQ, DIGEST_LEN);
  554. tmp = tor_malloc(DIGEST_LEN);
  555. memcpy(tmp, digest, DIGEST_LEN);
  556. smartlist_add(list, tmp);
  557. len = base16_decode(digest, DIGEST_LEN,
  558. auth_id_digest_2_str, strlen(auth_id_digest_2_str));
  559. tt_int_op(len, OP_EQ, DIGEST_LEN);
  560. tmp = tor_malloc(DIGEST_LEN);
  561. memcpy(tmp, digest, DIGEST_LEN);
  562. smartlist_add(list, tmp);
  563. done:
  564. return list;
  565. }
  566. static download_status_t *
  567. cert_dl_status_def_for_auth_mock(const char *digest)
  568. {
  569. download_status_t *dl = NULL;
  570. char digest_str[HEX_DIGEST_LEN+1];
  571. tt_ptr_op(digest, OP_NE, NULL);
  572. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  573. digest, DIGEST_LEN);
  574. digest_str[HEX_DIGEST_LEN] = '\0';
  575. if (strcmp(digest_str, auth_id_digest_1_str) == 0) {
  576. dl = &auth_def_cert_download_status_1;
  577. } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) {
  578. dl = &auth_def_cert_download_status_2;
  579. }
  580. done:
  581. return dl;
  582. }
  583. static smartlist_t *
  584. cert_dl_status_sks_for_auth_id_mock(const char *digest)
  585. {
  586. smartlist_t *list = NULL;
  587. char sk[DIGEST_LEN];
  588. char digest_str[HEX_DIGEST_LEN+1];
  589. char *tmp;
  590. int len;
  591. tt_ptr_op(digest, OP_NE, NULL);
  592. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  593. digest, DIGEST_LEN);
  594. digest_str[HEX_DIGEST_LEN] = '\0';
  595. /*
  596. * Build a list of two hard-coded digests, depending on what we
  597. * were just passed.
  598. */
  599. if (strcmp(digest_str, auth_id_digest_1_str) == 0) {
  600. list = smartlist_new();
  601. len = base16_decode(sk, DIGEST_LEN,
  602. auth_1_sk_1_str, strlen(auth_1_sk_1_str));
  603. tt_int_op(len, OP_EQ, DIGEST_LEN);
  604. tmp = tor_malloc(DIGEST_LEN);
  605. memcpy(tmp, sk, DIGEST_LEN);
  606. smartlist_add(list, tmp);
  607. len = base16_decode(sk, DIGEST_LEN,
  608. auth_1_sk_2_str, strlen(auth_1_sk_2_str));
  609. tt_int_op(len, OP_EQ, DIGEST_LEN);
  610. tmp = tor_malloc(DIGEST_LEN);
  611. memcpy(tmp, sk, DIGEST_LEN);
  612. smartlist_add(list, tmp);
  613. } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) {
  614. list = smartlist_new();
  615. len = base16_decode(sk, DIGEST_LEN,
  616. auth_2_sk_1_str, strlen(auth_2_sk_1_str));
  617. tt_int_op(len, OP_EQ, DIGEST_LEN);
  618. tmp = tor_malloc(DIGEST_LEN);
  619. memcpy(tmp, sk, DIGEST_LEN);
  620. smartlist_add(list, tmp);
  621. len = base16_decode(sk, DIGEST_LEN,
  622. auth_2_sk_2_str, strlen(auth_2_sk_2_str));
  623. tt_int_op(len, OP_EQ, DIGEST_LEN);
  624. tmp = tor_malloc(DIGEST_LEN);
  625. memcpy(tmp, sk, DIGEST_LEN);
  626. smartlist_add(list, tmp);
  627. }
  628. done:
  629. return list;
  630. }
  631. static download_status_t *
  632. cert_dl_status_fp_sk_mock(const char *fp_digest, const char *sk_digest)
  633. {
  634. download_status_t *dl = NULL;
  635. char fp_digest_str[HEX_DIGEST_LEN+1], sk_digest_str[HEX_DIGEST_LEN+1];
  636. /*
  637. * Unpack the digests so we can compare them and figure out which
  638. * dl status we want.
  639. */
  640. tt_ptr_op(fp_digest, OP_NE, NULL);
  641. base16_encode(fp_digest_str, HEX_DIGEST_LEN + 1,
  642. fp_digest, DIGEST_LEN);
  643. fp_digest_str[HEX_DIGEST_LEN] = '\0';
  644. tt_ptr_op(sk_digest, OP_NE, NULL);
  645. base16_encode(sk_digest_str, HEX_DIGEST_LEN + 1,
  646. sk_digest, DIGEST_LEN);
  647. sk_digest_str[HEX_DIGEST_LEN] = '\0';
  648. if (strcmp(fp_digest_str, auth_id_digest_1_str) == 0) {
  649. if (strcmp(sk_digest_str, auth_1_sk_1_str) == 0) {
  650. dl = &auth_1_sk_1_dls;
  651. } else if (strcmp(sk_digest_str, auth_1_sk_2_str) == 0) {
  652. dl = &auth_1_sk_2_dls;
  653. }
  654. } else if (strcmp(fp_digest_str, auth_id_digest_2_str) == 0) {
  655. if (strcmp(sk_digest_str, auth_2_sk_1_str) == 0) {
  656. dl = &auth_2_sk_1_dls;
  657. } else if (strcmp(sk_digest_str, auth_2_sk_2_str) == 0) {
  658. dl = &auth_2_sk_2_dls;
  659. }
  660. }
  661. done:
  662. return dl;
  663. }
  664. static void
  665. setup_cert_mocks(void)
  666. {
  667. MOCK(list_authority_ids_with_downloads, cert_dl_status_auth_ids_mock);
  668. MOCK(id_only_download_status_for_authority_id,
  669. cert_dl_status_def_for_auth_mock);
  670. MOCK(list_sk_digests_for_authority_id,
  671. cert_dl_status_sks_for_auth_id_mock);
  672. MOCK(download_status_for_authority_id_and_sk,
  673. cert_dl_status_fp_sk_mock);
  674. reset_mocked_dl_statuses();
  675. }
  676. static void
  677. clear_cert_mocks(void)
  678. {
  679. UNMOCK(list_authority_ids_with_downloads);
  680. UNMOCK(id_only_download_status_for_authority_id);
  681. UNMOCK(list_sk_digests_for_authority_id);
  682. UNMOCK(download_status_for_authority_id_and_sk);
  683. }
  684. static smartlist_t *
  685. descbr_get_digests_mock(void)
  686. {
  687. char digest[DIGEST_LEN], *tmp;
  688. int len;
  689. smartlist_t *list = NULL;
  690. if (!disable_descbr) {
  691. /* Just pretend we have only the two hard-coded digests listed above */
  692. list = smartlist_new();
  693. len = base16_decode(digest, DIGEST_LEN,
  694. descbr_digest_1_str, strlen(descbr_digest_1_str));
  695. tt_int_op(len, OP_EQ, DIGEST_LEN);
  696. tmp = tor_malloc(DIGEST_LEN);
  697. memcpy(tmp, digest, DIGEST_LEN);
  698. smartlist_add(list, tmp);
  699. len = base16_decode(digest, DIGEST_LEN,
  700. descbr_digest_2_str, strlen(descbr_digest_2_str));
  701. tt_int_op(len, OP_EQ, DIGEST_LEN);
  702. tmp = tor_malloc(DIGEST_LEN);
  703. memcpy(tmp, digest, DIGEST_LEN);
  704. smartlist_add(list, tmp);
  705. }
  706. done:
  707. return list;
  708. }
  709. static download_status_t *
  710. descbr_get_dl_by_digest_mock(const char *digest)
  711. {
  712. download_status_t *dl = NULL;
  713. char digest_str[HEX_DIGEST_LEN+1];
  714. if (!disable_descbr) {
  715. tt_ptr_op(digest, OP_NE, NULL);
  716. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  717. digest, DIGEST_LEN);
  718. digest_str[HEX_DIGEST_LEN] = '\0';
  719. if (strcmp(digest_str, descbr_digest_1_str) == 0) {
  720. dl = &descbr_digest_1_dl;
  721. } else if (strcmp(digest_str, descbr_digest_2_str) == 0) {
  722. dl = &descbr_digest_2_dl;
  723. }
  724. }
  725. done:
  726. return dl;
  727. }
  728. static void
  729. setup_desc_mocks(void)
  730. {
  731. MOCK(router_get_descriptor_digests,
  732. descbr_get_digests_mock);
  733. MOCK(router_get_dl_status_by_descriptor_digest,
  734. descbr_get_dl_by_digest_mock);
  735. reset_mocked_dl_statuses();
  736. }
  737. static void
  738. clear_desc_mocks(void)
  739. {
  740. UNMOCK(router_get_descriptor_digests);
  741. UNMOCK(router_get_dl_status_by_descriptor_digest);
  742. }
  743. static void
  744. setup_bridge_mocks(void)
  745. {
  746. disable_descbr = 0;
  747. MOCK(list_bridge_identities,
  748. descbr_get_digests_mock);
  749. MOCK(get_bridge_dl_status_by_id,
  750. descbr_get_dl_by_digest_mock);
  751. reset_mocked_dl_statuses();
  752. }
  753. static void
  754. clear_bridge_mocks(void)
  755. {
  756. UNMOCK(list_bridge_identities);
  757. UNMOCK(get_bridge_dl_status_by_id);
  758. disable_descbr = 0;
  759. }
  760. static void
  761. test_download_status_consensus(void *arg)
  762. {
  763. /* We just need one of these to pass, it doesn't matter what's in it */
  764. control_connection_t dummy;
  765. /* Get results out */
  766. char *answer = NULL;
  767. const char *errmsg = NULL;
  768. (void)arg;
  769. /* Check that the unknown prefix case works; no mocks needed yet */
  770. getinfo_helper_downloads(&dummy, "downloads/foo", &answer, &errmsg);
  771. tt_ptr_op(answer, OP_EQ, NULL);
  772. tt_str_op(errmsg, OP_EQ, "Unknown download status query");
  773. setup_ns_mocks();
  774. /*
  775. * Check returning serialized dlstatuses, and implicitly also test
  776. * download_status_to_string().
  777. */
  778. /* Case 1 default/FLAV_NS*/
  779. memcpy(&(ns_dl_status[FLAV_NS]), &dls_sample_1,
  780. sizeof(download_status_t));
  781. getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns",
  782. &answer, &errmsg);
  783. tt_ptr_op(answer, OP_NE, NULL);
  784. tt_ptr_op(errmsg, OP_EQ, NULL);
  785. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  786. tor_free(answer);
  787. errmsg = NULL;
  788. /* Case 2 default/FLAV_MICRODESC */
  789. memcpy(&(ns_dl_status[FLAV_MICRODESC]), &dls_sample_2,
  790. sizeof(download_status_t));
  791. getinfo_helper_downloads(&dummy, "downloads/networkstatus/microdesc",
  792. &answer, &errmsg);
  793. tt_ptr_op(answer, OP_NE, NULL);
  794. tt_ptr_op(errmsg, OP_EQ, NULL);
  795. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  796. tor_free(answer);
  797. errmsg = NULL;
  798. /* Case 3 bootstrap/FLAV_NS */
  799. memcpy(&(ns_dl_status_bootstrap[FLAV_NS]), &dls_sample_3,
  800. sizeof(download_status_t));
  801. getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns/bootstrap",
  802. &answer, &errmsg);
  803. tt_ptr_op(answer, OP_NE, NULL);
  804. tt_ptr_op(errmsg, OP_EQ, NULL);
  805. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  806. tor_free(answer);
  807. errmsg = NULL;
  808. /* Case 4 bootstrap/FLAV_MICRODESC */
  809. memcpy(&(ns_dl_status_bootstrap[FLAV_MICRODESC]), &dls_sample_4,
  810. sizeof(download_status_t));
  811. getinfo_helper_downloads(&dummy,
  812. "downloads/networkstatus/microdesc/bootstrap",
  813. &answer, &errmsg);
  814. tt_ptr_op(answer, OP_NE, NULL);
  815. tt_ptr_op(errmsg, OP_EQ, NULL);
  816. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  817. tor_free(answer);
  818. errmsg = NULL;
  819. /* Case 5 running/FLAV_NS */
  820. memcpy(&(ns_dl_status_running[FLAV_NS]), &dls_sample_5,
  821. sizeof(download_status_t));
  822. getinfo_helper_downloads(&dummy,
  823. "downloads/networkstatus/ns/running",
  824. &answer, &errmsg);
  825. tt_ptr_op(answer, OP_NE, NULL);
  826. tt_ptr_op(errmsg, OP_EQ, NULL);
  827. tt_str_op(answer, OP_EQ, dls_sample_5_str);
  828. tor_free(answer);
  829. errmsg = NULL;
  830. /* Case 6 running/FLAV_MICRODESC */
  831. memcpy(&(ns_dl_status_running[FLAV_MICRODESC]), &dls_sample_6,
  832. sizeof(download_status_t));
  833. getinfo_helper_downloads(&dummy,
  834. "downloads/networkstatus/microdesc/running",
  835. &answer, &errmsg);
  836. tt_ptr_op(answer, OP_NE, NULL);
  837. tt_ptr_op(errmsg, OP_EQ, NULL);
  838. tt_str_op(answer, OP_EQ, dls_sample_6_str);
  839. tor_free(answer);
  840. errmsg = NULL;
  841. /* Now check the error case */
  842. getinfo_helper_downloads(&dummy, "downloads/networkstatus/foo",
  843. &answer, &errmsg);
  844. tt_ptr_op(answer, OP_EQ, NULL);
  845. tt_ptr_op(errmsg, OP_NE, NULL);
  846. tt_str_op(errmsg, OP_EQ, "Unknown flavor");
  847. errmsg = NULL;
  848. done:
  849. clear_ns_mocks();
  850. tor_free(answer);
  851. return;
  852. }
  853. static void
  854. test_download_status_cert(void *arg)
  855. {
  856. /* We just need one of these to pass, it doesn't matter what's in it */
  857. control_connection_t dummy;
  858. /* Get results out */
  859. char *question = NULL;
  860. char *answer = NULL;
  861. const char *errmsg = NULL;
  862. (void)arg;
  863. setup_cert_mocks();
  864. /*
  865. * Check returning serialized dlstatuses and digest lists, and implicitly
  866. * also test download_status_to_string() and digest_list_to_string().
  867. */
  868. /* Case 1 - list of authority identity fingerprints */
  869. getinfo_helper_downloads(&dummy,
  870. "downloads/cert/fps",
  871. &answer, &errmsg);
  872. tt_ptr_op(answer, OP_NE, NULL);
  873. tt_ptr_op(errmsg, OP_EQ, NULL);
  874. tt_str_op(answer, OP_EQ, auth_id_digest_expected_list);
  875. tor_free(answer);
  876. errmsg = NULL;
  877. /* Case 2 - download status for default cert for 1st auth id */
  878. memcpy(&auth_def_cert_download_status_1, &dls_sample_1,
  879. sizeof(download_status_t));
  880. tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_1_str);
  881. tt_ptr_op(question, OP_NE, NULL);
  882. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  883. tt_ptr_op(answer, OP_NE, NULL);
  884. tt_ptr_op(errmsg, OP_EQ, NULL);
  885. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  886. tor_free(question);
  887. tor_free(answer);
  888. errmsg = NULL;
  889. /* Case 3 - download status for default cert for 2nd auth id */
  890. memcpy(&auth_def_cert_download_status_2, &dls_sample_2,
  891. sizeof(download_status_t));
  892. tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_2_str);
  893. tt_ptr_op(question, OP_NE, NULL);
  894. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  895. tt_ptr_op(answer, OP_NE, NULL);
  896. tt_ptr_op(errmsg, OP_EQ, NULL);
  897. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  898. tor_free(question);
  899. tor_free(answer);
  900. errmsg = NULL;
  901. /* Case 4 - list of signing key digests for 1st auth id */
  902. tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_1_str);
  903. tt_ptr_op(question, OP_NE, NULL);
  904. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  905. tt_ptr_op(answer, OP_NE, NULL);
  906. tt_ptr_op(errmsg, OP_EQ, NULL);
  907. tt_str_op(answer, OP_EQ, auth_1_sk_digest_expected_list);
  908. tor_free(question);
  909. tor_free(answer);
  910. errmsg = NULL;
  911. /* Case 5 - list of signing key digests for 2nd auth id */
  912. tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_2_str);
  913. tt_ptr_op(question, OP_NE, NULL);
  914. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  915. tt_ptr_op(answer, OP_NE, NULL);
  916. tt_ptr_op(errmsg, OP_EQ, NULL);
  917. tt_str_op(answer, OP_EQ, auth_2_sk_digest_expected_list);
  918. tor_free(question);
  919. tor_free(answer);
  920. errmsg = NULL;
  921. /* Case 6 - download status for 1st auth id, 1st sk */
  922. memcpy(&auth_1_sk_1_dls, &dls_sample_3,
  923. sizeof(download_status_t));
  924. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  925. auth_id_digest_1_str, auth_1_sk_1_str);
  926. tt_ptr_op(question, OP_NE, NULL);
  927. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  928. tt_ptr_op(answer, OP_NE, NULL);
  929. tt_ptr_op(errmsg, OP_EQ, NULL);
  930. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  931. tor_free(question);
  932. tor_free(answer);
  933. errmsg = NULL;
  934. /* Case 7 - download status for 1st auth id, 2nd sk */
  935. memcpy(&auth_1_sk_2_dls, &dls_sample_4,
  936. sizeof(download_status_t));
  937. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  938. auth_id_digest_1_str, auth_1_sk_2_str);
  939. tt_ptr_op(question, OP_NE, NULL);
  940. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  941. tt_ptr_op(answer, OP_NE, NULL);
  942. tt_ptr_op(errmsg, OP_EQ, NULL);
  943. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  944. tor_free(question);
  945. tor_free(answer);
  946. errmsg = NULL;
  947. /* Case 8 - download status for 2nd auth id, 1st sk */
  948. memcpy(&auth_2_sk_1_dls, &dls_sample_5,
  949. sizeof(download_status_t));
  950. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  951. auth_id_digest_2_str, auth_2_sk_1_str);
  952. tt_ptr_op(question, OP_NE, NULL);
  953. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  954. tt_ptr_op(answer, OP_NE, NULL);
  955. tt_ptr_op(errmsg, OP_EQ, NULL);
  956. tt_str_op(answer, OP_EQ, dls_sample_5_str);
  957. tor_free(question);
  958. tor_free(answer);
  959. errmsg = NULL;
  960. /* Case 9 - download status for 2nd auth id, 2nd sk */
  961. memcpy(&auth_2_sk_2_dls, &dls_sample_6,
  962. sizeof(download_status_t));
  963. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  964. auth_id_digest_2_str, auth_2_sk_2_str);
  965. tt_ptr_op(question, OP_NE, NULL);
  966. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  967. tt_ptr_op(answer, OP_NE, NULL);
  968. tt_ptr_op(errmsg, OP_EQ, NULL);
  969. tt_str_op(answer, OP_EQ, dls_sample_6_str);
  970. tor_free(question);
  971. tor_free(answer);
  972. errmsg = NULL;
  973. /* Now check the error cases */
  974. /* Case 1 - query is garbage after downloads/cert/ part */
  975. getinfo_helper_downloads(&dummy, "downloads/cert/blahdeblah",
  976. &answer, &errmsg);
  977. tt_ptr_op(answer, OP_EQ, NULL);
  978. tt_ptr_op(errmsg, OP_NE, NULL);
  979. tt_str_op(errmsg, OP_EQ, "Unknown certificate download status query");
  980. errmsg = NULL;
  981. /*
  982. * Case 2 - looks like downloads/cert/fp/<fp>, but <fp> isn't even
  983. * the right length for a digest.
  984. */
  985. getinfo_helper_downloads(&dummy, "downloads/cert/fp/2B1D36D32B2942406",
  986. &answer, &errmsg);
  987. tt_ptr_op(answer, OP_EQ, NULL);
  988. tt_ptr_op(errmsg, OP_NE, NULL);
  989. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  990. errmsg = NULL;
  991. /*
  992. * Case 3 - looks like downloads/cert/fp/<fp>, and <fp> is digest-sized,
  993. * but not parseable as one.
  994. */
  995. getinfo_helper_downloads(&dummy,
  996. "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1",
  997. &answer, &errmsg);
  998. tt_ptr_op(answer, OP_EQ, NULL);
  999. tt_ptr_op(errmsg, OP_NE, NULL);
  1000. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1001. errmsg = NULL;
  1002. /*
  1003. * Case 4 - downloads/cert/fp/<fp>, and <fp> is not a known authority
  1004. * identity digest
  1005. */
  1006. getinfo_helper_downloads(&dummy,
  1007. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61",
  1008. &answer, &errmsg);
  1009. tt_ptr_op(answer, OP_EQ, NULL);
  1010. tt_ptr_op(errmsg, OP_NE, NULL);
  1011. tt_str_op(errmsg, OP_EQ,
  1012. "Failed to get download status for this authority identity digest");
  1013. errmsg = NULL;
  1014. /*
  1015. * Case 5 - looks like downloads/cert/fp/<fp>/<anything>, but <fp> doesn't
  1016. * parse as a sensible digest.
  1017. */
  1018. getinfo_helper_downloads(&dummy,
  1019. "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1/blah",
  1020. &answer, &errmsg);
  1021. tt_ptr_op(answer, OP_EQ, NULL);
  1022. tt_ptr_op(errmsg, OP_NE, NULL);
  1023. tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest");
  1024. errmsg = NULL;
  1025. /*
  1026. * Case 6 - looks like downloads/cert/fp/<fp>/<anything>, but <fp> doesn't
  1027. * parse as a sensible digest.
  1028. */
  1029. getinfo_helper_downloads(&dummy,
  1030. "downloads/cert/fp/82F52AF55D25/blah",
  1031. &answer, &errmsg);
  1032. tt_ptr_op(answer, OP_EQ, NULL);
  1033. tt_ptr_op(errmsg, OP_NE, NULL);
  1034. tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest");
  1035. errmsg = NULL;
  1036. /*
  1037. * Case 7 - downloads/cert/fp/<fp>/sks, and <fp> is not a known authority
  1038. * digest.
  1039. */
  1040. getinfo_helper_downloads(&dummy,
  1041. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/sks",
  1042. &answer, &errmsg);
  1043. tt_ptr_op(answer, OP_EQ, NULL);
  1044. tt_ptr_op(errmsg, OP_NE, NULL);
  1045. tt_str_op(errmsg, OP_EQ,
  1046. "Failed to get list of signing key digests for this authority "
  1047. "identity digest");
  1048. errmsg = NULL;
  1049. /*
  1050. * Case 8 - looks like downloads/cert/fp/<fp>/<sk>, but <sk> doesn't
  1051. * parse as a signing key digest.
  1052. */
  1053. getinfo_helper_downloads(&dummy,
  1054. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/"
  1055. "82F52AF55D250115FE44D3GC81D49643241D56A1",
  1056. &answer, &errmsg);
  1057. tt_ptr_op(answer, OP_EQ, NULL);
  1058. tt_ptr_op(errmsg, OP_NE, NULL);
  1059. tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest");
  1060. errmsg = NULL;
  1061. /*
  1062. * Case 9 - looks like downloads/cert/fp/<fp>/<sk>, but <sk> doesn't
  1063. * parse as a signing key digest.
  1064. */
  1065. getinfo_helper_downloads(&dummy,
  1066. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/"
  1067. "82F52AF55D250115FE44D",
  1068. &answer, &errmsg);
  1069. tt_ptr_op(answer, OP_EQ, NULL);
  1070. tt_ptr_op(errmsg, OP_NE, NULL);
  1071. tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest");
  1072. errmsg = NULL;
  1073. /*
  1074. * Case 10 - downloads/cert/fp/<fp>/<sk>, but <fp> isn't a known
  1075. * authority identity digest.
  1076. */
  1077. getinfo_helper_downloads(&dummy,
  1078. "downloads/cert/fp/C6B05DF332F74DB9A13498EE3BBC7AA2F69FCB45/"
  1079. "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D",
  1080. &answer, &errmsg);
  1081. tt_ptr_op(answer, OP_EQ, NULL);
  1082. tt_ptr_op(errmsg, OP_NE, NULL);
  1083. tt_str_op(errmsg, OP_EQ,
  1084. "Failed to get download status for this identity/"
  1085. "signing key digest pair");
  1086. errmsg = NULL;
  1087. /*
  1088. * Case 11 - downloads/cert/fp/<fp>/<sk>, but <sk> isn't a known
  1089. * signing key digest.
  1090. */
  1091. getinfo_helper_downloads(&dummy,
  1092. "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/"
  1093. "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D",
  1094. &answer, &errmsg);
  1095. tt_ptr_op(answer, OP_EQ, NULL);
  1096. tt_ptr_op(errmsg, OP_NE, NULL);
  1097. tt_str_op(errmsg, OP_EQ,
  1098. "Failed to get download status for this identity/"
  1099. "signing key digest pair");
  1100. errmsg = NULL;
  1101. /*
  1102. * Case 12 - downloads/cert/fp/<fp>/<sk>, but <sk> is on the list for
  1103. * a different authority identity digest.
  1104. */
  1105. getinfo_helper_downloads(&dummy,
  1106. "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/"
  1107. "9451B8F1B10952384EB58B5F230C0BB701626C9B",
  1108. &answer, &errmsg);
  1109. tt_ptr_op(answer, OP_EQ, NULL);
  1110. tt_ptr_op(errmsg, OP_NE, NULL);
  1111. tt_str_op(errmsg, OP_EQ,
  1112. "Failed to get download status for this identity/"
  1113. "signing key digest pair");
  1114. errmsg = NULL;
  1115. done:
  1116. clear_cert_mocks();
  1117. tor_free(answer);
  1118. return;
  1119. }
  1120. static void
  1121. test_download_status_desc(void *arg)
  1122. {
  1123. /* We just need one of these to pass, it doesn't matter what's in it */
  1124. control_connection_t dummy;
  1125. /* Get results out */
  1126. char *question = NULL;
  1127. char *answer = NULL;
  1128. const char *errmsg = NULL;
  1129. (void)arg;
  1130. setup_desc_mocks();
  1131. /*
  1132. * Check returning serialized dlstatuses and digest lists, and implicitly
  1133. * also test download_status_to_string() and digest_list_to_string().
  1134. */
  1135. /* Case 1 - list of router descriptor digests */
  1136. getinfo_helper_downloads(&dummy,
  1137. "downloads/desc/descs",
  1138. &answer, &errmsg);
  1139. tt_ptr_op(answer, OP_NE, NULL);
  1140. tt_ptr_op(errmsg, OP_EQ, NULL);
  1141. tt_str_op(answer, OP_EQ, descbr_expected_list);
  1142. tor_free(answer);
  1143. errmsg = NULL;
  1144. /* Case 2 - get download status for router descriptor 1 */
  1145. memcpy(&descbr_digest_1_dl, &dls_sample_1,
  1146. sizeof(download_status_t));
  1147. tor_asprintf(&question, "downloads/desc/%s", descbr_digest_1_str);
  1148. tt_ptr_op(question, OP_NE, NULL);
  1149. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1150. tt_ptr_op(answer, OP_NE, NULL);
  1151. tt_ptr_op(errmsg, OP_EQ, NULL);
  1152. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  1153. tor_free(question);
  1154. tor_free(answer);
  1155. errmsg = NULL;
  1156. /* Case 3 - get download status for router descriptor 1 */
  1157. memcpy(&descbr_digest_2_dl, &dls_sample_2,
  1158. sizeof(download_status_t));
  1159. tor_asprintf(&question, "downloads/desc/%s", descbr_digest_2_str);
  1160. tt_ptr_op(question, OP_NE, NULL);
  1161. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1162. tt_ptr_op(answer, OP_NE, NULL);
  1163. tt_ptr_op(errmsg, OP_EQ, NULL);
  1164. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  1165. tor_free(question);
  1166. tor_free(answer);
  1167. errmsg = NULL;
  1168. /* Now check the error cases */
  1169. /* Case 1 - non-digest-length garbage after downloads/desc */
  1170. getinfo_helper_downloads(&dummy, "downloads/desc/blahdeblah",
  1171. &answer, &errmsg);
  1172. tt_ptr_op(answer, OP_EQ, NULL);
  1173. tt_ptr_op(errmsg, OP_NE, NULL);
  1174. tt_str_op(errmsg, OP_EQ, "Unknown router descriptor download status query");
  1175. errmsg = NULL;
  1176. /* Case 2 - nonparseable digest-shaped thing */
  1177. getinfo_helper_downloads(
  1178. &dummy,
  1179. "downloads/desc/774EC52FD9A5B80A6FACZE536616E8022E3470AG",
  1180. &answer, &errmsg);
  1181. tt_ptr_op(answer, OP_EQ, NULL);
  1182. tt_ptr_op(errmsg, OP_NE, NULL);
  1183. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1184. errmsg = NULL;
  1185. /* Case 3 - digest we have no descriptor for */
  1186. getinfo_helper_downloads(
  1187. &dummy,
  1188. "downloads/desc/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A",
  1189. &answer, &errmsg);
  1190. tt_ptr_op(answer, OP_EQ, NULL);
  1191. tt_ptr_op(errmsg, OP_NE, NULL);
  1192. tt_str_op(errmsg, OP_EQ, "No such descriptor digest found");
  1193. errmsg = NULL;
  1194. /* Case 4 - microdescs only */
  1195. disable_descbr = 1;
  1196. getinfo_helper_downloads(&dummy,
  1197. "downloads/desc/descs",
  1198. &answer, &errmsg);
  1199. tt_ptr_op(answer, OP_EQ, NULL);
  1200. tt_ptr_op(errmsg, OP_NE, NULL);
  1201. tt_str_op(errmsg, OP_EQ,
  1202. "We don't seem to have a networkstatus-flavored consensus");
  1203. errmsg = NULL;
  1204. disable_descbr = 0;
  1205. done:
  1206. clear_desc_mocks();
  1207. tor_free(answer);
  1208. return;
  1209. }
  1210. static void
  1211. test_download_status_bridge(void *arg)
  1212. {
  1213. /* We just need one of these to pass, it doesn't matter what's in it */
  1214. control_connection_t dummy;
  1215. /* Get results out */
  1216. char *question = NULL;
  1217. char *answer = NULL;
  1218. const char *errmsg = NULL;
  1219. (void)arg;
  1220. setup_bridge_mocks();
  1221. /*
  1222. * Check returning serialized dlstatuses and digest lists, and implicitly
  1223. * also test download_status_to_string() and digest_list_to_string().
  1224. */
  1225. /* Case 1 - list of bridge identity digests */
  1226. getinfo_helper_downloads(&dummy,
  1227. "downloads/bridge/bridges",
  1228. &answer, &errmsg);
  1229. tt_ptr_op(answer, OP_NE, NULL);
  1230. tt_ptr_op(errmsg, OP_EQ, NULL);
  1231. tt_str_op(answer, OP_EQ, descbr_expected_list);
  1232. tor_free(answer);
  1233. errmsg = NULL;
  1234. /* Case 2 - get download status for bridge descriptor 1 */
  1235. memcpy(&descbr_digest_1_dl, &dls_sample_3,
  1236. sizeof(download_status_t));
  1237. tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_1_str);
  1238. tt_ptr_op(question, OP_NE, NULL);
  1239. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1240. tt_ptr_op(answer, OP_NE, NULL);
  1241. tt_ptr_op(errmsg, OP_EQ, NULL);
  1242. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  1243. tor_free(question);
  1244. tor_free(answer);
  1245. errmsg = NULL;
  1246. /* Case 3 - get download status for router descriptor 1 */
  1247. memcpy(&descbr_digest_2_dl, &dls_sample_4,
  1248. sizeof(download_status_t));
  1249. tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_2_str);
  1250. tt_ptr_op(question, OP_NE, NULL);
  1251. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1252. tt_ptr_op(answer, OP_NE, NULL);
  1253. tt_ptr_op(errmsg, OP_EQ, NULL);
  1254. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  1255. tor_free(question);
  1256. tor_free(answer);
  1257. errmsg = NULL;
  1258. /* Now check the error cases */
  1259. /* Case 1 - non-digest-length garbage after downloads/bridge */
  1260. getinfo_helper_downloads(&dummy, "downloads/bridge/blahdeblah",
  1261. &answer, &errmsg);
  1262. tt_ptr_op(answer, OP_EQ, NULL);
  1263. tt_ptr_op(errmsg, OP_NE, NULL);
  1264. tt_str_op(errmsg, OP_EQ, "Unknown bridge descriptor download status query");
  1265. errmsg = NULL;
  1266. /* Case 2 - nonparseable digest-shaped thing */
  1267. getinfo_helper_downloads(
  1268. &dummy,
  1269. "downloads/bridge/774EC52FD9A5B80A6FACZE536616E8022E3470AG",
  1270. &answer, &errmsg);
  1271. tt_ptr_op(answer, OP_EQ, NULL);
  1272. tt_ptr_op(errmsg, OP_NE, NULL);
  1273. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1274. errmsg = NULL;
  1275. /* Case 3 - digest we have no descriptor for */
  1276. getinfo_helper_downloads(
  1277. &dummy,
  1278. "downloads/bridge/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A",
  1279. &answer, &errmsg);
  1280. tt_ptr_op(answer, OP_EQ, NULL);
  1281. tt_ptr_op(errmsg, OP_NE, NULL);
  1282. tt_str_op(errmsg, OP_EQ, "No such bridge identity digest found");
  1283. errmsg = NULL;
  1284. /* Case 4 - bridges disabled */
  1285. disable_descbr = 1;
  1286. getinfo_helper_downloads(&dummy,
  1287. "downloads/bridge/bridges",
  1288. &answer, &errmsg);
  1289. tt_ptr_op(answer, OP_EQ, NULL);
  1290. tt_ptr_op(errmsg, OP_NE, NULL);
  1291. tt_str_op(errmsg, OP_EQ, "We don't seem to be using bridges");
  1292. errmsg = NULL;
  1293. disable_descbr = 0;
  1294. done:
  1295. clear_bridge_mocks();
  1296. tor_free(answer);
  1297. return;
  1298. }
  1299. struct testcase_t controller_tests[] = {
  1300. { "add_onion_helper_keyarg_v2", test_add_onion_helper_keyarg_v2, 0,
  1301. NULL, NULL },
  1302. { "add_onion_helper_keyarg_v3", test_add_onion_helper_keyarg_v3, 0,
  1303. NULL, NULL },
  1304. { "getinfo_helper_onion", test_getinfo_helper_onion, 0, NULL, NULL },
  1305. { "rend_service_parse_port_config", test_rend_service_parse_port_config, 0,
  1306. NULL, NULL },
  1307. { "add_onion_helper_clientauth", test_add_onion_helper_clientauth, 0, NULL,
  1308. NULL },
  1309. { "download_status_consensus", test_download_status_consensus, 0, NULL,
  1310. NULL },
  1311. { "download_status_cert", test_download_status_cert, 0, NULL,
  1312. NULL },
  1313. { "download_status_desc", test_download_status_desc, 0, NULL, NULL },
  1314. { "download_status_bridge", test_download_status_bridge, 0, NULL, NULL },
  1315. END_OF_TESTCASES
  1316. };