Tor 0.4.9.13
Loading...
Searching...
No Matches
bridges.c
Go to the documentation of this file.
1/* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
5/* See LICENSE for licensing information */
6
7/**
8 * \file bridges.c
9 * \brief Code to manage bridges and bridge selection.
10 *
11 * Bridges are fixed entry nodes, used for censorship circumvention.
12 **/
13
14#define TOR_BRIDGES_PRIVATE
15
16#include "core/or/or.h"
17#include "app/config/config.h"
20#include "core/or/policies.h"
33
39
40/** Information about a configured bridge. Currently this just matches the
41 * ones in the torrc file, but one day we may be able to learn about new
42 * bridges on our own, and remember them in the state file. */
44 /** Address and port of the bridge, as configured by the user.*/
46 /** Address of the bridge. */
48 /** TLS port for the bridge. */
49 uint16_t port;
50 /** Boolean: We are re-parsing our bridge list, and we are going to remove
51 * this one if we don't find it in the list of configured bridges. */
52 unsigned marked_for_removal : 1;
53 /** Expected identity digest, or all zero bytes if we don't know what the
54 * digest should be. */
56
57 /** Name of pluggable transport protocol taken from its config line. */
59
60 /** When should we next try to fetch a descriptor for this bridge? */
62
63 /** A smartlist of k=v values to be passed to the SOCKS proxy, if
64 transports are used for this bridge. */
66};
67
68#define bridge_free(bridge) \
69 FREE_AND_NULL(bridge_info_t, bridge_free_, (bridge))
70
71static void bridge_free_(bridge_info_t *bridge);
72static void rewrite_node_address_for_bridge(const bridge_info_t *bridge,
73 node_t *node);
74
75/** A list of configured bridges. Whenever we actually get a descriptor
76 * for one, we add it as an entry guard. Note that the order of bridges
77 * in this list does not necessarily correspond to the order of bridges
78 * in the torrc. */
79static smartlist_t *bridge_list = NULL;
80
81/** Mark every entry of the bridge list to be removed on our next call to
82 * sweep_bridge_list unless it has first been un-marked. */
83void
91
92/** Remove every entry of the bridge list that was marked with
93 * mark_bridge_list if it has not subsequently been un-marked. */
94void
96{
97 if (!bridge_list)
100 if (b->marked_for_removal) {
102 bridge_free(b);
103 }
104 } SMARTLIST_FOREACH_END(b);
105}
106
107/** Initialize the bridge list to empty, creating it if needed. */
108STATIC void
116
117/** Free the bridge <b>bridge</b>. */
118static void
120{
121 if (!bridge)
122 return;
123
124 tor_free(bridge->transport_name);
125 if (bridge->socks_args) {
126 SMARTLIST_FOREACH(bridge->socks_args, char*, s, tor_free(s));
127 smartlist_free(bridge->socks_args);
128 }
129
130 tor_free(bridge);
131}
132
133/** Return a list of all the configured bridges, as bridge_info_t pointers. */
134const smartlist_t *
136{
137 if (!bridge_list)
139 return bridge_list;
140}
141
142/**
143 * Returns true if there are enough bridges to make a conflux set
144 * without re-using the same bridge.
145 */
146bool
148{
149 if (smartlist_len(bridge_list_get()) == 1) {
150 static bool warned_once = false;
151 bridge_info_t *bridge = smartlist_get(bridge_list_get(), 0);
152 tor_assert(bridge);
153
154 /* Snowflake is a special case. With one snowflake bridge,
155 * you are load balanced among many back-end bridges.
156 * So we do not need to warn the user for it. */
157 if (bridge->transport_name &&
158 strcasecmp(bridge->transport_name, "snowflake") == 0) {
159 return false;
160 }
161
162 if (!warned_once) {
163 log_warn(LD_CIRC, "Only one bridge (transport: '%s') is configured. "
164 "You should have at least two for conflux, "
165 "for any transport that is not 'snowflake'.",
166 bridge->transport_name ?
167 bridge->transport_name : "vanilla");
168 warned_once = true;
169 }
170
171 return false;
172 }
173
174 return true;
175}
176
177/**
178 * Given a <b>bridge</b>, return a pointer to its RSA identity digest, or
179 * NULL if we don't know one for it.
180 */
181const uint8_t *
183{
184 tor_assert(bridge);
185 if (tor_digest_is_zero(bridge->identity))
186 return NULL;
187 else
188 return (const uint8_t *) bridge->identity;
189}
190
191/**
192 * Given a <b>bridge</b>, return a pointer to its configured addr:port
193 * combination.
194 */
195const tor_addr_port_t *
197{
198 tor_assert(bridge);
199 return &bridge->addrport_configured;
200}
201
202/** Returns the descriptor download schedule for this configured bridge. */
205{
206 tor_assert(bridge);
207 return &bridge->fetch_status;
208}
209
210/**
211 * Given a <b>bridge</b>, return the transport name. If none were configured,
212 * NULL is returned.
213 */
214const char *
216{
217 tor_assert(bridge);
218 return bridge->transport_name;
219}
220
221/**
222 * Return true if @a bridge has a transport name for which we don't actually
223 * know a transport.
224 */
225bool
227{
228 const char *tname = bridget_get_transport_name(bridge);
229 return tname && transport_get_by_name(tname) == NULL;
230}
231
232/** If we have a bridge configured whose digest matches <b>digest</b>, or a
233 * bridge with no known digest whose address matches any of the
234 * tor_addr_port_t's in <b>orports</b>, return that bridge. Else return
235 * NULL. */
238 const smartlist_t *orports)
239{
240 if (!bridge_list)
241 return NULL;
243 {
244 if (tor_digest_is_zero(bridge->identity)) {
246 {
247 if (tor_addr_compare(&bridge->addr, &ap->addr, CMP_EXACT) == 0 &&
248 bridge->port == ap->port)
249 return bridge;
250 }
251 SMARTLIST_FOREACH_END(ap);
252 }
253 if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN))
254 return bridge;
255 }
256 SMARTLIST_FOREACH_END(bridge);
257 return NULL;
258}
259
260/** If we have a bridge configured whose digest matches <b>digest</b>, or a
261 * bridge with no known digest whose address matches <b>addr</b>:<b>port</b>,
262 * return that bridge. Else return NULL. If <b>digest</b> is NULL, check for
263 * address/port matches only. */
266 uint16_t port,
267 const char *digest)
268{
269 if (!bridge_list)
270 return NULL;
272 {
273 if ((tor_digest_is_zero(bridge->identity) || digest == NULL) &&
274 !tor_addr_compare(&bridge->addr, addr, CMP_EXACT) &&
275 bridge->port == port)
276 return bridge;
277 if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN))
278 return bridge;
279 }
280 SMARTLIST_FOREACH_END(bridge);
281 return NULL;
282}
283
284/**
285 * As get_configured_bridge_by_addr_port, but require that the
286 * address match <b>addr</b>:<b>port</b>, and that the ID digest match
287 * <b>digest</b>. (The other function will ignore the address if the
288 * digest matches.)
289 */
292 uint16_t port,
293 const char *digest)
294{
295 if (!bridge_list)
296 return NULL;
298 if (!tor_addr_compare(&bridge->addr, addr, CMP_EXACT) &&
299 bridge->port == port) {
300
301 if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN))
302 return bridge;
303 else if (!digest || tor_digest_is_zero(bridge->identity))
304 return bridge;
305 }
306
307 } SMARTLIST_FOREACH_END(bridge);
308 return NULL;
309}
310
311/** If we have a bridge configured whose digest matches <b>digest</b>, or a
312 * bridge with no known digest whose address matches <b>addr</b>:<b>port</b>,
313 * return 1. Else return 0. If <b>digest</b> is NULL, check for
314 * address/port matches only. */
315int
317 uint16_t port,
318 const char *digest)
319{
320 tor_assert(addr);
321 return get_configured_bridge_by_addr_port_digest(addr, port, digest) ? 1 : 0;
322}
323
324/** If we have a bridge configured whose digest matches
325 * <b>ei->identity_digest</b>, or a bridge with no known digest whose address
326 * matches <b>ei->addr</b>:<b>ei->port</b>, return 1. Else return 0.
327 * If <b>ei</b> has no onion key configured, check for address/port matches
328 * only.
329 *
330 * Note that if the extend_info_t contains multiple addresses, we return true
331 * only if _every_ address is a bridge.
332 */
333int
335{
336 const char *digest = curve25519_public_key_is_ok(&ei->curve25519_onion_key)
337 ? ei->identity_digest : NULL;
338 const tor_addr_port_t *ap1 = NULL, *ap2 = NULL;
339 if (! tor_addr_is_null(&ei->orports[0].addr))
340 ap1 = &ei->orports[0];
341 if (! tor_addr_is_null(&ei->orports[1].addr))
342 ap2 = &ei->orports[1];
343 IF_BUG_ONCE(ap1 == NULL) {
344 return 0;
345 }
346 return addr_is_a_configured_bridge(&ap1->addr, ap1->port, digest) &&
347 (ap2 == NULL ||
348 addr_is_a_configured_bridge(&ap2->addr, ap2->port, digest));
349}
350
351/** Wrapper around get_configured_bridge_by_addr_port_digest() to look
352 * it up via router descriptor <b>ri</b>. */
353static bridge_info_t *
355{
356 bridge_info_t *bi = NULL;
357 smartlist_t *orports = router_get_all_orports(ri);
359 orports);
360 SMARTLIST_FOREACH(orports, tor_addr_port_t *, p, tor_free(p));
361 smartlist_free(orports);
362 return bi;
363}
364
365/** Return 1 if <b>ri</b> is one of our known bridges, else 0. */
366int
371
372/**
373 * Return 1 iff <b>bridge_list</b> contains entry matching given
374 * <b>addr</b> and <b>port</b> (and no identity digest) OR
375 * it contains an entry whose identity matches <b>digest</b>.
376 * Otherwise, return 0.
377 */
378static int
380 const uint16_t port,
381 const char *digest)
382{
383 if (!tor_addr_port_is_valid(addr, port, 0))
384 return 0;
385
386 bridge_info_t *bridge =
388
389 return (bridge != NULL);
390}
391
392/** Return 1 if <b>node</b> is one of our configured bridges, else 0.
393 * More specifically, return 1 iff: a bridge_info_t object exists in
394 * <b>bridge_list</b> such that: 1) It's identity is equal to node
395 * identity OR 2) It's identity digest is zero, but it matches
396 * address and port of any ORPort in the node.
397 */
398int
400{
401 /* First, let's try searching for a bridge with matching identity. */
402 if (BUG(fast_mem_is_zero(node->identity, DIGEST_LEN)))
403 return 0;
404
405 if (find_bridge_by_digest(node->identity) != NULL)
406 return 1;
407
408 /* At this point, we have established that no bridge exists with
409 * matching identity digest. However, we still pass it into
410 * bridge_exists_* functions because we want further code to
411 * check for absence of identity digest in a bridge.
412 */
413 if (node->ri) {
415 node->ri->ipv4_orport,
416 node->identity))
417 return 1;
418
420 node->ri->ipv6_orport,
421 node->identity))
422 return 1;
423 } else if (node->rs) {
424 if (bridge_exists_with_addr_and_port(&node->rs->ipv4_addr,
425 node->rs->ipv4_orport,
426 node->identity))
427 return 1;
428
430 node->rs->ipv6_orport,
431 node->identity))
432 return 1;
433 } else if (node->md) {
435 node->md->ipv6_orport,
436 node->identity))
437 return 1;
438 }
439
440 return 0;
441}
442
443/** We made a connection to a router at <b>addr</b>:<b>port</b>
444 * without knowing its digest. Its digest turned out to be <b>digest</b>.
445 * If it was a bridge, and we still don't know its digest, record it.
446 */
447void
448learned_router_identity(const tor_addr_t *addr, uint16_t port,
449 const char *digest,
450 const ed25519_public_key_t *ed_id)
451{
452 // XXXX prop220 use ed_id here, once there is some way to specify
453 (void)ed_id;
454 int learned = 0;
455 bridge_info_t *bridge =
457 if (bridge && tor_digest_is_zero(bridge->identity)) {
458 memcpy(bridge->identity, digest, DIGEST_LEN);
459 learned = 1;
460 }
461 /* XXXX prop220 remember bridge ed25519 identities -- add a field */
462#if 0
463 if (bridge && ed_id &&
464 ed25519_public_key_is_zero(&bridge->ed25519_identity) &&
466 memcpy(&bridge->ed25519_identity, ed_id, sizeof(*ed_id));
467 learned = 1;
468 }
469#endif /* 0 */
470 if (learned) {
471 char *transport_info = NULL;
472 const char *transport_name =
474 if (transport_name)
475 tor_asprintf(&transport_info, " (with transport '%s')", transport_name);
476
477 // XXXX prop220 log both fingerprints.
478 log_notice(LD_DIR, "Learned fingerprint %s for bridge %s%s.",
479 hex_str(digest, DIGEST_LEN), fmt_addrport(addr, port),
480 transport_info ? transport_info : "");
481 tor_free(transport_info);
483 (const uint8_t *)digest);
484 }
485}
486
487/** Return true if <b>bridge</b> has the same identity digest as
488 * <b>digest</b>. If <b>digest</b> is NULL, it matches
489 * bridges with unspecified identity digests. */
490static int
491bridge_has_digest(const bridge_info_t *bridge, const char *digest)
492{
493 if (digest)
494 return tor_memeq(digest, bridge->identity, DIGEST_LEN);
495 else
496 return tor_digest_is_zero(bridge->identity);
497}
498
499/** We are about to add a new bridge at <b>addr</b>:<b>port</b>, with optional
500 * <b>digest</b> and <b>transport_name</b>. Mark for removal any previously
501 * existing bridge with the same address and port, and warn the user as
502 * appropriate.
503 */
504STATIC void
505bridge_resolve_conflicts(const tor_addr_t *addr, uint16_t port,
506 const char *digest, const char *transport_name)
507{
508 /* Iterate the already-registered bridge list:
509
510 If you find a bridge with the same address and port, mark it for
511 removal. It doesn't make sense to have two active bridges with
512 the same IP:PORT. If the bridge in question has a different
513 digest or transport than <b>digest</b>/<b>transport_name</b>,
514 it's probably a misconfiguration and we should warn the user.
515 */
517 if (bridge->marked_for_removal)
518 continue;
519
520 if (tor_addr_eq(&bridge->addr, addr) && (bridge->port == port)) {
521
522 bridge->marked_for_removal = 1;
523
524 if (!bridge_has_digest(bridge, digest) ||
525 strcmp_opt(bridge->transport_name, transport_name)) {
526 /* warn the user */
527 char *bridge_description_new, *bridge_description_old;
528 tor_asprintf(&bridge_description_new, "%s:%s:%s",
529 fmt_addrport(addr, port),
530 digest ? hex_str(digest, DIGEST_LEN) : "",
531 transport_name ? transport_name : "");
532 tor_asprintf(&bridge_description_old, "%s:%s:%s",
533 fmt_addrport(&bridge->addr, bridge->port),
534 tor_digest_is_zero(bridge->identity) ?
535 "" : hex_str(bridge->identity,DIGEST_LEN),
536 bridge->transport_name ? bridge->transport_name : "");
537
538 log_warn(LD_GENERAL,"Tried to add bridge '%s', but we found a conflict"
539 " with the already registered bridge '%s'. We will discard"
540 " the old bridge and keep '%s'. If this is not what you"
541 " wanted, please change your configuration file accordingly.",
542 bridge_description_new, bridge_description_old,
543 bridge_description_new);
544
545 tor_free(bridge_description_new);
546 tor_free(bridge_description_old);
547 }
548 }
549 } SMARTLIST_FOREACH_END(bridge);
550}
551
552/** Return True if we have a bridge that uses a transport with name
553 * <b>transport_name</b>. */
554MOCK_IMPL(int,
555transport_is_needed, (const char *transport_name))
556{
557 if (!bridge_list)
558 return 0;
559
561 if (bridge->transport_name &&
562 !strcmp(bridge->transport_name, transport_name))
563 return 1;
564 } SMARTLIST_FOREACH_END(bridge);
565
566 return 0;
567}
568
569/** Register the bridge information in <b>bridge_line</b> to the
570 * bridge subsystem. Steals reference of <b>bridge_line</b>. */
571void
573{
574 bridge_info_t *b;
575
576 // XXXX prop220 add a way to specify ed25519 ID to bridge_line_t.
577
578 { /* Log the bridge we are about to register: */
579 log_debug(LD_GENERAL, "Registering bridge at %s (transport: %s) (%s)",
580 fmt_addrport(&bridge_line->addr, bridge_line->port),
581 bridge_line->transport_name ?
582 bridge_line->transport_name : "no transport",
583 tor_digest_is_zero(bridge_line->digest) ?
584 "no key listed" : hex_str(bridge_line->digest, DIGEST_LEN));
585
586 if (bridge_line->socks_args) { /* print socks arguments */
587 int i = 0;
588
589 tor_assert(smartlist_len(bridge_line->socks_args) > 0);
590
591 log_debug(LD_GENERAL, "Bridge uses %d SOCKS arguments:",
592 smartlist_len(bridge_line->socks_args));
593 SMARTLIST_FOREACH(bridge_line->socks_args, const char *, arg,
594 log_debug(LD_CONFIG, "%d: %s", ++i, arg));
595 }
596 }
597
598 bridge_resolve_conflicts(&bridge_line->addr,
599 bridge_line->port,
600 bridge_line->digest,
601 bridge_line->transport_name);
602
603 b = tor_malloc_zero(sizeof(bridge_info_t));
604 tor_addr_copy(&b->addrport_configured.addr, &bridge_line->addr);
605 b->addrport_configured.port = bridge_line->port;
606 tor_addr_copy(&b->addr, &bridge_line->addr);
607 b->port = bridge_line->port;
608 memcpy(b->identity, bridge_line->digest, DIGEST_LEN);
609 if (bridge_line->transport_name)
610 b->transport_name = bridge_line->transport_name;
611 b->fetch_status.schedule = DL_SCHED_BRIDGE;
612 b->fetch_status.increment_on = DL_SCHED_INCREMENT_ATTEMPT;
613 /* We can't reset the bridge's download status here, because UseBridges
614 * might be 0 now, and it might be changed to 1 much later. */
615 b->socks_args = bridge_line->socks_args;
616 if (!bridge_list)
618
619 tor_free(bridge_line); /* Deallocate bridge_line now. */
620
622}
623
624/** If <b>digest</b> is one of our known bridges, return it. */
626find_bridge_by_digest(const char *digest)
627{
628 if (! bridge_list)
629 return NULL;
631 {
632 if (tor_memeq(bridge->identity, digest, DIGEST_LEN))
633 return bridge;
634 });
635 return NULL;
636}
637
638/** Given the <b>addr</b> and <b>port</b> of a bridge, if that bridge
639 * supports a pluggable transport, return its name. Otherwise, return
640 * NULL. */
641const char *
643{
644 if (!bridge_list)
645 return NULL;
646
648 if (tor_addr_eq(&bridge->addr, addr) &&
649 (bridge->port == port))
650 return bridge->transport_name;
651 } SMARTLIST_FOREACH_END(bridge);
652
653 return NULL;
654}
655
656/** If <b>addr</b> and <b>port</b> match the address and port of a
657 * bridge of ours that uses pluggable transports, place its transport
658 * in <b>transport</b>.
659 *
660 * Return 0 on success (found a transport, or found a bridge with no
661 * transport, or found no bridge); return -1 if we should be using a
662 * transport, but the transport could not be found.
663 */
664int
666 const transport_t **transport)
667{
668 *transport = NULL;
669 if (!bridge_list)
670 return 0;
671
673 if (tor_addr_eq(&bridge->addr, addr) &&
674 (bridge->port == port)) { /* bridge matched */
675 if (bridge->transport_name) { /* it also uses pluggable transports */
676 *transport = transport_get_by_name(bridge->transport_name);
677 if (*transport == NULL) { /* it uses pluggable transports, but
678 the transport could not be found! */
679 return -1;
680 }
681 return 0;
682 } else { /* bridge matched, but it doesn't use transports. */
683 break;
684 }
685 }
686 } SMARTLIST_FOREACH_END(bridge);
687
688 *transport = NULL;
689 return 0;
690}
691
692/** Return a smartlist containing all the SOCKS arguments that we
693 * should pass to the SOCKS proxy. */
694const smartlist_t *
696{
698 port,
699 NULL);
700 return bridge ? bridge->socks_args : NULL;
701}
702
703/** We need to ask <b>bridge</b> for its server descriptor. */
704static void
706{
707 const or_options_t *options = get_options();
708 circuit_guard_state_t *guard_state = NULL;
709
711 CONN_TYPE_DIR, &bridge->addr, bridge->port,
713 return; /* it's already on the way */
714
715 if (bridge_has_invalid_transport(bridge)) {
717 log_warn(LD_CONFIG, "Can't use bridge at %s: there is no configured "
718 "transport called \"%s\".",
719 safe_str_client(fmt_and_decorate_addr(&bridge->addr)),
721 return; /* Can't use this bridge; it has not */
722 }
723
724 if (routerset_contains_bridge(options->ExcludeNodes, bridge)) {
726 log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.",
727 safe_str_client(fmt_and_decorate_addr(&bridge->addr)));
728 return;
729 }
730
731 /* Until we get a descriptor for the bridge, we only know one address for
732 * it. */
733 if (!reachable_addr_allows_addr(&bridge->addr, bridge->port,
734 FIREWALL_OR_CONNECTION, 0, 0)) {
735 log_notice(LD_CONFIG, "Tried to fetch a descriptor directly from a "
736 "bridge, but that bridge is not reachable through our "
737 "firewall.");
738 return;
739 }
740
741 /* If we already have a node_t for this bridge, rewrite its address now. */
742 node_t *node = node_get_mutable_by_id(bridge->identity);
743 if (node) {
745 }
746
747 tor_addr_port_t bridge_addrport;
748 memcpy(&bridge_addrport.addr, &bridge->addr, sizeof(tor_addr_t));
749 bridge_addrport.port = bridge->port;
750
751 guard_state = get_guard_state_for_bridge_desc_fetch(bridge);
752
755 directory_request_set_or_addr_port(req, &bridge_addrport);
758 directory_request_set_resource(req, "authority.z");
759 if (guard_state) {
760 directory_request_set_guard_state(req, guard_state);
761 }
763 directory_request_free(req);
764}
765
766/** Fetching the bridge descriptor from the bridge authority returned a
767 * "not found". Fall back to trying a direct fetch. */
768void
770{
771 bridge_info_t *bridge = find_bridge_by_digest(digest);
772 if (!bridge)
773 return; /* not found? oh well. */
774
776}
777
778/** For each bridge in our list for which we don't currently have a
779 * descriptor, fetch a new copy of its descriptor -- either directly
780 * from the bridge or via a bridge authority. */
781void
782fetch_bridge_descriptors(const or_options_t *options, time_t now)
783{
784 int num_bridge_auths = get_n_authorities(BRIDGE_DIRINFO);
785 int ask_bridge_directly;
786 int can_use_bridge_authority;
787
788 if (!bridge_list)
789 return;
790
791 /* If we still have unconfigured managed proxies, don't go and
792 connect to a bridge. */
794 return;
795
797 {
798 /* This resets the download status on first use */
799 if (!download_status_is_ready(&bridge->fetch_status, now))
800 continue; /* don't bother, no need to retry yet */
801 if (routerset_contains_bridge(options->ExcludeNodes, bridge)) {
802 download_status_mark_impossible(&bridge->fetch_status);
803 log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.",
804 safe_str_client(fmt_and_decorate_addr(&bridge->addr)));
805 continue;
806 }
807
808 /* schedule the next attempt
809 * we can't increment after a failure, because sometimes we use the
810 * bridge authority, and sometimes we use the bridge direct */
812 &bridge->fetch_status,
813 safe_str_client(fmt_and_decorate_addr(&bridge->addr)),
814 now);
815
816 can_use_bridge_authority = !tor_digest_is_zero(bridge->identity) &&
817 num_bridge_auths;
818 ask_bridge_directly = !can_use_bridge_authority ||
820 log_debug(LD_DIR, "ask_bridge_directly=%d (%d, %d, %d)",
821 ask_bridge_directly, tor_digest_is_zero(bridge->identity),
822 !options->UpdateBridgesFromAuthority, !num_bridge_auths);
823
824 if (ask_bridge_directly &&
825 !reachable_addr_allows_addr(&bridge->addr, bridge->port,
826 FIREWALL_OR_CONNECTION, 0,
827 0)) {
828 log_notice(LD_DIR, "Bridge at '%s' isn't reachable by our "
829 "firewall policy. %s.",
830 fmt_addrport(&bridge->addr, bridge->port),
831 can_use_bridge_authority ?
832 "Asking bridge authority instead" : "Skipping");
833 if (can_use_bridge_authority)
834 ask_bridge_directly = 0;
835 else
836 continue;
837 }
838
839 if (ask_bridge_directly) {
840 /* we need to ask the bridge itself for its descriptor. */
842 } else {
843 /* We have a digest and we want to ask an authority. We could
844 * combine all the requests into one, but that may give more
845 * hints to the bridge authority than we want to give. */
846 char resource[10 + HEX_DIGEST_LEN];
847 memcpy(resource, "fp/", 3);
848 base16_encode(resource+3, HEX_DIGEST_LEN+1,
849 bridge->identity, DIGEST_LEN);
850 memcpy(resource+3+HEX_DIGEST_LEN, ".z", 3);
851 log_info(LD_DIR, "Fetching bridge info '%s' from bridge authority.",
852 resource);
854 ROUTER_PURPOSE_BRIDGE, resource, 0, DL_WANT_AUTHORITY);
855 }
856 }
857 SMARTLIST_FOREACH_END(bridge);
858}
859
860/** If our <b>bridge</b> is configured to be a different address than
861 * the bridge gives in <b>node</b>, rewrite the routerinfo
862 * we received to use the address we meant to use. Now we handle
863 * multihomed bridges better.
864 */
865static void
867{
868 /* XXXX move this function. */
869 /* XXXX overridden addresses should really live in the node_t, so that the
870 * routerinfo_t and the microdesc_t can be immutable. But we can only
871 * do that safely if we know that no function that connects to an OR
872 * does so through an address from any source other than node_get_addr().
873 */
874 const or_options_t *options = get_options();
875
876 if (node->ri) {
877 routerinfo_t *ri = node->ri;
878 if ((!tor_addr_compare(&bridge->addr, &ri->ipv4_addr, CMP_EXACT) &&
879 bridge->port == ri->ipv4_orport) ||
880 (!tor_addr_compare(&bridge->addr, &ri->ipv6_addr, CMP_EXACT) &&
881 bridge->port == ri->ipv6_orport)) {
882 /* they match, so no need to do anything */
883 } else {
884 if (tor_addr_family(&bridge->addr) == AF_INET) {
885 tor_addr_copy(&ri->ipv4_addr, &bridge->addr);
886 ri->ipv4_orport = bridge->port;
887 log_info(LD_DIR,
888 "Adjusted bridge routerinfo for '%s' to match configured "
889 "address %s:%d.",
890 ri->nickname, fmt_addr(&ri->ipv4_addr), ri->ipv4_orport);
891 } else if (tor_addr_family(&bridge->addr) == AF_INET6) {
892 tor_addr_copy(&ri->ipv6_addr, &bridge->addr);
893 ri->ipv6_orport = bridge->port;
894 log_info(LD_DIR,
895 "Adjusted bridge routerinfo for '%s' to match configured "
896 "address %s.",
897 ri->nickname, fmt_addrport(&ri->ipv6_addr, ri->ipv6_orport));
898 } else {
899 log_err(LD_BUG, "Address family not supported: %d.",
900 tor_addr_family(&bridge->addr));
901 return;
902 }
903 }
904
905 if (options->ClientPreferIPv6ORPort == -1) {
906 /* Mark which address to use based on which bridge_t we got. */
907 node->ipv6_preferred = (tor_addr_family(&bridge->addr) == AF_INET6 &&
908 !tor_addr_is_null(&node->ri->ipv6_addr));
909 } else {
910 /* Mark which address to use based on user preference */
912 !tor_addr_is_null(&node->ri->ipv6_addr));
913 }
914
915 /* XXXipv6 we lack support for falling back to another address for
916 the same relay, warn the user */
917 if (!tor_addr_is_null(&ri->ipv6_addr)) {
919 node_get_pref_orport(node, &ap);
920 log_notice(LD_CONFIG,
921 "Bridge '%s' has both an IPv4 and an IPv6 address. "
922 "Will prefer using its %s address (%s) based on %s.",
923 ri->nickname,
924 node->ipv6_preferred ? "IPv6" : "IPv4",
925 fmt_addrport(&ap.addr, ap.port),
926 options->ClientPreferIPv6ORPort == -1 ?
927 "the configured Bridge address" :
928 "ClientPreferIPv6ORPort");
929 }
930 }
931 if (node->rs) {
932 routerstatus_t *rs = node->rs;
933
934 if ((!tor_addr_compare(&bridge->addr, &rs->ipv4_addr, CMP_EXACT) &&
935 bridge->port == rs->ipv4_orport) ||
936 (!tor_addr_compare(&bridge->addr, &rs->ipv6_addr, CMP_EXACT) &&
937 bridge->port == rs->ipv6_orport)) {
938 /* they match, so no need to do anything */
939 } else {
940 if (tor_addr_family(&bridge->addr) == AF_INET) {
941 tor_addr_copy(&rs->ipv4_addr, &bridge->addr);
942 rs->ipv4_orport = bridge->port;
943 log_info(LD_DIR,
944 "Adjusted bridge routerstatus for '%s' to match "
945 "configured address %s.",
946 rs->nickname, fmt_addrport(&bridge->addr, rs->ipv4_orport));
947 /* set IPv6 preferences even if there is no ri */
948 } else if (tor_addr_family(&bridge->addr) == AF_INET6) {
949 tor_addr_copy(&rs->ipv6_addr, &bridge->addr);
950 rs->ipv6_orport = bridge->port;
951 log_info(LD_DIR,
952 "Adjusted bridge routerstatus for '%s' to match configured"
953 " address %s.",
955 } else {
956 log_err(LD_BUG, "Address family not supported: %d.",
957 tor_addr_family(&bridge->addr));
958 return;
959 }
960 }
961
962 if (options->ClientPreferIPv6ORPort == -1) {
963 /* Mark which address to use based on which bridge_t we got. */
964 node->ipv6_preferred = (tor_addr_family(&bridge->addr) == AF_INET6 &&
965 !tor_addr_is_null(&node->rs->ipv6_addr));
966 } else {
967 /* Mark which address to use based on user preference */
969 !tor_addr_is_null(&node->rs->ipv6_addr));
970 }
971
972 /* XXXipv6 we lack support for falling back to another address for
973 the same relay, warn the user */
974 if (!tor_addr_is_null(&rs->ipv6_addr)) {
976 node_get_pref_orport(node, &ap);
977 log_notice(LD_CONFIG,
978 "Bridge '%s' has both an IPv4 and an IPv6 address. "
979 "Will prefer using its %s address (%s) based on %s.",
980 rs->nickname,
981 node->ipv6_preferred ? "IPv6" : "IPv4",
982 fmt_addrport(&ap.addr, ap.port),
983 options->ClientPreferIPv6ORPort == -1 ?
984 "the configured Bridge address" :
985 "ClientPreferIPv6ORPort");
986 }
987 }
988}
989
990/** We just learned a descriptor for a bridge. See if that
991 * digest is in our entry guard list, and add it if not. Schedule the
992 * next fetch for a long time from now, and initiate any follow-up
993 * activities like continuing to bootstrap.
994 *
995 * <b>from_cache</b> * tells us whether we fetched it from disk (else
996 * the network)
997 *
998 * <b>desc_is_new</b> tells us if we preferred it to the old version we
999 * had, if any. */
1000void
1001learned_bridge_descriptor(routerinfo_t *ri, int from_cache, int desc_is_new)
1002{
1003 tor_assert(ri);
1005 if (get_options()->UseBridges) {
1006 /* Retry directory downloads whenever we get a bridge descriptor:
1007 * - when bootstrapping, and
1008 * - when we aren't sure if any of our bridges are reachable.
1009 * Keep on retrying until we have at least one reachable bridge. */
1010 int first = num_bridges_usable(0) < 1;
1012 time_t now = time(NULL);
1013 router_set_status(ri->cache_info.identity_digest, 1);
1014
1015 if (bridge) { /* if we actually want to use this one */
1016 node_t *node;
1017 if (!from_cache) {
1018 /* This schedules the re-fetch at a constant interval, which produces
1019 * a pattern of bridge traffic. But it's better than trying all
1020 * configured bridges several times in the first few minutes. */
1022 /* it's here; schedule its re-fetch for a long time from now. */
1023 bridge->fetch_status.next_attempt_at +=
1025 }
1026
1027 node = node_get_mutable_by_id(ri->cache_info.identity_digest);
1028 tor_assert(node);
1029 rewrite_node_address_for_bridge(bridge, node);
1030 if (tor_digest_is_zero(bridge->identity)) {
1031 memcpy(bridge->identity,ri->cache_info.identity_digest, DIGEST_LEN);
1032 log_notice(LD_DIR, "Learned identity %s for bridge at %s:%d",
1033 hex_str(bridge->identity, DIGEST_LEN),
1034 fmt_and_decorate_addr(&bridge->addr),
1035 (int) bridge->port);
1036 }
1038 (const uint8_t*)ri->cache_info.identity_digest);
1039
1040 if (desc_is_new)
1041 log_notice(LD_DIR, "new bridge descriptor '%s' (%s): %s",
1042 ri->nickname,
1043 from_cache ? "cached" : "fresh", router_describe(ri));
1044 /* If we didn't have a reachable bridge before this one, try directory
1045 * documents again. */
1046 if (first) {
1048 }
1049 }
1050 }
1051}
1052
1053/** Return a smartlist containing all bridge identity digests */
1056{
1057 smartlist_t *result = NULL;
1058 char *digest_tmp;
1059
1060 if (get_options()->UseBridges && bridge_list) {
1061 result = smartlist_new();
1062
1064 digest_tmp = tor_malloc(DIGEST_LEN);
1065 memcpy(digest_tmp, b->identity, DIGEST_LEN);
1066 smartlist_add(result, digest_tmp);
1067 } SMARTLIST_FOREACH_END(b);
1068 }
1069
1070 return result;
1071}
1072
1073/** Get the download status for a bridge descriptor given its identity */
1075get_bridge_dl_status_by_id, (const char *digest))
1076{
1077 download_status_t *dl = NULL;
1078
1079 if (digest && get_options()->UseBridges && bridge_list) {
1081 if (tor_memeq(digest, b->identity, DIGEST_LEN)) {
1082 dl = &(b->fetch_status);
1083 break;
1084 }
1085 } SMARTLIST_FOREACH_END(b);
1086 }
1087
1088 return dl;
1089}
1090
1091/** Release all storage held in bridges.c */
1092void
1094{
1096 smartlist_free(bridge_list);
1097 bridge_list = NULL;
1098}
void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src)
Definition address.c:933
int tor_addr_compare(const tor_addr_t *addr1, const tor_addr_t *addr2, tor_addr_comparison_t how)
Definition address.c:984
int tor_addr_is_null(const tor_addr_t *addr)
Definition address.c:780
const char * fmt_addrport(const tor_addr_t *addr, uint16_t port)
Definition address.c:1199
#define fmt_and_decorate_addr(a)
Definition address.h:245
static sa_family_t tor_addr_family(const tor_addr_t *a)
Definition address.h:189
#define fmt_addr(a)
Definition address.h:241
#define tor_addr_eq(a, b)
Definition address.h:282
const char * hex_str(const char *from, size_t fromlen)
Definition binascii.c:34
void base16_encode(char *dest, size_t destlen, const char *src, size_t srclen)
Definition binascii.c:478
download_status_t * get_bridge_dl_status_by_id(const char *digest)
Definition bridges.c:1075
static void rewrite_node_address_for_bridge(const bridge_info_t *bridge, node_t *node)
Definition bridges.c:866
void mark_bridge_list(void)
Definition bridges.c:84
int routerinfo_is_a_configured_bridge(const routerinfo_t *ri)
Definition bridges.c:367
STATIC void bridge_resolve_conflicts(const tor_addr_t *addr, uint16_t port, const char *digest, const char *transport_name)
Definition bridges.c:505
int addr_is_a_configured_bridge(const tor_addr_t *addr, uint16_t port, const char *digest)
Definition bridges.c:316
static void bridge_free_(bridge_info_t *bridge)
Definition bridges.c:119
void learned_router_identity(const tor_addr_t *addr, uint16_t port, const char *digest, const ed25519_public_key_t *ed_id)
Definition bridges.c:448
void sweep_bridge_list(void)
Definition bridges.c:95
STATIC bridge_info_t * get_configured_bridge_by_orports_digest(const char *digest, const smartlist_t *orports)
Definition bridges.c:237
STATIC void clear_bridge_list(void)
Definition bridges.c:109
const uint8_t * bridge_get_rsa_id_digest(const bridge_info_t *bridge)
Definition bridges.c:182
int transport_is_needed(const char *transport_name)
Definition bridges.c:555
void bridge_add_from_config(bridge_line_t *bridge_line)
Definition bridges.c:572
static void launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge)
Definition bridges.c:705
smartlist_t * list_bridge_identities(void)
Definition bridges.c:1055
int extend_info_is_a_configured_bridge(const extend_info_t *ei)
Definition bridges.c:334
int node_is_a_configured_bridge(const node_t *node)
Definition bridges.c:399
STATIC bridge_info_t * find_bridge_by_digest(const char *digest)
Definition bridges.c:626
const tor_addr_port_t * bridge_get_addr_port(const bridge_info_t *bridge)
Definition bridges.c:196
void fetch_bridge_descriptors(const or_options_t *options, time_t now)
Definition bridges.c:782
const char * find_transport_name_by_bridge_addrport(const tor_addr_t *addr, uint16_t port)
Definition bridges.c:642
const smartlist_t * bridge_list_get(void)
Definition bridges.c:135
static bridge_info_t * get_configured_bridge_by_routerinfo(const routerinfo_t *ri)
Definition bridges.c:354
void bridges_free_all(void)
Definition bridges.c:1093
int get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port, const transport_t **transport)
Definition bridges.c:665
bool conflux_can_exclude_used_bridges(void)
Definition bridges.c:147
void learned_bridge_descriptor(routerinfo_t *ri, int from_cache, int desc_is_new)
Definition bridges.c:1001
static int bridge_exists_with_addr_and_port(const tor_addr_t *addr, const uint16_t port, const char *digest)
Definition bridges.c:379
bridge_info_t * get_configured_bridge_by_exact_addr_port_digest(const tor_addr_t *addr, uint16_t port, const char *digest)
Definition bridges.c:291
static smartlist_t * bridge_list
Definition bridges.c:79
download_status_t * bridge_get_dl_status(bridge_info_t *bridge)
Definition bridges.c:204
const char * bridget_get_transport_name(const bridge_info_t *bridge)
Definition bridges.c:215
const smartlist_t * get_socks_args_by_bridge_addrport(const tor_addr_t *addr, uint16_t port)
Definition bridges.c:695
void retry_bridge_descriptor_fetch_directly(const char *digest)
Definition bridges.c:769
static int bridge_has_digest(const bridge_info_t *bridge, const char *digest)
Definition bridges.c:491
bridge_info_t * get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr, uint16_t port, const char *digest)
Definition bridges.c:265
bool bridge_has_invalid_transport(const bridge_info_t *bridge)
Definition bridges.c:226
Header file for circuitbuild.c.
Header file for circuitbuild.c.
const or_options_t * get_options(void)
Definition config.c:949
Header file for config.c.
connection_t * connection_get_by_type_addr_port_purpose(int type, const tor_addr_t *addr, uint16_t port, int purpose)
Header file for connection.c.
#define CONN_TYPE_DIR
Definition connection.h:55
int curve25519_public_key_is_ok(const curve25519_public_key_t *key)
#define HEX_DIGEST_LEN
int ed25519_public_key_is_zero(const ed25519_public_key_t *pubkey)
const char * router_describe(const routerinfo_t *ri)
Definition describe.c:137
Header file for describe.c.
int tor_memeq(const void *a, const void *b, size_t sz)
Definition di_ops.c:107
#define DIGEST_LEN
void directory_request_set_resource(directory_request_t *req, const char *resource)
Definition dirclient.c:1037
void directory_request_set_or_addr_port(directory_request_t *req, const tor_addr_port_t *p)
Definition dirclient.c:975
void directory_request_set_guard_state(directory_request_t *req, circuit_guard_state_t *state)
Definition dirclient.c:1114
void directory_request_set_router_purpose(directory_request_t *req, uint8_t router_purpose)
Definition dirclient.c:1008
void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, const char *resource, int pds_flags, download_want_authority_t want_authority)
Definition dirclient.c:453
void directory_request_set_directory_id_digest(directory_request_t *req, const char *digest)
Definition dirclient.c:996
void directory_initiate_request(directory_request_t *request)
Definition dirclient.c:1244
directory_request_t * directory_request_new(uint8_t dir_purpose)
Definition dirclient.c:941
Header file for dirclient.c.
struct directory_request_t directory_request_t
Definition dirclient.h:52
Header file for directory.c.
#define DIR_PURPOSE_FETCH_SERVERDESC
Definition directory.h:36
int get_n_authorities(dirinfo_type_t type)
Definition dirlist.c:103
Header file for dirlist.c.
int download_status_is_ready(download_status_t *dls, time_t now)
Definition dlstatus.c:380
time_t download_status_increment_attempt(download_status_t *dls, const char *item, time_t now)
Definition dlstatus.c:308
void download_status_mark_impossible(download_status_t *dl)
Definition dlstatus.c:392
void download_status_reset(download_status_t *dls)
Definition dlstatus.c:363
Header file for dlstatus.c.
void entry_guard_learned_bridge_identity(const tor_addr_port_t *addrport, const uint8_t *rsa_id_digest)
Definition entrynodes.c:981
int num_bridges_usable(int use_maybe_reachable)
circuit_guard_state_t * get_guard_state_for_bridge_desc_fetch(const bridge_info_t *bridge)
Header file for circuitbuild.c.
Extend-info structure.
#define LD_APP
Definition log.h:78
#define LD_BUG
Definition log.h:86
#define LD_GENERAL
Definition log.h:62
#define LD_DIR
Definition log.h:88
#define LD_CONFIG
Definition log.h:68
#define LD_CIRC
Definition log.h:82
#define tor_free(p)
Definition malloc.h:56
Microdescriptor structure.
Node information structure.
void node_get_pref_orport(const node_t *node, tor_addr_port_t *ap_out)
Definition nodelist.c:1876
node_t * node_get_mutable_by_id(const char *identity_digest)
Definition nodelist.c:197
void router_set_status(const char *digest, int up)
Definition nodelist.c:2427
Header file for nodelist.c.
Master header file for Tor-specific functionality.
@ BRIDGE_DIRINFO
Definition or.h:895
int reachable_addr_prefer_ipv6_orport(const or_options_t *options)
Definition policies.c:490
int reachable_addr_allows_addr(const tor_addr_t *addr, uint16_t port, firewall_connection_t fw_connection, int pref_only, int pref_ipv6)
Definition policies.c:536
Header file for policies.c.
int tor_asprintf(char **strp, const char *fmt,...)
Definition printf.c:75
smartlist_t * router_get_all_orports(const routerinfo_t *ri)
Definition routerinfo.c:68
Header file for routerinfo.c.
Router descriptor structure.
#define ROUTER_PURPOSE_BRIDGE
void routerlist_retry_directory_downloads(time_t now)
Header file for routerlist.c.
int routerset_contains_bridge(const routerset_t *set, const bridge_info_t *bridge)
Definition routerset.c:365
Header file for routerset.c.
Routerstatus (consensus entry) structure.
smartlist_t * smartlist_new(void)
void smartlist_add(smartlist_t *sl, void *element)
void smartlist_clear(smartlist_t *sl)
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
#define SMARTLIST_FOREACH(sl, type, var, cmd)
#define SMARTLIST_DEL_CURRENT(sl, var)
tor_addr_port_t addrport_configured
Definition bridges.c:45
char * transport_name
Definition bridges.c:58
uint16_t port
Definition bridges.c:49
char identity[DIGEST_LEN]
Definition bridges.c:55
unsigned marked_for_removal
Definition bridges.c:52
download_status_t fetch_status
Definition bridges.c:61
smartlist_t * socks_args
Definition bridges.c:65
tor_addr_t addr
Definition bridges.c:47
download_schedule_increment_bitfield_t increment_on
download_schedule_bitfield_t schedule
tor_addr_port_t orports[EXTEND_INFO_MAX_ADDRS]
char identity_digest[DIGEST_LEN]
curve25519_public_key_t curve25519_onion_key
uint16_t ipv6_orport
tor_addr_t ipv6_addr
char identity[DIGEST_LEN]
Definition node_st.h:46
unsigned int ipv6_preferred
Definition node_st.h:93
int UpdateBridgesFromAuthority
int ClientPreferIPv6ORPort
struct routerset_t * ExcludeNodes
int TestingBridgeDownloadInitialDelay
tor_addr_t ipv6_addr
tor_addr_t ipv4_addr
tor_addr_t ipv6_addr
char nickname[MAX_NICKNAME_LEN+1]
char identity_digest[DIGEST_LEN]
#define STATIC
Definition testsupport.h:32
#define MOCK_IMPL(rv, funcname, arglist)
int pt_proxies_configuration_pending(void)
Definition transports.c:399
transport_t * transport_get_by_name(const char *name)
Definition transports.c:239
Headers for transports.c.
#define tor_assert(expr)
Definition util_bug.h:103
#define IF_BUG_ONCE(cond)
Definition util_bug.h:254
int strcmp_opt(const char *s1, const char *s2)
int fast_mem_is_zero(const char *mem, size_t len)
Definition util_string.c:76
int tor_digest_is_zero(const char *digest)
Definition util_string.c:98