Tor 0.4.9.3-alpha-dev
Loading...
Searching...
No Matches
connection_or.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 connection_or.c
9 * \brief Functions to handle OR connections, TLS handshaking, and
10 * cells on the network.
11 *
12 * An or_connection_t is a subtype of connection_t (as implemented in
13 * connection.c) that uses a TLS connection to send and receive cells on the
14 * Tor network. (By sending and receiving cells connection_or.c, it cooperates
15 * with channeltls.c to implement a the channel interface of channel.c.)
16 *
17 * Every OR connection has an underlying tortls_t object (as implemented in
18 * tortls.c) which it uses as its TLS stream. It is responsible for
19 * sending and receiving cells over that TLS.
20 *
21 * This module also implements the client side of the v3 (and greater) Tor
22 * link handshake.
23 **/
24#include "core/or/or.h"
26#include "lib/buf/buffers.h"
27/*
28 * Define this so we get channel internal functions, since we're implementing
29 * part of a subclass (channel_tls_t).
30 */
31#define CHANNEL_OBJECT_PRIVATE
32#define CONNECTION_OR_PRIVATE
33#define ORCONN_EVENT_PRIVATE
34#include "core/or/channel.h"
35#include "core/or/channeltls.h"
37#include "core/or/circuitlist.h"
39#include "core/or/command.h"
40#include "app/config/config.h"
48#include "lib/geoip/geoip.h"
50#include "trunnel/netinfo.h"
55#include "core/or/reasons.h"
56#include "core/or/relay.h"
65#include "core/or/scheduler.h"
67#include "core/or/channelpadding.h"
71
72#include "core/or/cell_st.h"
79#include "core/or/var_cell_st.h"
81
82#include "lib/tls/tortls.h"
83
85
88
89static unsigned int
91static void connection_or_mark_bad_for_new_circs(or_connection_t *or_conn);
92
94 int started_here);
95
96/**************************************************************/
97
98/**
99 * Cast a `connection_t *` to an `or_connection_t *`.
100 *
101 * Exit with an assertion failure if the input is not an `or_connection_t`.
102 **/
105{
106 tor_assert(c->magic == OR_CONNECTION_MAGIC);
107 return DOWNCAST(or_connection_t, c);
108}
109
110/**
111 * Cast a `const connection_t *` to a `const or_connection_t *`.
112 *
113 * Exit with an assertion failure if the input is not an `or_connection_t`.
114 **/
115const or_connection_t *
117{
118 return TO_OR_CONN((connection_t *)c);
119}
120
121/** Clear clear conn->identity_digest and update other data
122 * structures as appropriate.*/
123void
125{
126 tor_assert(conn);
127 memset(conn->identity_digest, 0, DIGEST_LEN);
128}
129
130/** Clear all identities in OR conns.*/
131void
133{
135 SMARTLIST_FOREACH(conns, connection_t *, conn,
136 {
137 if (conn->type == CONN_TYPE_OR) {
138 connection_or_clear_identity(TO_OR_CONN(conn));
139 }
140 });
141}
142
143/** Change conn->identity_digest to digest, and add conn into
144 * the appropriate digest maps.
145 *
146 * NOTE that this function only allows two kinds of transitions: from
147 * unset identity to set identity, and from idempotent re-settings
148 * of the same identity. It's not allowed to clear an identity or to
149 * change an identity. Return 0 on success, and -1 if the transition
150 * is not allowed.
151 **/
152static void
154 const char *rsa_digest,
155 const ed25519_public_key_t *ed_id)
156{
157 channel_t *chan = NULL;
158 tor_assert(conn);
159 tor_assert(rsa_digest);
160
161 if (conn->chan)
162 chan = TLS_CHAN_TO_BASE(conn->chan);
163
164 log_info(LD_HANDSHAKE, "Set identity digest for %s at %p: %s %s.",
166 conn,
167 hex_str(rsa_digest, DIGEST_LEN),
168 ed25519_fmt(ed_id));
169 log_info(LD_HANDSHAKE, " (Previously: %s %s)",
171 chan ? ed25519_fmt(&chan->ed25519_identity) : "<null>");
172
173 const int rsa_id_was_set = ! tor_digest_is_zero(conn->identity_digest);
174 const int ed_id_was_set =
176 const int new_ed_id_is_set =
177 (ed_id && !ed25519_public_key_is_zero(ed_id));
178 const int rsa_changed =
179 tor_memneq(conn->identity_digest, rsa_digest, DIGEST_LEN);
180 const int ed_changed = bool_neq(ed_id_was_set, new_ed_id_is_set) ||
181 (ed_id_was_set && new_ed_id_is_set && chan &&
182 !ed25519_pubkey_eq(ed_id, &chan->ed25519_identity));
183
184 if (BUG(rsa_changed && rsa_id_was_set))
185 return;
186 if (BUG(ed_changed && ed_id_was_set))
187 return;
188
189 if (!rsa_changed && !ed_changed)
190 return;
191
192 /* If the identity was set previously, remove the old mapping. */
193 if (rsa_id_was_set) {
195 if (chan)
197 }
198
199 memcpy(conn->identity_digest, rsa_digest, DIGEST_LEN);
200
201 /* If we're initializing the IDs to zero, don't add a mapping yet. */
202 if (tor_digest_is_zero(rsa_digest) && !new_ed_id_is_set)
203 return;
204
205 /* Deal with channels */
206 if (chan)
207 channel_set_identity_digest(chan, rsa_digest, ed_id);
208}
209
210/**
211 * Return the Ed25519 identity of the peer for this connection (if any).
212 *
213 * Note that this ID may not be the _actual_ identity for the peer if
214 * authentication is not complete.
215 **/
216const struct ed25519_public_key_t *
218{
219 if (conn && conn->chan) {
220 const channel_t *chan = NULL;
221 chan = TLS_CHAN_TO_BASE(conn->chan);
223 return &chan->ed25519_identity;
224 }
225 }
226
227 return NULL;
228}
229
230/**************************************************************/
231
232/** Map from a string describing what a non-open OR connection was doing when
233 * failed, to an intptr_t describing the count of connections that failed that
234 * way. Note that the count is stored _as_ the pointer.
235 */
237
238/** If true, do not record information in <b>broken_connection_counts</b>. */
240
241/** Record that an OR connection failed in <b>state</b>. */
242static void
243note_broken_connection(const char *state)
244{
245 void *ptr;
246 intptr_t val;
248 return;
249
251 broken_connection_counts = strmap_new();
252
253 ptr = strmap_get(broken_connection_counts, state);
254 val = (intptr_t)ptr;
255 val++;
256 ptr = (void*)val;
257 strmap_set(broken_connection_counts, state, ptr);
258}
259
260/** Forget all recorded states for failed connections. If
261 * <b>stop_recording</b> is true, don't record any more. */
262void
264{
266 strmap_free(broken_connection_counts, NULL);
268 if (stop_recording)
270}
271
272/** Write a detailed description the state of <b>orconn</b> into the
273 * <b>buflen</b>-byte buffer at <b>buf</b>. This description includes not
274 * only the OR-conn level state but also the TLS state. It's useful for
275 * diagnosing broken handshakes. */
276static void
278 char *buf, size_t buflen)
279{
280 connection_t *conn = TO_CONN(orconn);
281 const char *conn_state;
282 char tls_state[256];
283
284 tor_assert(conn->type == CONN_TYPE_OR || conn->type == CONN_TYPE_EXT_OR);
285
286 conn_state = conn_state_to_string(conn->type, conn->state);
287 tor_tls_get_state_description(orconn->tls, tls_state, sizeof(tls_state));
288
289 tor_snprintf(buf, buflen, "%s with SSL state %s", conn_state, tls_state);
290}
291
292/** Record the current state of <b>orconn</b> as the state of a broken
293 * connection. */
294static void
296{
297 char buf[256];
299 return;
300 connection_or_get_state_description(orconn, buf, sizeof(buf));
301 log_info(LD_HANDSHAKE,"Connection died in state '%s'", buf);
303}
304
305/** Helper type used to sort connection states and find the most frequent. */
306typedef struct broken_state_count_t {
307 intptr_t count;
308 const char *state;
310
311/** Helper function used to sort broken_state_count_t by frequency. */
312static int
313broken_state_count_compare(const void **a_ptr, const void **b_ptr)
314{
315 const broken_state_count_t *a = *a_ptr, *b = *b_ptr;
316 if (b->count < a->count)
317 return -1;
318 else if (b->count == a->count)
319 return 0;
320 else
321 return 1;
322}
323
324/** Upper limit on the number of different states to report for connection
325 * failure. */
326#define MAX_REASONS_TO_REPORT 10
327
328/** Report a list of the top states for failed OR connections at log level
329 * <b>severity</b>, in log domain <b>domain</b>. */
330void
331connection_or_report_broken_states(int severity, int domain)
332{
333 int total = 0;
334 smartlist_t *items;
335
337 return;
338
339 items = smartlist_new();
340 STRMAP_FOREACH(broken_connection_counts, state, void *, countptr) {
341 broken_state_count_t *c = tor_malloc(sizeof(broken_state_count_t));
342 c->count = (intptr_t)countptr;
343 total += (int)c->count;
344 c->state = state;
345 smartlist_add(items, c);
346 } STRMAP_FOREACH_END;
347
349
350 tor_log(severity, domain, "%d connections have failed%s", total,
351 smartlist_len(items) > MAX_REASONS_TO_REPORT ? ". Top reasons:" : ":");
352
354 if (c_sl_idx > MAX_REASONS_TO_REPORT)
355 break;
356 tor_log(severity, domain,
357 " %d connections died in state %s", (int)c->count, c->state);
358 } SMARTLIST_FOREACH_END(c);
359
361 smartlist_free(items);
362}
363
364/**
365 * Helper function to publish an OR connection status event
366 *
367 * Publishes a messages to subscribers of ORCONN messages, and sends
368 * the control event.
369 **/
370void
372 int reason)
373{
374 orconn_status_msg_t *msg = tor_malloc(sizeof(*msg));
375
376 msg->gid = conn->base_.global_identifier;
377 msg->status = tp;
378 msg->reason = reason;
379 orconn_status_publish(msg);
380 control_event_or_conn_status(conn, tp, reason);
381}
382
383/**
384 * Helper function to publish a state change message
385 *
386 * connection_or_change_state() calls this to notify subscribers about
387 * a change of an OR connection state.
388 **/
389static void
391{
392 orconn_state_msg_t *msg = tor_malloc(sizeof(*msg));
393
394 msg->gid = conn->base_.global_identifier;
395 if (conn->is_pt) {
396 /* Do extra decoding because conn->proxy_type indicates the proxy
397 * protocol that tor uses to talk with the transport plugin,
398 * instead of PROXY_PLUGGABLE. */
399 tor_assert_nonfatal(conn->proxy_type != PROXY_NONE);
400 msg->proxy_type = PROXY_PLUGGABLE;
401 } else {
402 msg->proxy_type = conn->proxy_type;
403 }
404 msg->state = state;
405 if (conn->chan) {
406 msg->chan = TLS_CHAN_TO_BASE(conn->chan)->global_identifier;
407 } else {
408 msg->chan = 0;
409 }
410 orconn_state_publish(msg);
411}
412
413/** Call this to change or_connection_t states, so the owning channel_tls_t can
414 * be notified.
415 */
416MOCK_IMPL(void,
418{
419 tor_assert(conn);
420
421 conn->base_.state = state;
422
423 connection_or_state_publish(conn, state);
424 if (conn->chan)
426}
427
428/** Return the number of circuits using an or_connection_t; this used to
429 * be an or_connection_t field, but it got moved to channel_t and we
430 * shouldn't maintain two copies. */
431MOCK_IMPL(int,
433{
434 tor_assert(conn);
435
436 if (conn->chan) {
437 return channel_num_circuits(TLS_CHAN_TO_BASE(conn->chan));
438 } else return 0;
439}
440
441/**************************************************************/
442
443/** Pack the cell_t host-order structure <b>src</b> into network-order
444 * in the buffer <b>dest</b>. See tor-spec.txt for details about the
445 * wire format.
446 *
447 * Note that this function doesn't touch <b>dst</b>->next: the caller
448 * should set it or clear it as appropriate.
449 */
450void
451cell_pack(packed_cell_t *dst, const cell_t *src, int wide_circ_ids)
452{
453 char *dest = dst->body;
454 if (wide_circ_ids) {
455 set_uint32(dest, htonl(src->circ_id));
456 dest += 4;
457 } else {
458 /* Clear the last two bytes of dest, in case we can accidentally
459 * send them to the network somehow. */
460 memset(dest+CELL_MAX_NETWORK_SIZE-2, 0, 2);
461 set_uint16(dest, htons(src->circ_id));
462 dest += 2;
463 }
464 set_uint8(dest, src->command);
465 memcpy(dest+1, src->payload, CELL_PAYLOAD_SIZE);
466}
467
468/** Unpack the network-order buffer <b>src</b> into a host-order
469 * cell_t structure <b>dest</b>.
470 */
471static void
472cell_unpack(cell_t *dest, const char *src, int wide_circ_ids)
473{
474 if (wide_circ_ids) {
475 dest->circ_id = ntohl(get_uint32(src));
476 src += 4;
477 } else {
478 dest->circ_id = ntohs(get_uint16(src));
479 src += 2;
480 }
481 dest->command = get_uint8(src);
482 memcpy(dest->payload, src+1, CELL_PAYLOAD_SIZE);
483}
484
485/** Write the header of <b>cell</b> into the first VAR_CELL_MAX_HEADER_SIZE
486 * bytes of <b>hdr_out</b>. Returns number of bytes used. */
487int
488var_cell_pack_header(const var_cell_t *cell, char *hdr_out, int wide_circ_ids)
489{
490 int r;
491 if (wide_circ_ids) {
492 set_uint32(hdr_out, htonl(cell->circ_id));
493 hdr_out += 4;
495 } else {
496 set_uint16(hdr_out, htons(cell->circ_id));
497 hdr_out += 2;
499 }
500 set_uint8(hdr_out, cell->command);
501 set_uint16(hdr_out+1, htons(cell->payload_len));
502 return r;
503}
504
505/** Allocate and return a new var_cell_t with <b>payload_len</b> bytes of
506 * payload space. */
508var_cell_new(uint16_t payload_len)
509{
510 size_t size = offsetof(var_cell_t, payload) + payload_len;
511 var_cell_t *cell = tor_malloc_zero(size);
512 cell->payload_len = payload_len;
513 cell->command = 0;
514 cell->circ_id = 0;
515 return cell;
516}
517
518/**
519 * Copy a var_cell_t
520 */
523{
524 var_cell_t *copy = NULL;
525 size_t size = 0;
526
527 if (src != NULL) {
528 size = offsetof(var_cell_t, payload) + src->payload_len;
529 copy = tor_malloc_zero(size);
530 copy->payload_len = src->payload_len;
531 copy->command = src->command;
532 copy->circ_id = src->circ_id;
533 memcpy(copy->payload, src->payload, copy->payload_len);
534 }
535
536 return copy;
537}
538
539/** Release all space held by <b>cell</b>. */
540void
542{
543 tor_free(cell);
544}
545
546/** We've received an EOF from <b>conn</b>. Mark it for close and return. */
547int
549{
550 tor_assert(conn);
551
552 log_info(LD_OR,"OR connection reached EOF. Closing.");
554
555 return 0;
556}
557
558/** Handle any new bytes that have come in on connection <b>conn</b>.
559 * If conn is in 'open' state, hand it to
560 * connection_or_process_cells_from_inbuf()
561 * (else do nothing).
562 */
563int
565{
566 int ret = 0;
567 tor_assert(conn);
568
569 switch (conn->base_.state) {
572
573 /* start TLS after handshake completion, or deal with error */
574 if (ret == 1) {
575 tor_assert(TO_CONN(conn)->proxy_state == PROXY_CONNECTED);
576 if (buf_datalen(conn->base_.inbuf) != 0) {
577 log_fn(LOG_PROTOCOL_WARN, LD_NET, "Found leftover (%d bytes) "
578 "when transitioning from PROXY_HANDSHAKING state on %s: "
579 "closing.",
580 (int)buf_datalen(conn->base_.inbuf),
583 return -1;
584 }
585 if (connection_tls_start_handshake(conn, 0) < 0)
586 ret = -1;
587 /* Touch the channel's active timestamp if there is one */
588 if (conn->chan)
589 channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
590 }
591 if (ret < 0) {
593 }
594
595 return ret;
600 default:
601 break; /* don't do anything */
602 }
603
604 /* This check makes sure that we don't have any data on the inbuf if we're
605 * doing our TLS handshake: if we did, they were probably put there by a
606 * SOCKS proxy trying to trick us into accepting unauthenticated data.
607 */
608 if (buf_datalen(conn->base_.inbuf) != 0) {
609 log_fn(LOG_PROTOCOL_WARN, LD_NET, "Accumulated data (%d bytes) "
610 "on non-open %s; closing.",
611 (int)buf_datalen(conn->base_.inbuf),
614 ret = -1;
615 }
616
617 return ret;
618}
619
620/** Called whenever we have flushed some data on an or_conn: add more data
621 * from active circuits. */
622int
624{
625 size_t datalen;
626
627 /* Update the channel's active timestamp if there is one */
628 if (conn->chan)
629 channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
630
631 /* If we're under the low water mark, add cells until we're just over the
632 * high water mark. */
633 datalen = connection_get_outbuf_len(TO_CONN(conn));
634 if (datalen < or_conn_lowwatermark()) {
635 /* Let the scheduler know */
636 scheduler_channel_wants_writes(TLS_CHAN_TO_BASE(conn->chan));
637 }
638
639 return 0;
640}
641
642/** This is for channeltls.c to ask how many cells we could accept if
643 * they were available. */
644ssize_t
646{
647 size_t datalen, cell_network_size;
648 ssize_t n = 0;
649
650 tor_assert(conn);
651
652 /*
653 * If we're under the high water mark, we're potentially
654 * writeable; note this is different from the calculation above
655 * used to trigger when to start writing after we've stopped.
656 */
657 datalen = connection_get_outbuf_len(TO_CONN(conn));
658 if (datalen < or_conn_highwatermark()) {
659 cell_network_size = get_cell_network_size(conn->wide_circ_ids);
660 n = CEIL_DIV(or_conn_highwatermark() - datalen, cell_network_size);
661 }
662
663 return n;
664}
665
666/** Connection <b>conn</b> has finished writing and has no bytes left on
667 * its outbuf.
668 *
669 * Otherwise it's in state "open": stop writing and return.
670 *
671 * If <b>conn</b> is broken, mark it for close and return -1, else
672 * return 0.
673 */
674int
676{
677 tor_assert(conn);
679
680 switch (conn->base_.state) {
682 /* PROXY_HAPROXY gets connected by receiving an ack. */
683 if (conn->proxy_type == PROXY_HAPROXY) {
684 tor_assert(TO_CONN(conn)->proxy_state == PROXY_HAPROXY_WAIT_FOR_FLUSH);
685 IF_BUG_ONCE(buf_datalen(TO_CONN(conn)->inbuf) != 0) {
686 /* This should be impossible; we're not even reading. */
688 return -1;
689 }
690 TO_CONN(conn)->proxy_state = PROXY_CONNECTED;
691
692 if (connection_tls_start_handshake(conn, 0) < 0) {
693 /* TLS handshaking error of some kind. */
695 return -1;
696 }
697 break;
698 }
699 break;
702 break;
703 default:
704 log_err(LD_BUG,"Called in unexpected state %d.", conn->base_.state);
706 return -1;
707 }
708
709 /* Update the channel's active timestamp if there is one */
710 if (conn->chan)
711 channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
712
713 return 0;
714}
715
716/** Connected handler for OR connections: begin the TLS handshake.
717 */
718int
720{
721 const int proxy_type = or_conn->proxy_type;
722 connection_t *conn;
723
724 tor_assert(or_conn);
725 conn = TO_CONN(or_conn);
727
728 log_debug(LD_HANDSHAKE,"connect finished for %s",
729 connection_describe(conn));
730
731 if (proxy_type != PROXY_NONE) {
732 /* start proxy handshake */
733 if (connection_proxy_connect(conn, proxy_type) < 0) {
735 return -1;
736 }
737
740
741 return 0;
742 }
743
744 if (connection_tls_start_handshake(or_conn, 0) < 0) {
745 /* TLS handshaking error of some kind. */
747 return -1;
748 }
749 return 0;
750}
751
752/** Called when we're about to finally unlink and free an OR connection:
753 * perform necessary accounting and cleanup */
754void
756{
757 connection_t *conn = TO_CONN(or_conn);
758
759 /* Tell the controlling channel we're closed */
760 if (or_conn->chan) {
761 channel_closed(TLS_CHAN_TO_BASE(or_conn->chan));
762 /*
763 * NULL this out because the channel might hang around a little
764 * longer before channel_run_cleanup() gets it.
765 */
766 or_conn->chan->conn = NULL;
767 or_conn->chan = NULL;
768 }
769
770 /* Remember why we're closing this connection. */
771 if (conn->state != OR_CONN_STATE_OPEN) {
772 /* now mark things down as needed */
774 const or_options_t *options = get_options();
776 /* Tell the new guard API about the channel failure */
777 entry_guard_chan_failed(TLS_CHAN_TO_BASE(or_conn->chan));
779 int reason = tls_error_to_orconn_end_reason(or_conn->tls_error);
780 connection_or_event_status(or_conn, OR_CONN_EVENT_FAILED,
781 reason);
782 if (!authdir_mode_tests_reachability(options)) {
783 const char *warning = NULL;
784 if (reason == END_OR_CONN_REASON_TLS_ERROR && or_conn->tls) {
785 warning = tor_tls_get_last_error_msg(or_conn->tls);
786 }
787 if (warning == NULL) {
788 warning = orconn_end_reason_to_control_string(reason);
789 }
790 control_event_bootstrap_prob_or(warning, reason, or_conn);
791 }
792 }
793 }
794 } else if (conn->hold_open_until_flushed) {
795 /* We only set hold_open_until_flushed when we're intentionally
796 * closing a connection. */
797 connection_or_event_status(or_conn, OR_CONN_EVENT_CLOSED,
799 } else if (!tor_digest_is_zero(or_conn->identity_digest)) {
800 connection_or_event_status(or_conn, OR_CONN_EVENT_CLOSED,
802 } else {
803 /* Normal close, we notify of a done connection. */
804 connection_or_event_status(or_conn, OR_CONN_EVENT_CLOSED,
805 END_OR_CONN_REASON_DONE);
806 }
807}
808
809/** Return 1 if identity digest <b>id_digest</b> is known to be a
810 * currently or recently running relay. Otherwise return 0. */
811int
813{
815 return 1; /* It's in the consensus: "yes" */
816 if (router_get_by_id_digest(id_digest))
817 return 1; /* Not in the consensus, but we have a descriptor for
818 * it. Probably it was in a recent consensus. "Yes". */
819 return 0;
820}
821
822/** Set the per-conn read and write limits for <b>conn</b>. If it's a known
823 * relay, we will rely on the global read and write buckets, so give it
824 * per-conn limits that are big enough they'll never matter. But if it's
825 * not a known relay, first check if we set PerConnBwRate/Burst, then
826 * check if the consensus sets them, else default to 'big enough'.
827 *
828 * If <b>reset</b> is true, set the bucket to be full. Otherwise, just
829 * clip the bucket if it happens to be <em>too</em> full.
830 */
831static void
833 const or_options_t *options)
834{
835 int rate, burst; /* per-connection rate limiting params */
837 /* It's in the consensus, or we have a descriptor for it meaning it
838 * was probably in a recent consensus. It's a recognized relay:
839 * give it full bandwidth. */
840 rate = (int)options->BandwidthRate;
841 burst = (int)options->BandwidthBurst;
842 } else {
843 /* Not a recognized relay. Squeeze it down based on the suggested
844 * bandwidth parameters in the consensus, but allow local config
845 * options to override. */
846 rate = options->PerConnBWRate ? (int)options->PerConnBWRate :
847 networkstatus_get_param(NULL, "perconnbwrate",
848 (int)options->BandwidthRate, 1, INT32_MAX);
849 burst = options->PerConnBWBurst ? (int)options->PerConnBWBurst :
850 networkstatus_get_param(NULL, "perconnbwburst",
851 (int)options->BandwidthBurst, 1, INT32_MAX);
852 }
853
854 token_bucket_rw_adjust(&conn->bucket, rate, burst);
855 if (reset) {
857 }
858}
859
860/** Either our set of relays or our per-conn rate limits have changed.
861 * Go through all the OR connections and update their token buckets to make
862 * sure they don't exceed their maximum values. */
863void
865 const or_options_t *options)
866{
867 SMARTLIST_FOREACH(conns, connection_t *, conn,
868 {
869 if (connection_speaks_cells(conn))
871 });
872}
873
874/* Mark <b>or_conn</b> as canonical if <b>is_canonical</b> is set, and
875 * non-canonical otherwise. Adjust idle_timeout accordingly.
876 */
877void
878connection_or_set_canonical(or_connection_t *or_conn,
879 int is_canonical)
880{
881 if (bool_eq(is_canonical, or_conn->is_canonical) &&
882 or_conn->idle_timeout != 0) {
883 /* Don't recalculate an existing idle_timeout unless the canonical
884 * status changed. */
885 return;
886 }
887
888 or_conn->is_canonical = !! is_canonical; /* force to a 1-bit boolean */
890 TLS_CHAN_TO_BASE(or_conn->chan), is_canonical);
891
892 log_info(LD_CIRC,
893 "Channel %"PRIu64 " chose an idle timeout of %d.",
894 or_conn->chan ?
895 (TLS_CHAN_TO_BASE(or_conn->chan)->global_identifier):0,
896 or_conn->idle_timeout);
897}
898
899/** If we don't necessarily know the router we're connecting to, but we
900 * have an addr/port/id_digest, then fill in as much as we can. Start
901 * by checking to see if this describes a router we know.
902 * <b>started_here</b> is 1 if we are the initiator of <b>conn</b> and
903 * 0 if it's an incoming connection. */
904void
906 const tor_addr_t *addr, uint16_t port,
907 const char *id_digest,
908 const ed25519_public_key_t *ed_id,
909 int started_here)
910{
911 log_debug(LD_HANDSHAKE, "init conn from address %s: %s, %s (%d)",
912 fmt_addr(addr),
913 hex_str((const char*)id_digest, DIGEST_LEN),
914 ed25519_fmt(ed_id),
915 started_here);
916
917 connection_or_set_identity_digest(conn, id_digest, ed_id);
919
920 conn->base_.port = port;
921 tor_addr_copy(&conn->base_.addr, addr);
922 if (! conn->base_.address) {
923 conn->base_.address = tor_strdup(fmt_addr(addr));
924 }
925
926 connection_or_check_canonicity(conn, started_here);
927}
928
929/** Check whether the identity of <b>conn</b> matches a known node. If it
930 * does, check whether the address of conn matches the expected address, and
931 * update the connection's is_canonical flag, nickname, and address fields as
932 * appropriate. */
933static void
935{
936 (void) started_here;
937
938 const char *id_digest = conn->identity_digest;
939 const ed25519_public_key_t *ed_id = NULL;
940 if (conn->chan)
941 ed_id = & TLS_CHAN_TO_BASE(conn->chan)->ed25519_identity;
942
943 const node_t *r = node_get_by_id(id_digest);
944 if (r &&
946 ! node_ed25519_id_matches(r, ed_id)) {
947 /* If this node is capable of proving an ed25519 ID,
948 * we can't call this a canonical connection unless both IDs match. */
949 r = NULL;
950 }
951
952 if (r) {
953 tor_addr_port_t node_ipv4_ap;
954 tor_addr_port_t node_ipv6_ap;
955 node_get_prim_orport(r, &node_ipv4_ap);
956 node_get_pref_ipv6_orport(r, &node_ipv6_ap);
957 if (tor_addr_eq(&conn->base_.addr, &node_ipv4_ap.addr) ||
958 tor_addr_eq(&conn->base_.addr, &node_ipv6_ap.addr)) {
959 connection_or_set_canonical(conn, 1);
960 }
961 /* Choose the correct canonical address and port. */
962 tor_addr_port_t *node_ap;
963 if (tor_addr_family(&conn->base_.addr) == AF_INET) {
964 node_ap = &node_ipv4_ap;
965 } else {
966 node_ap = &node_ipv6_ap;
967 }
968 /* Remember the canonical addr/port so our log messages will make
969 sense. */
970 tor_addr_port_copy(&conn->canonical_orport, node_ap);
971 tor_free(conn->nickname);
972 conn->nickname = tor_strdup(node_get_nickname(r));
973 } else {
974 tor_free(conn->nickname);
975 conn->nickname = tor_malloc(HEX_DIGEST_LEN+2);
976 conn->nickname[0] = '$';
979 }
980
981 /*
982 * We have to tell channeltls.c to update the channel marks (local, in
983 * particular), since we may have changed the address.
984 */
985
986 if (conn->chan) {
988 }
989}
990
991/** These just pass all the is_bad_for_new_circs manipulation on to
992 * channel_t */
993
994static unsigned int
996{
997 tor_assert(or_conn);
998
999 if (or_conn->chan)
1000 return channel_is_bad_for_new_circs(TLS_CHAN_TO_BASE(or_conn->chan));
1001 else return 0;
1002}
1003
1004static void
1005connection_or_mark_bad_for_new_circs(or_connection_t *or_conn)
1006{
1007 tor_assert(or_conn);
1008
1009 if (or_conn->chan)
1010 channel_mark_bad_for_new_circs(TLS_CHAN_TO_BASE(or_conn->chan));
1011}
1012
1013/** How old do we let a connection to an OR get before deciding it's
1014 * too old for new circuits? */
1015#define TIME_BEFORE_OR_CONN_IS_TOO_OLD (60*60*24*7)
1016
1017/** Expire an or_connection if it is too old. Helper for
1018 * connection_or_group_set_badness_ and fast path for
1019 * channel_rsa_id_group_set_badness.
1020 *
1021 * Returns 1 if the connection was already expired, else 0.
1022 */
1023int
1025 or_connection_t *or_conn,
1026 int force)
1027{
1028 /* XXXX this function should also be about channels? */
1029 if (or_conn->base_.marked_for_close ||
1031 return 1;
1032
1033 if (force ||
1035 < now) {
1036 log_info(LD_OR,
1037 "Marking %s as too old for new circuits "
1038 "(fd "TOR_SOCKET_T_FORMAT", %d secs old).",
1039 connection_describe(TO_CONN(or_conn)),
1040 or_conn->base_.s,
1041 (int)(now - or_conn->base_.timestamp_created));
1042 connection_or_mark_bad_for_new_circs(or_conn);
1043 }
1044
1045 return 0;
1046}
1047
1048/** Given a list of all the or_connections with a given
1049 * identity, set elements of that list as is_bad_for_new_circs as
1050 * appropriate. Helper for connection_or_set_bad_connections().
1051 *
1052 * Specifically, we set the is_bad_for_new_circs flag on:
1053 * - all connections if <b>force</b> is true.
1054 * - all connections that are too old.
1055 * - all open non-canonical connections for which a canonical connection
1056 * exists to the same router.
1057 * - all open canonical connections for which a 'better' canonical
1058 * connection exists to the same router.
1059 * - all open non-canonical connections for which a 'better' non-canonical
1060 * connection exists to the same router at the same address.
1061 *
1062 * See channel_is_better() in channel.c for our idea of what makes one OR
1063 * connection better than another.
1064 */
1065void
1067{
1068 /* XXXX this function should be entirely about channels, not OR
1069 * XXXX connections. */
1070
1071 or_connection_t *best = NULL;
1072 int n_canonical = 0;
1073 time_t now = time(NULL);
1074
1075 /* Pass 1: expire everything that's old, and see what the status of
1076 * everything else is. */
1077 SMARTLIST_FOREACH_BEGIN(group, or_connection_t *, or_conn) {
1078 if (connection_or_single_set_badness_(now, or_conn, force))
1079 continue;
1080
1081 if (or_conn->is_canonical) {
1082 ++n_canonical;
1083 }
1084 } SMARTLIST_FOREACH_END(or_conn);
1085
1086 /* Pass 2: We know how about how good the best connection is.
1087 * expire everything that's worse, and find the very best if we can. */
1088 SMARTLIST_FOREACH_BEGIN(group, or_connection_t *, or_conn) {
1089 if (or_conn->base_.marked_for_close ||
1091 continue; /* This one doesn't need to be marked bad. */
1092 if (or_conn->base_.state != OR_CONN_STATE_OPEN)
1093 continue; /* Don't mark anything bad until we have seen what happens
1094 * when the connection finishes. */
1095 if (n_canonical && !or_conn->is_canonical) {
1096 /* We have at least one open canonical connection to this router,
1097 * and this one is open but not canonical. Mark it bad. */
1098 log_info(LD_OR,
1099 "Marking %s unsuitable for new circuits: "
1100 "(fd "TOR_SOCKET_T_FORMAT", %d secs old). It is not "
1101 "canonical, and we have another connection to that OR that is.",
1102 connection_describe(TO_CONN(or_conn)),
1103 or_conn->base_.s,
1104 (int)(now - or_conn->base_.timestamp_created));
1105 connection_or_mark_bad_for_new_circs(or_conn);
1106 continue;
1107 }
1108
1109 if (!best ||
1110 channel_is_better(TLS_CHAN_TO_BASE(or_conn->chan),
1111 TLS_CHAN_TO_BASE(best->chan))) {
1112 best = or_conn;
1113 }
1114 } SMARTLIST_FOREACH_END(or_conn);
1115
1116 if (!best)
1117 return;
1118
1119 /* Pass 3: One connection to OR is best. If it's canonical, mark as bad
1120 * every other open connection. If it's non-canonical, mark as bad
1121 * every other open connection to the same address.
1122 *
1123 * XXXX This isn't optimal; if we have connections to an OR at multiple
1124 * addresses, we'd like to pick the best _for each address_, and mark as
1125 * bad every open connection that isn't best for its address. But this
1126 * can only occur in cases where the other OR is old (so we have no
1127 * canonical connection to it), or where all the connections to the OR are
1128 * at noncanonical addresses and we have no good direct connection (which
1129 * means we aren't at risk of attaching circuits to it anyway). As
1130 * 0.1.2.x dies out, the first case will go away, and the second one is
1131 * "mostly harmless", so a fix can wait until somebody is bored.
1132 */
1133 SMARTLIST_FOREACH_BEGIN(group, or_connection_t *, or_conn) {
1134 if (or_conn->base_.marked_for_close ||
1136 or_conn->base_.state != OR_CONN_STATE_OPEN)
1137 continue;
1138 if (or_conn != best &&
1139 channel_is_better(TLS_CHAN_TO_BASE(best->chan),
1140 TLS_CHAN_TO_BASE(or_conn->chan))) {
1141 /* This isn't the best conn, _and_ the best conn is better than it */
1142 if (best->is_canonical) {
1143 log_info(LD_OR,
1144 "Marking %s as unsuitable for new circuits: "
1145 "(fd "TOR_SOCKET_T_FORMAT", %d secs old). "
1146 "We have a better canonical one "
1147 "(fd "TOR_SOCKET_T_FORMAT"; %d secs old).",
1148 connection_describe(TO_CONN(or_conn)),
1149 or_conn->base_.s,
1150 (int)(now - or_conn->base_.timestamp_created),
1151 best->base_.s, (int)(now - best->base_.timestamp_created));
1152 connection_or_mark_bad_for_new_circs(or_conn);
1153 } else if (tor_addr_eq(&TO_CONN(or_conn)->addr,
1154 &TO_CONN(best)->addr)) {
1155 log_info(LD_OR,
1156 "Marking %s unsuitable for new circuits: "
1157 "(fd "TOR_SOCKET_T_FORMAT", %d secs old). We have a better "
1158 "one with the "
1159 "same address (fd "TOR_SOCKET_T_FORMAT"; %d secs old).",
1160 connection_describe(TO_CONN(or_conn)),
1161 or_conn->base_.s,
1162 (int)(now - or_conn->base_.timestamp_created),
1163 best->base_.s, (int)(now - best->base_.timestamp_created));
1164 connection_or_mark_bad_for_new_circs(or_conn);
1165 }
1166 }
1167 } SMARTLIST_FOREACH_END(or_conn);
1168}
1169
1170/* Lifetime of a connection failure. After that, we'll retry. This is in
1171 * seconds. */
1172#define OR_CONNECT_FAILURE_LIFETIME 60
1173/* The interval to use with when to clean up the failure cache. */
1174#define OR_CONNECT_FAILURE_CLEANUP_INTERVAL 60
1175
1176/* When is the next time we have to cleanup the failure map. We keep this
1177 * because we clean it opportunistically. */
1178static time_t or_connect_failure_map_next_cleanup_ts = 0;
1179
1180/* OR connection failure entry data structure. It is kept in the connection
1181 * failure map defined below and indexed by OR identity digest, address and
1182 * port.
1183 *
1184 * We need to identify a connection failure with these three values because we
1185 * want to avoid to wrongfully block a relay if someone is trying to
1186 * extend to a known identity digest but with the wrong IP/port. For instance,
1187 * it can happen if a relay changed its port but the client still has an old
1188 * descriptor with the old port. We want to stop connecting to that
1189 * IP/port/identity all together, not only the relay identity. */
1191 HT_ENTRY(or_connect_failure_entry_t) node;
1192 /* Identity digest of the connection where it is connecting to. */
1193 uint8_t identity_digest[DIGEST_LEN];
1194 /* This is the connection address from the base connection_t. After the
1195 * connection is checked for canonicity, the base address should represent
1196 * what we know instead of where we are connecting to. This is what we need
1197 * so we can correlate known relays within the consensus. */
1198 tor_addr_t addr;
1199 uint16_t port;
1200 /* Last time we were unable to connect. */
1201 time_t last_failed_connect_ts;
1203
1204/* Map where we keep connection failure entries. They are indexed by addr,
1205 * port and identity digest. */
1206static HT_HEAD(or_connect_failure_ht, or_connect_failure_entry_t)
1207 or_connect_failures_map = HT_INITIALIZER();
1208
1209/* Helper: Hashtable equal function. Return 1 if equal else 0. */
1210static int
1211or_connect_failure_ht_eq(const or_connect_failure_entry_t *a,
1213{
1214 return fast_memeq(a->identity_digest, b->identity_digest, DIGEST_LEN) &&
1215 tor_addr_eq(&a->addr, &b->addr) &&
1216 a->port == b->port;
1217}
1218
1219/* Helper: Return the hash for the hashtable of the given entry. For this
1220 * table, it is a combination of address, port and identity digest. */
1221static unsigned int
1222or_connect_failure_ht_hash(const or_connect_failure_entry_t *entry)
1223{
1224 size_t offset = 0, addr_size;
1225 const void *addr_ptr;
1226 /* Largest size is IPv6 and IPv4 is smaller so it is fine. */
1227 uint8_t data[16 + sizeof(uint16_t) + DIGEST_LEN];
1228
1229 /* Get the right address bytes depending on the family. */
1230 switch (tor_addr_family(&entry->addr)) {
1231 case AF_INET:
1232 addr_size = 4;
1233 addr_ptr = &entry->addr.addr.in_addr.s_addr;
1234 break;
1235 case AF_INET6:
1236 addr_size = 16;
1237 addr_ptr = &entry->addr.addr.in6_addr.s6_addr;
1238 break;
1239 default:
1241 return 0;
1242 }
1243
1244 memcpy(data, addr_ptr, addr_size);
1245 offset += addr_size;
1246 memcpy(data + offset, entry->identity_digest, DIGEST_LEN);
1247 offset += DIGEST_LEN;
1248 set_uint16(data + offset, entry->port);
1249 offset += sizeof(uint16_t);
1250
1251 return (unsigned int) siphash24g(data, offset);
1252}
1253
1254HT_PROTOTYPE(or_connect_failure_ht, or_connect_failure_entry_t, node,
1255 or_connect_failure_ht_hash, or_connect_failure_ht_eq);
1256
1257HT_GENERATE2(or_connect_failure_ht, or_connect_failure_entry_t, node,
1258 or_connect_failure_ht_hash, or_connect_failure_ht_eq,
1260
1261/* Initialize a given connect failure entry with the given identity_digest,
1262 * addr and port. All field are optional except ocf. */
1263static void
1264or_connect_failure_init(const char *identity_digest, const tor_addr_t *addr,
1265 uint16_t port, or_connect_failure_entry_t *ocf)
1266{
1267 tor_assert(ocf);
1268 if (identity_digest) {
1269 memcpy(ocf->identity_digest, identity_digest,
1270 sizeof(ocf->identity_digest));
1271 }
1272 if (addr) {
1273 tor_addr_copy(&ocf->addr, addr);
1274 }
1275 ocf->port = port;
1276}
1277
1278/* Return a newly allocated connection failure entry. It is initialized with
1279 * the given or_conn data. This can't fail. */
1281or_connect_failure_new(const or_connection_t *or_conn)
1282{
1283 or_connect_failure_entry_t *ocf = tor_malloc_zero(sizeof(*ocf));
1284 or_connect_failure_init(or_conn->identity_digest, &TO_CONN(or_conn)->addr,
1285 TO_CONN(or_conn)->port, ocf);
1286 return ocf;
1287}
1288
1289/* Return a connection failure entry matching the given or_conn. NULL is
1290 * returned if not found. */
1292or_connect_failure_find(const or_connection_t *or_conn)
1293{
1295 tor_assert(or_conn);
1296 or_connect_failure_init(or_conn->identity_digest, &TO_CONN(or_conn)->addr,
1297 TO_CONN(or_conn)->port, &lookup);
1298 return HT_FIND(or_connect_failure_ht, &or_connect_failures_map, &lookup);
1299}
1300
1301/* Note down in the connection failure cache that a failure occurred on the
1302 * given or_conn. */
1303STATIC void
1304note_or_connect_failed(const or_connection_t *or_conn)
1305{
1306 or_connect_failure_entry_t *ocf = NULL;
1307
1308 tor_assert(or_conn);
1309
1311 /* Don't cache connection failures for connections we initiated ourself.
1312 * If these direct connections fail, we're supposed to recognize that
1313 * the destination is down and stop trying. See ticket 40499. */
1314 return;
1315 }
1316
1317 ocf = or_connect_failure_find(or_conn);
1318 if (ocf == NULL) {
1319 ocf = or_connect_failure_new(or_conn);
1320 HT_INSERT(or_connect_failure_ht, &or_connect_failures_map, ocf);
1321 }
1322 ocf->last_failed_connect_ts = approx_time();
1323}
1324
1325/* Cleanup the connection failure cache and remove all entries below the
1326 * given cutoff. */
1327static void
1328or_connect_failure_map_cleanup(time_t cutoff)
1329{
1330 or_connect_failure_entry_t **ptr, **next, *entry;
1331
1332 for (ptr = HT_START(or_connect_failure_ht, &or_connect_failures_map);
1333 ptr != NULL; ptr = next) {
1334 entry = *ptr;
1335 if (entry->last_failed_connect_ts <= cutoff) {
1336 next = HT_NEXT_RMV(or_connect_failure_ht, &or_connect_failures_map, ptr);
1337 tor_free(entry);
1338 } else {
1339 next = HT_NEXT(or_connect_failure_ht, &or_connect_failures_map, ptr);
1340 }
1341 }
1342}
1343
1344/* Return true iff the given OR connection can connect to its destination that
1345 * is the triplet identity_digest, address and port.
1346 *
1347 * The or_conn MUST have gone through connection_or_check_canonicity() so the
1348 * base address is properly set to what we know or doesn't know. */
1349STATIC int
1350should_connect_to_relay(const or_connection_t *or_conn)
1351{
1352 time_t now, cutoff;
1353 time_t connect_failed_since_ts = 0;
1355
1356 tor_assert(or_conn);
1357
1358 now = approx_time();
1359 cutoff = now - OR_CONNECT_FAILURE_LIFETIME;
1360
1361 /* Opportunistically try to cleanup the failure cache. We do that at regular
1362 * interval so it doesn't grow too big. */
1363 if (or_connect_failure_map_next_cleanup_ts <= now) {
1364 or_connect_failure_map_cleanup(cutoff);
1365 or_connect_failure_map_next_cleanup_ts =
1366 now + OR_CONNECT_FAILURE_CLEANUP_INTERVAL;
1367 }
1368
1369 /* Look if we have failed previously to the same destination as this
1370 * OR connection. */
1371 ocf = or_connect_failure_find(or_conn);
1372 if (ocf) {
1373 connect_failed_since_ts = ocf->last_failed_connect_ts;
1374 }
1375 /* If we do have an unable to connect timestamp and it is below cutoff, we
1376 * can connect. Or we have never failed before so let it connect. */
1377 if (connect_failed_since_ts > cutoff) {
1378 goto no_connect;
1379 }
1380
1381 /* Ok we can connect! */
1382 return 1;
1383 no_connect:
1384 return 0;
1385}
1386
1387/** <b>conn</b> is in the 'connecting' state, and it failed to complete
1388 * a TCP connection. Send notifications appropriately.
1389 *
1390 * <b>reason</b> specifies the or_conn_end_reason for the failure;
1391 * <b>msg</b> specifies the strerror-style error message.
1392 */
1393void
1395 int reason, const char *msg)
1396{
1397 connection_or_event_status(conn, OR_CONN_EVENT_FAILED, reason);
1398 if (!authdir_mode_tests_reachability(get_options()))
1399 control_event_bootstrap_prob_or(msg, reason, conn);
1400 note_or_connect_failed(conn);
1401}
1402
1403/** <b>conn</b> got an error in connection_handle_read_impl() or
1404 * connection_handle_write_impl() and is going to die soon.
1405 *
1406 * <b>reason</b> specifies the or_conn_end_reason for the failure;
1407 * <b>msg</b> specifies the strerror-style error message.
1408 */
1409void
1411 int reason, const char *msg)
1412{
1413 channel_t *chan;
1414
1415 tor_assert(conn);
1416
1417 /* If we're connecting, call connect_failed() too */
1418 if (TO_CONN(conn)->state == OR_CONN_STATE_CONNECTING)
1419 connection_or_connect_failed(conn, reason, msg);
1420
1421 /* Tell the controlling channel if we have one */
1422 if (conn->chan) {
1423 chan = TLS_CHAN_TO_BASE(conn->chan);
1424 /* Don't transition if we're already in closing, closed or error */
1425 if (!CHANNEL_CONDEMNED(chan)) {
1427 }
1428 }
1429
1430 /* No need to mark for error because connection.c is about to do that */
1431}
1432
1433/** Launch a new OR connection to <b>addr</b>:<b>port</b> and expect to
1434 * handshake with an OR with identity digest <b>id_digest</b>. Optionally,
1435 * pass in a pointer to a channel using this connection.
1436 *
1437 * If <b>id_digest</b> is me, do nothing. If we're already connected to it,
1438 * return that connection. If the connect() is in progress, set the
1439 * new conn's state to 'connecting' and return it. If connect() succeeds,
1440 * call connection_tls_start_handshake() on it.
1441 *
1442 * This function is called from router_retry_connections(), for
1443 * ORs connecting to ORs, and circuit_establish_circuit(), for
1444 * OPs connecting to ORs.
1445 *
1446 * Return the launched conn, or NULL if it failed.
1447 */
1449connection_or_connect, (const tor_addr_t *_addr, uint16_t port,
1450 const char *id_digest,
1451 const ed25519_public_key_t *ed_id,
1452 channel_tls_t *chan))
1453{
1454 or_connection_t *conn;
1455 const or_options_t *options = get_options();
1456 int socket_error = 0;
1457 tor_addr_t addr;
1458
1459 int r;
1460 tor_addr_t proxy_addr;
1461 uint16_t proxy_port;
1462 int proxy_type, is_pt = 0;
1463
1464 tor_assert(_addr);
1465 tor_assert(id_digest);
1466 tor_addr_copy(&addr, _addr);
1467
1468 if (server_mode(options) && router_digest_is_me(id_digest)) {
1469 log_info(LD_PROTOCOL,"Client asked me to connect to myself. Refusing.");
1470 return NULL;
1471 }
1472 if (server_mode(options) && router_ed25519_id_is_me(ed_id)) {
1473 log_info(LD_PROTOCOL,"Client asked me to connect to myself by Ed25519 "
1474 "identity. Refusing.");
1475 return NULL;
1476 }
1477
1479
1480 /*
1481 * Set up conn so it's got all the data we need to remember for channels
1482 *
1483 * This stuff needs to happen before connection_or_init_conn_from_address()
1484 * so connection_or_set_identity_digest() and such know where to look to
1485 * keep the channel up to date.
1486 */
1487 conn->chan = chan;
1488 chan->conn = conn;
1489 connection_or_init_conn_from_address(conn, &addr, port, id_digest, ed_id, 1);
1490
1491 /* We have a proper OR connection setup, now check if we can connect to it
1492 * that is we haven't had a failure earlier. This is to avoid to try to
1493 * constantly connect to relays that we think are not reachable. */
1494 if (!should_connect_to_relay(conn)) {
1495 log_info(LD_GENERAL, "Can't connect to %s because we "
1496 "failed earlier. Refusing.",
1499 return NULL;
1500 }
1501
1502 conn->is_outgoing = 1;
1503
1504 /* If we are using a proxy server, find it and use it. */
1505 r = get_proxy_addrport(&proxy_addr, &proxy_port, &proxy_type, &is_pt,
1506 TO_CONN(conn));
1507 if (r == 0) {
1508 conn->proxy_type = proxy_type;
1509 if (proxy_type != PROXY_NONE) {
1510 tor_addr_copy(&addr, &proxy_addr);
1511 port = proxy_port;
1512 conn->base_.proxy_state = PROXY_INFANT;
1513 conn->is_pt = is_pt;
1514 }
1516 connection_or_event_status(conn, OR_CONN_EVENT_LAUNCHED, 0);
1517 } else {
1518 /* This duplication of state change calls is necessary in case we
1519 * run into an error condition below */
1521 connection_or_event_status(conn, OR_CONN_EVENT_LAUNCHED, 0);
1522
1523 /* get_proxy_addrport() might fail if we have a Bridge line that
1524 references a transport, but no ClientTransportPlugin lines
1525 defining its transport proxy. If this is the case, let's try to
1526 output a useful log message to the user. */
1527 const char *transport_name =
1529 TO_CONN(conn)->port);
1530
1531 if (transport_name) {
1532 log_warn(LD_GENERAL, "We were supposed to connect to bridge '%s' "
1533 "using pluggable transport '%s', but we can't find a pluggable "
1534 "transport proxy supporting '%s'. This can happen if you "
1535 "haven't provided a ClientTransportPlugin line, or if "
1536 "your pluggable transport proxy stopped running.",
1538 transport_name, transport_name);
1539
1541 "Can't connect to bridge",
1542 END_OR_CONN_REASON_PT_MISSING,
1543 conn);
1544
1545 } else {
1546 log_warn(LD_GENERAL, "Tried to connect to %s through a proxy, but "
1547 "the proxy address could not be found.",
1549 }
1550
1552 return NULL;
1553 }
1554
1555 switch (connection_connect(TO_CONN(conn), conn->base_.address,
1556 &addr, port, &socket_error)) {
1557 case -1:
1558 /* We failed to establish a connection probably because of a local
1559 * error. No need to blame the guard in this case. Notify the networking
1560 * system of this failure. */
1562 errno_to_orconn_end_reason(socket_error),
1563 tor_socket_strerror(socket_error));
1565 return NULL;
1566 case 0:
1568 /* writable indicates finish, readable indicates broken link,
1569 error indicates broken link on windows */
1570 return conn;
1571 /* case 1: fall through */
1572 }
1573
1574 if (connection_or_finished_connecting(conn) < 0) {
1575 /* already marked for close */
1576 return NULL;
1577 }
1578 return conn;
1579}
1580
1581/** Mark orconn for close and transition the associated channel, if any, to
1582 * the closing state.
1583 *
1584 * It's safe to call this and connection_or_close_for_error() any time, and
1585 * channel layer will treat it as a connection closing for reasons outside
1586 * its control, like the remote end closing it. It can also be a local
1587 * reason that's specific to connection_t/or_connection_t rather than
1588 * the channel mechanism, such as expiration of old connections in
1589 * run_connection_housekeeping(). If you want to close a channel_t
1590 * from somewhere that logically works in terms of generic channels
1591 * rather than connections, use channel_mark_for_close(); see also
1592 * the comment on that function in channel.c.
1593 */
1594void
1596{
1597 channel_t *chan = NULL;
1598
1599 tor_assert(orconn);
1600 if (flush) connection_mark_and_flush_internal(TO_CONN(orconn));
1601 else connection_mark_for_close_internal(TO_CONN(orconn));
1602 if (orconn->chan) {
1603 chan = TLS_CHAN_TO_BASE(orconn->chan);
1604 /* Don't transition if we're already in closing, closed or error */
1605 if (!CHANNEL_CONDEMNED(chan)) {
1607 }
1608 }
1609}
1610
1611/** Mark orconn for close and transition the associated channel, if any, to
1612 * the error state.
1613 */
1614MOCK_IMPL(void,
1616{
1617 channel_t *chan = NULL;
1618
1619 tor_assert(orconn);
1620 if (flush) connection_mark_and_flush_internal(TO_CONN(orconn));
1621 else connection_mark_for_close_internal(TO_CONN(orconn));
1622 if (orconn->chan) {
1623 chan = TLS_CHAN_TO_BASE(orconn->chan);
1624 /* Don't transition if we're already in closing, closed or error */
1625 if (!CHANNEL_CONDEMNED(chan)) {
1627 }
1628 }
1629}
1630
1631/** Begin the tls handshake with <b>conn</b>. <b>receiving</b> is 0 if
1632 * we initiated the connection, else it's 1.
1633 *
1634 * Assign a new tls object to conn->tls, begin reading on <b>conn</b>, and
1635 * pass <b>conn</b> to connection_tls_continue_handshake().
1636 *
1637 * Return -1 if <b>conn</b> is broken, else return 0.
1638 */
1639MOCK_IMPL(int,
1641{
1642 channel_listener_t *chan_listener;
1643 channel_t *chan;
1644
1645 /* Incoming connections will need a new channel passed to the
1646 * channel_tls_listener */
1647 if (receiving) {
1648 /* It shouldn't already be set */
1649 tor_assert(!(conn->chan));
1650 chan_listener = channel_tls_get_listener();
1651 if (!chan_listener) {
1652 chan_listener = channel_tls_start_listener();
1653 command_setup_listener(chan_listener);
1654 }
1655 chan = channel_tls_handle_incoming(conn);
1656 channel_listener_queue_incoming(chan_listener, chan);
1657 }
1658
1660 tor_assert(!conn->tls);
1661 conn->tls = tor_tls_new(conn->base_.s, receiving);
1662 if (!conn->tls) {
1663 log_warn(LD_BUG,"tor_tls_new failed. Closing.");
1664 return -1;
1665 }
1668
1670 log_debug(LD_HANDSHAKE,"starting TLS handshake on fd "TOR_SOCKET_T_FORMAT,
1671 conn->base_.s);
1672
1674 return -1;
1675
1676 return 0;
1677}
1678
1679/** Move forward with the tls handshake. If it finishes, hand
1680 * <b>conn</b> to connection_tls_finish_handshake().
1681 *
1682 * Return -1 if <b>conn</b> is broken, else return 0.
1683 */
1684int
1686{
1687 int result;
1688 check_no_tls_errors();
1689
1691 // log_notice(LD_OR, "Continue handshake with %p", conn->tls);
1692 result = tor_tls_handshake(conn->tls);
1693 // log_notice(LD_OR, "Result: %d", result);
1694
1695 switch (result) {
1697 conn->tls_error = result;
1698 log_info(LD_OR,"tls error [%s]. breaking connection.",
1699 tor_tls_err_to_string(result));
1700 return -1;
1701 case TOR_TLS_DONE:
1702 {
1703 if (!tor_tls_is_server(conn->tls)) {
1706 } else {
1707 /* v3+ handshake, but we are not a client. */
1708 log_debug(LD_OR, "Done with initial SSL handshake (server-side). "
1709 "Expecting VERSIONS cell");
1710 /* Note: We could instead just send a VERSIONS cell now,
1711 * since the V2 handshake is no longer a thing.
1712 * But that would require re-plumbing this state machine. */
1717 return 0;
1718 }
1719 }
1720 case TOR_TLS_WANTWRITE:
1722 log_debug(LD_OR,"wanted write");
1723 return 0;
1724 case TOR_TLS_WANTREAD: /* handshaking conns are *always* reading */
1725 log_debug(LD_OR,"wanted read");
1726 return 0;
1727 case TOR_TLS_CLOSE:
1728 conn->tls_error = result;
1729 log_info(LD_OR,"tls closed. breaking connection.");
1730 return -1;
1731 }
1732 return 0;
1733}
1734
1735/** Return 1 if we initiated this connection, or 0 if it started
1736 * out as an incoming connection.
1737 */
1738int
1740{
1741 tor_assert(conn->base_.type == CONN_TYPE_OR ||
1742 conn->base_.type == CONN_TYPE_EXT_OR);
1743 if (!conn->tls)
1744 return 1; /* it's still in proxy states or something */
1745 if (conn->handshake_state)
1746 return conn->handshake_state->started_here;
1747 return !tor_tls_is_server(conn->tls);
1748}
1749
1750/** Called when we (as a connection initiator) have definitively,
1751 * authenticatedly, learned that ID of the Tor instance on the other
1752 * side of <b>conn</b> is <b>rsa_peer_id</b> and optionally <b>ed_peer_id</b>.
1753 * For v1 and v2 handshakes,
1754 * this is right after we get a certificate chain in a TLS handshake
1755 * or renegotiation. For v3+ handshakes, this is right after we get a
1756 * certificate chain in a CERTS cell.
1757 *
1758 * If we did not know the ID before, record the one we got.
1759 *
1760 * If we wanted an ID, but we didn't get the one we expected, log a message
1761 * and return -1.
1762 * On relays:
1763 * - log a protocol warning whenever the fingerprints don't match;
1764 * On clients:
1765 * - if a relay's fingerprint doesn't match, log a warning;
1766 * - if we don't have updated relay fingerprints from a recent consensus, and
1767 * a fallback directory mirror's hard-coded fingerprint has changed, log an
1768 * info explaining that we will try another fallback.
1769 *
1770 * If we're testing reachability, remember what we learned.
1771 *
1772 * Return 0 on success, -1 on failure.
1773 */
1774int
1776 const uint8_t *rsa_peer_id,
1777 const ed25519_public_key_t *ed_peer_id)
1778{
1779 const or_options_t *options = get_options();
1780 channel_tls_t *chan_tls = conn->chan;
1781 channel_t *chan = channel_tls_to_base(chan_tls);
1782 int changed_identity = 0;
1783 tor_assert(chan);
1784
1785 const int expected_rsa_key =
1787 const int expected_ed_key =
1789
1790 log_info(LD_HANDSHAKE, "learned peer id for %s at %p: %s, %s",
1792 conn,
1793 hex_str((const char*)rsa_peer_id, DIGEST_LEN),
1794 ed25519_fmt(ed_peer_id));
1795
1796 if (! expected_rsa_key && ! expected_ed_key) {
1797 log_info(LD_HANDSHAKE, "(we had no ID in mind when we made this "
1798 "connection.");
1800 (const char*)rsa_peer_id, ed_peer_id);
1801 tor_free(conn->nickname);
1802 conn->nickname = tor_malloc(HEX_DIGEST_LEN+2);
1803 conn->nickname[0] = '$';
1806 log_info(LD_HANDSHAKE, "Connected to router at %s without knowing "
1807 "its key. Hoping for the best.",
1809 /* if it's a bridge and we didn't know its identity fingerprint, now
1810 * we do -- remember it for future attempts. */
1811 learned_router_identity(&conn->base_.addr, conn->base_.port,
1812 (const char*)rsa_peer_id, ed_peer_id);
1813 changed_identity = 1;
1814 }
1815
1816 const int rsa_mismatch = expected_rsa_key &&
1817 tor_memneq(rsa_peer_id, conn->identity_digest, DIGEST_LEN);
1818 /* It only counts as an ed25519 mismatch if we wanted an ed25519 identity
1819 * and didn't get it. It's okay if we get one that we didn't ask for. */
1820 const int ed25519_mismatch =
1821 expected_ed_key &&
1822 (ed_peer_id == NULL ||
1823 ! ed25519_pubkey_eq(&chan->ed25519_identity, ed_peer_id));
1824
1825 if (rsa_mismatch || ed25519_mismatch) {
1826 /* I was aiming for a particular digest. I didn't get it! */
1827 char seen_rsa[HEX_DIGEST_LEN+1];
1828 char expected_rsa[HEX_DIGEST_LEN+1];
1829 char seen_ed[ED25519_BASE64_LEN+1];
1830 char expected_ed[ED25519_BASE64_LEN+1];
1831 base16_encode(seen_rsa, sizeof(seen_rsa),
1832 (const char*)rsa_peer_id, DIGEST_LEN);
1833 base16_encode(expected_rsa, sizeof(expected_rsa), conn->identity_digest,
1834 DIGEST_LEN);
1835 if (ed_peer_id) {
1836 ed25519_public_to_base64(seen_ed, ed_peer_id);
1837 } else {
1838 strlcpy(seen_ed, "no ed25519 key", sizeof(seen_ed));
1839 }
1841 ed25519_public_to_base64(expected_ed, &chan->ed25519_identity);
1842 } else {
1843 strlcpy(expected_ed, "no ed25519 key", sizeof(expected_ed));
1844 }
1845 const int using_hardcoded_fingerprints =
1848 const int is_fallback_fingerprint = router_digest_is_fallback_dir(
1849 conn->identity_digest);
1850 const int is_authority_fingerprint = router_digest_is_trusted_dir(
1851 conn->identity_digest);
1852 const int non_anonymous_mode =
1853 hs_service_non_anonymous_mode_enabled(options);
1854 int severity;
1855 const char *extra_log = "";
1856
1857 /* Relays and Single Onion Services make direct connections using
1858 * untrusted authentication keys. */
1859 if (server_mode(options) || non_anonymous_mode) {
1860 severity = LOG_PROTOCOL_WARN;
1861 } else {
1862 if (using_hardcoded_fingerprints) {
1863 /* We need to do the checks in this order, because the list of
1864 * fallbacks includes the list of authorities */
1865 if (is_authority_fingerprint) {
1866 severity = LOG_WARN;
1867 } else if (is_fallback_fingerprint) {
1868 /* we expect a small number of fallbacks to change from their
1869 * hard-coded fingerprints over the life of a release */
1870 severity = LOG_INFO;
1871 extra_log = " Tor will try a different fallback.";
1872 } else {
1873 /* it's a bridge, it's either a misconfiguration, or unexpected */
1874 severity = LOG_WARN;
1875 }
1876 } else {
1877 /* a relay has changed its fingerprint from the one in the consensus */
1878 severity = LOG_WARN;
1879 }
1880 }
1881
1882 log_fn(severity, LD_HANDSHAKE,
1883 "Tried connecting to router at %s, but RSA + ed25519 identity "
1884 "keys were not as expected: wanted %s + %s but got %s + %s.%s",
1886 expected_rsa, expected_ed, seen_rsa, seen_ed, extra_log);
1887
1888 /* Tell the new guard API about the channel failure */
1889 entry_guard_chan_failed(TLS_CHAN_TO_BASE(conn->chan));
1890 connection_or_event_status(conn, OR_CONN_EVENT_FAILED,
1891 END_OR_CONN_REASON_OR_IDENTITY);
1892 if (!authdir_mode_tests_reachability(options))
1894 "Unexpected identity in router certificate",
1895 END_OR_CONN_REASON_OR_IDENTITY,
1896 conn);
1897 return -1;
1898 }
1899
1900 if (!expected_ed_key && ed_peer_id) {
1901 log_info(LD_HANDSHAKE, "(We had no Ed25519 ID in mind when we made this "
1902 "connection.)");
1904 (const char*)rsa_peer_id, ed_peer_id);
1905 changed_identity = 1;
1906 }
1907
1908 if (changed_identity) {
1909 /* If we learned an identity for this connection, then we might have
1910 * just discovered it to be canonical. */
1912 if (conn->tls)
1915 }
1916
1917 if (authdir_mode_tests_reachability(options)) {
1918 // We don't want to use canonical_orport here -- we want the address
1919 // that we really used.
1920 dirserv_orconn_tls_done(&conn->base_.addr, conn->base_.port,
1921 (const char*)rsa_peer_id, ed_peer_id);
1922 }
1923
1924 return 0;
1925}
1926
1927/** Return when we last used this channel for client activity (origin
1928 * circuits). This is called from connection.c, since client_used is now one
1929 * of the timestamps in channel_t */
1930time_t
1932{
1933 tor_assert(conn);
1934
1935 if (conn->chan) {
1936 return channel_when_last_client(TLS_CHAN_TO_BASE(conn->chan));
1937 } else return 0;
1938}
1939
1940/**
1941 * Called as client when initial TLS handshake is done, and we notice
1942 * that we got a v3-handshake signalling certificate from the server.
1943 * Set up structures, do bookkeeping, and send the versions cell.
1944 * Return 0 on success and -1 on failure.
1945 */
1946static int
1959
1960/** Allocate a new connection handshake state for the connection
1961 * <b>conn</b>. Return 0 on success, -1 on failure. */
1962int
1964{
1966 if (conn->handshake_state) {
1967 log_warn(LD_BUG, "Duplicate call to connection_init_or_handshake_state!");
1968 return 0;
1969 }
1970 s = conn->handshake_state = tor_malloc_zero(sizeof(or_handshake_state_t));
1971 s->started_here = started_here ? 1 : 0;
1972 s->digest_sent_data = 1;
1973 s->digest_received_data = 1;
1974 if (! started_here && get_current_link_cert_cert()) {
1975 s->own_link_cert = tor_cert_dup(get_current_link_cert_cert());
1976 }
1979 return 0;
1980}
1981
1982/** Free all storage held by <b>state</b>. */
1983void
1985{
1986 if (!state)
1987 return;
1989 crypto_digest_free(state->digest_received);
1990 or_handshake_certs_free(state->certs);
1991 tor_cert_free(state->own_link_cert);
1992 memwipe(state, 0xBE, sizeof(or_handshake_state_t));
1993 tor_free(state);
1994}
1995
1996/**
1997 * Remember that <b>cell</b> has been transmitted (if <b>incoming</b> is
1998 * false) or received (if <b>incoming</b> is true) during a V3 handshake using
1999 * <b>state</b>.
2000 *
2001 * (We don't record the cell, but we keep a digest of everything sent or
2002 * received during the v3 handshake, and the client signs it in an
2003 * authenticate cell.)
2004 */
2005void
2007 or_handshake_state_t *state,
2008 const cell_t *cell,
2009 int incoming)
2010{
2011 size_t cell_network_size = get_cell_network_size(conn->wide_circ_ids);
2012 crypto_digest_t *d, **dptr;
2013 packed_cell_t packed;
2014 if (incoming) {
2015 if (!state->digest_received_data)
2016 return;
2017 } else {
2018 if (!state->digest_sent_data)
2019 return;
2020 }
2021 if (!incoming) {
2022 log_warn(LD_BUG, "We shouldn't be sending any non-variable-length cells "
2023 "while making a handshake digest. But we think we are sending "
2024 "one with type %d.", (int)cell->command);
2025 }
2026 dptr = incoming ? &state->digest_received : &state->digest_sent;
2027 if (! *dptr)
2028 *dptr = crypto_digest256_new(DIGEST_SHA256);
2029
2030 d = *dptr;
2031 /* Re-packing like this is a little inefficient, but we don't have to do
2032 this very often at all. */
2033 cell_pack(&packed, cell, conn->wide_circ_ids);
2034 crypto_digest_add_bytes(d, packed.body, cell_network_size);
2035 memwipe(&packed, 0, sizeof(packed));
2036}
2037
2038/** Remember that a variable-length <b>cell</b> has been transmitted (if
2039 * <b>incoming</b> is false) or received (if <b>incoming</b> is true) during a
2040 * V3 handshake using <b>state</b>.
2041 *
2042 * (We don't record the cell, but we keep a digest of everything sent or
2043 * received during the v3 handshake, and the client signs it in an
2044 * authenticate cell.)
2045 */
2046void
2048 or_handshake_state_t *state,
2049 const var_cell_t *cell,
2050 int incoming)
2051{
2052 crypto_digest_t *d, **dptr;
2053 int n;
2054 char buf[VAR_CELL_MAX_HEADER_SIZE];
2055 if (incoming) {
2056 if (!state->digest_received_data)
2057 return;
2058 } else {
2059 if (!state->digest_sent_data)
2060 return;
2061 }
2062 dptr = incoming ? &state->digest_received : &state->digest_sent;
2063 if (! *dptr)
2064 *dptr = crypto_digest256_new(DIGEST_SHA256);
2065
2066 d = *dptr;
2067
2068 n = var_cell_pack_header(cell, buf, conn->wide_circ_ids);
2069 crypto_digest_add_bytes(d, buf, n);
2070 crypto_digest_add_bytes(d, (const char *)cell->payload, cell->payload_len);
2071
2072 memwipe(buf, 0, sizeof(buf));
2073}
2074
2075/** Set <b>conn</b>'s state to OR_CONN_STATE_OPEN, and tell other subsystems
2076 * as appropriate. Called when we are done with all TLS and OR handshaking.
2077 */
2078int
2080{
2082 connection_or_event_status(conn, OR_CONN_EVENT_CONNECTED, 0);
2083
2084 /* Link protocol 3 appeared in Tor 0.2.3.6-alpha, so any connection
2085 * that uses an earlier link protocol should not be treated as a relay. */
2086 if (conn->link_proto < 3) {
2087 channel_mark_client(TLS_CHAN_TO_BASE(conn->chan));
2088 }
2089
2090 or_handshake_state_free(conn->handshake_state);
2091 conn->handshake_state = NULL;
2093
2094 return 0;
2095}
2096
2097/** Pack <b>cell</b> into wire-format, and write it onto <b>conn</b>'s outbuf.
2098 * For cells that use or affect a circuit, this should only be called by
2099 * connection_or_flush_from_first_active_circuit().
2100 */
2101void
2103{
2104 packed_cell_t networkcell;
2105 size_t cell_network_size = get_cell_network_size(conn->wide_circ_ids);
2106
2107 tor_assert(cell);
2108 tor_assert(conn);
2109
2110 cell_pack(&networkcell, cell, conn->wide_circ_ids);
2111
2112 /* We need to count padding cells from this non-packed code path
2113 * since they are sent via chan->write_cell() (which is not packed) */
2115 if (cell->command == CELL_PADDING)
2117
2118 connection_buf_add(networkcell.body, cell_network_size, TO_CONN(conn));
2119
2120 /* Touch the channel's active timestamp if there is one */
2121 if (conn->chan) {
2122 channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
2123
2124 if (TLS_CHAN_TO_BASE(conn->chan)->padding_enabled) {
2126 if (cell->command == CELL_PADDING)
2128 }
2129 }
2130
2131 if (conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3)
2132 or_handshake_state_record_cell(conn, conn->handshake_state, cell, 0);
2133}
2134
2135/** Pack a variable-length <b>cell</b> into wire-format, and write it onto
2136 * <b>conn</b>'s outbuf. Right now, this <em>DOES NOT</em> support cells that
2137 * affect a circuit.
2138 */
2139MOCK_IMPL(void,
2142{
2143 int n;
2144 char hdr[VAR_CELL_MAX_HEADER_SIZE];
2145 tor_assert(cell);
2146 tor_assert(conn);
2147 n = var_cell_pack_header(cell, hdr, conn->wide_circ_ids);
2148 connection_buf_add(hdr, n, TO_CONN(conn));
2149 connection_buf_add((char*)cell->payload,
2150 cell->payload_len, TO_CONN(conn));
2151 if (conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3)
2153
2155 /* Touch the channel's active timestamp if there is one */
2156 if (conn->chan)
2157 channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
2158}
2159
2160/** See whether there's a variable-length cell waiting on <b>or_conn</b>'s
2161 * inbuf. Return values as for fetch_var_cell_from_buf(). */
2162static int
2164{
2165 connection_t *conn = TO_CONN(or_conn);
2166 return fetch_var_cell_from_buf(conn->inbuf, out, or_conn->link_proto);
2167}
2168
2169/** Process cells from <b>conn</b>'s inbuf.
2170 *
2171 * Loop: while inbuf contains a cell, pull it off the inbuf, unpack it,
2172 * and hand it to command_process_cell().
2173 *
2174 * Always return 0.
2175 */
2176static int
2178{
2179 var_cell_t *var_cell;
2180
2181 /*
2182 * Note on memory management for incoming cells: below the channel layer,
2183 * we shouldn't need to consider its internal queueing/copying logic. It
2184 * is safe to pass cells to it on the stack or on the heap, but in the
2185 * latter case we must be sure we free them later.
2186 *
2187 * The incoming cell queue code in channel.c will (in the common case)
2188 * decide it can pass them to the upper layer immediately, in which case
2189 * those functions may run directly on the cell pointers we pass here, or
2190 * it may decide to queue them, in which case it will allocate its own
2191 * buffer and copy the cell.
2192 */
2193
2194 while (1) {
2195 log_debug(LD_OR,
2196 TOR_SOCKET_T_FORMAT": starting, inbuf_datalen %d "
2197 "(%d pending in tls object).",
2198 conn->base_.s,(int)connection_get_inbuf_len(TO_CONN(conn)),
2200 if (connection_fetch_var_cell_from_buf(conn, &var_cell)) {
2201 if (!var_cell)
2202 return 0; /* not yet. */
2203
2204 /* Touch the channel's active timestamp if there is one */
2205 if (conn->chan)
2206 channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
2207
2209 channel_tls_handle_var_cell(var_cell, conn);
2210 var_cell_free(var_cell);
2211 } else {
2212 const int wide_circ_ids = conn->wide_circ_ids;
2213 size_t cell_network_size = get_cell_network_size(conn->wide_circ_ids);
2214 char buf[CELL_MAX_NETWORK_SIZE];
2215 cell_t cell;
2216 if (connection_get_inbuf_len(TO_CONN(conn))
2217 < cell_network_size) /* whole response available? */
2218 return 0; /* not yet */
2219
2220 /* Touch the channel's active timestamp if there is one */
2221 if (conn->chan)
2222 channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
2223
2225 connection_buf_get_bytes(buf, cell_network_size, TO_CONN(conn));
2226
2227 /* retrieve cell info from buf (create the host-order struct from the
2228 * network-order string) */
2229 cell_unpack(&cell, buf, wide_circ_ids);
2230
2231 channel_tls_handle_cell(&cell, conn);
2232 }
2233 }
2234}
2235
2236/** Array of supported link protocol versions. */
2237static const uint16_t or_protocol_versions[] = { 3, 4, 5 };
2238/** Number of versions in <b>or_protocol_versions</b>. */
2239static const int n_or_protocol_versions =
2240 (int)( sizeof(or_protocol_versions)/sizeof(uint16_t) );
2241
2242/** Return true iff <b>v</b> is a link protocol version that this Tor
2243 * implementation believes it can support. */
2244int
2246{
2247 int i;
2248 for (i = 0; i < n_or_protocol_versions; ++i) {
2249 if (or_protocol_versions[i] == v)
2250 return 1;
2251 }
2252 return 0;
2253}
2254
2255/** Send a VERSIONS cell on <b>conn</b>, telling the other host about the
2256 * link protocol versions that this Tor can support.
2257 *
2258 * If <b>v3_plus</b>, this is part of a V3 protocol handshake, so only
2259 * allow protocol version v3 or later. If not <b>v3_plus</b>, this is
2260 * not part of a v3 protocol handshake, so don't allow protocol v3 or
2261 * later.
2262 **/
2263int
2265{
2266 var_cell_t *cell;
2267 int i;
2268 int n_versions = 0;
2269 const int min_version = v3_plus ? 3 : 0;
2270 const int max_version = v3_plus ? UINT16_MAX : 2;
2274 cell->command = CELL_VERSIONS;
2275 for (i = 0; i < n_or_protocol_versions; ++i) {
2276 uint16_t v = or_protocol_versions[i];
2277 if (v < min_version || v > max_version)
2278 continue;
2279 set_uint16(cell->payload+(2*n_versions), htons(v));
2280 ++n_versions;
2281 }
2282 cell->payload_len = n_versions * 2;
2283
2285 conn->handshake_state->sent_versions_at = time(NULL);
2286
2287 var_cell_free(cell);
2288 return 0;
2289}
2290
2291static netinfo_addr_t *
2292netinfo_addr_from_tor_addr(const tor_addr_t *tor_addr)
2293{
2294 sa_family_t addr_family = tor_addr_family(tor_addr);
2295
2296 if (BUG(addr_family != AF_INET && addr_family != AF_INET6))
2297 return NULL;
2298
2299 netinfo_addr_t *netinfo_addr = netinfo_addr_new();
2300
2301 if (addr_family == AF_INET) {
2302 netinfo_addr_set_addr_type(netinfo_addr, NETINFO_ADDR_TYPE_IPV4);
2303 netinfo_addr_set_len(netinfo_addr, 4);
2304 netinfo_addr_set_addr_ipv4(netinfo_addr, tor_addr_to_ipv4h(tor_addr));
2305 } else if (addr_family == AF_INET6) {
2306 netinfo_addr_set_addr_type(netinfo_addr, NETINFO_ADDR_TYPE_IPV6);
2307 netinfo_addr_set_len(netinfo_addr, 16);
2308 uint8_t *ipv6_buf = netinfo_addr_getarray_addr_ipv6(netinfo_addr);
2309 const uint8_t *in6_addr = tor_addr_to_in6_addr8(tor_addr);
2310 memcpy(ipv6_buf, in6_addr, 16);
2311 }
2312
2313 return netinfo_addr;
2314}
2315
2316/** Send a NETINFO cell on <b>conn</b>, telling the other server what we know
2317 * about their address, our address, and the current time. */
2318MOCK_IMPL(int,
2320{
2321 cell_t cell;
2322 time_t now = time(NULL);
2323 const routerinfo_t *me;
2324 int r = -1;
2325
2327
2328 if (conn->handshake_state->sent_netinfo) {
2329 log_warn(LD_BUG, "Attempted to send an extra netinfo cell on a connection "
2330 "where we already sent one.");
2331 return 0;
2332 }
2333
2334 memset(&cell, 0, sizeof(cell_t));
2335 cell.command = CELL_NETINFO;
2336
2337 netinfo_cell_t *netinfo_cell = netinfo_cell_new();
2338
2339 /* Timestamp, if we're a relay. */
2340 if (public_server_mode(get_options()) || ! conn->is_outgoing)
2341 netinfo_cell_set_timestamp(netinfo_cell, (uint32_t)now);
2342
2343 /* Their address. */
2344 const tor_addr_t *remote_tor_addr = &TO_CONN(conn)->addr;
2345 /* We can safely use TO_CONN(conn)->addr here, since we no longer replace
2346 * it with a canonical address. */
2347 netinfo_addr_t *their_addr = netinfo_addr_from_tor_addr(remote_tor_addr);
2348
2349 netinfo_cell_set_other_addr(netinfo_cell, their_addr);
2350
2351 /* My address -- only include it if I'm a public relay, or if I'm a
2352 * bridge and this is an incoming connection. If I'm a bridge and this
2353 * is an outgoing connection, act like a normal client and omit it. */
2354 if ((public_server_mode(get_options()) || !conn->is_outgoing) &&
2355 (me = router_get_my_routerinfo())) {
2356 uint8_t n_my_addrs = 1 + !tor_addr_is_null(&me->ipv6_addr);
2357 netinfo_cell_set_n_my_addrs(netinfo_cell, n_my_addrs);
2358
2359 netinfo_cell_add_my_addrs(netinfo_cell,
2360 netinfo_addr_from_tor_addr(&me->ipv4_addr));
2361
2362 if (!tor_addr_is_null(&me->ipv6_addr)) {
2363 netinfo_cell_add_my_addrs(netinfo_cell,
2364 netinfo_addr_from_tor_addr(&me->ipv6_addr));
2365 }
2366 }
2367
2368 const char *errmsg = NULL;
2369 if ((errmsg = netinfo_cell_check(netinfo_cell))) {
2370 log_warn(LD_OR, "Failed to validate NETINFO cell with error: %s",
2371 errmsg);
2372 goto cleanup;
2373 }
2374
2375 if (netinfo_cell_encode(cell.payload, CELL_PAYLOAD_SIZE,
2376 netinfo_cell) < 0) {
2377 log_warn(LD_OR, "Failed generating NETINFO cell");
2378 goto cleanup;
2379 }
2380
2382 conn->handshake_state->sent_netinfo = 1;
2384
2385 r = 0;
2386 cleanup:
2387 netinfo_cell_free(netinfo_cell);
2388
2389 return r;
2390}
void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src)
Definition address.c:933
int tor_addr_is_null(const tor_addr_t *addr)
Definition address.c:780
void tor_addr_port_copy(tor_addr_port_t *dest, const tor_addr_port_t *source)
Definition address.c:2121
static sa_family_t tor_addr_family(const tor_addr_t *a)
Definition address.h:187
static uint32_t tor_addr_to_ipv4h(const tor_addr_t *a)
Definition address.h:160
#define tor_addr_to_in6_addr8(x)
Definition address.h:135
#define fmt_addr(a)
Definition address.h:239
#define tor_addr_eq(a, b)
Definition address.h:280
time_t approx_time(void)
Definition approx_time.c:32
Header file for directory authority mode.
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
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:440
const char * find_transport_name_by_bridge_addrport(const tor_addr_t *addr, uint16_t port)
Definition bridges.c:634
Header file for circuitbuild.c.
size_t buf_datalen(const buf_t *buf)
Definition buffers.c:394
Header file for buffers.c.
static void set_uint16(void *cp, uint16_t v)
Definition bytes.h:78
static uint16_t get_uint16(const void *cp)
Definition bytes.h:42
static void set_uint32(void *cp, uint32_t v)
Definition bytes.h:87
static uint8_t get_uint8(const void *cp)
Definition bytes.h:23
static void set_uint8(void *cp, uint8_t v)
Definition bytes.h:31
static uint32_t get_uint32(const void *cp)
Definition bytes.h:54
Cell queue structures.
Fixed-size cell structure.
void channel_timestamp_active(channel_t *chan)
Definition channel.c:3146
int channel_is_better(channel_t *a, channel_t *b)
Definition channel.c:2343
int channel_is_bad_for_new_circs(channel_t *chan)
Definition channel.c:2889
void channel_set_identity_digest(channel_t *chan, const char *identity_digest, const ed25519_public_key_t *ed_identity)
Definition channel.c:1336
void channel_mark_client(channel_t *chan)
Definition channel.c:2930
void channel_closed(channel_t *chan)
Definition channel.c:1276
void channel_close_from_lower_layer(channel_t *chan)
Definition channel.c:1221
void channel_listener_queue_incoming(channel_listener_t *listener, channel_t *incoming)
Definition channel.c:1931
time_t channel_when_last_client(channel_t *chan)
Definition channel.c:3266
void channel_mark_bad_for_new_circs(channel_t *chan)
Definition channel.c:2902
void channel_close_for_error(channel_t *chan)
Definition channel.c:1249
void channel_clear_identity_digest(channel_t *chan)
Definition channel.c:1307
unsigned int channel_num_circuits(channel_t *chan)
Definition channel.c:3340
Header file for channel.c.
unsigned int channelpadding_get_channel_idle_timeout(const channel_t *chan, int is_canonical)
void channel_tls_handle_var_cell(var_cell_t *var_cell, or_connection_t *conn)
channel_listener_t * channel_tls_start_listener(void)
Definition channeltls.c:269
void channel_tls_handle_state_change_on_orconn(channel_tls_t *chan, or_connection_t *conn, uint8_t state)
Definition channeltls.c:980
void channel_tls_handle_cell(cell_t *cell, or_connection_t *conn)
channel_listener_t * channel_tls_get_listener(void)
Definition channeltls.c:257
void channel_tls_update_marks(or_connection_t *conn)
channel_t * channel_tls_handle_incoming(or_connection_t *orconn)
Definition channeltls.c:332
channel_t * channel_tls_to_base(channel_tls_t *tlschan)
Definition channeltls.c:413
Header file for channeltls.c.
Header file for circuitbuild.c.
Header file for circuitlist.c.
circuit_build_times_t * get_circuit_build_times_mutable(void)
void circuit_build_times_network_is_live(circuit_build_times_t *cbt)
Header file for circuitstats.c.
void command_setup_listener(channel_listener_t *listener)
Definition command.c:725
Header file for command.c.
uint32_t monotime_coarse_get_stamp(void)
const or_options_t * get_options(void)
Definition config.c:948
Header file for config.c.
Public APIs for congestion control.
static uint32_t or_conn_highwatermark(void)
static uint32_t or_conn_lowwatermark(void)
int connection_buf_get_bytes(char *string, size_t len, connection_t *conn)
int get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type, int *is_pt_out, const connection_t *conn)
int connection_proxy_connect(connection_t *conn, int type)
void assert_connection_ok(connection_t *conn, time_t now)
int connection_read_proxy_handshake(connection_t *conn)
const char * connection_describe_peer(const connection_t *conn)
Definition connection.c:526
or_connection_t * or_connection_new(int type, int socket_family)
Definition connection.c:574
const char * connection_describe(const connection_t *conn)
Definition connection.c:541
void connection_free_(connection_t *conn)
Definition connection.c:968
int connection_connect(connection_t *conn, const char *address, const tor_addr_t *addr, uint16_t port, int *socket_error)
const char * conn_state_to_string(int type, int state)
Definition connection.c:304
Header file for connection.c.
#define CONN_TYPE_OR
Definition connection.h:44
#define CONN_TYPE_EXT_OR
Definition connection.h:71
void connection_or_event_status(or_connection_t *conn, or_conn_status_event_t tp, int reason)
or_connection_t * TO_OR_CONN(connection_t *c)
int is_or_protocol_version_known(uint16_t v)
int connection_or_set_state_open(or_connection_t *conn)
int connection_or_reached_eof(or_connection_t *conn)
static const int n_or_protocol_versions
int connection_tls_continue_handshake(or_connection_t *conn)
static void connection_or_set_identity_digest(or_connection_t *conn, const char *rsa_digest, const ed25519_public_key_t *ed_id)
void connection_or_notify_error(or_connection_t *conn, int reason, const char *msg)
void connection_or_write_cell_to_buf(const cell_t *cell, or_connection_t *conn)
int connection_or_process_inbuf(or_connection_t *conn)
static int connection_fetch_var_cell_from_buf(or_connection_t *or_conn, var_cell_t **out)
void connection_or_clear_identity(or_connection_t *conn)
int connection_or_send_versions(or_connection_t *conn, int v3_plus)
int connection_or_client_learned_peer_id(or_connection_t *conn, const uint8_t *rsa_peer_id, const ed25519_public_key_t *ed_peer_id)
static void connection_or_update_token_buckets_helper(or_connection_t *conn, int reset, const or_options_t *options)
time_t connection_or_client_used(or_connection_t *conn)
void cell_pack(packed_cell_t *dst, const cell_t *src, int wide_circ_ids)
static void connection_or_note_state_when_broken(or_connection_t *orconn)
var_cell_t * var_cell_new(uint16_t payload_len)
void or_handshake_state_free_(or_handshake_state_t *state)
void or_handshake_state_record_var_cell(or_connection_t *conn, or_handshake_state_t *state, const var_cell_t *cell, int incoming)
int var_cell_pack_header(const var_cell_t *cell, char *hdr_out, int wide_circ_ids)
int connection_or_finished_flushing(or_connection_t *conn)
static unsigned int connection_or_is_bad_for_new_circs(or_connection_t *or_conn)
void clear_broken_connection_map(int stop_recording)
static void cell_unpack(cell_t *dest, const char *src, int wide_circ_ids)
void connection_or_connect_failed(or_connection_t *conn, int reason, const char *msg)
static int connection_or_process_cells_from_inbuf(or_connection_t *conn)
int connection_or_send_netinfo(or_connection_t *conn)
void var_cell_free_(var_cell_t *cell)
int connection_or_single_set_badness_(time_t now, or_connection_t *or_conn, int force)
int connection_tls_start_handshake(or_connection_t *conn, int receiving)
void connection_or_change_state(or_connection_t *conn, uint8_t state)
void or_handshake_state_record_cell(or_connection_t *conn, or_handshake_state_t *state, const cell_t *cell, int incoming)
var_cell_t * var_cell_copy(const var_cell_t *src)
static int connection_or_launch_v3_or_handshake(or_connection_t *conn)
static void note_broken_connection(const char *state)
void connection_or_report_broken_states(int severity, int domain)
static void connection_or_check_canonicity(or_connection_t *conn, int started_here)
int connection_or_digest_is_known_relay(const char *id_digest)
#define MAX_REASONS_TO_REPORT
void connection_or_init_conn_from_address(or_connection_t *conn, const tor_addr_t *addr, uint16_t port, const char *id_digest, const ed25519_public_key_t *ed_id, int started_here)
static const uint16_t or_protocol_versions[]
int connection_or_get_num_circuits(or_connection_t *conn)
int connection_or_flushed_some(or_connection_t *conn)
const struct ed25519_public_key_t * connection_or_get_alleged_ed25519_id(const or_connection_t *conn)
int connection_or_nonopen_was_started_here(or_connection_t *conn)
static int disable_broken_connection_counts
or_connection_t * connection_or_connect(const tor_addr_t *_addr, uint16_t port, const char *id_digest, const ed25519_public_key_t *ed_id, channel_tls_t *chan)
void connection_or_close_for_error(or_connection_t *orconn, int flush)
const or_connection_t * CONST_TO_OR_CONN(const connection_t *c)
static strmap_t * broken_connection_counts
void connection_or_update_token_buckets(smartlist_t *conns, const or_options_t *options)
static void connection_or_get_state_description(or_connection_t *orconn, char *buf, size_t buflen)
void connection_or_group_set_badness_(smartlist_t *group, int force)
int connection_or_finished_connecting(or_connection_t *or_conn)
void connection_or_about_to_close(or_connection_t *or_conn)
static int broken_state_count_compare(const void **a_ptr, const void **b_ptr)
ssize_t connection_or_num_cells_writeable(or_connection_t *conn)
int connection_init_or_handshake_state(or_connection_t *conn, int started_here)
void connection_or_clear_identity_map(void)
void connection_or_close_normally(or_connection_t *orconn, int flush)
static void connection_or_state_publish(const or_connection_t *conn, uint8_t state)
void connection_or_write_var_cell_to_buf(const var_cell_t *cell, or_connection_t *conn)
#define TIME_BEFORE_OR_CONN_IS_TOO_OLD
Header file for connection_or.c.
void control_event_bootstrap_prob_or(const char *warn, int reason, or_connection_t *or_conn)
int control_event_or_conn_status(or_connection_t *conn, or_conn_status_event_t tp, int reason)
Header file for control_events.c.
#define HEX_DIGEST_LEN
#define crypto_digest_free(d)
crypto_digest_t * crypto_digest256_new(digest_algorithm_t algorithm)
void crypto_digest_add_bytes(crypto_digest_t *digest, const char *data, size_t len)
int ed25519_public_key_is_zero(const ed25519_public_key_t *pubkey)
int ed25519_pubkey_eq(const ed25519_public_key_t *key1, const ed25519_public_key_t *key2)
void ed25519_public_to_base64(char *output, const ed25519_public_key_t *pkey)
const char * ed25519_fmt(const ed25519_public_key_t *pkey)
Header for crypto_format.c.
void memwipe(void *mem, uint8_t byte, size_t sz)
Definition crypto_util.c:55
Common functions for cryptographic routines.
#define fast_memeq(a, b, c)
Definition di_ops.h:35
#define tor_memneq(a, b, sz)
Definition di_ops.h:21
#define DIGEST_LEN
int router_digest_is_fallback_dir(const char *digest)
Definition dirlist.c:205
Header file for dirlist.c.
void entry_guard_chan_failed(channel_t *chan)
Header file for circuitbuild.c.
Header for ext_orport.c.
Header file for geoip.c.
Header file containing service data for the HS subsystem.
uint16_t sa_family_t
Definition inaddr_st.h:77
void tor_log(int severity, log_domain_mask_t domain, const char *format,...)
Definition log.c:591
#define log_fn(severity, domain, args,...)
Definition log.h:283
#define LD_PROTOCOL
Definition log.h:72
#define LD_OR
Definition log.h:92
#define LD_BUG
Definition log.h:86
#define LD_HANDSHAKE
Definition log.h:101
#define LD_NET
Definition log.h:66
#define LD_GENERAL
Definition log.h:62
#define LD_CIRC
Definition log.h:82
#define LOG_WARN
Definition log.h:53
#define LOG_INFO
Definition log.h:45
#define bool_neq(a, b)
Definition logic.h:18
#define bool_eq(a, b)
Definition logic.h:16
void connection_watch_events(connection_t *conn, watchable_events_t events)
Definition mainloop.c:485
void connection_start_reading(connection_t *conn)
Definition mainloop.c:623
void connection_start_writing(connection_t *conn)
Definition mainloop.c:696
smartlist_t * get_connection_array(void)
Definition mainloop.c:443
void connection_stop_writing(connection_t *conn)
Definition mainloop.c:673
Header file for mainloop.c.
@ WRITE_EVENT
Definition mainloop.h:38
@ READ_EVENT
Definition mainloop.h:37
void * tor_reallocarray_(void *ptr, size_t sz1, size_t sz2)
Definition malloc.c:146
void tor_free_(void *mem)
Definition malloc.c:227
#define tor_free(p)
Definition malloc.h:56
int usable_consensus_flavor(void)
Definition microdesc.c:1088
Header file for microdesc.c.
networkstatus_t * networkstatus_get_reasonably_live_consensus(time_t now, int flavor)
const routerstatus_t * router_get_consensus_status_by_id(const char *digest)
int32_t networkstatus_get_param(const networkstatus_t *ns, const char *param_name, int32_t default_val, int32_t min_val, int32_t max_val)
Header file for networkstatus.c.
void node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out)
Definition nodelist.c:1855
const node_t * node_get_by_id(const char *identity_digest)
Definition nodelist.c:226
const char * node_get_nickname(const node_t *node)
Definition nodelist.c:1484
bool node_supports_ed25519_link_authentication(const node_t *node, bool compatible_with_us)
Definition nodelist.c:1260
int node_ed25519_id_matches(const node_t *node, const ed25519_public_key_t *id)
Definition nodelist.c:1220
void node_get_pref_ipv6_orport(const node_t *node, tor_addr_port_t *ap_out)
Definition nodelist.c:1891
Header file for nodelist.c.
Master header file for Tor-specific functionality.
#define CELL_PAYLOAD_SIZE
Definition or.h:529
#define VAR_CELL_MAX_HEADER_SIZE
Definition or.h:535
#define CELL_MAX_NETWORK_SIZE
Definition or.h:532
#define TO_CONN(c)
Definition or.h:709
#define DOWNCAST(to, ptr)
Definition or.h:109
OR connection structure.
OR handshake certs structure.
OR handshake state structure.
The or_state_t structure, which represents Tor's state file.
Header file for orconn_event.c.
#define OR_CONN_STATE_SERVER_VERSIONS_WAIT
or_conn_status_event_t
#define OR_CONN_STATE_CONNECTING
#define OR_CONN_STATE_PROXY_HANDSHAKING
#define OR_CONN_STATE_TLS_HANDSHAKING
#define OR_CONN_STATE_OR_HANDSHAKING_V3
#define OR_CONN_STATE_OPEN
int tor_snprintf(char *str, size_t size, const char *format,...)
Definition printf.c:27
int fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto)
Definition proto_cell.c:57
Header for proto_cell.c.
Header file for reachability.c.
int tls_error_to_orconn_end_reason(int e)
Definition reasons.c:267
int errno_to_orconn_end_reason(int e)
Definition reasons.c:295
const char * orconn_end_reason_to_control_string(int r)
Definition reasons.c:229
Header file for reasons.c.
Header file for relay.c.
Header for feature/relay/relay_handshake.c.
Header file for rendcommon.c.
void rep_hist_padding_count_write(padding_type_t type)
Definition rephist.c:2816
Header file for rephist.c.
@ PADDING_TYPE_ENABLED_CELL
Definition rephist.h:158
@ PADDING_TYPE_TOTAL
Definition rephist.h:154
@ PADDING_TYPE_ENABLED_TOTAL
Definition rephist.h:156
@ PADDING_TYPE_CELL
Definition rephist.h:152
int router_digest_is_me(const char *digest)
Definition router.c:1755
const routerinfo_t * router_get_my_routerinfo(void)
Definition router.c:1817
Header file for router.c.
Router descriptor structure.
Header for routerkeys.c.
const routerinfo_t * router_get_by_id_digest(const char *digest)
Definition routerlist.c:778
Header file for routerlist.c.
Header file for routermode.c.
void scheduler_channel_wants_writes(channel_t *chan)
Definition scheduler.c:673
Header file for scheduler*.c.
void smartlist_sort(smartlist_t *sl, int(*compare)(const void **a, const void **b))
Definition smartlist.c:334
smartlist_t * smartlist_new(void)
void smartlist_add(smartlist_t *sl, void *element)
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
#define SMARTLIST_FOREACH(sl, type, var, cmd)
uint8_t payload[CELL_PAYLOAD_SIZE]
Definition cell_st.h:21
uint8_t command
Definition cell_st.h:19
circid_t circ_id
Definition cell_st.h:18
struct ed25519_public_key_t ed25519_identity
Definition channel.h:389
unsigned int proxy_state
struct buf_t * inbuf
unsigned int hold_open_until_flushed
unsigned int type
uint32_t magic
uint64_t global_identifier
uint16_t marked_for_close
tor_socket_t s
time_t timestamp_created
tor_addr_t addr
token_bucket_rw_t bucket
channel_tls_t * chan
unsigned int potentially_used_for_bootstrapping
char identity_digest[DIGEST_LEN]
unsigned int is_outgoing
or_handshake_state_t * handshake_state
unsigned int is_pt
tor_addr_port_t canonical_orport
struct tor_tls_t * tls
unsigned int is_canonical
unsigned int proxy_type
struct tor_cert_st * own_link_cert
crypto_digest_t * digest_sent
or_handshake_certs_t * certs
uint64_t BandwidthRate
uint64_t PerConnBWBurst
uint64_t PerConnBWRate
uint64_t BandwidthBurst
char body[CELL_MAX_NETWORK_SIZE]
tor_addr_t ipv6_addr
tor_addr_t ipv4_addr
uint8_t command
Definition var_cell_st.h:18
uint16_t payload_len
Definition var_cell_st.h:22
circid_t circ_id
Definition var_cell_st.h:20
uint8_t payload[FLEXIBLE_ARRAY_MEMBER]
Definition var_cell_st.h:24
#define STATIC
Definition testsupport.h:32
#define MOCK_IMPL(rv, funcname, arglist)
void token_bucket_rw_adjust(token_bucket_rw_t *bucket, uint32_t rate, uint32_t burst)
void token_bucket_rw_reset(token_bucket_rw_t *bucket, uint32_t now_ts_stamp)
tor_cert_t * tor_cert_dup(const tor_cert_t *cert)
Definition torcert.c:294
or_handshake_certs_t * or_handshake_certs_new(void)
Definition torcert.c:471
Header for torcert.c.
int tor_tls_is_server(tor_tls_t *tls)
Definition tortls.c:365
void tor_tls_set_logged_address(tor_tls_t *tls, const char *address)
Definition tortls.c:355
const char * tor_tls_err_to_string(int err)
Definition tortls.c:142
Headers for tortls.c.
#define CASE_TOR_TLS_ERROR_ANY
Definition tortls.h:62
int tor_tls_get_pending_bytes(tor_tls_t *tls)
Definition tortls_nss.c:596
int tor_tls_handshake(tor_tls_t *tls)
Definition tortls_nss.c:578
tor_tls_t * tor_tls_new(tor_socket_t sock, int is_server)
Definition tortls_nss.c:386
const char * tor_tls_get_last_error_msg(const tor_tls_t *tls)
Definition tortls_nss.c:374
void tor_tls_get_state_description(tor_tls_t *tls, char *buf, size_t sz)
Definition tortls_nss.c:323
#define tor_assert_nonfatal_unreached()
Definition util_bug.h:177
#define tor_assert(expr)
Definition util_bug.h:103
#define tor_fragile_assert()
Definition util_bug.h:278
#define IF_BUG_ONCE(cond)
Definition util_bug.h:254
int tor_digest_is_zero(const char *digest)
Definition util_string.c:98
Variable-length cell structure.
#define ED25519_BASE64_LEN