mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +01:00
Restore changes from f79688d
that got lost somehow during a merge.
This commit is contained in:
parent
358efe1eea
commit
77f5ad6b07
@ -63,7 +63,7 @@ rend_client_send_introduction(origin_circuit_t *introcirc,
|
||||
rend_cache_entry_t *entry;
|
||||
crypt_path_t *cpath;
|
||||
off_t dh_offset;
|
||||
crypto_pk_env_t *intro_key; /* either Bob's public key or an intro key. */
|
||||
crypto_pk_env_t *intro_key = NULL;
|
||||
|
||||
tor_assert(introcirc->_base.purpose == CIRCUIT_PURPOSE_C_INTRODUCING);
|
||||
tor_assert(rendcirc->_base.purpose == CIRCUIT_PURPOSE_C_REND_READY);
|
||||
@ -80,23 +80,19 @@ rend_client_send_introduction(origin_circuit_t *introcirc,
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* first 20 bytes of payload are the hash of bob's pk */
|
||||
if (entry->parsed->version == 0) { /* unversioned descriptor */
|
||||
intro_key = entry->parsed->pk;
|
||||
} else { /* versioned descriptor */
|
||||
intro_key = NULL;
|
||||
SMARTLIST_FOREACH(entry->parsed->intro_nodes, rend_intro_point_t *,
|
||||
intro, {
|
||||
if (!memcmp(introcirc->build_state->chosen_exit->identity_digest,
|
||||
intro->extend_info->identity_digest, DIGEST_LEN)) {
|
||||
intro_key = intro->intro_key;
|
||||
break;
|
||||
}
|
||||
});
|
||||
if (!intro_key) {
|
||||
log_warn(LD_BUG, "Internal error: could not find intro key.");
|
||||
goto err;
|
||||
/* first 20 bytes of payload are the hash of the intro key */
|
||||
intro_key = NULL;
|
||||
SMARTLIST_FOREACH(entry->parsed->intro_nodes, rend_intro_point_t *,
|
||||
intro, {
|
||||
if (!memcmp(introcirc->build_state->chosen_exit->identity_digest,
|
||||
intro->extend_info->identity_digest, DIGEST_LEN)) {
|
||||
intro_key = intro->intro_key;
|
||||
break;
|
||||
}
|
||||
});
|
||||
if (!intro_key) {
|
||||
log_warn(LD_BUG, "Internal error: could not find intro key.");
|
||||
goto err;
|
||||
}
|
||||
if (crypto_pk_get_digest(intro_key, payload)<0) {
|
||||
log_warn(LD_BUG, "Internal error: couldn't hash public key.");
|
||||
@ -451,28 +447,6 @@ directory_get_from_hs_dir(const char *desc_id, const rend_data_t *rend_query)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** If we are not currently fetching a rendezvous service descriptor
|
||||
* for the service ID <b>query</b>, start a directory connection to fetch a
|
||||
* new one.
|
||||
*/
|
||||
static void
|
||||
rend_client_refetch_renddesc(const char *query)
|
||||
{
|
||||
if (!get_options()->FetchHidServDescriptors)
|
||||
return;
|
||||
log_info(LD_REND, "Fetching rendezvous descriptor for service %s",
|
||||
escaped_safe_str(query));
|
||||
if (connection_get_by_type_state_rendquery(CONN_TYPE_DIR, 0, query)) {
|
||||
log_info(LD_REND,"Would fetch a new renddesc here (for %s), but one is "
|
||||
"already in progress.", escaped_safe_str(query));
|
||||
} else {
|
||||
/* not one already; initiate a dir rend desc lookup */
|
||||
directory_get_from_dirserver(DIR_PURPOSE_FETCH_RENDDESC,
|
||||
ROUTER_PURPOSE_GENERAL, query,
|
||||
PDS_RETRY_IF_NO_SERVERS);
|
||||
}
|
||||
}
|
||||
|
||||
/** Start a connection to a hidden service directory to fetch a v2
|
||||
* rendezvous service descriptor for the base32-encoded service ID
|
||||
* <b>query</b>.
|
||||
@ -552,12 +526,7 @@ rend_client_remove_intro_point(extend_info_t *failed_intro,
|
||||
if (r==0) {
|
||||
log_info(LD_REND, "Unknown service %s. Re-fetching descriptor.",
|
||||
escaped_safe_str(rend_query->onion_address));
|
||||
/* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever
|
||||
* arrives first. Exception: When using client authorization, only
|
||||
* fetch v2 descriptors.*/
|
||||
rend_client_refetch_v2_renddesc(rend_query);
|
||||
if (rend_query->auth_type == REND_NO_AUTH)
|
||||
rend_client_refetch_renddesc(rend_query->onion_address);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -575,12 +544,7 @@ rend_client_remove_intro_point(extend_info_t *failed_intro,
|
||||
log_info(LD_REND,
|
||||
"No more intro points remain for %s. Re-fetching descriptor.",
|
||||
escaped_safe_str(rend_query->onion_address));
|
||||
/* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever
|
||||
* arrives first. Exception: When using client authorization, only
|
||||
* fetch v2 descriptors.*/
|
||||
rend_client_refetch_v2_renddesc(rend_query);
|
||||
if (rend_query->auth_type == REND_NO_AUTH)
|
||||
rend_client_refetch_renddesc(rend_query->onion_address);
|
||||
|
||||
/* move all pending streams back to renddesc_wait */
|
||||
while ((conn = connection_get_by_type_state_rendquery(CONN_TYPE_AP,
|
||||
|
Loading…
Reference in New Issue
Block a user