rendclient.c 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246
  1. /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
  2. * Copyright (c) 2007-2017, The Tor Project, Inc. */
  3. /* See LICENSE for licensing information */
  4. /**
  5. * \file rendclient.c
  6. * \brief Client code to access location-hidden services.
  7. **/
  8. #include "or.h"
  9. #include "circpathbias.h"
  10. #include "circuitbuild.h"
  11. #include "circuitlist.h"
  12. #include "circuituse.h"
  13. #include "config.h"
  14. #include "connection.h"
  15. #include "connection_edge.h"
  16. #include "control.h"
  17. #include "crypto_rand.h"
  18. #include "crypto_util.h"
  19. #include "directory.h"
  20. #include "hs_circuit.h"
  21. #include "hs_client.h"
  22. #include "hs_common.h"
  23. #include "main.h"
  24. #include "networkstatus.h"
  25. #include "nodelist.h"
  26. #include "relay.h"
  27. #include "rendclient.h"
  28. #include "rendcommon.h"
  29. #include "rephist.h"
  30. #include "router.h"
  31. #include "routerlist.h"
  32. #include "routerset.h"
  33. static extend_info_t *rend_client_get_random_intro_impl(
  34. const rend_cache_entry_t *rend_query,
  35. const int strict, const int warnings);
  36. /** Purge all potentially remotely-detectable state held in the hidden
  37. * service client code. Called on SIGNAL NEWNYM. */
  38. void
  39. rend_client_purge_state(void)
  40. {
  41. rend_cache_purge();
  42. rend_cache_failure_purge();
  43. rend_client_cancel_descriptor_fetches();
  44. hs_purge_last_hid_serv_requests();
  45. }
  46. /** Called when we've established a circuit to an introduction point:
  47. * send the introduction request. */
  48. void
  49. rend_client_introcirc_has_opened(origin_circuit_t *circ)
  50. {
  51. tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_C_INTRODUCING);
  52. tor_assert(circ->cpath);
  53. log_info(LD_REND,"introcirc is open");
  54. connection_ap_attach_pending(1);
  55. }
  56. /** Send the establish-rendezvous cell along a rendezvous circuit. if
  57. * it fails, mark the circ for close and return -1. else return 0.
  58. */
  59. static int
  60. rend_client_send_establish_rendezvous(origin_circuit_t *circ)
  61. {
  62. tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND);
  63. tor_assert(circ->rend_data);
  64. log_info(LD_REND, "Sending an ESTABLISH_RENDEZVOUS cell");
  65. crypto_rand(circ->rend_data->rend_cookie, REND_COOKIE_LEN);
  66. /* Set timestamp_dirty, because circuit_expire_building expects it,
  67. * and the rend cookie also means we've used the circ. */
  68. circ->base_.timestamp_dirty = time(NULL);
  69. /* We've attempted to use this circuit. Probe it if we fail */
  70. pathbias_count_use_attempt(circ);
  71. if (relay_send_command_from_edge(0, TO_CIRCUIT(circ),
  72. RELAY_COMMAND_ESTABLISH_RENDEZVOUS,
  73. circ->rend_data->rend_cookie,
  74. REND_COOKIE_LEN,
  75. circ->cpath->prev)<0) {
  76. /* circ is already marked for close */
  77. log_warn(LD_GENERAL, "Couldn't send ESTABLISH_RENDEZVOUS cell");
  78. return -1;
  79. }
  80. return 0;
  81. }
  82. /** Called when we're trying to connect an ap conn; sends an INTRODUCE1 cell
  83. * down introcirc if possible.
  84. */
  85. int
  86. rend_client_send_introduction(origin_circuit_t *introcirc,
  87. origin_circuit_t *rendcirc)
  88. {
  89. const or_options_t *options = get_options();
  90. size_t payload_len;
  91. int r, v3_shift = 0;
  92. char payload[RELAY_PAYLOAD_SIZE];
  93. char tmp[RELAY_PAYLOAD_SIZE];
  94. rend_cache_entry_t *entry = NULL;
  95. crypt_path_t *cpath;
  96. off_t dh_offset;
  97. crypto_pk_t *intro_key = NULL;
  98. int status = 0;
  99. const char *onion_address;
  100. tor_assert(introcirc->base_.purpose == CIRCUIT_PURPOSE_C_INTRODUCING);
  101. tor_assert(rendcirc->base_.purpose == CIRCUIT_PURPOSE_C_REND_READY);
  102. tor_assert(introcirc->rend_data);
  103. tor_assert(rendcirc->rend_data);
  104. tor_assert(!rend_cmp_service_ids(rend_data_get_address(introcirc->rend_data),
  105. rend_data_get_address(rendcirc->rend_data)));
  106. assert_circ_anonymity_ok(introcirc, options);
  107. assert_circ_anonymity_ok(rendcirc, options);
  108. onion_address = rend_data_get_address(introcirc->rend_data);
  109. r = rend_cache_lookup_entry(onion_address, -1, &entry);
  110. /* An invalid onion address is not possible else we have a big issue. */
  111. tor_assert(r != -EINVAL);
  112. if (r < 0 || !rend_client_any_intro_points_usable(entry)) {
  113. /* If the descriptor is not found or the intro points are not usable
  114. * anymore, trigger a fetch. */
  115. log_info(LD_REND,
  116. "query %s didn't have valid rend desc in cache. "
  117. "Refetching descriptor.",
  118. safe_str_client(onion_address));
  119. rend_client_refetch_v2_renddesc(introcirc->rend_data);
  120. {
  121. connection_t *conn;
  122. while ((conn = connection_get_by_type_state_rendquery(CONN_TYPE_AP,
  123. AP_CONN_STATE_CIRCUIT_WAIT, onion_address))) {
  124. connection_ap_mark_as_non_pending_circuit(TO_ENTRY_CONN(conn));
  125. conn->state = AP_CONN_STATE_RENDDESC_WAIT;
  126. }
  127. }
  128. status = -1;
  129. goto cleanup;
  130. }
  131. /* first 20 bytes of payload are the hash of the service's pk */
  132. intro_key = NULL;
  133. SMARTLIST_FOREACH(entry->parsed->intro_nodes, rend_intro_point_t *,
  134. intro, {
  135. if (tor_memeq(introcirc->build_state->chosen_exit->identity_digest,
  136. intro->extend_info->identity_digest, DIGEST_LEN)) {
  137. intro_key = intro->intro_key;
  138. break;
  139. }
  140. });
  141. if (!intro_key) {
  142. log_info(LD_REND, "Could not find intro key for %s at %s; we "
  143. "have a v2 rend desc with %d intro points. "
  144. "Trying a different intro point...",
  145. safe_str_client(onion_address),
  146. safe_str_client(extend_info_describe(
  147. introcirc->build_state->chosen_exit)),
  148. smartlist_len(entry->parsed->intro_nodes));
  149. if (hs_client_reextend_intro_circuit(introcirc)) {
  150. status = -2;
  151. goto perm_err;
  152. } else {
  153. status = -1;
  154. goto cleanup;
  155. }
  156. }
  157. if (crypto_pk_get_digest(intro_key, payload)<0) {
  158. log_warn(LD_BUG, "Internal error: couldn't hash public key.");
  159. status = -2;
  160. goto perm_err;
  161. }
  162. /* Initialize the pending_final_cpath and start the DH handshake. */
  163. cpath = rendcirc->build_state->pending_final_cpath;
  164. if (!cpath) {
  165. cpath = rendcirc->build_state->pending_final_cpath =
  166. tor_malloc_zero(sizeof(crypt_path_t));
  167. cpath->magic = CRYPT_PATH_MAGIC;
  168. if (!(cpath->rend_dh_handshake_state = crypto_dh_new(DH_TYPE_REND))) {
  169. log_warn(LD_BUG, "Internal error: couldn't allocate DH.");
  170. status = -2;
  171. goto perm_err;
  172. }
  173. if (crypto_dh_generate_public(cpath->rend_dh_handshake_state)<0) {
  174. log_warn(LD_BUG, "Internal error: couldn't generate g^x.");
  175. status = -2;
  176. goto perm_err;
  177. }
  178. }
  179. /* If version is 3, write (optional) auth data and timestamp. */
  180. if (entry->parsed->protocols & (1<<3)) {
  181. tmp[0] = 3; /* version 3 of the cell format */
  182. /* auth type, if any */
  183. tmp[1] = (uint8_t) TO_REND_DATA_V2(introcirc->rend_data)->auth_type;
  184. v3_shift = 1;
  185. if (tmp[1] != REND_NO_AUTH) {
  186. set_uint16(tmp+2, htons(REND_DESC_COOKIE_LEN));
  187. memcpy(tmp+4, TO_REND_DATA_V2(introcirc->rend_data)->descriptor_cookie,
  188. REND_DESC_COOKIE_LEN);
  189. v3_shift += 2+REND_DESC_COOKIE_LEN;
  190. }
  191. /* Once this held a timestamp. */
  192. set_uint32(tmp+v3_shift+1, 0);
  193. v3_shift += 4;
  194. } /* if version 2 only write version number */
  195. else if (entry->parsed->protocols & (1<<2)) {
  196. tmp[0] = 2; /* version 2 of the cell format */
  197. }
  198. /* write the remaining items into tmp */
  199. if (entry->parsed->protocols & (1<<3) || entry->parsed->protocols & (1<<2)) {
  200. /* version 2 format */
  201. extend_info_t *extend_info = rendcirc->build_state->chosen_exit;
  202. int klen;
  203. /* nul pads */
  204. set_uint32(tmp+v3_shift+1, tor_addr_to_ipv4n(&extend_info->addr));
  205. set_uint16(tmp+v3_shift+5, htons(extend_info->port));
  206. memcpy(tmp+v3_shift+7, extend_info->identity_digest, DIGEST_LEN);
  207. klen = crypto_pk_asn1_encode(extend_info->onion_key,
  208. tmp+v3_shift+7+DIGEST_LEN+2,
  209. sizeof(tmp)-(v3_shift+7+DIGEST_LEN+2));
  210. if (klen < 0) {
  211. log_warn(LD_BUG,"Internal error: can't encode public key.");
  212. status = -2;
  213. goto perm_err;
  214. }
  215. set_uint16(tmp+v3_shift+7+DIGEST_LEN, htons(klen));
  216. memcpy(tmp+v3_shift+7+DIGEST_LEN+2+klen, rendcirc->rend_data->rend_cookie,
  217. REND_COOKIE_LEN);
  218. dh_offset = v3_shift+7+DIGEST_LEN+2+klen+REND_COOKIE_LEN;
  219. } else {
  220. /* Version 0. */
  221. strncpy(tmp, rendcirc->build_state->chosen_exit->nickname,
  222. (MAX_NICKNAME_LEN+1)); /* nul pads */
  223. memcpy(tmp+MAX_NICKNAME_LEN+1, rendcirc->rend_data->rend_cookie,
  224. REND_COOKIE_LEN);
  225. dh_offset = MAX_NICKNAME_LEN+1+REND_COOKIE_LEN;
  226. }
  227. if (crypto_dh_get_public(cpath->rend_dh_handshake_state, tmp+dh_offset,
  228. DH_KEY_LEN)<0) {
  229. log_warn(LD_BUG, "Internal error: couldn't extract g^x.");
  230. status = -2;
  231. goto perm_err;
  232. }
  233. /*XXX maybe give crypto_pk_obsolete_public_hybrid_encrypt a max_len arg,
  234. * to avoid buffer overflows? */
  235. r = crypto_pk_obsolete_public_hybrid_encrypt(intro_key, payload+DIGEST_LEN,
  236. sizeof(payload)-DIGEST_LEN,
  237. tmp,
  238. (int)(dh_offset+DH_KEY_LEN),
  239. PK_PKCS1_OAEP_PADDING, 0);
  240. if (r<0) {
  241. log_warn(LD_BUG,"Internal error: hybrid pk encrypt failed.");
  242. status = -2;
  243. goto perm_err;
  244. }
  245. payload_len = DIGEST_LEN + r;
  246. tor_assert(payload_len <= RELAY_PAYLOAD_SIZE); /* we overran something */
  247. /* Copy the rendezvous cookie from rendcirc to introcirc, so that
  248. * when introcirc gets an ack, we can change the state of the right
  249. * rendezvous circuit. */
  250. memcpy(introcirc->rend_data->rend_cookie, rendcirc->rend_data->rend_cookie,
  251. REND_COOKIE_LEN);
  252. log_info(LD_REND, "Sending an INTRODUCE1 cell");
  253. if (relay_send_command_from_edge(0, TO_CIRCUIT(introcirc),
  254. RELAY_COMMAND_INTRODUCE1,
  255. payload, payload_len,
  256. introcirc->cpath->prev)<0) {
  257. /* introcirc is already marked for close. leave rendcirc alone. */
  258. log_warn(LD_BUG, "Couldn't send INTRODUCE1 cell");
  259. status = -2;
  260. goto cleanup;
  261. }
  262. /* Now, we wait for an ACK or NAK on this circuit. */
  263. circuit_change_purpose(TO_CIRCUIT(introcirc),
  264. CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT);
  265. /* Set timestamp_dirty, because circuit_expire_building expects it
  266. * to specify when a circuit entered the _C_INTRODUCE_ACK_WAIT
  267. * state. */
  268. introcirc->base_.timestamp_dirty = time(NULL);
  269. pathbias_count_use_attempt(introcirc);
  270. goto cleanup;
  271. perm_err:
  272. if (!introcirc->base_.marked_for_close)
  273. circuit_mark_for_close(TO_CIRCUIT(introcirc), END_CIRC_REASON_INTERNAL);
  274. circuit_mark_for_close(TO_CIRCUIT(rendcirc), END_CIRC_REASON_INTERNAL);
  275. cleanup:
  276. memwipe(payload, 0, sizeof(payload));
  277. memwipe(tmp, 0, sizeof(tmp));
  278. return status;
  279. }
  280. /** Called when a rendezvous circuit is open; sends a establish
  281. * rendezvous circuit as appropriate. */
  282. void
  283. rend_client_rendcirc_has_opened(origin_circuit_t *circ)
  284. {
  285. tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND);
  286. log_info(LD_REND,"rendcirc is open");
  287. /* generate a rendezvous cookie, store it in circ */
  288. if (rend_client_send_establish_rendezvous(circ) < 0) {
  289. return;
  290. }
  291. }
  292. /**
  293. * Called to close other intro circuits we launched in parallel.
  294. */
  295. static void
  296. rend_client_close_other_intros(const uint8_t *rend_pk_digest)
  297. {
  298. /* abort parallel intro circs, if any */
  299. SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, c) {
  300. if ((c->purpose == CIRCUIT_PURPOSE_C_INTRODUCING ||
  301. c->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) &&
  302. !c->marked_for_close && CIRCUIT_IS_ORIGIN(c)) {
  303. origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(c);
  304. if (oc->rend_data &&
  305. rend_circuit_pk_digest_eq(oc, rend_pk_digest)) {
  306. log_info(LD_REND|LD_CIRC, "Closing introduction circuit %d that we "
  307. "built in parallel (Purpose %d).", oc->global_identifier,
  308. c->purpose);
  309. circuit_mark_for_close(c, END_CIRC_REASON_IP_NOW_REDUNDANT);
  310. }
  311. }
  312. }
  313. SMARTLIST_FOREACH_END(c);
  314. }
  315. /** Called when get an ACK or a NAK for a REND_INTRODUCE1 cell.
  316. */
  317. int
  318. rend_client_introduction_acked(origin_circuit_t *circ,
  319. const uint8_t *request, size_t request_len)
  320. {
  321. const or_options_t *options = get_options();
  322. origin_circuit_t *rendcirc;
  323. (void) request; // XXXX Use this.
  324. tor_assert(circ->build_state);
  325. tor_assert(circ->build_state->chosen_exit);
  326. assert_circ_anonymity_ok(circ, options);
  327. tor_assert(circ->rend_data);
  328. if (request_len == 0) {
  329. /* It's an ACK; the introduction point relayed our introduction request. */
  330. /* Locate the rend circ which is waiting to hear about this ack,
  331. * and tell it.
  332. */
  333. log_info(LD_REND,"Received ack. Telling rend circ...");
  334. rendcirc = circuit_get_ready_rend_circ_by_rend_data(circ->rend_data);
  335. if (rendcirc) { /* remember the ack */
  336. assert_circ_anonymity_ok(rendcirc, options);
  337. circuit_change_purpose(TO_CIRCUIT(rendcirc),
  338. CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED);
  339. /* Set timestamp_dirty, because circuit_expire_building expects
  340. * it to specify when a circuit entered the
  341. * _C_REND_READY_INTRO_ACKED state. */
  342. rendcirc->base_.timestamp_dirty = time(NULL);
  343. } else {
  344. log_info(LD_REND,"...Found no rend circ. Dropping on the floor.");
  345. }
  346. /* close the circuit: we won't need it anymore. */
  347. circuit_change_purpose(TO_CIRCUIT(circ),
  348. CIRCUIT_PURPOSE_C_INTRODUCE_ACKED);
  349. circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED);
  350. /* close any other intros launched in parallel */
  351. rend_client_close_other_intros(rend_data_get_pk_digest(circ->rend_data,
  352. NULL));
  353. } else {
  354. /* It's a NAK; the introduction point didn't relay our request. */
  355. circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_INTRODUCING);
  356. /* Remove this intro point from the set of viable introduction
  357. * points. If any remain, extend to a new one and try again.
  358. * If none remain, refetch the service descriptor.
  359. */
  360. log_info(LD_REND, "Got nack for %s from %s...",
  361. safe_str_client(rend_data_get_address(circ->rend_data)),
  362. safe_str_client(extend_info_describe(circ->build_state->chosen_exit)));
  363. if (rend_client_report_intro_point_failure(circ->build_state->chosen_exit,
  364. circ->rend_data,
  365. INTRO_POINT_FAILURE_GENERIC)>0) {
  366. /* There are introduction points left. Re-extend the circuit to
  367. * another intro point and try again. */
  368. int result = hs_client_reextend_intro_circuit(circ);
  369. /* XXXX If that call failed, should we close the rend circuit,
  370. * too? */
  371. return result;
  372. } else {
  373. /* Close circuit because no more intro points are usable thus not
  374. * useful anymore. Change it's purpose before so we don't report an
  375. * intro point failure again triggering an extra descriptor fetch. */
  376. circuit_change_purpose(TO_CIRCUIT(circ),
  377. CIRCUIT_PURPOSE_C_INTRODUCE_ACKED);
  378. circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED);
  379. }
  380. }
  381. return 0;
  382. }
  383. /** Determine the responsible hidden service directories for <b>desc_id</b>
  384. * and fetch the descriptor with that ID from one of them. Only
  385. * send a request to a hidden service directory that we have not yet tried
  386. * during this attempt to connect to this hidden service; on success, return 1,
  387. * in the case that no hidden service directory is left to ask for the
  388. * descriptor, return 0, and in case of a failure -1. */
  389. static int
  390. directory_get_from_hs_dir(const char *desc_id,
  391. const rend_data_t *rend_query,
  392. routerstatus_t *rs_hsdir)
  393. {
  394. routerstatus_t *hs_dir = rs_hsdir;
  395. char *hsdir_fp;
  396. char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
  397. char descriptor_cookie_base64[3*REND_DESC_COOKIE_LEN_BASE64];
  398. const rend_data_v2_t *rend_data;
  399. #ifdef ENABLE_TOR2WEB_MODE
  400. const int tor2web_mode = get_options()->Tor2webMode;
  401. const int how_to_fetch = tor2web_mode ? DIRIND_ONEHOP : DIRIND_ANONYMOUS;
  402. #else
  403. const int how_to_fetch = DIRIND_ANONYMOUS;
  404. #endif /* defined(ENABLE_TOR2WEB_MODE) */
  405. tor_assert(desc_id);
  406. tor_assert(rend_query);
  407. rend_data = TO_REND_DATA_V2(rend_query);
  408. base32_encode(desc_id_base32, sizeof(desc_id_base32),
  409. desc_id, DIGEST_LEN);
  410. /* Automatically pick an hs dir if none given. */
  411. if (!rs_hsdir) {
  412. /* Determine responsible dirs. Even if we can't get all we want, work with
  413. * the ones we have. If it's empty, we'll notice in hs_pick_hsdir(). */
  414. smartlist_t *responsible_dirs = smartlist_new();
  415. hid_serv_get_responsible_directories(responsible_dirs, desc_id);
  416. hs_dir = hs_pick_hsdir(responsible_dirs, desc_id_base32);
  417. if (!hs_dir) {
  418. /* No suitable hs dir can be found, stop right now. */
  419. control_event_hsv2_descriptor_failed(rend_query, NULL,
  420. "QUERY_NO_HSDIR");
  421. control_event_hs_descriptor_content(rend_data_get_address(rend_query),
  422. desc_id_base32, NULL, NULL);
  423. return 0;
  424. }
  425. }
  426. /* Add a copy of the HSDir identity digest to the query so we can track it
  427. * on the control port. */
  428. hsdir_fp = tor_memdup(hs_dir->identity_digest,
  429. sizeof(hs_dir->identity_digest));
  430. smartlist_add(rend_query->hsdirs_fp, hsdir_fp);
  431. /* Encode descriptor cookie for logging purposes. Also, if the cookie is
  432. * malformed, no fetch is triggered thus this needs to be done before the
  433. * fetch request. */
  434. if (rend_data->auth_type != REND_NO_AUTH) {
  435. if (base64_encode(descriptor_cookie_base64,
  436. sizeof(descriptor_cookie_base64),
  437. rend_data->descriptor_cookie,
  438. REND_DESC_COOKIE_LEN,
  439. 0)<0) {
  440. log_warn(LD_BUG, "Could not base64-encode descriptor cookie.");
  441. control_event_hsv2_descriptor_failed(rend_query, hsdir_fp, "BAD_DESC");
  442. control_event_hs_descriptor_content(rend_data_get_address(rend_query),
  443. desc_id_base32, hsdir_fp, NULL);
  444. return 0;
  445. }
  446. /* Remove == signs. */
  447. descriptor_cookie_base64[strlen(descriptor_cookie_base64)-2] = '\0';
  448. } else {
  449. strlcpy(descriptor_cookie_base64, "(none)",
  450. sizeof(descriptor_cookie_base64));
  451. }
  452. /* Send fetch request. (Pass query and possibly descriptor cookie so that
  453. * they can be written to the directory connection and be referred to when
  454. * the response arrives. */
  455. directory_request_t *req =
  456. directory_request_new(DIR_PURPOSE_FETCH_RENDDESC_V2);
  457. directory_request_set_routerstatus(req, hs_dir);
  458. directory_request_set_indirection(req, how_to_fetch);
  459. directory_request_set_resource(req, desc_id_base32);
  460. directory_request_set_rend_query(req, rend_query);
  461. directory_initiate_request(req);
  462. directory_request_free(req);
  463. log_info(LD_REND, "Sending fetch request for v2 descriptor for "
  464. "service '%s' with descriptor ID '%s', auth type %d, "
  465. "and descriptor cookie '%s' to hidden service "
  466. "directory %s",
  467. rend_data->onion_address, desc_id_base32,
  468. rend_data->auth_type,
  469. (rend_data->auth_type == REND_NO_AUTH ? "[none]" :
  470. escaped_safe_str_client(descriptor_cookie_base64)),
  471. routerstatus_describe(hs_dir));
  472. control_event_hs_descriptor_requested(rend_data->onion_address,
  473. rend_data->auth_type,
  474. hs_dir->identity_digest,
  475. desc_id_base32, NULL);
  476. return 1;
  477. }
  478. /** Remove tracked HSDir requests from our history for this hidden service
  479. * descriptor <b>desc_id</b> (of size DIGEST_LEN) */
  480. static void
  481. purge_v2_hidserv_req(const char *desc_id)
  482. {
  483. char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
  484. /* The hsdir request tracker stores v2 keys using the base32 encoded
  485. desc_id. Do it: */
  486. base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_id,
  487. DIGEST_LEN);
  488. hs_purge_hid_serv_from_last_hid_serv_requests(desc_id_base32);
  489. }
  490. /** Fetch a v2 descriptor using the given descriptor id. If any hsdir(s) are
  491. * given, they will be used instead.
  492. *
  493. * On success, 1 is returned. If no hidden service is left to ask, return 0.
  494. * On error, -1 is returned. */
  495. static int
  496. fetch_v2_desc_by_descid(const char *desc_id,
  497. const rend_data_t *rend_query, smartlist_t *hsdirs)
  498. {
  499. int ret;
  500. tor_assert(rend_query);
  501. if (!hsdirs) {
  502. ret = directory_get_from_hs_dir(desc_id, rend_query, NULL);
  503. goto end; /* either success or failure, but we're done */
  504. }
  505. /* Using the given hsdir list, trigger a fetch on each of them. */
  506. SMARTLIST_FOREACH_BEGIN(hsdirs, routerstatus_t *, hs_dir) {
  507. /* This should always be a success. */
  508. ret = directory_get_from_hs_dir(desc_id, rend_query, hs_dir);
  509. tor_assert(ret);
  510. } SMARTLIST_FOREACH_END(hs_dir);
  511. /* Everything went well. */
  512. ret = 0;
  513. end:
  514. return ret;
  515. }
  516. /** Fetch a v2 descriptor using the onion address in the given query object.
  517. * This will compute the descriptor id for each replicas and fetch it on the
  518. * given hsdir(s) if any or the responsible ones that are chosen
  519. * automatically.
  520. *
  521. * On success, 1 is returned. If no hidden service is left to ask, return 0.
  522. * On error, -1 is returned. */
  523. static int
  524. fetch_v2_desc_by_addr(rend_data_t *rend_query, smartlist_t *hsdirs)
  525. {
  526. char descriptor_id[DIGEST_LEN];
  527. int replicas_left_to_try[REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS];
  528. int i, tries_left, ret;
  529. rend_data_v2_t *rend_data = TO_REND_DATA_V2(rend_query);
  530. /* Randomly iterate over the replicas until a descriptor can be fetched
  531. * from one of the consecutive nodes, or no options are left. */
  532. for (i = 0; i < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; i++) {
  533. replicas_left_to_try[i] = i;
  534. }
  535. tries_left = REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS;
  536. while (tries_left > 0) {
  537. int rand_val = crypto_rand_int(tries_left);
  538. int chosen_replica = replicas_left_to_try[rand_val];
  539. replicas_left_to_try[rand_val] = replicas_left_to_try[--tries_left];
  540. ret = rend_compute_v2_desc_id(descriptor_id,
  541. rend_data->onion_address,
  542. rend_data->auth_type == REND_STEALTH_AUTH ?
  543. rend_data->descriptor_cookie : NULL,
  544. time(NULL), chosen_replica);
  545. if (ret < 0) {
  546. /* Normally, on failure the descriptor_id is untouched but let's be
  547. * safe in general in case the function changes at some point. */
  548. goto end;
  549. }
  550. if (tor_memcmp(descriptor_id, rend_data->descriptor_id[chosen_replica],
  551. sizeof(descriptor_id)) != 0) {
  552. /* Not equal from what we currently have so purge the last hid serv
  553. * request cache and update the descriptor ID with the new value. */
  554. purge_v2_hidserv_req(rend_data->descriptor_id[chosen_replica]);
  555. memcpy(rend_data->descriptor_id[chosen_replica], descriptor_id,
  556. sizeof(rend_data->descriptor_id[chosen_replica]));
  557. }
  558. /* Trigger the fetch with the computed descriptor ID. */
  559. ret = fetch_v2_desc_by_descid(descriptor_id, rend_query, hsdirs);
  560. if (ret != 0) {
  561. /* Either on success or failure, as long as we tried a fetch we are
  562. * done here. */
  563. goto end;
  564. }
  565. }
  566. /* If we come here, there are no hidden service directories left. */
  567. log_info(LD_REND, "Could not pick one of the responsible hidden "
  568. "service directories to fetch descriptors, because "
  569. "we already tried them all unsuccessfully.");
  570. ret = 0;
  571. end:
  572. memwipe(descriptor_id, 0, sizeof(descriptor_id));
  573. return ret;
  574. }
  575. /** Fetch a v2 descriptor using the given query. If any hsdir are specified,
  576. * use them for the fetch.
  577. *
  578. * On success, 1 is returned. If no hidden service is left to ask, return 0.
  579. * On error, -1 is returned. */
  580. int
  581. rend_client_fetch_v2_desc(rend_data_t *query, smartlist_t *hsdirs)
  582. {
  583. int ret;
  584. rend_data_v2_t *rend_data;
  585. const char *onion_address;
  586. tor_assert(query);
  587. /* Get the version 2 data structure of the query. */
  588. rend_data = TO_REND_DATA_V2(query);
  589. onion_address = rend_data_get_address(query);
  590. /* Depending on what's available in the rend data query object, we will
  591. * trigger a fetch by HS address or using a descriptor ID. */
  592. if (onion_address[0] != '\0') {
  593. ret = fetch_v2_desc_by_addr(query, hsdirs);
  594. } else if (!tor_digest_is_zero(rend_data->desc_id_fetch)) {
  595. ret = fetch_v2_desc_by_descid(rend_data->desc_id_fetch, query,
  596. hsdirs);
  597. } else {
  598. /* Query data is invalid. */
  599. ret = -1;
  600. goto error;
  601. }
  602. error:
  603. return ret;
  604. }
  605. /** Unless we already have a descriptor for <b>rend_query</b> with at least
  606. * one (possibly) working introduction point in it, start a connection to a
  607. * hidden service directory to fetch a v2 rendezvous service descriptor. */
  608. void
  609. rend_client_refetch_v2_renddesc(rend_data_t *rend_query)
  610. {
  611. rend_cache_entry_t *e = NULL;
  612. const char *onion_address = rend_data_get_address(rend_query);
  613. tor_assert(rend_query);
  614. /* Before fetching, check if we already have a usable descriptor here. */
  615. if (rend_cache_lookup_entry(onion_address, -1, &e) == 0 &&
  616. rend_client_any_intro_points_usable(e)) {
  617. log_info(LD_REND, "We would fetch a v2 rendezvous descriptor, but we "
  618. "already have a usable descriptor here. Not fetching.");
  619. return;
  620. }
  621. /* Are we configured to fetch descriptors? */
  622. if (!get_options()->FetchHidServDescriptors) {
  623. log_warn(LD_REND, "We received an onion address for a v2 rendezvous "
  624. "service descriptor, but are not fetching service descriptors.");
  625. return;
  626. }
  627. log_debug(LD_REND, "Fetching v2 rendezvous descriptor for service %s",
  628. safe_str_client(onion_address));
  629. rend_client_fetch_v2_desc(rend_query, NULL);
  630. /* We don't need to look the error code because either on failure or
  631. * success, the necessary steps to continue the HS connection will be
  632. * triggered once the descriptor arrives or if all fetch failed. */
  633. return;
  634. }
  635. /** Cancel all rendezvous descriptor fetches currently in progress.
  636. */
  637. void
  638. rend_client_cancel_descriptor_fetches(void)
  639. {
  640. smartlist_t *connection_array = get_connection_array();
  641. SMARTLIST_FOREACH_BEGIN(connection_array, connection_t *, conn) {
  642. if (conn->type == CONN_TYPE_DIR &&
  643. conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) {
  644. /* It's a rendezvous descriptor fetch in progress -- cancel it
  645. * by marking the connection for close.
  646. *
  647. * Even if this connection has already reached EOF, this is
  648. * enough to make sure that if the descriptor hasn't been
  649. * processed yet, it won't be. See the end of
  650. * connection_handle_read; connection_reached_eof (indirectly)
  651. * processes whatever response the connection received. */
  652. const rend_data_t *rd = (TO_DIR_CONN(conn))->rend_data;
  653. if (!rd) {
  654. log_warn(LD_BUG | LD_REND,
  655. "Marking for close dir conn fetching rendezvous "
  656. "descriptor for unknown service!");
  657. } else {
  658. log_debug(LD_REND, "Marking for close dir conn fetching "
  659. "rendezvous descriptor for service %s",
  660. safe_str(rend_data_get_address(rd)));
  661. }
  662. connection_mark_for_close(conn);
  663. }
  664. } SMARTLIST_FOREACH_END(conn);
  665. }
  666. /** Mark <b>failed_intro</b> as a failed introduction point for the
  667. * hidden service specified by <b>rend_query</b>. If the HS now has no
  668. * usable intro points, or we do not have an HS descriptor for it,
  669. * then launch a new renddesc fetch.
  670. *
  671. * If <b>failure_type</b> is INTRO_POINT_FAILURE_GENERIC, remove the
  672. * intro point from (our parsed copy of) the HS descriptor.
  673. *
  674. * If <b>failure_type</b> is INTRO_POINT_FAILURE_TIMEOUT, mark the
  675. * intro point as 'timed out'; it will not be retried until the
  676. * current hidden service connection attempt has ended or it has
  677. * appeared in a newly fetched rendezvous descriptor.
  678. *
  679. * If <b>failure_type</b> is INTRO_POINT_FAILURE_UNREACHABLE,
  680. * increment the intro point's reachability-failure count; if it has
  681. * now failed MAX_INTRO_POINT_REACHABILITY_FAILURES or more times,
  682. * remove the intro point from (our parsed copy of) the HS descriptor.
  683. *
  684. * Return -1 if error, 0 if no usable intro points remain or service
  685. * unrecognized, 1 if recognized and some intro points remain.
  686. */
  687. int
  688. rend_client_report_intro_point_failure(extend_info_t *failed_intro,
  689. rend_data_t *rend_data,
  690. unsigned int failure_type)
  691. {
  692. int i, r;
  693. rend_cache_entry_t *ent;
  694. connection_t *conn;
  695. const char *onion_address = rend_data_get_address(rend_data);
  696. r = rend_cache_lookup_entry(onion_address, -1, &ent);
  697. if (r < 0) {
  698. /* Either invalid onion address or cache entry not found. */
  699. switch (-r) {
  700. case EINVAL:
  701. log_warn(LD_BUG, "Malformed service ID %s.",
  702. escaped_safe_str_client(onion_address));
  703. return -1;
  704. case ENOENT:
  705. log_info(LD_REND, "Unknown service %s. Re-fetching descriptor.",
  706. escaped_safe_str_client(onion_address));
  707. rend_client_refetch_v2_renddesc(rend_data);
  708. return 0;
  709. default:
  710. log_warn(LD_BUG, "Unknown cache lookup returned code: %d", r);
  711. return -1;
  712. }
  713. }
  714. /* The intro points are not checked here if they are usable or not because
  715. * this is called when an intro point circuit is closed thus there must be
  716. * at least one intro point that is usable and is about to be flagged. */
  717. for (i = 0; i < smartlist_len(ent->parsed->intro_nodes); i++) {
  718. rend_intro_point_t *intro = smartlist_get(ent->parsed->intro_nodes, i);
  719. if (tor_memeq(failed_intro->identity_digest,
  720. intro->extend_info->identity_digest, DIGEST_LEN)) {
  721. switch (failure_type) {
  722. default:
  723. log_warn(LD_BUG, "Unknown failure type %u. Removing intro point.",
  724. failure_type);
  725. tor_fragile_assert();
  726. /* fall through */
  727. case INTRO_POINT_FAILURE_GENERIC:
  728. rend_cache_intro_failure_note(failure_type,
  729. (uint8_t *)failed_intro->identity_digest,
  730. onion_address);
  731. rend_intro_point_free(intro);
  732. smartlist_del(ent->parsed->intro_nodes, i);
  733. break;
  734. case INTRO_POINT_FAILURE_TIMEOUT:
  735. intro->timed_out = 1;
  736. break;
  737. case INTRO_POINT_FAILURE_UNREACHABLE:
  738. ++(intro->unreachable_count);
  739. {
  740. int zap_intro_point =
  741. intro->unreachable_count >= MAX_INTRO_POINT_REACHABILITY_FAILURES;
  742. log_info(LD_REND, "Failed to reach this intro point %u times.%s",
  743. intro->unreachable_count,
  744. zap_intro_point ? " Removing from descriptor.": "");
  745. if (zap_intro_point) {
  746. rend_cache_intro_failure_note(
  747. failure_type,
  748. (uint8_t *) failed_intro->identity_digest, onion_address);
  749. rend_intro_point_free(intro);
  750. smartlist_del(ent->parsed->intro_nodes, i);
  751. }
  752. }
  753. break;
  754. }
  755. break;
  756. }
  757. }
  758. if (! rend_client_any_intro_points_usable(ent)) {
  759. log_info(LD_REND,
  760. "No more intro points remain for %s. Re-fetching descriptor.",
  761. escaped_safe_str_client(onion_address));
  762. rend_client_refetch_v2_renddesc(rend_data);
  763. /* move all pending streams back to renddesc_wait */
  764. /* NOTE: We can now do this faster, if we use pending_entry_connections */
  765. while ((conn = connection_get_by_type_state_rendquery(CONN_TYPE_AP,
  766. AP_CONN_STATE_CIRCUIT_WAIT,
  767. onion_address))) {
  768. connection_ap_mark_as_non_pending_circuit(TO_ENTRY_CONN(conn));
  769. conn->state = AP_CONN_STATE_RENDDESC_WAIT;
  770. }
  771. return 0;
  772. }
  773. log_info(LD_REND,"%d options left for %s.",
  774. smartlist_len(ent->parsed->intro_nodes),
  775. escaped_safe_str_client(onion_address));
  776. return 1;
  777. }
  778. /** The service sent us a rendezvous cell; join the circuits. */
  779. int
  780. rend_client_receive_rendezvous(origin_circuit_t *circ, const uint8_t *request,
  781. size_t request_len)
  782. {
  783. if (request_len != DH_KEY_LEN+DIGEST_LEN) {
  784. log_warn(LD_PROTOCOL,"Incorrect length (%d) on RENDEZVOUS2 cell.",
  785. (int)request_len);
  786. goto err;
  787. }
  788. if (hs_circuit_setup_e2e_rend_circ_legacy_client(circ, request) < 0) {
  789. log_warn(LD_GENERAL, "Failed to setup circ");
  790. goto err;
  791. }
  792. return 0;
  793. err:
  794. circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
  795. return -1;
  796. }
  797. /** Find all the apconns in state AP_CONN_STATE_RENDDESC_WAIT that are
  798. * waiting on <b>query</b>. If there's a working cache entry here with at
  799. * least one intro point, move them to the next state. */
  800. void
  801. rend_client_desc_trynow(const char *query)
  802. {
  803. entry_connection_t *conn;
  804. rend_cache_entry_t *entry;
  805. const rend_data_t *rend_data;
  806. time_t now = time(NULL);
  807. smartlist_t *conns = get_connection_array();
  808. SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) {
  809. if (base_conn->type != CONN_TYPE_AP ||
  810. base_conn->state != AP_CONN_STATE_RENDDESC_WAIT ||
  811. base_conn->marked_for_close)
  812. continue;
  813. conn = TO_ENTRY_CONN(base_conn);
  814. rend_data = ENTRY_TO_EDGE_CONN(conn)->rend_data;
  815. if (!rend_data)
  816. continue;
  817. const char *onion_address = rend_data_get_address(rend_data);
  818. if (rend_cmp_service_ids(query, onion_address))
  819. continue;
  820. assert_connection_ok(base_conn, now);
  821. if (rend_cache_lookup_entry(onion_address, -1,
  822. &entry) == 0 &&
  823. rend_client_any_intro_points_usable(entry)) {
  824. /* either this fetch worked, or it failed but there was a
  825. * valid entry from before which we should reuse */
  826. log_info(LD_REND,"Rend desc is usable. Launching circuits.");
  827. base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
  828. /* restart their timeout values, so they get a fair shake at
  829. * connecting to the hidden service. */
  830. base_conn->timestamp_created = now;
  831. base_conn->timestamp_last_read_allowed = now;
  832. base_conn->timestamp_last_write_allowed = now;
  833. connection_ap_mark_as_pending_circuit(conn);
  834. } else { /* 404, or fetch didn't get that far */
  835. log_notice(LD_REND,"Closing stream for '%s.onion': hidden service is "
  836. "unavailable (try again later).",
  837. safe_str_client(query));
  838. connection_mark_unattached_ap(conn, END_STREAM_REASON_RESOLVEFAILED);
  839. rend_client_note_connection_attempt_ended(rend_data);
  840. }
  841. } SMARTLIST_FOREACH_END(base_conn);
  842. }
  843. /** Clear temporary state used only during an attempt to connect to the
  844. * hidden service with <b>rend_data</b>. Called when a connection attempt
  845. * has ended; it is possible for this to be called multiple times while
  846. * handling an ended connection attempt, and any future changes to this
  847. * function must ensure it remains idempotent. */
  848. void
  849. rend_client_note_connection_attempt_ended(const rend_data_t *rend_data)
  850. {
  851. unsigned int have_onion = 0;
  852. rend_cache_entry_t *cache_entry = NULL;
  853. const char *onion_address = rend_data_get_address(rend_data);
  854. rend_data_v2_t *rend_data_v2 = TO_REND_DATA_V2(rend_data);
  855. if (onion_address[0] != '\0') {
  856. /* Ignore return value; we find an entry, or we don't. */
  857. (void) rend_cache_lookup_entry(onion_address, -1, &cache_entry);
  858. have_onion = 1;
  859. }
  860. /* Clear the timed_out flag on all remaining intro points for this HS. */
  861. if (cache_entry != NULL) {
  862. SMARTLIST_FOREACH(cache_entry->parsed->intro_nodes,
  863. rend_intro_point_t *, ip,
  864. ip->timed_out = 0; );
  865. }
  866. /* Remove the HS's entries in last_hid_serv_requests. */
  867. if (have_onion) {
  868. unsigned int replica;
  869. for (replica = 0; replica < ARRAY_LENGTH(rend_data_v2->descriptor_id);
  870. replica++) {
  871. const char *desc_id = rend_data_v2->descriptor_id[replica];
  872. purge_v2_hidserv_req(desc_id);
  873. }
  874. log_info(LD_REND, "Connection attempt for %s has ended; "
  875. "cleaning up temporary state.",
  876. safe_str_client(onion_address));
  877. } else {
  878. /* We only have an ID for a fetch. Probably used by HSFETCH. */
  879. purge_v2_hidserv_req(rend_data_v2->desc_id_fetch);
  880. }
  881. }
  882. /** Return a newly allocated extend_info_t* for a randomly chosen introduction
  883. * point for the named hidden service. Return NULL if all introduction points
  884. * have been tried and failed.
  885. */
  886. extend_info_t *
  887. rend_client_get_random_intro(const rend_data_t *rend_query)
  888. {
  889. int ret;
  890. extend_info_t *result;
  891. rend_cache_entry_t *entry;
  892. const char *onion_address = rend_data_get_address(rend_query);
  893. ret = rend_cache_lookup_entry(onion_address, -1, &entry);
  894. if (ret < 0 || !rend_client_any_intro_points_usable(entry)) {
  895. log_warn(LD_REND,
  896. "Query '%s' didn't have valid rend desc in cache. Failing.",
  897. safe_str_client(onion_address));
  898. /* XXX: Should we refetch the descriptor here if the IPs are not usable
  899. * anymore ?. */
  900. return NULL;
  901. }
  902. /* See if we can get a node that complies with ExcludeNodes */
  903. if ((result = rend_client_get_random_intro_impl(entry, 1, 1)))
  904. return result;
  905. /* If not, and StrictNodes is not set, see if we can return any old node
  906. */
  907. if (!get_options()->StrictNodes)
  908. return rend_client_get_random_intro_impl(entry, 0, 1);
  909. return NULL;
  910. }
  911. /** As rend_client_get_random_intro, except assume that StrictNodes is set
  912. * iff <b>strict</b> is true. If <b>warnings</b> is false, don't complain
  913. * to the user when we're out of nodes, even if StrictNodes is true.
  914. */
  915. static extend_info_t *
  916. rend_client_get_random_intro_impl(const rend_cache_entry_t *entry,
  917. const int strict,
  918. const int warnings)
  919. {
  920. int i;
  921. rend_intro_point_t *intro;
  922. const or_options_t *options = get_options();
  923. smartlist_t *usable_nodes;
  924. int n_excluded = 0;
  925. /* We'll keep a separate list of the usable nodes. If this becomes empty,
  926. * no nodes are usable. */
  927. usable_nodes = smartlist_new();
  928. smartlist_add_all(usable_nodes, entry->parsed->intro_nodes);
  929. /* Remove the intro points that have timed out during this HS
  930. * connection attempt from our list of usable nodes. */
  931. SMARTLIST_FOREACH(usable_nodes, rend_intro_point_t *, ip,
  932. if (ip->timed_out) {
  933. SMARTLIST_DEL_CURRENT(usable_nodes, ip);
  934. });
  935. again:
  936. if (smartlist_len(usable_nodes) == 0) {
  937. if (n_excluded && get_options()->StrictNodes && warnings) {
  938. /* We only want to warn if StrictNodes is really set. Otherwise
  939. * we're just about to retry anyways.
  940. */
  941. log_warn(LD_REND, "All introduction points for hidden service are "
  942. "at excluded relays, and StrictNodes is set. Skipping.");
  943. }
  944. smartlist_free(usable_nodes);
  945. return NULL;
  946. }
  947. i = crypto_rand_int(smartlist_len(usable_nodes));
  948. intro = smartlist_get(usable_nodes, i);
  949. if (BUG(!intro->extend_info)) {
  950. /* This should never happen, but it isn't fatal, just try another */
  951. smartlist_del(usable_nodes, i);
  952. goto again;
  953. }
  954. /* All version 2 HS descriptors come with a TAP onion key.
  955. * Clients used to try to get the TAP onion key from the consensus, but this
  956. * meant that hidden services could discover which consensus clients have. */
  957. if (!extend_info_supports_tap(intro->extend_info)) {
  958. log_info(LD_REND, "The HS descriptor is missing a TAP onion key for the "
  959. "intro-point relay '%s'; trying another.",
  960. safe_str_client(extend_info_describe(intro->extend_info)));
  961. smartlist_del(usable_nodes, i);
  962. goto again;
  963. }
  964. /* Check if we should refuse to talk to this router. */
  965. if (strict &&
  966. routerset_contains_extendinfo(options->ExcludeNodes,
  967. intro->extend_info)) {
  968. n_excluded++;
  969. smartlist_del(usable_nodes, i);
  970. goto again;
  971. }
  972. smartlist_free(usable_nodes);
  973. return extend_info_dup(intro->extend_info);
  974. }
  975. /** Return true iff any introduction points still listed in <b>entry</b> are
  976. * usable. */
  977. int
  978. rend_client_any_intro_points_usable(const rend_cache_entry_t *entry)
  979. {
  980. extend_info_t *extend_info =
  981. rend_client_get_random_intro_impl(entry, get_options()->StrictNodes, 0);
  982. int rv = (extend_info != NULL);
  983. extend_info_free(extend_info);
  984. return rv;
  985. }
  986. /** Client-side authorizations for hidden services; map of onion address to
  987. * rend_service_authorization_t*. */
  988. static strmap_t *auth_hid_servs = NULL;
  989. /** Look up the client-side authorization for the hidden service with
  990. * <b>onion_address</b>. Return NULL if no authorization is available for
  991. * that address. */
  992. rend_service_authorization_t*
  993. rend_client_lookup_service_authorization(const char *onion_address)
  994. {
  995. tor_assert(onion_address);
  996. if (!auth_hid_servs) return NULL;
  997. return strmap_get(auth_hid_servs, onion_address);
  998. }
  999. #define rend_service_authorization_free(val) \
  1000. FREE_AND_NULL(rend_service_authorization_t, \
  1001. rend_service_authorization_free_, (val))
  1002. /** Helper: Free storage held by rend_service_authorization_t. */
  1003. static void
  1004. rend_service_authorization_free_(rend_service_authorization_t *auth)
  1005. {
  1006. tor_free(auth);
  1007. }
  1008. /** Helper for strmap_free. */
  1009. static void
  1010. rend_service_authorization_free_void(void *service_auth)
  1011. {
  1012. rend_service_authorization_free_(service_auth);
  1013. }
  1014. /** Release all the storage held in auth_hid_servs.
  1015. */
  1016. void
  1017. rend_service_authorization_free_all(void)
  1018. {
  1019. if (!auth_hid_servs) {
  1020. return;
  1021. }
  1022. strmap_free(auth_hid_servs, rend_service_authorization_free_void);
  1023. auth_hid_servs = NULL;
  1024. }
  1025. /** Parse <b>config_line</b> as a client-side authorization for a hidden
  1026. * service and add it to the local map of hidden service authorizations.
  1027. * Return 0 for success and -1 for failure. */
  1028. int
  1029. rend_parse_service_authorization(const or_options_t *options,
  1030. int validate_only)
  1031. {
  1032. config_line_t *line;
  1033. int res = -1;
  1034. strmap_t *parsed = strmap_new();
  1035. smartlist_t *sl = smartlist_new();
  1036. rend_service_authorization_t *auth = NULL;
  1037. char *err_msg = NULL;
  1038. for (line = options->HidServAuth; line; line = line->next) {
  1039. char *onion_address, *descriptor_cookie;
  1040. auth = NULL;
  1041. SMARTLIST_FOREACH(sl, char *, c, tor_free(c););
  1042. smartlist_clear(sl);
  1043. smartlist_split_string(sl, line->value, " ",
  1044. SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3);
  1045. if (smartlist_len(sl) < 2) {
  1046. log_warn(LD_CONFIG, "Configuration line does not consist of "
  1047. "\"onion-address authorization-cookie [service-name]\": "
  1048. "'%s'", line->value);
  1049. goto err;
  1050. }
  1051. auth = tor_malloc_zero(sizeof(rend_service_authorization_t));
  1052. /* Parse onion address. */
  1053. onion_address = smartlist_get(sl, 0);
  1054. if (strlen(onion_address) != REND_SERVICE_ADDRESS_LEN ||
  1055. strcmpend(onion_address, ".onion")) {
  1056. log_warn(LD_CONFIG, "Onion address has wrong format: '%s'",
  1057. onion_address);
  1058. goto err;
  1059. }
  1060. strlcpy(auth->onion_address, onion_address, REND_SERVICE_ID_LEN_BASE32+1);
  1061. if (!rend_valid_v2_service_id(auth->onion_address)) {
  1062. log_warn(LD_CONFIG, "Onion address has wrong format: '%s'",
  1063. onion_address);
  1064. goto err;
  1065. }
  1066. /* Parse descriptor cookie. */
  1067. descriptor_cookie = smartlist_get(sl, 1);
  1068. if (rend_auth_decode_cookie(descriptor_cookie, auth->descriptor_cookie,
  1069. &auth->auth_type, &err_msg) < 0) {
  1070. tor_assert(err_msg);
  1071. log_warn(LD_CONFIG, "%s", err_msg);
  1072. tor_free(err_msg);
  1073. goto err;
  1074. }
  1075. if (strmap_get(parsed, auth->onion_address)) {
  1076. log_warn(LD_CONFIG, "Duplicate authorization for the same hidden "
  1077. "service.");
  1078. goto err;
  1079. }
  1080. strmap_set(parsed, auth->onion_address, auth);
  1081. auth = NULL;
  1082. }
  1083. res = 0;
  1084. goto done;
  1085. err:
  1086. res = -1;
  1087. done:
  1088. rend_service_authorization_free(auth);
  1089. SMARTLIST_FOREACH(sl, char *, c, tor_free(c););
  1090. smartlist_free(sl);
  1091. if (!validate_only && res == 0) {
  1092. rend_service_authorization_free_all();
  1093. auth_hid_servs = parsed;
  1094. } else {
  1095. strmap_free(parsed, rend_service_authorization_free_void);
  1096. }
  1097. return res;
  1098. }
  1099. /* Can Tor client code make direct (non-anonymous) connections to introduction
  1100. * or rendezvous points?
  1101. * Returns true if tor was compiled with NON_ANONYMOUS_MODE_ENABLED, and is
  1102. * configured in Tor2web mode. */
  1103. int
  1104. rend_client_allow_non_anonymous_connection(const or_options_t *options)
  1105. {
  1106. /* Tor2web support needs to be compiled in to a tor binary. */
  1107. #ifdef NON_ANONYMOUS_MODE_ENABLED
  1108. /* Tor2web */
  1109. return options->Tor2webMode ? 1 : 0;
  1110. #else
  1111. (void)options;
  1112. return 0;
  1113. #endif /* defined(NON_ANONYMOUS_MODE_ENABLED) */
  1114. }
  1115. /* At compile-time, was non-anonymous mode enabled via
  1116. * NON_ANONYMOUS_MODE_ENABLED ? */
  1117. int
  1118. rend_client_non_anonymous_mode_enabled(const or_options_t *options)
  1119. {
  1120. (void)options;
  1121. /* Tor2web support needs to be compiled in to a tor binary. */
  1122. #ifdef NON_ANONYMOUS_MODE_ENABLED
  1123. /* Tor2web */
  1124. return 1;
  1125. #else
  1126. return 0;
  1127. #endif /* defined(NON_ANONYMOUS_MODE_ENABLED) */
  1128. }