test_controller.c 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491
  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, 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, 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_RANDOM_EXPONENTIAL\n"
  366. "last-backoff-position 0\n"
  367. "last-delay-used 0\n";
  368. static const download_status_t dls_sample_2 =
  369. { 1467164400, 1, 2, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY,
  370. DL_SCHED_INCREMENT_FAILURE, 0, 0 };
  371. static const char * dls_sample_2_str =
  372. "next-attempt-at 2016-06-29 01:40:00\n"
  373. "n-download-failures 1\n"
  374. "n-download-attempts 2\n"
  375. "schedule DL_SCHED_CONSENSUS\n"
  376. "want-authority DL_WANT_AUTHORITY\n"
  377. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  378. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  379. "last-backoff-position 0\n"
  380. "last-delay-used 0\n";
  381. static const download_status_t dls_sample_3 =
  382. { 1467154400, 12, 25, DL_SCHED_BRIDGE, DL_WANT_ANY_DIRSERVER,
  383. DL_SCHED_INCREMENT_ATTEMPT, 0, 0 };
  384. static const char * dls_sample_3_str =
  385. "next-attempt-at 2016-06-28 22:53:20\n"
  386. "n-download-failures 12\n"
  387. "n-download-attempts 25\n"
  388. "schedule DL_SCHED_BRIDGE\n"
  389. "want-authority DL_WANT_ANY_DIRSERVER\n"
  390. "increment-on DL_SCHED_INCREMENT_ATTEMPT\n"
  391. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  392. "last-backoff-position 0\n"
  393. "last-delay-used 0\n";
  394. static const download_status_t dls_sample_4 =
  395. { 1467166600, 3, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER,
  396. DL_SCHED_INCREMENT_FAILURE, 0, 0 };
  397. static const char * dls_sample_4_str =
  398. "next-attempt-at 2016-06-29 02:16:40\n"
  399. "n-download-failures 3\n"
  400. "n-download-attempts 0\n"
  401. "schedule DL_SCHED_GENERIC\n"
  402. "want-authority DL_WANT_ANY_DIRSERVER\n"
  403. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  404. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  405. "last-backoff-position 0\n"
  406. "last-delay-used 0\n";
  407. static const download_status_t dls_sample_5 =
  408. { 1467164600, 3, 7, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER,
  409. DL_SCHED_INCREMENT_FAILURE, 1, 2112, };
  410. static const char * dls_sample_5_str =
  411. "next-attempt-at 2016-06-29 01:43:20\n"
  412. "n-download-failures 3\n"
  413. "n-download-attempts 7\n"
  414. "schedule DL_SCHED_CONSENSUS\n"
  415. "want-authority DL_WANT_ANY_DIRSERVER\n"
  416. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  417. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  418. "last-backoff-position 1\n"
  419. "last-delay-used 2112\n";
  420. static const download_status_t dls_sample_6 =
  421. { 1467164200, 4, 9, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY,
  422. DL_SCHED_INCREMENT_ATTEMPT, 3, 432 };
  423. static const char * dls_sample_6_str =
  424. "next-attempt-at 2016-06-29 01:36:40\n"
  425. "n-download-failures 4\n"
  426. "n-download-attempts 9\n"
  427. "schedule DL_SCHED_CONSENSUS\n"
  428. "want-authority DL_WANT_AUTHORITY\n"
  429. "increment-on DL_SCHED_INCREMENT_ATTEMPT\n"
  430. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  431. "last-backoff-position 3\n"
  432. "last-delay-used 432\n";
  433. /* Simulated auth certs */
  434. static const char *auth_id_digest_1_str =
  435. "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061";
  436. static download_status_t auth_def_cert_download_status_1;
  437. static const char *auth_id_digest_2_str =
  438. "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99";
  439. static download_status_t auth_def_cert_download_status_2;
  440. /* Expected form of digest list returned for GETINFO downloads/cert/fps */
  441. static const char *auth_id_digest_expected_list =
  442. "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061\n"
  443. "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99\n";
  444. /* Signing keys for simulated auth 1 */
  445. static const char *auth_1_sk_1_str =
  446. "AA69566029B1F023BA09451B8F1B10952384EB58";
  447. static download_status_t auth_1_sk_1_dls;
  448. static const char *auth_1_sk_2_str =
  449. "710865C7F06B73C5292695A8C34F1C94F769FF72";
  450. static download_status_t auth_1_sk_2_dls;
  451. /*
  452. * Expected form of sk digest list for
  453. * GETINFO downloads/cert/<auth_id_digest_1_str>/sks
  454. */
  455. static const char *auth_1_sk_digest_expected_list =
  456. "AA69566029B1F023BA09451B8F1B10952384EB58\n"
  457. "710865C7F06B73C5292695A8C34F1C94F769FF72\n";
  458. /* Signing keys for simulated auth 2 */
  459. static const char *auth_2_sk_1_str =
  460. "4299047E00D070AD6703FE00BE7AA756DB061E62";
  461. static download_status_t auth_2_sk_1_dls;
  462. static const char *auth_2_sk_2_str =
  463. "9451B8F1B10952384EB58B5F230C0BB701626C9B";
  464. static download_status_t auth_2_sk_2_dls;
  465. /*
  466. * Expected form of sk digest list for
  467. * GETINFO downloads/cert/<auth_id_digest_2_str>/sks
  468. */
  469. static const char *auth_2_sk_digest_expected_list =
  470. "4299047E00D070AD6703FE00BE7AA756DB061E62\n"
  471. "9451B8F1B10952384EB58B5F230C0BB701626C9B\n";
  472. /* Simulated router descriptor digests or bridge identity digests */
  473. static const char *descbr_digest_1_str =
  474. "616408544C7345822696074A1A3DFA16AB381CBD";
  475. static download_status_t descbr_digest_1_dl;
  476. static const char *descbr_digest_2_str =
  477. "06E8067246967265DBCB6641631B530EFEC12DC3";
  478. static download_status_t descbr_digest_2_dl;
  479. /* Expected form of digest list returned for GETINFO downloads/desc/descs */
  480. static const char *descbr_expected_list =
  481. "616408544C7345822696074A1A3DFA16AB381CBD\n"
  482. "06E8067246967265DBCB6641631B530EFEC12DC3\n";
  483. /*
  484. * Flag to make all descbr queries fail, to simulate not being
  485. * configured such that such queries make sense.
  486. */
  487. static int disable_descbr = 0;
  488. static void
  489. reset_mocked_dl_statuses(void)
  490. {
  491. int i;
  492. for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) {
  493. memcpy(&(ns_dl_status[i]), &dl_status_default,
  494. sizeof(download_status_t));
  495. memcpy(&(ns_dl_status_bootstrap[i]), &dl_status_default,
  496. sizeof(download_status_t));
  497. memcpy(&(ns_dl_status_running[i]), &dl_status_default,
  498. sizeof(download_status_t));
  499. }
  500. memcpy(&auth_def_cert_download_status_1, &dl_status_default,
  501. sizeof(download_status_t));
  502. memcpy(&auth_def_cert_download_status_2, &dl_status_default,
  503. sizeof(download_status_t));
  504. memcpy(&auth_1_sk_1_dls, &dl_status_default,
  505. sizeof(download_status_t));
  506. memcpy(&auth_1_sk_2_dls, &dl_status_default,
  507. sizeof(download_status_t));
  508. memcpy(&auth_2_sk_1_dls, &dl_status_default,
  509. sizeof(download_status_t));
  510. memcpy(&auth_2_sk_2_dls, &dl_status_default,
  511. sizeof(download_status_t));
  512. memcpy(&descbr_digest_1_dl, &dl_status_default,
  513. sizeof(download_status_t));
  514. memcpy(&descbr_digest_2_dl, &dl_status_default,
  515. sizeof(download_status_t));
  516. }
  517. static download_status_t *
  518. ns_dl_status_mock(consensus_flavor_t flavor)
  519. {
  520. return &(ns_dl_status[flavor]);
  521. }
  522. static download_status_t *
  523. ns_dl_status_bootstrap_mock(consensus_flavor_t flavor)
  524. {
  525. return &(ns_dl_status_bootstrap[flavor]);
  526. }
  527. static download_status_t *
  528. ns_dl_status_running_mock(consensus_flavor_t flavor)
  529. {
  530. return &(ns_dl_status_running[flavor]);
  531. }
  532. static void
  533. setup_ns_mocks(void)
  534. {
  535. MOCK(networkstatus_get_dl_status_by_flavor, ns_dl_status_mock);
  536. MOCK(networkstatus_get_dl_status_by_flavor_bootstrap,
  537. ns_dl_status_bootstrap_mock);
  538. MOCK(networkstatus_get_dl_status_by_flavor_running,
  539. ns_dl_status_running_mock);
  540. reset_mocked_dl_statuses();
  541. }
  542. static void
  543. clear_ns_mocks(void)
  544. {
  545. UNMOCK(networkstatus_get_dl_status_by_flavor);
  546. UNMOCK(networkstatus_get_dl_status_by_flavor_bootstrap);
  547. UNMOCK(networkstatus_get_dl_status_by_flavor_running);
  548. }
  549. static smartlist_t *
  550. cert_dl_status_auth_ids_mock(void)
  551. {
  552. char digest[DIGEST_LEN], *tmp;
  553. int len;
  554. smartlist_t *list = NULL;
  555. /* Just pretend we have only the two hard-coded digests listed above */
  556. list = smartlist_new();
  557. len = base16_decode(digest, DIGEST_LEN,
  558. auth_id_digest_1_str, strlen(auth_id_digest_1_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. len = base16_decode(digest, DIGEST_LEN,
  564. auth_id_digest_2_str, strlen(auth_id_digest_2_str));
  565. tt_int_op(len, OP_EQ, DIGEST_LEN);
  566. tmp = tor_malloc(DIGEST_LEN);
  567. memcpy(tmp, digest, DIGEST_LEN);
  568. smartlist_add(list, tmp);
  569. done:
  570. return list;
  571. }
  572. static download_status_t *
  573. cert_dl_status_def_for_auth_mock(const char *digest)
  574. {
  575. download_status_t *dl = NULL;
  576. char digest_str[HEX_DIGEST_LEN+1];
  577. tt_ptr_op(digest, OP_NE, NULL);
  578. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  579. digest, DIGEST_LEN);
  580. digest_str[HEX_DIGEST_LEN] = '\0';
  581. if (strcmp(digest_str, auth_id_digest_1_str) == 0) {
  582. dl = &auth_def_cert_download_status_1;
  583. } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) {
  584. dl = &auth_def_cert_download_status_2;
  585. }
  586. done:
  587. return dl;
  588. }
  589. static smartlist_t *
  590. cert_dl_status_sks_for_auth_id_mock(const char *digest)
  591. {
  592. smartlist_t *list = NULL;
  593. char sk[DIGEST_LEN];
  594. char digest_str[HEX_DIGEST_LEN+1];
  595. char *tmp;
  596. int len;
  597. tt_ptr_op(digest, OP_NE, NULL);
  598. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  599. digest, DIGEST_LEN);
  600. digest_str[HEX_DIGEST_LEN] = '\0';
  601. /*
  602. * Build a list of two hard-coded digests, depending on what we
  603. * were just passed.
  604. */
  605. if (strcmp(digest_str, auth_id_digest_1_str) == 0) {
  606. list = smartlist_new();
  607. len = base16_decode(sk, DIGEST_LEN,
  608. auth_1_sk_1_str, strlen(auth_1_sk_1_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. len = base16_decode(sk, DIGEST_LEN,
  614. auth_1_sk_2_str, strlen(auth_1_sk_2_str));
  615. tt_int_op(len, OP_EQ, DIGEST_LEN);
  616. tmp = tor_malloc(DIGEST_LEN);
  617. memcpy(tmp, sk, DIGEST_LEN);
  618. smartlist_add(list, tmp);
  619. } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) {
  620. list = smartlist_new();
  621. len = base16_decode(sk, DIGEST_LEN,
  622. auth_2_sk_1_str, strlen(auth_2_sk_1_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. len = base16_decode(sk, DIGEST_LEN,
  628. auth_2_sk_2_str, strlen(auth_2_sk_2_str));
  629. tt_int_op(len, OP_EQ, DIGEST_LEN);
  630. tmp = tor_malloc(DIGEST_LEN);
  631. memcpy(tmp, sk, DIGEST_LEN);
  632. smartlist_add(list, tmp);
  633. }
  634. done:
  635. return list;
  636. }
  637. static download_status_t *
  638. cert_dl_status_fp_sk_mock(const char *fp_digest, const char *sk_digest)
  639. {
  640. download_status_t *dl = NULL;
  641. char fp_digest_str[HEX_DIGEST_LEN+1], sk_digest_str[HEX_DIGEST_LEN+1];
  642. /*
  643. * Unpack the digests so we can compare them and figure out which
  644. * dl status we want.
  645. */
  646. tt_ptr_op(fp_digest, OP_NE, NULL);
  647. base16_encode(fp_digest_str, HEX_DIGEST_LEN + 1,
  648. fp_digest, DIGEST_LEN);
  649. fp_digest_str[HEX_DIGEST_LEN] = '\0';
  650. tt_ptr_op(sk_digest, OP_NE, NULL);
  651. base16_encode(sk_digest_str, HEX_DIGEST_LEN + 1,
  652. sk_digest, DIGEST_LEN);
  653. sk_digest_str[HEX_DIGEST_LEN] = '\0';
  654. if (strcmp(fp_digest_str, auth_id_digest_1_str) == 0) {
  655. if (strcmp(sk_digest_str, auth_1_sk_1_str) == 0) {
  656. dl = &auth_1_sk_1_dls;
  657. } else if (strcmp(sk_digest_str, auth_1_sk_2_str) == 0) {
  658. dl = &auth_1_sk_2_dls;
  659. }
  660. } else if (strcmp(fp_digest_str, auth_id_digest_2_str) == 0) {
  661. if (strcmp(sk_digest_str, auth_2_sk_1_str) == 0) {
  662. dl = &auth_2_sk_1_dls;
  663. } else if (strcmp(sk_digest_str, auth_2_sk_2_str) == 0) {
  664. dl = &auth_2_sk_2_dls;
  665. }
  666. }
  667. done:
  668. return dl;
  669. }
  670. static void
  671. setup_cert_mocks(void)
  672. {
  673. MOCK(list_authority_ids_with_downloads, cert_dl_status_auth_ids_mock);
  674. MOCK(id_only_download_status_for_authority_id,
  675. cert_dl_status_def_for_auth_mock);
  676. MOCK(list_sk_digests_for_authority_id,
  677. cert_dl_status_sks_for_auth_id_mock);
  678. MOCK(download_status_for_authority_id_and_sk,
  679. cert_dl_status_fp_sk_mock);
  680. reset_mocked_dl_statuses();
  681. }
  682. static void
  683. clear_cert_mocks(void)
  684. {
  685. UNMOCK(list_authority_ids_with_downloads);
  686. UNMOCK(id_only_download_status_for_authority_id);
  687. UNMOCK(list_sk_digests_for_authority_id);
  688. UNMOCK(download_status_for_authority_id_and_sk);
  689. }
  690. static smartlist_t *
  691. descbr_get_digests_mock(void)
  692. {
  693. char digest[DIGEST_LEN], *tmp;
  694. int len;
  695. smartlist_t *list = NULL;
  696. if (!disable_descbr) {
  697. /* Just pretend we have only the two hard-coded digests listed above */
  698. list = smartlist_new();
  699. len = base16_decode(digest, DIGEST_LEN,
  700. descbr_digest_1_str, strlen(descbr_digest_1_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. len = base16_decode(digest, DIGEST_LEN,
  706. descbr_digest_2_str, strlen(descbr_digest_2_str));
  707. tt_int_op(len, OP_EQ, DIGEST_LEN);
  708. tmp = tor_malloc(DIGEST_LEN);
  709. memcpy(tmp, digest, DIGEST_LEN);
  710. smartlist_add(list, tmp);
  711. }
  712. done:
  713. return list;
  714. }
  715. static download_status_t *
  716. descbr_get_dl_by_digest_mock(const char *digest)
  717. {
  718. download_status_t *dl = NULL;
  719. char digest_str[HEX_DIGEST_LEN+1];
  720. if (!disable_descbr) {
  721. tt_ptr_op(digest, OP_NE, NULL);
  722. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  723. digest, DIGEST_LEN);
  724. digest_str[HEX_DIGEST_LEN] = '\0';
  725. if (strcmp(digest_str, descbr_digest_1_str) == 0) {
  726. dl = &descbr_digest_1_dl;
  727. } else if (strcmp(digest_str, descbr_digest_2_str) == 0) {
  728. dl = &descbr_digest_2_dl;
  729. }
  730. }
  731. done:
  732. return dl;
  733. }
  734. static void
  735. setup_desc_mocks(void)
  736. {
  737. MOCK(router_get_descriptor_digests,
  738. descbr_get_digests_mock);
  739. MOCK(router_get_dl_status_by_descriptor_digest,
  740. descbr_get_dl_by_digest_mock);
  741. reset_mocked_dl_statuses();
  742. }
  743. static void
  744. clear_desc_mocks(void)
  745. {
  746. UNMOCK(router_get_descriptor_digests);
  747. UNMOCK(router_get_dl_status_by_descriptor_digest);
  748. }
  749. static void
  750. setup_bridge_mocks(void)
  751. {
  752. disable_descbr = 0;
  753. MOCK(list_bridge_identities,
  754. descbr_get_digests_mock);
  755. MOCK(get_bridge_dl_status_by_id,
  756. descbr_get_dl_by_digest_mock);
  757. reset_mocked_dl_statuses();
  758. }
  759. static void
  760. clear_bridge_mocks(void)
  761. {
  762. UNMOCK(list_bridge_identities);
  763. UNMOCK(get_bridge_dl_status_by_id);
  764. disable_descbr = 0;
  765. }
  766. static void
  767. test_download_status_consensus(void *arg)
  768. {
  769. /* We just need one of these to pass, it doesn't matter what's in it */
  770. control_connection_t dummy;
  771. /* Get results out */
  772. char *answer = NULL;
  773. const char *errmsg = NULL;
  774. (void)arg;
  775. /* Check that the unknown prefix case works; no mocks needed yet */
  776. getinfo_helper_downloads(&dummy, "downloads/foo", &answer, &errmsg);
  777. tt_ptr_op(answer, OP_EQ, NULL);
  778. tt_str_op(errmsg, OP_EQ, "Unknown download status query");
  779. setup_ns_mocks();
  780. /*
  781. * Check returning serialized dlstatuses, and implicitly also test
  782. * download_status_to_string().
  783. */
  784. /* Case 1 default/FLAV_NS*/
  785. memcpy(&(ns_dl_status[FLAV_NS]), &dls_sample_1,
  786. sizeof(download_status_t));
  787. getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns",
  788. &answer, &errmsg);
  789. tt_ptr_op(answer, OP_NE, NULL);
  790. tt_ptr_op(errmsg, OP_EQ, NULL);
  791. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  792. tor_free(answer);
  793. errmsg = NULL;
  794. /* Case 2 default/FLAV_MICRODESC */
  795. memcpy(&(ns_dl_status[FLAV_MICRODESC]), &dls_sample_2,
  796. sizeof(download_status_t));
  797. getinfo_helper_downloads(&dummy, "downloads/networkstatus/microdesc",
  798. &answer, &errmsg);
  799. tt_ptr_op(answer, OP_NE, NULL);
  800. tt_ptr_op(errmsg, OP_EQ, NULL);
  801. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  802. tor_free(answer);
  803. errmsg = NULL;
  804. /* Case 3 bootstrap/FLAV_NS */
  805. memcpy(&(ns_dl_status_bootstrap[FLAV_NS]), &dls_sample_3,
  806. sizeof(download_status_t));
  807. getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns/bootstrap",
  808. &answer, &errmsg);
  809. tt_ptr_op(answer, OP_NE, NULL);
  810. tt_ptr_op(errmsg, OP_EQ, NULL);
  811. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  812. tor_free(answer);
  813. errmsg = NULL;
  814. /* Case 4 bootstrap/FLAV_MICRODESC */
  815. memcpy(&(ns_dl_status_bootstrap[FLAV_MICRODESC]), &dls_sample_4,
  816. sizeof(download_status_t));
  817. getinfo_helper_downloads(&dummy,
  818. "downloads/networkstatus/microdesc/bootstrap",
  819. &answer, &errmsg);
  820. tt_ptr_op(answer, OP_NE, NULL);
  821. tt_ptr_op(errmsg, OP_EQ, NULL);
  822. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  823. tor_free(answer);
  824. errmsg = NULL;
  825. /* Case 5 running/FLAV_NS */
  826. memcpy(&(ns_dl_status_running[FLAV_NS]), &dls_sample_5,
  827. sizeof(download_status_t));
  828. getinfo_helper_downloads(&dummy,
  829. "downloads/networkstatus/ns/running",
  830. &answer, &errmsg);
  831. tt_ptr_op(answer, OP_NE, NULL);
  832. tt_ptr_op(errmsg, OP_EQ, NULL);
  833. tt_str_op(answer, OP_EQ, dls_sample_5_str);
  834. tor_free(answer);
  835. errmsg = NULL;
  836. /* Case 6 running/FLAV_MICRODESC */
  837. memcpy(&(ns_dl_status_running[FLAV_MICRODESC]), &dls_sample_6,
  838. sizeof(download_status_t));
  839. getinfo_helper_downloads(&dummy,
  840. "downloads/networkstatus/microdesc/running",
  841. &answer, &errmsg);
  842. tt_ptr_op(answer, OP_NE, NULL);
  843. tt_ptr_op(errmsg, OP_EQ, NULL);
  844. tt_str_op(answer, OP_EQ, dls_sample_6_str);
  845. tor_free(answer);
  846. errmsg = NULL;
  847. /* Now check the error case */
  848. getinfo_helper_downloads(&dummy, "downloads/networkstatus/foo",
  849. &answer, &errmsg);
  850. tt_ptr_op(answer, OP_EQ, NULL);
  851. tt_ptr_op(errmsg, OP_NE, NULL);
  852. tt_str_op(errmsg, OP_EQ, "Unknown flavor");
  853. errmsg = NULL;
  854. done:
  855. clear_ns_mocks();
  856. tor_free(answer);
  857. return;
  858. }
  859. static void
  860. test_download_status_cert(void *arg)
  861. {
  862. /* We just need one of these to pass, it doesn't matter what's in it */
  863. control_connection_t dummy;
  864. /* Get results out */
  865. char *question = NULL;
  866. char *answer = NULL;
  867. const char *errmsg = NULL;
  868. (void)arg;
  869. setup_cert_mocks();
  870. /*
  871. * Check returning serialized dlstatuses and digest lists, and implicitly
  872. * also test download_status_to_string() and digest_list_to_string().
  873. */
  874. /* Case 1 - list of authority identity fingerprints */
  875. getinfo_helper_downloads(&dummy,
  876. "downloads/cert/fps",
  877. &answer, &errmsg);
  878. tt_ptr_op(answer, OP_NE, NULL);
  879. tt_ptr_op(errmsg, OP_EQ, NULL);
  880. tt_str_op(answer, OP_EQ, auth_id_digest_expected_list);
  881. tor_free(answer);
  882. errmsg = NULL;
  883. /* Case 2 - download status for default cert for 1st auth id */
  884. memcpy(&auth_def_cert_download_status_1, &dls_sample_1,
  885. sizeof(download_status_t));
  886. tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_1_str);
  887. tt_ptr_op(question, OP_NE, NULL);
  888. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  889. tt_ptr_op(answer, OP_NE, NULL);
  890. tt_ptr_op(errmsg, OP_EQ, NULL);
  891. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  892. tor_free(question);
  893. tor_free(answer);
  894. errmsg = NULL;
  895. /* Case 3 - download status for default cert for 2nd auth id */
  896. memcpy(&auth_def_cert_download_status_2, &dls_sample_2,
  897. sizeof(download_status_t));
  898. tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_2_str);
  899. tt_ptr_op(question, OP_NE, NULL);
  900. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  901. tt_ptr_op(answer, OP_NE, NULL);
  902. tt_ptr_op(errmsg, OP_EQ, NULL);
  903. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  904. tor_free(question);
  905. tor_free(answer);
  906. errmsg = NULL;
  907. /* Case 4 - list of signing key digests for 1st auth id */
  908. tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_1_str);
  909. tt_ptr_op(question, OP_NE, NULL);
  910. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  911. tt_ptr_op(answer, OP_NE, NULL);
  912. tt_ptr_op(errmsg, OP_EQ, NULL);
  913. tt_str_op(answer, OP_EQ, auth_1_sk_digest_expected_list);
  914. tor_free(question);
  915. tor_free(answer);
  916. errmsg = NULL;
  917. /* Case 5 - list of signing key digests for 2nd auth id */
  918. tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_2_str);
  919. tt_ptr_op(question, OP_NE, NULL);
  920. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  921. tt_ptr_op(answer, OP_NE, NULL);
  922. tt_ptr_op(errmsg, OP_EQ, NULL);
  923. tt_str_op(answer, OP_EQ, auth_2_sk_digest_expected_list);
  924. tor_free(question);
  925. tor_free(answer);
  926. errmsg = NULL;
  927. /* Case 6 - download status for 1st auth id, 1st sk */
  928. memcpy(&auth_1_sk_1_dls, &dls_sample_3,
  929. sizeof(download_status_t));
  930. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  931. auth_id_digest_1_str, auth_1_sk_1_str);
  932. tt_ptr_op(question, OP_NE, NULL);
  933. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  934. tt_ptr_op(answer, OP_NE, NULL);
  935. tt_ptr_op(errmsg, OP_EQ, NULL);
  936. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  937. tor_free(question);
  938. tor_free(answer);
  939. errmsg = NULL;
  940. /* Case 7 - download status for 1st auth id, 2nd sk */
  941. memcpy(&auth_1_sk_2_dls, &dls_sample_4,
  942. sizeof(download_status_t));
  943. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  944. auth_id_digest_1_str, auth_1_sk_2_str);
  945. tt_ptr_op(question, OP_NE, NULL);
  946. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  947. tt_ptr_op(answer, OP_NE, NULL);
  948. tt_ptr_op(errmsg, OP_EQ, NULL);
  949. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  950. tor_free(question);
  951. tor_free(answer);
  952. errmsg = NULL;
  953. /* Case 8 - download status for 2nd auth id, 1st sk */
  954. memcpy(&auth_2_sk_1_dls, &dls_sample_5,
  955. sizeof(download_status_t));
  956. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  957. auth_id_digest_2_str, auth_2_sk_1_str);
  958. tt_ptr_op(question, OP_NE, NULL);
  959. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  960. tt_ptr_op(answer, OP_NE, NULL);
  961. tt_ptr_op(errmsg, OP_EQ, NULL);
  962. tt_str_op(answer, OP_EQ, dls_sample_5_str);
  963. tor_free(question);
  964. tor_free(answer);
  965. errmsg = NULL;
  966. /* Case 9 - download status for 2nd auth id, 2nd sk */
  967. memcpy(&auth_2_sk_2_dls, &dls_sample_6,
  968. sizeof(download_status_t));
  969. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  970. auth_id_digest_2_str, auth_2_sk_2_str);
  971. tt_ptr_op(question, OP_NE, NULL);
  972. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  973. tt_ptr_op(answer, OP_NE, NULL);
  974. tt_ptr_op(errmsg, OP_EQ, NULL);
  975. tt_str_op(answer, OP_EQ, dls_sample_6_str);
  976. tor_free(question);
  977. tor_free(answer);
  978. errmsg = NULL;
  979. /* Now check the error cases */
  980. /* Case 1 - query is garbage after downloads/cert/ part */
  981. getinfo_helper_downloads(&dummy, "downloads/cert/blahdeblah",
  982. &answer, &errmsg);
  983. tt_ptr_op(answer, OP_EQ, NULL);
  984. tt_ptr_op(errmsg, OP_NE, NULL);
  985. tt_str_op(errmsg, OP_EQ, "Unknown certificate download status query");
  986. errmsg = NULL;
  987. /*
  988. * Case 2 - looks like downloads/cert/fp/<fp>, but <fp> isn't even
  989. * the right length for a digest.
  990. */
  991. getinfo_helper_downloads(&dummy, "downloads/cert/fp/2B1D36D32B2942406",
  992. &answer, &errmsg);
  993. tt_ptr_op(answer, OP_EQ, NULL);
  994. tt_ptr_op(errmsg, OP_NE, NULL);
  995. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  996. errmsg = NULL;
  997. /*
  998. * Case 3 - looks like downloads/cert/fp/<fp>, and <fp> is digest-sized,
  999. * but not parseable as one.
  1000. */
  1001. getinfo_helper_downloads(&dummy,
  1002. "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1",
  1003. &answer, &errmsg);
  1004. tt_ptr_op(answer, OP_EQ, NULL);
  1005. tt_ptr_op(errmsg, OP_NE, NULL);
  1006. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1007. errmsg = NULL;
  1008. /*
  1009. * Case 4 - downloads/cert/fp/<fp>, and <fp> is not a known authority
  1010. * identity digest
  1011. */
  1012. getinfo_helper_downloads(&dummy,
  1013. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61",
  1014. &answer, &errmsg);
  1015. tt_ptr_op(answer, OP_EQ, NULL);
  1016. tt_ptr_op(errmsg, OP_NE, NULL);
  1017. tt_str_op(errmsg, OP_EQ,
  1018. "Failed to get download status for this authority identity digest");
  1019. errmsg = NULL;
  1020. /*
  1021. * Case 5 - looks like downloads/cert/fp/<fp>/<anything>, but <fp> doesn't
  1022. * parse as a sensible digest.
  1023. */
  1024. getinfo_helper_downloads(&dummy,
  1025. "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1/blah",
  1026. &answer, &errmsg);
  1027. tt_ptr_op(answer, OP_EQ, NULL);
  1028. tt_ptr_op(errmsg, OP_NE, NULL);
  1029. tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest");
  1030. errmsg = NULL;
  1031. /*
  1032. * Case 6 - looks like downloads/cert/fp/<fp>/<anything>, but <fp> doesn't
  1033. * parse as a sensible digest.
  1034. */
  1035. getinfo_helper_downloads(&dummy,
  1036. "downloads/cert/fp/82F52AF55D25/blah",
  1037. &answer, &errmsg);
  1038. tt_ptr_op(answer, OP_EQ, NULL);
  1039. tt_ptr_op(errmsg, OP_NE, NULL);
  1040. tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest");
  1041. errmsg = NULL;
  1042. /*
  1043. * Case 7 - downloads/cert/fp/<fp>/sks, and <fp> is not a known authority
  1044. * digest.
  1045. */
  1046. getinfo_helper_downloads(&dummy,
  1047. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/sks",
  1048. &answer, &errmsg);
  1049. tt_ptr_op(answer, OP_EQ, NULL);
  1050. tt_ptr_op(errmsg, OP_NE, NULL);
  1051. tt_str_op(errmsg, OP_EQ,
  1052. "Failed to get list of signing key digests for this authority "
  1053. "identity digest");
  1054. errmsg = NULL;
  1055. /*
  1056. * Case 8 - looks like downloads/cert/fp/<fp>/<sk>, but <sk> doesn't
  1057. * parse as a signing key digest.
  1058. */
  1059. getinfo_helper_downloads(&dummy,
  1060. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/"
  1061. "82F52AF55D250115FE44D3GC81D49643241D56A1",
  1062. &answer, &errmsg);
  1063. tt_ptr_op(answer, OP_EQ, NULL);
  1064. tt_ptr_op(errmsg, OP_NE, NULL);
  1065. tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest");
  1066. errmsg = NULL;
  1067. /*
  1068. * Case 9 - looks like downloads/cert/fp/<fp>/<sk>, but <sk> doesn't
  1069. * parse as a signing key digest.
  1070. */
  1071. getinfo_helper_downloads(&dummy,
  1072. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/"
  1073. "82F52AF55D250115FE44D",
  1074. &answer, &errmsg);
  1075. tt_ptr_op(answer, OP_EQ, NULL);
  1076. tt_ptr_op(errmsg, OP_NE, NULL);
  1077. tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest");
  1078. errmsg = NULL;
  1079. /*
  1080. * Case 10 - downloads/cert/fp/<fp>/<sk>, but <fp> isn't a known
  1081. * authority identity digest.
  1082. */
  1083. getinfo_helper_downloads(&dummy,
  1084. "downloads/cert/fp/C6B05DF332F74DB9A13498EE3BBC7AA2F69FCB45/"
  1085. "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D",
  1086. &answer, &errmsg);
  1087. tt_ptr_op(answer, OP_EQ, NULL);
  1088. tt_ptr_op(errmsg, OP_NE, NULL);
  1089. tt_str_op(errmsg, OP_EQ,
  1090. "Failed to get download status for this identity/"
  1091. "signing key digest pair");
  1092. errmsg = NULL;
  1093. /*
  1094. * Case 11 - downloads/cert/fp/<fp>/<sk>, but <sk> isn't a known
  1095. * signing key digest.
  1096. */
  1097. getinfo_helper_downloads(&dummy,
  1098. "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/"
  1099. "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D",
  1100. &answer, &errmsg);
  1101. tt_ptr_op(answer, OP_EQ, NULL);
  1102. tt_ptr_op(errmsg, OP_NE, NULL);
  1103. tt_str_op(errmsg, OP_EQ,
  1104. "Failed to get download status for this identity/"
  1105. "signing key digest pair");
  1106. errmsg = NULL;
  1107. /*
  1108. * Case 12 - downloads/cert/fp/<fp>/<sk>, but <sk> is on the list for
  1109. * a different authority identity digest.
  1110. */
  1111. getinfo_helper_downloads(&dummy,
  1112. "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/"
  1113. "9451B8F1B10952384EB58B5F230C0BB701626C9B",
  1114. &answer, &errmsg);
  1115. tt_ptr_op(answer, OP_EQ, NULL);
  1116. tt_ptr_op(errmsg, OP_NE, NULL);
  1117. tt_str_op(errmsg, OP_EQ,
  1118. "Failed to get download status for this identity/"
  1119. "signing key digest pair");
  1120. errmsg = NULL;
  1121. done:
  1122. clear_cert_mocks();
  1123. tor_free(answer);
  1124. return;
  1125. }
  1126. static void
  1127. test_download_status_desc(void *arg)
  1128. {
  1129. /* We just need one of these to pass, it doesn't matter what's in it */
  1130. control_connection_t dummy;
  1131. /* Get results out */
  1132. char *question = NULL;
  1133. char *answer = NULL;
  1134. const char *errmsg = NULL;
  1135. (void)arg;
  1136. setup_desc_mocks();
  1137. /*
  1138. * Check returning serialized dlstatuses and digest lists, and implicitly
  1139. * also test download_status_to_string() and digest_list_to_string().
  1140. */
  1141. /* Case 1 - list of router descriptor digests */
  1142. getinfo_helper_downloads(&dummy,
  1143. "downloads/desc/descs",
  1144. &answer, &errmsg);
  1145. tt_ptr_op(answer, OP_NE, NULL);
  1146. tt_ptr_op(errmsg, OP_EQ, NULL);
  1147. tt_str_op(answer, OP_EQ, descbr_expected_list);
  1148. tor_free(answer);
  1149. errmsg = NULL;
  1150. /* Case 2 - get download status for router descriptor 1 */
  1151. memcpy(&descbr_digest_1_dl, &dls_sample_1,
  1152. sizeof(download_status_t));
  1153. tor_asprintf(&question, "downloads/desc/%s", descbr_digest_1_str);
  1154. tt_ptr_op(question, OP_NE, NULL);
  1155. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1156. tt_ptr_op(answer, OP_NE, NULL);
  1157. tt_ptr_op(errmsg, OP_EQ, NULL);
  1158. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  1159. tor_free(question);
  1160. tor_free(answer);
  1161. errmsg = NULL;
  1162. /* Case 3 - get download status for router descriptor 1 */
  1163. memcpy(&descbr_digest_2_dl, &dls_sample_2,
  1164. sizeof(download_status_t));
  1165. tor_asprintf(&question, "downloads/desc/%s", descbr_digest_2_str);
  1166. tt_ptr_op(question, OP_NE, NULL);
  1167. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1168. tt_ptr_op(answer, OP_NE, NULL);
  1169. tt_ptr_op(errmsg, OP_EQ, NULL);
  1170. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  1171. tor_free(question);
  1172. tor_free(answer);
  1173. errmsg = NULL;
  1174. /* Now check the error cases */
  1175. /* Case 1 - non-digest-length garbage after downloads/desc */
  1176. getinfo_helper_downloads(&dummy, "downloads/desc/blahdeblah",
  1177. &answer, &errmsg);
  1178. tt_ptr_op(answer, OP_EQ, NULL);
  1179. tt_ptr_op(errmsg, OP_NE, NULL);
  1180. tt_str_op(errmsg, OP_EQ, "Unknown router descriptor download status query");
  1181. errmsg = NULL;
  1182. /* Case 2 - nonparseable digest-shaped thing */
  1183. getinfo_helper_downloads(
  1184. &dummy,
  1185. "downloads/desc/774EC52FD9A5B80A6FACZE536616E8022E3470AG",
  1186. &answer, &errmsg);
  1187. tt_ptr_op(answer, OP_EQ, NULL);
  1188. tt_ptr_op(errmsg, OP_NE, NULL);
  1189. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1190. errmsg = NULL;
  1191. /* Case 3 - digest we have no descriptor for */
  1192. getinfo_helper_downloads(
  1193. &dummy,
  1194. "downloads/desc/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A",
  1195. &answer, &errmsg);
  1196. tt_ptr_op(answer, OP_EQ, NULL);
  1197. tt_ptr_op(errmsg, OP_NE, NULL);
  1198. tt_str_op(errmsg, OP_EQ, "No such descriptor digest found");
  1199. errmsg = NULL;
  1200. /* Case 4 - microdescs only */
  1201. disable_descbr = 1;
  1202. getinfo_helper_downloads(&dummy,
  1203. "downloads/desc/descs",
  1204. &answer, &errmsg);
  1205. tt_ptr_op(answer, OP_EQ, NULL);
  1206. tt_ptr_op(errmsg, OP_NE, NULL);
  1207. tt_str_op(errmsg, OP_EQ,
  1208. "We don't seem to have a networkstatus-flavored consensus");
  1209. errmsg = NULL;
  1210. disable_descbr = 0;
  1211. done:
  1212. clear_desc_mocks();
  1213. tor_free(answer);
  1214. return;
  1215. }
  1216. static void
  1217. test_download_status_bridge(void *arg)
  1218. {
  1219. /* We just need one of these to pass, it doesn't matter what's in it */
  1220. control_connection_t dummy;
  1221. /* Get results out */
  1222. char *question = NULL;
  1223. char *answer = NULL;
  1224. const char *errmsg = NULL;
  1225. (void)arg;
  1226. setup_bridge_mocks();
  1227. /*
  1228. * Check returning serialized dlstatuses and digest lists, and implicitly
  1229. * also test download_status_to_string() and digest_list_to_string().
  1230. */
  1231. /* Case 1 - list of bridge identity digests */
  1232. getinfo_helper_downloads(&dummy,
  1233. "downloads/bridge/bridges",
  1234. &answer, &errmsg);
  1235. tt_ptr_op(answer, OP_NE, NULL);
  1236. tt_ptr_op(errmsg, OP_EQ, NULL);
  1237. tt_str_op(answer, OP_EQ, descbr_expected_list);
  1238. tor_free(answer);
  1239. errmsg = NULL;
  1240. /* Case 2 - get download status for bridge descriptor 1 */
  1241. memcpy(&descbr_digest_1_dl, &dls_sample_3,
  1242. sizeof(download_status_t));
  1243. tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_1_str);
  1244. tt_ptr_op(question, OP_NE, NULL);
  1245. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1246. tt_ptr_op(answer, OP_NE, NULL);
  1247. tt_ptr_op(errmsg, OP_EQ, NULL);
  1248. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  1249. tor_free(question);
  1250. tor_free(answer);
  1251. errmsg = NULL;
  1252. /* Case 3 - get download status for router descriptor 1 */
  1253. memcpy(&descbr_digest_2_dl, &dls_sample_4,
  1254. sizeof(download_status_t));
  1255. tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_2_str);
  1256. tt_ptr_op(question, OP_NE, NULL);
  1257. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1258. tt_ptr_op(answer, OP_NE, NULL);
  1259. tt_ptr_op(errmsg, OP_EQ, NULL);
  1260. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  1261. tor_free(question);
  1262. tor_free(answer);
  1263. errmsg = NULL;
  1264. /* Now check the error cases */
  1265. /* Case 1 - non-digest-length garbage after downloads/bridge */
  1266. getinfo_helper_downloads(&dummy, "downloads/bridge/blahdeblah",
  1267. &answer, &errmsg);
  1268. tt_ptr_op(answer, OP_EQ, NULL);
  1269. tt_ptr_op(errmsg, OP_NE, NULL);
  1270. tt_str_op(errmsg, OP_EQ, "Unknown bridge descriptor download status query");
  1271. errmsg = NULL;
  1272. /* Case 2 - nonparseable digest-shaped thing */
  1273. getinfo_helper_downloads(
  1274. &dummy,
  1275. "downloads/bridge/774EC52FD9A5B80A6FACZE536616E8022E3470AG",
  1276. &answer, &errmsg);
  1277. tt_ptr_op(answer, OP_EQ, NULL);
  1278. tt_ptr_op(errmsg, OP_NE, NULL);
  1279. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1280. errmsg = NULL;
  1281. /* Case 3 - digest we have no descriptor for */
  1282. getinfo_helper_downloads(
  1283. &dummy,
  1284. "downloads/bridge/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A",
  1285. &answer, &errmsg);
  1286. tt_ptr_op(answer, OP_EQ, NULL);
  1287. tt_ptr_op(errmsg, OP_NE, NULL);
  1288. tt_str_op(errmsg, OP_EQ, "No such bridge identity digest found");
  1289. errmsg = NULL;
  1290. /* Case 4 - bridges disabled */
  1291. disable_descbr = 1;
  1292. getinfo_helper_downloads(&dummy,
  1293. "downloads/bridge/bridges",
  1294. &answer, &errmsg);
  1295. tt_ptr_op(answer, OP_EQ, NULL);
  1296. tt_ptr_op(errmsg, OP_NE, NULL);
  1297. tt_str_op(errmsg, OP_EQ, "We don't seem to be using bridges");
  1298. errmsg = NULL;
  1299. disable_descbr = 0;
  1300. done:
  1301. clear_bridge_mocks();
  1302. tor_free(answer);
  1303. return;
  1304. }
  1305. struct testcase_t controller_tests[] = {
  1306. { "add_onion_helper_keyarg_v2", test_add_onion_helper_keyarg_v2, 0,
  1307. NULL, NULL },
  1308. { "add_onion_helper_keyarg_v3", test_add_onion_helper_keyarg_v3, 0,
  1309. NULL, NULL },
  1310. { "getinfo_helper_onion", test_getinfo_helper_onion, 0, NULL, NULL },
  1311. { "rend_service_parse_port_config", test_rend_service_parse_port_config, 0,
  1312. NULL, NULL },
  1313. { "add_onion_helper_clientauth", test_add_onion_helper_clientauth, 0, NULL,
  1314. NULL },
  1315. { "download_status_consensus", test_download_status_consensus, 0, NULL,
  1316. NULL },
  1317. { "download_status_cert", test_download_status_cert, 0, NULL,
  1318. NULL },
  1319. { "download_status_desc", test_download_status_desc, 0, NULL, NULL },
  1320. { "download_status_bridge", test_download_status_bridge, 0, NULL, NULL },
  1321. END_OF_TESTCASES
  1322. };