test_controller.c 44 KB

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