Commit 2cae4f41 authored by David Goulet's avatar David Goulet 🐼 Committed by Nick Mathewson
Browse files

prop224: Move get_intro_circuit() to hs_circuit.c



Make this function public so we can use it both in hs_circuit.c and
hs_service.c to avoid code duplication.

Signed-off-by: David Goulet's avatarDavid Goulet <dgoulet@torproject.org>
parent 6c3d525c
Loading
Loading
Loading
Loading
+24 −11
Original line number Diff line number Diff line
@@ -215,17 +215,7 @@ count_opened_desc_intro_point_circuits(const hs_service_t *service,
  DIGEST256MAP_FOREACH(desc->intro_points.map, key,
                       const hs_service_intro_point_t *, ip) {
    circuit_t *circ;
    origin_circuit_t *ocirc;
    if (ip->base.is_only_legacy) {
      uint8_t digest[DIGEST_LEN];
      if (BUG(crypto_pk_get_digest(ip->legacy_key, (char *) digest) < 0)) {
        continue;
      }
      ocirc = hs_circuitmap_get_intro_circ_v2_service_side(digest);
    } else {
      ocirc =
        hs_circuitmap_get_intro_circ_v3_service_side(&ip->auth_key_kp.pubkey);
    }
    origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip);
    if (ocirc == NULL) {
      continue;
    }
@@ -665,6 +655,29 @@ retry_service_rendezvous_point(const origin_circuit_t *circ)
/* Public API */
/* ========== */

/* Return an introduction point circuit matching the given intro point object.
 * NULL is returned is no such circuit can be found. */
origin_circuit_t *
hs_circ_service_get_intro_circ(const hs_service_intro_point_t *ip)
{
  origin_circuit_t *circ = NULL;

  tor_assert(ip);

  if (ip->base.is_only_legacy) {
    uint8_t digest[DIGEST_LEN];
    if (BUG(crypto_pk_get_digest(ip->legacy_key, (char *) digest) < 0)) {
      goto end;
    }
    circ = hs_circuitmap_get_intro_circ_v2_service_side(digest);
  } else {
    circ = hs_circuitmap_get_intro_circ_v3_service_side(
                                        &ip->auth_key_kp.pubkey);
  }
 end:
  return circ;
}

/* Called when we fail building a rendezvous circuit at some point other than
 * the last hop: launches a new circuit to the same rendezvous point. This
 * supports legacy service. */
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@ int hs_circ_launch_rendezvous_point(const hs_service_t *service,
                                    const uint8_t *rendezvous_cookie);
void hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ);

origin_circuit_t *hs_circ_service_get_intro_circ(
                                      const hs_service_intro_point_t *ip);

/* Cell API. */
int hs_circ_handle_intro_established(const hs_service_t *service,
                                     const hs_service_intro_point_t *ip,
+3 −26
Original line number Diff line number Diff line
@@ -578,29 +578,6 @@ get_extend_info_from_intro_point(const hs_service_intro_point_t *ip,
  return info;
}

/* Return an introduction point circuit matching the given intro point object.
 * NULL is returned is no such circuit can be found. */
static origin_circuit_t *
get_intro_circuit(const hs_service_intro_point_t *ip)
{
  origin_circuit_t *circ = NULL;

  tor_assert(ip);

  if (ip->base.is_only_legacy) {
    uint8_t digest[DIGEST_LEN];
    if (BUG(crypto_pk_get_digest(ip->legacy_key, (char *) digest) < 0)) {
      goto end;
    }
    circ = hs_circuitmap_get_intro_circ_v2_service_side(digest);
  } else {
    circ = hs_circuitmap_get_intro_circ_v3_service_side(
                                        &ip->auth_key_kp.pubkey);
  }
 end:
  return circ;
}

/* Return the number of introduction points that are established for the
 * given descriptor. */
static unsigned int
@@ -656,7 +633,7 @@ close_intro_circuits(hs_service_intropoints_t *intro_points)

  DIGEST256MAP_FOREACH(intro_points->map, key,
                       const hs_service_intro_point_t *, ip) {
    origin_circuit_t *ocirc = get_intro_circuit(ip);
    origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip);
    if (ocirc) {
      /* Reason is FINISHED because service has been removed and thus the
       * circuit is considered old/uneeded. When freed, the circuit is removed
@@ -1587,7 +1564,7 @@ cleanup_intro_points(hs_service_t *service, time_t now)
    DIGEST256MAP_FOREACH_MODIFY(desc->intro_points.map, key,
                                hs_service_intro_point_t *, ip) {
      const node_t *node = get_node_from_intro_point(ip);
      origin_circuit_t *ocirc = get_intro_circuit(ip);
      origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip);
      int has_expired = intro_point_should_expire(ip, now);

      /* We cleanup an intro point if it has expired or if we do not know the
@@ -1733,7 +1710,7 @@ launch_intro_point_circuits(hs_service_t *service, time_t now)

      /* Skip the intro point that already has an existing circuit
       * (established or not). */
      if (get_intro_circuit(ip)) {
      if (hs_circ_service_get_intro_circ(ip)) {
        continue;
      }