Tor 0.4.9.0-alpha-dev
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
85{
86 if (!bridge_list)
89 b->marked_for_removal = 1);
90}
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
110{
111 if (!bridge_list)
113 SMARTLIST_FOREACH(bridge_list, bridge_info_t *, b, bridge_free(b));
115}
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/**
203 * Given a <b>bridge</b>, return the transport name. If none were configured,
204 * NULL is returned.
205 */
206const char *
208{
209 tor_assert(bridge);
210 return bridge->transport_name;
211}
212
213/**
214 * Return true if @a bridge has a transport name for which we don't actually
215 * know a transport.
216 */
217bool
219{
220 const char *tname = bridget_get_transport_name(bridge);
221 return tname && transport_get_by_name(tname) == NULL;
222}
223
224/** If we have a bridge configured whose digest matches <b>digest</b>, or a
225 * bridge with no known digest whose address matches any of the
226 * tor_addr_port_t's in <b>orports</b>, return that bridge. Else return
227 * NULL. */
230 const smartlist_t *orports)
231{
232 if (!bridge_list)
233 return NULL;
235 {
236 if (tor_digest_is_zero(bridge->identity)) {
238 {
239 if (tor_addr_compare(&bridge->addr, &ap->addr, CMP_EXACT) == 0 &&
240 bridge->port == ap->port)
241 return bridge;
242 }
243 SMARTLIST_FOREACH_END(ap);
244 }
245 if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN))
246 return bridge;
247 }
248 SMARTLIST_FOREACH_END(bridge);
249 return NULL;
250}
251
252/** If we have a bridge configured whose digest matches <b>digest</b>, or a
253 * bridge with no known digest whose address matches <b>addr</b>:<b>port</b>,
254 * return that bridge. Else return NULL. If <b>digest</b> is NULL, check for
255 * address/port matches only. */
258 uint16_t port,
259 const char *digest)
260{
261 if (!bridge_list)
262 return NULL;
264 {
265 if ((tor_digest_is_zero(bridge->identity) || digest == NULL) &&
266 !tor_addr_compare(&bridge->addr, addr, CMP_EXACT) &&
267 bridge->port == port)
268 return bridge;
269 if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN))
270 return bridge;
271 }
272 SMARTLIST_FOREACH_END(bridge);
273 return NULL;
274}
275
276/**
277 * As get_configured_bridge_by_addr_port, but require that the
278 * address match <b>addr</b>:<b>port</b>, and that the ID digest match
279 * <b>digest</b>. (The other function will ignore the address if the
280 * digest matches.)
281 */
284 uint16_t port,
285 const char *digest)
286{
287 if (!bridge_list)
288 return NULL;
290 if (!tor_addr_compare(&bridge->addr, addr, CMP_EXACT) &&
291 bridge->port == port) {
292
293 if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN))
294 return bridge;
295 else if (!digest || tor_digest_is_zero(bridge->identity))
296 return bridge;
297 }
298
299 } SMARTLIST_FOREACH_END(bridge);
300 return NULL;
301}
302
303/** If we have a bridge configured whose digest matches <b>digest</b>, or a
304 * bridge with no known digest whose address matches <b>addr</b>:<b>port</b>,
305 * return 1. Else return 0. If <b>digest</b> is NULL, check for
306 * address/port matches only. */
307int
309 uint16_t port,
310 const char *digest)
311{
312 tor_assert(addr);
313 return get_configured_bridge_by_addr_port_digest(addr, port, digest) ? 1 : 0;
314}
315
316/** If we have a bridge configured whose digest matches
317 * <b>ei->identity_digest</b>, or a bridge with no known digest whose address
318 * matches <b>ei->addr</b>:<b>ei->port</b>, return 1. Else return 0.
319 * If <b>ei->onion_key</b> is NULL, check for address/port matches only.
320 *
321 * Note that if the extend_info_t contains multiple addresses, we return true
322 * only if _every_ address is a bridge.
323 */
324int
326{
327 const char *digest = ei->onion_key ? ei->identity_digest : NULL;
328 const tor_addr_port_t *ap1 = NULL, *ap2 = NULL;
329 if (! tor_addr_is_null(&ei->orports[0].addr))
330 ap1 = &ei->orports[0];
331 if (! tor_addr_is_null(&ei->orports[1].addr))
332 ap2 = &ei->orports[1];
333 IF_BUG_ONCE(ap1 == NULL) {
334 return 0;
335 }
336 return addr_is_a_configured_bridge(&ap1->addr, ap1->port, digest) &&
337 (ap2 == NULL ||
338 addr_is_a_configured_bridge(&ap2->addr, ap2->port, digest));
339}
340
341/** Wrapper around get_configured_bridge_by_addr_port_digest() to look
342 * it up via router descriptor <b>ri</b>. */
343static bridge_info_t *
345{
346 bridge_info_t *bi = NULL;
347 smartlist_t *orports = router_get_all_orports(ri);
349 orports);
350 SMARTLIST_FOREACH(orports, tor_addr_port_t *, p, tor_free(p));
351 smartlist_free(orports);
352 return bi;
353}
354
355/** Return 1 if <b>ri</b> is one of our known bridges, else 0. */
356int
358{
359 return get_configured_bridge_by_routerinfo(ri) ? 1 : 0;
360}
361
362/**
363 * Return 1 iff <b>bridge_list</b> contains entry matching given
364 * <b>addr</b> and <b>port</b> (and no identity digest) OR
365 * it contains an entry whose identity matches <b>digest</b>.
366 * Otherwise, return 0.
367 */
368static int
370 const uint16_t port,
371 const char *digest)
372{
373 if (!tor_addr_port_is_valid(addr, port, 0))
374 return 0;
375
376 bridge_info_t *bridge =
378
379 return (bridge != NULL);
380}
381
382/** Return 1 if <b>node</b> is one of our configured bridges, else 0.
383 * More specifically, return 1 iff: a bridge_info_t object exists in
384 * <b>bridge_list</b> such that: 1) It's identity is equal to node
385 * identity OR 2) It's identity digest is zero, but it matches
386 * address and port of any ORPort in the node.
387 */
388int
390{
391 /* First, let's try searching for a bridge with matching identity. */
392 if (BUG(fast_mem_is_zero(node->identity, DIGEST_LEN)))
393 return 0;
394
395 if (find_bridge_by_digest(node->identity) != NULL)
396 return 1;
397
398 /* At this point, we have established that no bridge exists with
399 * matching identity digest. However, we still pass it into
400 * bridge_exists_* functions because we want further code to
401 * check for absence of identity digest in a bridge.
402 */
403 if (node->ri) {
405 node->ri->ipv4_orport,
406 node->identity))
407 return 1;
408
410 node->ri->ipv6_orport,
411 node->identity))
412 return 1;
413 } else if (node->rs) {
414 if (bridge_exists_with_addr_and_port(&node->rs->ipv4_addr,
415 node->rs->ipv4_orport,
416 node->identity))
417 return 1;
418
420 node->rs->ipv6_orport,
421 node->identity))
422 return 1;
423 } else if (node->md) {
425 node->md->ipv6_orport,
426 node->identity))
427 return 1;
428 }
429
430 return 0;
431}
432
433/** We made a connection to a router at <b>addr</b>:<b>port</b>
434 * without knowing its digest. Its digest turned out to be <b>digest</b>.
435 * If it was a bridge, and we still don't know its digest, record it.
436 */
437void
438learned_router_identity(const tor_addr_t *addr, uint16_t port,
439 const char *digest,
440 const ed25519_public_key_t *ed_id)
441{
442 // XXXX prop220 use ed_id here, once there is some way to specify
443 (void)ed_id;
444 int learned = 0;
445 bridge_info_t *bridge =
447 if (bridge && tor_digest_is_zero(bridge->identity)) {
448 memcpy(bridge->identity, digest, DIGEST_LEN);
449 learned = 1;
450 }
451 /* XXXX prop220 remember bridge ed25519 identities -- add a field */
452#if 0
453 if (bridge && ed_id &&
454 ed25519_public_key_is_zero(&bridge->ed25519_identity) &&
456 memcpy(&bridge->ed25519_identity, ed_id, sizeof(*ed_id));
457 learned = 1;
458 }
459#endif /* 0 */
460 if (learned) {
461 char *transport_info = NULL;
462 const char *transport_name =
464 if (transport_name)
465 tor_asprintf(&transport_info, " (with transport '%s')", transport_name);
466
467 // XXXX prop220 log both fingerprints.
468 log_notice(LD_DIR, "Learned fingerprint %s for bridge %s%s.",
469 hex_str(digest, DIGEST_LEN), fmt_addrport(addr, port),
470 transport_info ? transport_info : "");
471 tor_free(transport_info);
473 (const uint8_t *)digest);
474 }
475}
476
477/** Return true if <b>bridge</b> has the same identity digest as
478 * <b>digest</b>. If <b>digest</b> is NULL, it matches
479 * bridges with unspecified identity digests. */
480static int
481bridge_has_digest(const bridge_info_t *bridge, const char *digest)
482{
483 if (digest)
484 return tor_memeq(digest, bridge->identity, DIGEST_LEN);
485 else
486 return tor_digest_is_zero(bridge->identity);
487}
488
489/** We are about to add a new bridge at <b>addr</b>:<b>port</b>, with optional
490 * <b>digest</b> and <b>transport_name</b>. Mark for removal any previously
491 * existing bridge with the same address and port, and warn the user as
492 * appropriate.
493 */
494STATIC void
495bridge_resolve_conflicts(const tor_addr_t *addr, uint16_t port,
496 const char *digest, const char *transport_name)
497{
498 /* Iterate the already-registered bridge list:
499
500 If you find a bridge with the same address and port, mark it for
501 removal. It doesn't make sense to have two active bridges with
502 the same IP:PORT. If the bridge in question has a different
503 digest or transport than <b>digest</b>/<b>transport_name</b>,
504 it's probably a misconfiguration and we should warn the user.
505 */
507 if (bridge->marked_for_removal)
508 continue;
509
510 if (tor_addr_eq(&bridge->addr, addr) && (bridge->port == port)) {
511
512 bridge->marked_for_removal = 1;
513
514 if (!bridge_has_digest(bridge, digest) ||
515 strcmp_opt(bridge->transport_name, transport_name)) {
516 /* warn the user */
517 char *bridge_description_new, *bridge_description_old;
518 tor_asprintf(&bridge_description_new, "%s:%s:%s",
519 fmt_addrport(addr, port),
520 digest ? hex_str(digest, DIGEST_LEN) : "",
521 transport_name ? transport_name : "");
522 tor_asprintf(&bridge_description_old, "%s:%s:%s",
523 fmt_addrport(&bridge->addr, bridge->port),
524 tor_digest_is_zero(bridge->identity) ?
525 "" : hex_str(bridge->identity,DIGEST_LEN),
526 bridge->transport_name ? bridge->transport_name : "");
527
528 log_warn(LD_GENERAL,"Tried to add bridge '%s', but we found a conflict"
529 " with the already registered bridge '%s'. We will discard"
530 " the old bridge and keep '%s'. If this is not what you"
531 " wanted, please change your configuration file accordingly.",
532 bridge_description_new, bridge_description_old,
533 bridge_description_new);
534
535 tor_free(bridge_description_new);
536 tor_free(bridge_description_old);
537 }
538 }
539 } SMARTLIST_FOREACH_END(bridge);
540}
541
542/** Return True if we have a bridge that uses a transport with name
543 * <b>transport_name</b>. */
544MOCK_IMPL(int,
545transport_is_needed, (const char *transport_name))
546{
547 if (!bridge_list)
548 return 0;
549
551 if (bridge->transport_name &&
552 !strcmp(bridge->transport_name, transport_name))
553 return 1;
554 } SMARTLIST_FOREACH_END(bridge);
555
556 return 0;
557}
558
559/** Register the bridge information in <b>bridge_line</b> to the
560 * bridge subsystem. Steals reference of <b>bridge_line</b>. */
561void
563{
564 bridge_info_t *b;
565
566 // XXXX prop220 add a way to specify ed25519 ID to bridge_line_t.
567
568 { /* Log the bridge we are about to register: */
569 log_debug(LD_GENERAL, "Registering bridge at %s (transport: %s) (%s)",
570 fmt_addrport(&bridge_line->addr, bridge_line->port),
571 bridge_line->transport_name ?
572 bridge_line->transport_name : "no transport",
573 tor_digest_is_zero(bridge_line->digest) ?
574 "no key listed" : hex_str(bridge_line->digest, DIGEST_LEN));
575
576 if (bridge_line->socks_args) { /* print socks arguments */
577 int i = 0;
578
579 tor_assert(smartlist_len(bridge_line->socks_args) > 0);
580
581 log_debug(LD_GENERAL, "Bridge uses %d SOCKS arguments:",
582 smartlist_len(bridge_line->socks_args));
583 SMARTLIST_FOREACH(bridge_line->socks_args, const char *, arg,
584 log_debug(LD_CONFIG, "%d: %s", ++i, arg));
585 }
586 }
587
588 bridge_resolve_conflicts(&bridge_line->addr,
589 bridge_line->port,
590 bridge_line->digest,
591 bridge_line->transport_name);
592
593 b = tor_malloc_zero(sizeof(bridge_info_t));
594 tor_addr_copy(&b->addrport_configured.addr, &bridge_line->addr);
595 b->addrport_configured.port = bridge_line->port;
596 tor_addr_copy(&b->addr, &bridge_line->addr);
597 b->port = bridge_line->port;
598 memcpy(b->identity, bridge_line->digest, DIGEST_LEN);
599 if (bridge_line->transport_name)
600 b->transport_name = bridge_line->transport_name;
601 b->fetch_status.schedule = DL_SCHED_BRIDGE;
602 b->fetch_status.increment_on = DL_SCHED_INCREMENT_ATTEMPT;
603 /* We can't reset the bridge's download status here, because UseBridges
604 * might be 0 now, and it might be changed to 1 much later. */
605 b->socks_args = bridge_line->socks_args;
606 if (!bridge_list)
608
609 tor_free(bridge_line); /* Deallocate bridge_line now. */
610
612}
613
614/** If <b>digest</b> is one of our known bridges, return it. */
616find_bridge_by_digest(const char *digest)
617{
618 if (! bridge_list)
619 return NULL;
621 {
622 if (tor_memeq(bridge->identity, digest, DIGEST_LEN))
623 return bridge;
624 });
625 return NULL;
626}
627
628/** Given the <b>addr</b> and <b>port</b> of a bridge, if that bridge
629 * supports a pluggable transport, return its name. Otherwise, return
630 * NULL. */
631const char *
633{
634 if (!bridge_list)
635 return NULL;
636
638 if (tor_addr_eq(&bridge->addr, addr) &&
639 (bridge->port == port))
640 return bridge->transport_name;
641 } SMARTLIST_FOREACH_END(bridge);
642
643 return NULL;
644}
645
646/** If <b>addr</b> and <b>port</b> match the address and port of a
647 * bridge of ours that uses pluggable transports, place its transport
648 * in <b>transport</b>.
649 *
650 * Return 0 on success (found a transport, or found a bridge with no
651 * transport, or found no bridge); return -1 if we should be using a
652 * transport, but the transport could not be found.
653 */
654int
656 const transport_t **transport)
657{
658 *transport = NULL;
659 if (!bridge_list)
660 return 0;
661
663 if (tor_addr_eq(&bridge->addr, addr) &&
664 (bridge->port == port)) { /* bridge matched */
665 if (bridge->transport_name) { /* it also uses pluggable transports */
666 *transport = transport_get_by_name(bridge->transport_name);
667 if (*transport == NULL) { /* it uses pluggable transports, but
668 the transport could not be found! */
669 return -1;
670 }
671 return 0;
672 } else { /* bridge matched, but it doesn't use transports. */
673 break;
674 }
675 }
676 } SMARTLIST_FOREACH_END(bridge);
677
678 *transport = NULL;
679 return 0;
680}
681
682/** Return a smartlist containing all the SOCKS arguments that we
683 * should pass to the SOCKS proxy. */
684const smartlist_t *
686{
688 port,
689 NULL);
690 return bridge ? bridge->socks_args : NULL;
691}
692
693/** We need to ask <b>bridge</b> for its server descriptor. */
694static void
696{
697 const or_options_t *options = get_options();
698 circuit_guard_state_t *guard_state = NULL;
699
701 CONN_TYPE_DIR, &bridge->addr, bridge->port,
703 return; /* it's already on the way */
704
705 if (bridge_has_invalid_transport(bridge)) {
707 log_warn(LD_CONFIG, "Can't use bridge at %s: there is no configured "
708 "transport called \"%s\".",
709 safe_str_client(fmt_and_decorate_addr(&bridge->addr)),
711 return; /* Can't use this bridge; it has not */
712 }
713
714 if (routerset_contains_bridge(options->ExcludeNodes, bridge)) {
716 log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.",
717 safe_str_client(fmt_and_decorate_addr(&bridge->addr)));
718 return;
719 }
720
721 /* Until we get a descriptor for the bridge, we only know one address for
722 * it. */
723 if (!reachable_addr_allows_addr(&bridge->addr, bridge->port,
724 FIREWALL_OR_CONNECTION, 0, 0)) {
725 log_notice(LD_CONFIG, "Tried to fetch a descriptor directly from a "
726 "bridge, but that bridge is not reachable through our "
727 "firewall.");
728 return;
729 }
730
731 /* If we already have a node_t for this bridge, rewrite its address now. */
732 node_t *node = node_get_mutable_by_id(bridge->identity);
733 if (node) {
735 }
736
737 tor_addr_port_t bridge_addrport;
738 memcpy(&bridge_addrport.addr, &bridge->addr, sizeof(tor_addr_t));
739 bridge_addrport.port = bridge->port;
740
741 guard_state = get_guard_state_for_bridge_desc_fetch(bridge->identity);
742
745 directory_request_set_or_addr_port(req, &bridge_addrport);
748 directory_request_set_resource(req, "authority.z");
749 if (guard_state) {
750 directory_request_set_guard_state(req, guard_state);
751 }
753 directory_request_free(req);
754}
755
756/** Fetching the bridge descriptor from the bridge authority returned a
757 * "not found". Fall back to trying a direct fetch. */
758void
760{
761 bridge_info_t *bridge = find_bridge_by_digest(digest);
762 if (!bridge)
763 return; /* not found? oh well. */
764
766}
767
768/** For each bridge in our list for which we don't currently have a
769 * descriptor, fetch a new copy of its descriptor -- either directly
770 * from the bridge or via a bridge authority. */
771void
772fetch_bridge_descriptors(const or_options_t *options, time_t now)
773{
774 int num_bridge_auths = get_n_authorities(BRIDGE_DIRINFO);
775 int ask_bridge_directly;
776 int can_use_bridge_authority;
777
778 if (!bridge_list)
779 return;
780
781 /* If we still have unconfigured managed proxies, don't go and
782 connect to a bridge. */
784 return;
785
787 {
788 /* This resets the download status on first use */
789 if (!download_status_is_ready(&bridge->fetch_status, now))
790 continue; /* don't bother, no need to retry yet */
791 if (routerset_contains_bridge(options->ExcludeNodes, bridge)) {
792 download_status_mark_impossible(&bridge->fetch_status);
793 log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.",
794 safe_str_client(fmt_and_decorate_addr(&bridge->addr)));
795 continue;
796 }
797
798 /* schedule the next attempt
799 * we can't increment after a failure, because sometimes we use the
800 * bridge authority, and sometimes we use the bridge direct */
802 &bridge->fetch_status,
803 safe_str_client(fmt_and_decorate_addr(&bridge->addr)),
804 now);
805
806 can_use_bridge_authority = !tor_digest_is_zero(bridge->identity) &&
807 num_bridge_auths;
808 ask_bridge_directly = !can_use_bridge_authority ||
810 log_debug(LD_DIR, "ask_bridge_directly=%d (%d, %d, %d)",
811 ask_bridge_directly, tor_digest_is_zero(bridge->identity),
812 !options->UpdateBridgesFromAuthority, !num_bridge_auths);
813
814 if (ask_bridge_directly &&
815 !reachable_addr_allows_addr(&bridge->addr, bridge->port,
816 FIREWALL_OR_CONNECTION, 0,
817 0)) {
818 log_notice(LD_DIR, "Bridge at '%s' isn't reachable by our "
819 "firewall policy. %s.",
820 fmt_addrport(&bridge->addr, bridge->port),
821 can_use_bridge_authority ?
822 "Asking bridge authority instead" : "Skipping");
823 if (can_use_bridge_authority)
824 ask_bridge_directly = 0;
825 else
826 continue;
827 }
828
829 if (ask_bridge_directly) {
830 /* we need to ask the bridge itself for its descriptor. */
832 } else {
833 /* We have a digest and we want to ask an authority. We could
834 * combine all the requests into one, but that may give more
835 * hints to the bridge authority than we want to give. */
836 char resource[10 + HEX_DIGEST_LEN];
837 memcpy(resource, "fp/", 3);
838 base16_encode(resource+3, HEX_DIGEST_LEN+1,
839 bridge->identity, DIGEST_LEN);
840 memcpy(resource+3+HEX_DIGEST_LEN, ".z", 3);
841 log_info(LD_DIR, "Fetching bridge info '%s' from bridge authority.",
842 resource);
844 ROUTER_PURPOSE_BRIDGE, resource, 0, DL_WANT_AUTHORITY);
845 }
846 }
847 SMARTLIST_FOREACH_END(bridge);
848}
849
850/** If our <b>bridge</b> is configured to be a different address than
851 * the bridge gives in <b>node</b>, rewrite the routerinfo
852 * we received to use the address we meant to use. Now we handle
853 * multihomed bridges better.
854 */
855static void
857{
858 /* XXXX move this function. */
859 /* XXXX overridden addresses should really live in the node_t, so that the
860 * routerinfo_t and the microdesc_t can be immutable. But we can only
861 * do that safely if we know that no function that connects to an OR
862 * does so through an address from any source other than node_get_addr().
863 */
864 const or_options_t *options = get_options();
865
866 if (node->ri) {
867 routerinfo_t *ri = node->ri;
868 if ((!tor_addr_compare(&bridge->addr, &ri->ipv4_addr, CMP_EXACT) &&
869 bridge->port == ri->ipv4_orport) ||
870 (!tor_addr_compare(&bridge->addr, &ri->ipv6_addr, CMP_EXACT) &&
871 bridge->port == ri->ipv6_orport)) {
872 /* they match, so no need to do anything */
873 } else {
874 if (tor_addr_family(&bridge->addr) == AF_INET) {
875 tor_addr_copy(&ri->ipv4_addr, &bridge->addr);
876 ri->ipv4_orport = bridge->port;
877 log_info(LD_DIR,
878 "Adjusted bridge routerinfo for '%s' to match configured "
879 "address %s:%d.",
880 ri->nickname, fmt_addr(&ri->ipv4_addr), ri->ipv4_orport);
881 } else if (tor_addr_family(&bridge->addr) == AF_INET6) {
882 tor_addr_copy(&ri->ipv6_addr, &bridge->addr);
883 ri->ipv6_orport = bridge->port;
884 log_info(LD_DIR,
885 "Adjusted bridge routerinfo for '%s' to match configured "
886 "address %s.",
887 ri->nickname, fmt_addrport(&ri->ipv6_addr, ri->ipv6_orport));
888 } else {
889 log_err(LD_BUG, "Address family not supported: %d.",
890 tor_addr_family(&bridge->addr));
891 return;
892 }
893 }
894
895 if (options->ClientPreferIPv6ORPort == -1) {
896 /* Mark which address to use based on which bridge_t we got. */
897 node->ipv6_preferred = (tor_addr_family(&bridge->addr) == AF_INET6 &&
898 !tor_addr_is_null(&node->ri->ipv6_addr));
899 } else {
900 /* Mark which address to use based on user preference */
902 !tor_addr_is_null(&node->ri->ipv6_addr));
903 }
904
905 /* XXXipv6 we lack support for falling back to another address for
906 the same relay, warn the user */
907 if (!tor_addr_is_null(&ri->ipv6_addr)) {
909 node_get_pref_orport(node, &ap);
910 log_notice(LD_CONFIG,
911 "Bridge '%s' has both an IPv4 and an IPv6 address. "
912 "Will prefer using its %s address (%s) based on %s.",
913 ri->nickname,
914 node->ipv6_preferred ? "IPv6" : "IPv4",
915 fmt_addrport(&ap.addr, ap.port),
916 options->ClientPreferIPv6ORPort == -1 ?
917 "the configured Bridge address" :
918 "ClientPreferIPv6ORPort");
919 }
920 }
921 if (node->rs) {
922 routerstatus_t *rs = node->rs;
923
924 if ((!tor_addr_compare(&bridge->addr, &rs->ipv4_addr, CMP_EXACT) &&
925 bridge->port == rs->ipv4_orport) ||
926 (!tor_addr_compare(&bridge->addr, &rs->ipv6_addr, CMP_EXACT) &&
927 bridge->port == rs->ipv6_orport)) {
928 /* they match, so no need to do anything */
929 } else {
930 if (tor_addr_family(&bridge->addr) == AF_INET) {
931 tor_addr_copy(&rs->ipv4_addr, &bridge->addr);
932 rs->ipv4_orport = bridge->port;
933 log_info(LD_DIR,
934 "Adjusted bridge routerstatus for '%s' to match "
935 "configured address %s.",
936 rs->nickname, fmt_addrport(&bridge->addr, rs->ipv4_orport));
937 /* set IPv6 preferences even if there is no ri */
938 } else if (tor_addr_family(&bridge->addr) == AF_INET6) {
939 tor_addr_copy(&rs->ipv6_addr, &bridge->addr);
940 rs->ipv6_orport = bridge->port;
941 log_info(LD_DIR,
942 "Adjusted bridge routerstatus for '%s' to match configured"
943 " address %s.",
945 } else {
946 log_err(LD_BUG, "Address family not supported: %d.",
947 tor_addr_family(&bridge->addr));
948 return;
949 }
950 }
951
952 if (options->ClientPreferIPv6ORPort == -1) {
953 /* Mark which address to use based on which bridge_t we got. */
954 node->ipv6_preferred = (tor_addr_family(&bridge->addr) == AF_INET6 &&
955 !tor_addr_is_null(&node->rs->ipv6_addr));
956 } else {
957 /* Mark which address to use based on user preference */
959 !tor_addr_is_null(&node->rs->ipv6_addr));
960 }
961
962 /* XXXipv6 we lack support for falling back to another address for
963 the same relay, warn the user */
964 if (!tor_addr_is_null(&rs->ipv6_addr)) {
966 node_get_pref_orport(node, &ap);
967 log_notice(LD_CONFIG,
968 "Bridge '%s' has both an IPv4 and an IPv6 address. "
969 "Will prefer using its %s address (%s) based on %s.",
970 rs->nickname,
971 node->ipv6_preferred ? "IPv6" : "IPv4",
972 fmt_addrport(&ap.addr, ap.port),
973 options->ClientPreferIPv6ORPort == -1 ?
974 "the configured Bridge address" :
975 "ClientPreferIPv6ORPort");
976 }
977 }
978}
979
980/** We just learned a descriptor for a bridge. See if that
981 * digest is in our entry guard list, and add it if not. Schedule the
982 * next fetch for a long time from now, and initiate any follow-up
983 * activities like continuing to bootstrap.
984 *
985 * <b>from_cache</b> * tells us whether we fetched it from disk (else
986 * the network)
987 *
988 * <b>desc_is_new</b> tells us if we preferred it to the old version we
989 * had, if any. */
990void
991learned_bridge_descriptor(routerinfo_t *ri, int from_cache, int desc_is_new)
992{
993 tor_assert(ri);
995 if (get_options()->UseBridges) {
996 /* Retry directory downloads whenever we get a bridge descriptor:
997 * - when bootstrapping, and
998 * - when we aren't sure if any of our bridges are reachable.
999 * Keep on retrying until we have at least one reachable bridge. */
1000 int first = num_bridges_usable(0) < 1;
1002 time_t now = time(NULL);
1003 router_set_status(ri->cache_info.identity_digest, 1);
1004
1005 if (bridge) { /* if we actually want to use this one */
1006 node_t *node;
1007 if (!from_cache) {
1008 /* This schedules the re-fetch at a constant interval, which produces
1009 * a pattern of bridge traffic. But it's better than trying all
1010 * configured bridges several times in the first few minutes. */
1012 /* it's here; schedule its re-fetch for a long time from now. */
1013 bridge->fetch_status.next_attempt_at +=
1015 }
1016
1017 node = node_get_mutable_by_id(ri->cache_info.identity_digest);
1018 tor_assert(node);
1019 rewrite_node_address_for_bridge(bridge, node);
1020 if (tor_digest_is_zero(bridge->identity)) {
1021 memcpy(bridge->identity,ri->cache_info.identity_digest, DIGEST_LEN);
1022 log_notice(LD_DIR, "Learned identity %s for bridge at %s:%d",
1023 hex_str(bridge->identity, DIGEST_LEN),
1024 fmt_and_decorate_addr(&bridge->addr),
1025 (int) bridge->port);
1026 }
1028 (const uint8_t*)ri->cache_info.identity_digest);
1029
1030 if (desc_is_new)
1031 log_notice(LD_DIR, "new bridge descriptor '%s' (%s): %s",
1032 ri->nickname,
1033 from_cache ? "cached" : "fresh", router_describe(ri));
1034 /* If we didn't have a reachable bridge before this one, try directory
1035 * documents again. */
1036 if (first) {
1038 }
1039 }
1040 }
1041}
1042
1043/** Return a smartlist containing all bridge identity digests */
1046{
1047 smartlist_t *result = NULL;
1048 char *digest_tmp;
1049
1050 if (get_options()->UseBridges && bridge_list) {
1051 result = smartlist_new();
1052
1054 digest_tmp = tor_malloc(DIGEST_LEN);
1055 memcpy(digest_tmp, b->identity, DIGEST_LEN);
1056 smartlist_add(result, digest_tmp);
1057 } SMARTLIST_FOREACH_END(b);
1058 }
1059
1060 return result;
1061}
1062
1063/** Get the download status for a bridge descriptor given its identity */
1065get_bridge_dl_status_by_id, (const char *digest))
1066{
1067 download_status_t *dl = NULL;
1068
1069 if (digest && get_options()->UseBridges && bridge_list) {
1071 if (tor_memeq(digest, b->identity, DIGEST_LEN)) {
1072 dl = &(b->fetch_status);
1073 break;
1074 }
1075 } SMARTLIST_FOREACH_END(b);
1076 }
1077
1078 return dl;
1079}
1080
1081/** Release all storage held in bridges.c */
1082void
1084{
1086 smartlist_free(bridge_list);
1087 bridge_list = NULL;
1088}
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:243
static sa_family_t tor_addr_family(const tor_addr_t *a)
Definition: address.h:187
#define fmt_addr(a)
Definition: address.h:239
#define tor_addr_eq(a, b)
Definition: address.h:280
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:1065
static void rewrite_node_address_for_bridge(const bridge_info_t *bridge, node_t *node)
Definition: bridges.c:856
void mark_bridge_list(void)
Definition: bridges.c:84
int routerinfo_is_a_configured_bridge(const routerinfo_t *ri)
Definition: bridges.c:357
STATIC void bridge_resolve_conflicts(const tor_addr_t *addr, uint16_t port, const char *digest, const char *transport_name)
Definition: bridges.c:495
int addr_is_a_configured_bridge(const tor_addr_t *addr, uint16_t port, const char *digest)
Definition: bridges.c:308
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:438
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:229
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:545
void bridge_add_from_config(bridge_line_t *bridge_line)
Definition: bridges.c:562
static void launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge)
Definition: bridges.c:695
smartlist_t * list_bridge_identities(void)
Definition: bridges.c:1045
int extend_info_is_a_configured_bridge(const extend_info_t *ei)
Definition: bridges.c:325
int node_is_a_configured_bridge(const node_t *node)
Definition: bridges.c:389
STATIC bridge_info_t * find_bridge_by_digest(const char *digest)
Definition: bridges.c:616
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:772
const char * find_transport_name_by_bridge_addrport(const tor_addr_t *addr, uint16_t port)
Definition: bridges.c:632
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:344
void bridges_free_all(void)
Definition: bridges.c:1083
int get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port, const transport_t **transport)
Definition: bridges.c:655
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:991
static int bridge_exists_with_addr_and_port(const tor_addr_t *addr, const uint16_t port, const char *digest)
Definition: bridges.c:369
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:283
static smartlist_t * bridge_list
Definition: bridges.c:79
const char * bridget_get_transport_name(const bridge_info_t *bridge)
Definition: bridges.c:207
const smartlist_t * get_socks_args_by_bridge_addrport(const tor_addr_t *addr, uint16_t port)
Definition: bridges.c:685
void retry_bridge_descriptor_fetch_directly(const char *digest)
Definition: bridges.c:759
static int bridge_has_digest(const bridge_info_t *bridge, const char *digest)
Definition: bridges.c:481
bridge_info_t * get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr, uint16_t port, const char *digest)
Definition: bridges.c:257
bool bridge_has_invalid_transport(const bridge_info_t *bridge)
Definition: bridges.c:218
Header file for circuitbuild.c.
Header file for circuitbuild.c.
const or_options_t * get_options(void)
Definition: config.c:944
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)
Definition: connection.c:4899
Header file for connection.c.
#define CONN_TYPE_DIR
Definition: connection.h:55
#define HEX_DIGEST_LEN
Definition: crypto_digest.h:35
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
Definition: digest_sizes.h:20
void directory_request_set_resource(directory_request_t *req, const char *resource)
Definition: dirclient.c:1046
void directory_request_set_or_addr_port(directory_request_t *req, const tor_addr_port_t *p)
Definition: dirclient.c:984
void directory_request_set_guard_state(directory_request_t *req, circuit_guard_state_t *state)
Definition: dirclient.c:1123
void directory_request_set_router_purpose(directory_request_t *req, uint8_t router_purpose)
Definition: dirclient.c:1017
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:1005
void directory_initiate_request(directory_request_t *request)
Definition: dirclient.c:1253
directory_request_t * directory_request_new(uint8_t dir_purpose)
Definition: dirclient.c:950
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:977
int num_bridges_usable(int use_maybe_reachable)
Definition: entrynodes.c:3531
circuit_guard_state_t * get_guard_state_for_bridge_desc_fetch(const char *digest)
Definition: entrynodes.c:3469
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:1851
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:2380
Header file for nodelist.c.
Master header file for Tor-specific functionality.
@ BRIDGE_DIRINFO
Definition: or.h:792
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)
Definition: routerlist.c:2347
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]
crypto_pk_t * onion_key
uint16_t ipv6_orport
Definition: microdesc_st.h:81
tor_addr_t ipv6_addr
Definition: microdesc_st.h:79
Definition: node_st.h:34
char identity[DIGEST_LEN]
Definition: node_st.h:46
unsigned int ipv6_preferred
Definition: node_st.h:90
int UpdateBridgesFromAuthority
int ClientPreferIPv6ORPort
struct routerset_t * ExcludeNodes
int TestingBridgeDownloadInitialDelay
tor_addr_t ipv6_addr
Definition: routerinfo_st.h:30
tor_addr_t ipv4_addr
Definition: routerinfo_st.h:25
uint8_t purpose
char * nickname
Definition: routerinfo_st.h:22
uint16_t ipv6_orport
tor_addr_t ipv6_addr
char nickname[MAX_NICKNAME_LEN+1]
uint16_t ipv4_orport
char identity_digest[DIGEST_LEN]
#define STATIC
Definition: testsupport.h:32
#define MOCK_IMPL(rv, funcname, arglist)
Definition: testsupport.h:133
int pt_proxies_configuration_pending(void)
Definition: transports.c:396
transport_t * transport_get_by_name(const char *name)
Definition: transports.c:236
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)
Definition: util_string.c:199
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