|
@@ -51,6 +51,7 @@
|
|
|
#include "core/or/ocirc_event.h"
|
|
|
#include "core/or/policies.h"
|
|
|
#include "core/or/relay.h"
|
|
|
+#include "core/or/crypt_path.h"
|
|
|
#include "feature/client/bridges.h"
|
|
|
#include "feature/client/circpathbias.h"
|
|
|
#include "feature/client/entrynodes.h"
|
|
@@ -90,8 +91,6 @@ static channel_t * channel_connect_for_circuit(const tor_addr_t *addr,
|
|
|
static int circuit_deliver_create_cell(circuit_t *circ,
|
|
|
const create_cell_t *create_cell,
|
|
|
int relayed);
|
|
|
-static crypt_path_t *onion_next_hop_in_cpath(crypt_path_t *cpath);
|
|
|
-STATIC int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice);
|
|
|
static int circuit_send_first_onion_skin(origin_circuit_t *circ);
|
|
|
static int circuit_build_no_more_hops(origin_circuit_t *circ);
|
|
|
static int circuit_send_intermediate_onion_skin(origin_circuit_t *circ,
|
|
@@ -547,7 +546,7 @@ circuit_handle_first_hop(origin_circuit_t *circ)
|
|
|
int should_launch = 0;
|
|
|
const or_options_t *options = get_options();
|
|
|
|
|
|
- firsthop = onion_next_hop_in_cpath(circ->cpath);
|
|
|
+ firsthop = cpath_get_next_non_open_hop(circ->cpath);
|
|
|
tor_assert(firsthop);
|
|
|
tor_assert(firsthop->extend_info);
|
|
|
|
|
@@ -948,7 +947,7 @@ circuit_send_next_onion_skin(origin_circuit_t *circ)
|
|
|
tor_assert(circ->cpath->state == CPATH_STATE_OPEN);
|
|
|
tor_assert(circ->base_.state == CIRCUIT_STATE_BUILDING);
|
|
|
|
|
|
- crypt_path_t *hop = onion_next_hop_in_cpath(circ->cpath);
|
|
|
+ crypt_path_t *hop = cpath_get_next_non_open_hop(circ->cpath);
|
|
|
circuit_build_times_handle_completed_hop(circ);
|
|
|
|
|
|
circpad_machine_event_circ_added_hop(circ);
|
|
@@ -1360,34 +1359,6 @@ circuit_extend(cell_t *cell, circuit_t *circ)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/** Initialize cpath-\>{f|b}_{crypto|digest} from the key material in key_data.
|
|
|
- *
|
|
|
- * If <b>is_hs_v3</b> is set, this cpath will be used for next gen hidden
|
|
|
- * service circuits and <b>key_data</b> must be at least
|
|
|
- * HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN bytes in length.
|
|
|
- *
|
|
|
- * If <b>is_hs_v3</b> is not set, key_data must contain CPATH_KEY_MATERIAL_LEN
|
|
|
- * bytes, which are used as follows:
|
|
|
- * - 20 to initialize f_digest
|
|
|
- * - 20 to initialize b_digest
|
|
|
- * - 16 to key f_crypto
|
|
|
- * - 16 to key b_crypto
|
|
|
- *
|
|
|
- * (If 'reverse' is true, then f_XX and b_XX are swapped.)
|
|
|
- *
|
|
|
- * Return 0 if init was successful, else -1 if it failed.
|
|
|
- */
|
|
|
-int
|
|
|
-circuit_init_cpath_crypto(crypt_path_t *cpath,
|
|
|
- const char *key_data, size_t key_data_len,
|
|
|
- int reverse, int is_hs_v3)
|
|
|
-{
|
|
|
-
|
|
|
- tor_assert(cpath);
|
|
|
- return relay_crypto_init(&cpath->crypto, key_data, key_data_len, reverse,
|
|
|
- is_hs_v3);
|
|
|
-}
|
|
|
-
|
|
|
/** A "created" cell <b>reply</b> came back to us on circuit <b>circ</b>.
|
|
|
* (The body of <b>reply</b> varies depending on what sort of handshake
|
|
|
* this is.)
|
|
@@ -1413,7 +1384,7 @@ circuit_finish_handshake(origin_circuit_t *circ,
|
|
|
if (circ->cpath->state == CPATH_STATE_AWAITING_KEYS) {
|
|
|
hop = circ->cpath;
|
|
|
} else {
|
|
|
- hop = onion_next_hop_in_cpath(circ->cpath);
|
|
|
+ hop = cpath_get_next_non_open_hop(circ->cpath);
|
|
|
if (!hop) { /* got an extended when we're all done? */
|
|
|
log_warn(LD_PROTOCOL,"got extended when circ already built? Closing.");
|
|
|
return - END_CIRC_REASON_TORPROTOCOL;
|
|
@@ -1437,7 +1408,7 @@ circuit_finish_handshake(origin_circuit_t *circ,
|
|
|
|
|
|
onion_handshake_state_release(&hop->handshake_state);
|
|
|
|
|
|
- if (circuit_init_cpath_crypto(hop, keys, sizeof(keys), 0, 0)<0) {
|
|
|
+ if (cpath_init_circuit_crypto(hop, keys, sizeof(keys), 0, 0)<0) {
|
|
|
return -END_CIRC_REASON_TORPROTOCOL;
|
|
|
}
|
|
|
|
|
@@ -1489,7 +1460,7 @@ circuit_truncated(origin_circuit_t *circ, int reason)
|
|
|
}
|
|
|
|
|
|
layer->next = victim->next;
|
|
|
- circuit_free_cpath_node(victim);
|
|
|
+ cpath_free(victim);
|
|
|
}
|
|
|
|
|
|
log_info(LD_CIRC, "finished");
|
|
@@ -2308,7 +2279,7 @@ circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei)
|
|
|
state->chosen_exit = extend_info_dup(exit_ei);
|
|
|
|
|
|
++circ->build_state->desired_path_len;
|
|
|
- onion_append_hop(&circ->cpath, exit_ei);
|
|
|
+ cpath_append_hop(&circ->cpath, exit_ei);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -2373,47 +2344,6 @@ count_acceptable_nodes, (const smartlist_t *nodes, int direct))
|
|
|
return num;
|
|
|
}
|
|
|
|
|
|
-/** Add <b>new_hop</b> to the end of the doubly-linked-list <b>head_ptr</b>.
|
|
|
- * This function is used to extend cpath by another hop.
|
|
|
- */
|
|
|
-void
|
|
|
-onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop)
|
|
|
-{
|
|
|
- if (*head_ptr) {
|
|
|
- new_hop->next = (*head_ptr);
|
|
|
- new_hop->prev = (*head_ptr)->prev;
|
|
|
- (*head_ptr)->prev->next = new_hop;
|
|
|
- (*head_ptr)->prev = new_hop;
|
|
|
- } else {
|
|
|
- *head_ptr = new_hop;
|
|
|
- new_hop->prev = new_hop->next = new_hop;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-#ifdef TOR_UNIT_TESTS
|
|
|
-
|
|
|
-/** Unittest helper function: Count number of hops in cpath linked list. */
|
|
|
-unsigned int
|
|
|
-cpath_get_n_hops(crypt_path_t **head_ptr)
|
|
|
-{
|
|
|
- unsigned int n_hops = 0;
|
|
|
- crypt_path_t *tmp;
|
|
|
-
|
|
|
- if (!*head_ptr) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- tmp = *head_ptr;
|
|
|
- do {
|
|
|
- n_hops++;
|
|
|
- tmp = tmp->next;
|
|
|
- } while (tmp != *head_ptr);
|
|
|
-
|
|
|
- return n_hops;
|
|
|
-}
|
|
|
-
|
|
|
-#endif /* defined(TOR_UNIT_TESTS) */
|
|
|
-
|
|
|
/**
|
|
|
* Build the exclude list for vanguard circuits.
|
|
|
*
|
|
@@ -2688,20 +2618,6 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state,
|
|
|
return choice;
|
|
|
}
|
|
|
|
|
|
-/** Return the first non-open hop in cpath, or return NULL if all
|
|
|
- * hops are open. */
|
|
|
-static crypt_path_t *
|
|
|
-onion_next_hop_in_cpath(crypt_path_t *cpath)
|
|
|
-{
|
|
|
- crypt_path_t *hop = cpath;
|
|
|
- do {
|
|
|
- if (hop->state != CPATH_STATE_OPEN)
|
|
|
- return hop;
|
|
|
- hop = hop->next;
|
|
|
- } while (hop != cpath);
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
/** Choose a suitable next hop for the circuit <b>circ</b>.
|
|
|
* Append the hop info to circ->cpath.
|
|
|
*
|
|
@@ -2758,33 +2674,11 @@ onion_extend_cpath(origin_circuit_t *circ)
|
|
|
extend_info_describe(info),
|
|
|
cur_len+1, build_state_get_exit_nickname(state));
|
|
|
|
|
|
- onion_append_hop(&circ->cpath, info);
|
|
|
+ cpath_append_hop(&circ->cpath, info);
|
|
|
extend_info_free(info);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/** Create a new hop, annotate it with information about its
|
|
|
- * corresponding router <b>choice</b>, and append it to the
|
|
|
- * end of the cpath <b>head_ptr</b>. */
|
|
|
-STATIC int
|
|
|
-onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice)
|
|
|
-{
|
|
|
- crypt_path_t *hop = tor_malloc_zero(sizeof(crypt_path_t));
|
|
|
-
|
|
|
- /* link hop into the cpath, at the end. */
|
|
|
- onion_append_to_cpath(head_ptr, hop);
|
|
|
-
|
|
|
- hop->magic = CRYPT_PATH_MAGIC;
|
|
|
- hop->state = CPATH_STATE_CLOSED;
|
|
|
-
|
|
|
- hop->extend_info = extend_info_dup(choice);
|
|
|
-
|
|
|
- hop->package_window = circuit_initial_package_window();
|
|
|
- hop->deliver_window = CIRCWINDOW_START;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
/** Allocate a new extend_info object based on the various arguments. */
|
|
|
extend_info_t *
|
|
|
extend_info_new(const char *nickname,
|