LCOV - code coverage report
Current view: top level - feature/hs - hs_service.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 1215 1652 73.5 %
Date: 2021-11-24 03:28:48 Functions: 122 145 84.1 %

          Line data    Source code
       1             : /* Copyright (c) 2016-2021, The Tor Project, Inc. */
       2             : /* See LICENSE for licensing information */
       3             : 
       4             : /**
       5             :  * \file hs_service.c
       6             :  * \brief Implement next generation hidden service functionality
       7             :  **/
       8             : 
       9             : #define HS_SERVICE_PRIVATE
      10             : 
      11             : #include "core/or/or.h"
      12             : #include "app/config/config.h"
      13             : #include "app/config/statefile.h"
      14             : #include "core/mainloop/connection.h"
      15             : #include "core/mainloop/mainloop.h"
      16             : #include "core/or/circuitbuild.h"
      17             : #include "core/or/circuitlist.h"
      18             : #include "core/or/circuituse.h"
      19             : #include "core/or/extendinfo.h"
      20             : #include "core/or/relay.h"
      21             : #include "feature/client/circpathbias.h"
      22             : #include "feature/dirclient/dirclient.h"
      23             : #include "feature/dircommon/directory.h"
      24             : #include "feature/hs_common/shared_random_client.h"
      25             : #include "feature/keymgt/loadkey.h"
      26             : #include "feature/nodelist/describe.h"
      27             : #include "feature/nodelist/microdesc.h"
      28             : #include "feature/nodelist/networkstatus.h"
      29             : #include "feature/nodelist/nickname.h"
      30             : #include "feature/nodelist/node_select.h"
      31             : #include "feature/nodelist/nodelist.h"
      32             : #include "lib/crypt_ops/crypto_ope.h"
      33             : #include "lib/crypt_ops/crypto_rand.h"
      34             : #include "lib/crypt_ops/crypto_util.h"
      35             : 
      36             : #include "feature/hs/hs_circuit.h"
      37             : #include "feature/hs/hs_common.h"
      38             : #include "feature/hs/hs_config.h"
      39             : #include "feature/hs/hs_control.h"
      40             : #include "feature/hs/hs_descriptor.h"
      41             : #include "feature/hs/hs_ident.h"
      42             : #include "feature/hs/hs_intropoint.h"
      43             : #include "feature/hs/hs_metrics.h"
      44             : #include "feature/hs/hs_service.h"
      45             : #include "feature/hs/hs_stats.h"
      46             : #include "feature/hs/hs_ob.h"
      47             : 
      48             : #include "feature/dircommon/dir_connection_st.h"
      49             : #include "core/or/edge_connection_st.h"
      50             : #include "core/or/extend_info_st.h"
      51             : #include "feature/nodelist/networkstatus_st.h"
      52             : #include "feature/nodelist/node_st.h"
      53             : #include "core/or/origin_circuit_st.h"
      54             : #include "app/config/or_state_st.h"
      55             : #include "feature/nodelist/routerstatus_st.h"
      56             : 
      57             : #include "lib/encoding/confline.h"
      58             : #include "lib/crypt_ops/crypto_format.h"
      59             : 
      60             : /* Trunnel */
      61             : #include "trunnel/ed25519_cert.h"
      62             : #include "trunnel/hs/cell_common.h"
      63             : #include "trunnel/hs/cell_establish_intro.h"
      64             : 
      65             : #ifdef HAVE_SYS_STAT_H
      66             : #include <sys/stat.h>
      67             : #endif
      68             : #ifdef HAVE_UNISTD_H
      69             : #include <unistd.h>
      70             : #endif
      71             : 
      72             : #ifndef COCCI
      73             : /** Helper macro. Iterate over every service in the global map. The var is the
      74             :  * name of the service pointer. */
      75             : #define FOR_EACH_SERVICE_BEGIN(var)                          \
      76             :     STMT_BEGIN                                               \
      77             :     hs_service_t **var##_iter, *var;                         \
      78             :     HT_FOREACH(var##_iter, hs_service_ht, hs_service_map) {  \
      79             :       var = *var##_iter;
      80             : #define FOR_EACH_SERVICE_END } STMT_END ;
      81             : 
      82             : /** Helper macro. Iterate over both current and previous descriptor of a
      83             :  * service. The var is the name of the descriptor pointer. This macro skips
      84             :  * any descriptor object of the service that is NULL. */
      85             : #define FOR_EACH_DESCRIPTOR_BEGIN(service, var)                  \
      86             :   STMT_BEGIN                                                     \
      87             :     hs_service_descriptor_t *var;                                \
      88             :     for (int var ## _loop_idx = 0; var ## _loop_idx < 2;         \
      89             :          ++var ## _loop_idx) {                                   \
      90             :       (var ## _loop_idx == 0) ? (var = service->desc_current) :  \
      91             :                                 (var = service->desc_next);      \
      92             :       if (var == NULL) continue;
      93             : #define FOR_EACH_DESCRIPTOR_END } STMT_END ;
      94             : #endif /* !defined(COCCI) */
      95             : 
      96             : /* Onion service directory file names. */
      97             : static const char fname_keyfile_prefix[] = "hs_ed25519";
      98             : static const char dname_client_pubkeys[] = "authorized_clients";
      99             : static const char fname_hostname[] = "hostname";
     100             : static const char address_tld[] = "onion";
     101             : 
     102             : /** Staging list of service object. When configuring service, we add them to
     103             :  * this list considered a staging area and they will get added to our global
     104             :  * map once the keys have been loaded. These two steps are separated because
     105             :  * loading keys requires that we are an actual running tor process. */
     106             : static smartlist_t *hs_service_staging_list;
     107             : 
     108             : /** True if the list of available router descriptors might have changed which
     109             :  *  might result in an altered hash ring. Check if the hash ring changed and
     110             :  *  reupload if needed */
     111             : static int consider_republishing_hs_descriptors = 0;
     112             : 
     113             : /* Static declaration. */
     114             : static int load_client_keys(hs_service_t *service);
     115             : static void set_descriptor_revision_counter(hs_service_descriptor_t *hs_desc,
     116             :                                             time_t now, bool is_current);
     117             : static int build_service_desc_superencrypted(const hs_service_t *service,
     118             :                                              hs_service_descriptor_t *desc);
     119             : static void move_descriptors(hs_service_t *src, hs_service_t *dst);
     120             : static int service_encode_descriptor(const hs_service_t *service,
     121             :                                      const hs_service_descriptor_t *desc,
     122             :                                      const ed25519_keypair_t *signing_kp,
     123             :                                      char **encoded_out);
     124             : 
     125             : /** Helper: Function to compare two objects in the service map. Return 1 if the
     126             :  * two service have the same master public identity key. */
     127             : static inline int
     128          36 : hs_service_ht_eq(const hs_service_t *first, const hs_service_t *second)
     129             : {
     130          36 :   tor_assert(first);
     131          36 :   tor_assert(second);
     132             :   /* Simple key compare. */
     133          36 :   return ed25519_pubkey_eq(&first->keys.identity_pk,
     134             :                            &second->keys.identity_pk);
     135             : }
     136             : 
     137             : /** Helper: Function for the service hash table code below. The key used is the
     138             :  * master public identity key which is ultimately the onion address. */
     139             : static inline unsigned int
     140         132 : hs_service_ht_hash(const hs_service_t *service)
     141             : {
     142         132 :   tor_assert(service);
     143         132 :   return (unsigned int) siphash24g(service->keys.identity_pk.pubkey,
     144             :                                    sizeof(service->keys.identity_pk.pubkey));
     145             : }
     146             : 
     147             : /** This is _the_ global hash map of hidden services which indexed the service
     148             :  * contained in it by master public identity key which is roughly the onion
     149             :  * address of the service. */
     150             : static struct hs_service_ht *hs_service_map;
     151             : 
     152             : /* Register the service hash table. */
     153        5291 : HT_PROTOTYPE(hs_service_ht,      /* Name of hashtable. */
     154             :              hs_service_t,       /* Object contained in the map. */
     155             :              hs_service_node,    /* The name of the HT_ENTRY member. */
     156             :              hs_service_ht_hash, /* Hashing function. */
     157             :              hs_service_ht_eq);  /* Compare function for objects. */
     158             : 
     159         326 : HT_GENERATE2(hs_service_ht, hs_service_t, hs_service_node,
     160             :              hs_service_ht_hash, hs_service_ht_eq,
     161             :              0.6, tor_reallocarray, tor_free_);
     162             : 
     163             : /** Return true iff the given service has client authorization configured that
     164             :  * is the client list is non empty. */
     165             : static inline bool
     166         154 : is_client_auth_enabled(const hs_service_t *service)
     167             : {
     168         154 :   return (service->config.clients != NULL &&
     169          12 :           smartlist_len(service->config.clients) > 0);
     170             : }
     171             : 
     172             : /** Query the given service map with a public key and return a service object
     173             :  * if found else NULL. It is also possible to set a directory path in the
     174             :  * search query. If pk is NULL, then it will be set to zero indicating the
     175             :  * hash table to compare the directory path instead. */
     176             : STATIC hs_service_t *
     177          69 : find_service(hs_service_ht *map, const ed25519_public_key_t *pk)
     178             : {
     179          69 :   hs_service_t dummy_service;
     180          69 :   tor_assert(map);
     181          69 :   tor_assert(pk);
     182          69 :   memset(&dummy_service, 0, sizeof(dummy_service));
     183          69 :   ed25519_pubkey_copy(&dummy_service.keys.identity_pk, pk);
     184          69 :   return HT_FIND(hs_service_ht, map, &dummy_service);
     185             : }
     186             : 
     187             : /** Register the given service in the given map. If the service already exists
     188             :  * in the map, -1 is returned. On success, 0 is returned and the service
     189             :  * ownership has been transferred to the global map. */
     190             : STATIC int
     191          43 : register_service(hs_service_ht *map, hs_service_t *service)
     192             : {
     193          43 :   tor_assert(map);
     194          43 :   tor_assert(service);
     195          43 :   tor_assert(!ed25519_public_key_is_zero(&service->keys.identity_pk));
     196             : 
     197          43 :   if (find_service(map, &service->keys.identity_pk)) {
     198             :     /* Existing service with the same key. Do not register it. */
     199             :     return -1;
     200             :   }
     201             :   /* Taking ownership of the object at this point. */
     202          42 :   HT_INSERT(hs_service_ht, map, service);
     203             : 
     204             :   /* If we just modified the global map, we notify. */
     205          42 :   if (map == hs_service_map) {
     206          38 :     hs_service_map_has_changed();
     207             :   }
     208             :   /* Setup metrics. This is done here because in order to initialize metrics,
     209             :    * we require tor to have fully initialized a service so the ports of the
     210             :    * service can be looked at for instance. */
     211          42 :   hs_metrics_service_init(service);
     212             : 
     213          42 :   return 0;
     214             : }
     215             : 
     216             : /** Remove a given service from the given map. If service is NULL or the
     217             :  * service key is unset, return gracefully. */
     218             : STATIC void
     219          21 : remove_service(hs_service_ht *map, hs_service_t *service)
     220             : {
     221          21 :   hs_service_t *elm;
     222             : 
     223          21 :   tor_assert(map);
     224             : 
     225             :   /* Ignore if no service or key is zero. */
     226          21 :   if (BUG(service == NULL) ||
     227          21 :       BUG(ed25519_public_key_is_zero(&service->keys.identity_pk))) {
     228           0 :     return;
     229             :   }
     230             : 
     231          21 :   elm = HT_REMOVE(hs_service_ht, map, service);
     232          21 :   if (elm) {
     233          20 :     tor_assert(elm == service);
     234             :   } else {
     235           1 :     log_warn(LD_BUG, "Could not find service in the global map "
     236             :                      "while removing service %s",
     237             :              escaped(service->config.directory_path));
     238             :   }
     239             : 
     240             :   /* If we just modified the global map, we notify. */
     241          21 :   if (map == hs_service_map) {
     242          21 :     hs_service_map_has_changed();
     243             :   }
     244             : }
     245             : 
     246             : /** Set the default values for a service configuration object <b>c</b>. */
     247             : static void
     248          70 : set_service_default_config(hs_service_config_t *c,
     249             :                            const or_options_t *options)
     250             : {
     251          70 :   (void) options;
     252          70 :   tor_assert(c);
     253          70 :   c->ports = smartlist_new();
     254          70 :   c->directory_path = NULL;
     255          70 :   c->max_streams_per_rdv_circuit = 0;
     256          70 :   c->max_streams_close_circuit = 0;
     257          70 :   c->num_intro_points = NUM_INTRO_POINTS_DEFAULT;
     258          70 :   c->allow_unknown_ports = 0;
     259          70 :   c->is_single_onion = 0;
     260          70 :   c->dir_group_readable = 0;
     261          70 :   c->is_ephemeral = 0;
     262          70 :   c->has_dos_defense_enabled = HS_CONFIG_V3_DOS_DEFENSE_DEFAULT;
     263          70 :   c->intro_dos_rate_per_sec = HS_CONFIG_V3_DOS_DEFENSE_RATE_PER_SEC_DEFAULT;
     264          70 :   c->intro_dos_burst_per_sec = HS_CONFIG_V3_DOS_DEFENSE_BURST_PER_SEC_DEFAULT;
     265          70 : }
     266             : 
     267             : /** From a service configuration object config, clear everything from it
     268             :  * meaning free allocated pointers and reset the values. */
     269             : STATIC void
     270          83 : service_clear_config(hs_service_config_t *config)
     271             : {
     272          83 :   if (config == NULL) {
     273             :     return;
     274             :   }
     275          83 :   tor_free(config->directory_path);
     276          83 :   if (config->ports) {
     277         103 :     SMARTLIST_FOREACH(config->ports, hs_port_config_t *, p,
     278             :                       hs_port_config_free(p););
     279          69 :     smartlist_free(config->ports);
     280             :   }
     281          83 :   if (config->clients) {
     282          89 :     SMARTLIST_FOREACH(config->clients, hs_service_authorized_client_t *, p,
     283             :                       service_authorized_client_free(p));
     284          19 :     smartlist_free(config->clients);
     285             :   }
     286          83 :   if (config->ob_master_pubkeys) {
     287           3 :     SMARTLIST_FOREACH(config->ob_master_pubkeys, ed25519_public_key_t *, k,
     288             :                       tor_free(k));
     289           1 :     smartlist_free(config->ob_master_pubkeys);
     290             :   }
     291          83 :   memset(config, 0, sizeof(*config));
     292             : }
     293             : 
     294             : /** Helper function to return a human readable description of the given intro
     295             :  * point object.
     296             :  *
     297             :  * This function is not thread-safe. Each call to this invalidates the
     298             :  * previous values returned by it. */
     299             : static const char *
     300           4 : describe_intro_point(const hs_service_intro_point_t *ip)
     301             : {
     302             :   /* Hex identity digest of the IP prefixed by the $ sign and ends with NUL
     303             :    * byte hence the plus two. */
     304           4 :   static char buf[HEX_DIGEST_LEN + 2];
     305           4 :   const char *legacy_id = NULL;
     306             : 
     307           8 :   SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers,
     308             :                           const link_specifier_t *, lspec) {
     309           8 :     if (link_specifier_get_ls_type(lspec) == LS_LEGACY_ID) {
     310           4 :       legacy_id = (const char *)
     311           4 :         link_specifier_getconstarray_un_legacy_id(lspec);
     312           4 :       break;
     313             :     }
     314           4 :   } SMARTLIST_FOREACH_END(lspec);
     315             : 
     316             :   /* For now, we only print the identity digest but we could improve this with
     317             :    * much more information such as the ed25519 identity has well. */
     318           4 :   buf[0] = '$';
     319           4 :   if (legacy_id) {
     320           4 :     base16_encode(buf + 1, HEX_DIGEST_LEN + 1, legacy_id, DIGEST_LEN);
     321             :   }
     322             : 
     323           4 :   return buf;
     324             : }
     325             : 
     326             : /** Return the lower bound of maximum INTRODUCE2 cells per circuit before we
     327             :  * rotate intro point (defined by a consensus parameter or the default
     328             :  * value). */
     329             : static int32_t
     330          24 : get_intro_point_min_introduce2(void)
     331             : {
     332             :   /* The [0, 2147483647] range is quite large to accommodate anything we decide
     333             :    * in the future. */
     334          24 :   return networkstatus_get_param(NULL, "hs_intro_min_introduce2",
     335             :                                  INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS,
     336             :                                  0, INT32_MAX);
     337             : }
     338             : 
     339             : /** Return the upper bound of maximum INTRODUCE2 cells per circuit before we
     340             :  * rotate intro point (defined by a consensus parameter or the default
     341             :  * value). */
     342             : static int32_t
     343          24 : get_intro_point_max_introduce2(void)
     344             : {
     345             :   /* The [0, 2147483647] range is quite large to accommodate anything we decide
     346             :    * in the future. */
     347          24 :   return networkstatus_get_param(NULL, "hs_intro_max_introduce2",
     348             :                                  INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS,
     349             :                                  0, INT32_MAX);
     350             : }
     351             : 
     352             : /** Return the minimum lifetime in seconds of an introduction point defined by
     353             :  * a consensus parameter or the default value. */
     354             : static int32_t
     355          24 : get_intro_point_min_lifetime(void)
     356             : {
     357             : #define MIN_INTRO_POINT_LIFETIME_TESTING 10
     358          24 :   if (get_options()->TestingTorNetwork) {
     359             :     return MIN_INTRO_POINT_LIFETIME_TESTING;
     360             :   }
     361             : 
     362             :   /* The [0, 2147483647] range is quite large to accommodate anything we decide
     363             :    * in the future. */
     364          24 :   return networkstatus_get_param(NULL, "hs_intro_min_lifetime",
     365             :                                  INTRO_POINT_LIFETIME_MIN_SECONDS,
     366             :                                  0, INT32_MAX);
     367             : }
     368             : 
     369             : /** Return the maximum lifetime in seconds of an introduction point defined by
     370             :  * a consensus parameter or the default value. */
     371             : static int32_t
     372          24 : get_intro_point_max_lifetime(void)
     373             : {
     374             : #define MAX_INTRO_POINT_LIFETIME_TESTING 30
     375          24 :   if (get_options()->TestingTorNetwork) {
     376             :     return MAX_INTRO_POINT_LIFETIME_TESTING;
     377             :   }
     378             : 
     379             :   /* The [0, 2147483647] range is quite large to accommodate anything we decide
     380             :    * in the future. */
     381          24 :   return networkstatus_get_param(NULL, "hs_intro_max_lifetime",
     382             :                                  INTRO_POINT_LIFETIME_MAX_SECONDS,
     383             :                                  0, INT32_MAX);
     384             : }
     385             : 
     386             : /** Return the number of extra introduction point defined by a consensus
     387             :  * parameter or the default value. */
     388             : static int32_t
     389           7 : get_intro_point_num_extra(void)
     390             : {
     391             :   /* The [0, 128] range bounds the number of extra introduction point allowed.
     392             :    * Above 128 intro points, it's getting a bit crazy. */
     393           7 :   return networkstatus_get_param(NULL, "hs_intro_num_extra",
     394             :                                  NUM_INTRO_POINTS_EXTRA, 0, 128);
     395             : }
     396             : 
     397             : /** Helper: Function that needs to return 1 for the HT for each loop which
     398             :  * frees every service in an hash map. */
     399             : static int
     400          19 : ht_free_service_(struct hs_service_t *service, void *data)
     401             : {
     402          19 :   (void) data;
     403          19 :   hs_service_free(service);
     404             :   /* This function MUST return 1 so the given object is then removed from the
     405             :    * service map leading to this free of the object being safe. */
     406          19 :   return 1;
     407             : }
     408             : 
     409             : /** Free every service that can be found in the global map. Once done, clear
     410             :  * and free the global map. */
     411             : static void
     412         293 : service_free_all(void)
     413             : {
     414         293 :   if (hs_service_map) {
     415             :     /* The free helper function returns 1 so this is safe. */
     416         290 :     hs_service_ht_HT_FOREACH_FN(hs_service_map, ht_free_service_, NULL);
     417         290 :     HT_CLEAR(hs_service_ht, hs_service_map);
     418         290 :     tor_free(hs_service_map);
     419         290 :     hs_service_map = NULL;
     420             :   }
     421             : 
     422         293 :   if (hs_service_staging_list) {
     423             :     /* Cleanup staging list. */
     424         284 :     SMARTLIST_FOREACH(hs_service_staging_list, hs_service_t *, s,
     425             :                       hs_service_free(s));
     426         282 :     smartlist_free(hs_service_staging_list);
     427         282 :     hs_service_staging_list = NULL;
     428             :   }
     429         293 : }
     430             : 
     431             : /** Free a given service intro point object. */
     432             : STATIC void
     433          28 : service_intro_point_free_(hs_service_intro_point_t *ip)
     434             : {
     435          28 :   if (!ip) {
     436             :     return;
     437             :   }
     438          24 :   memwipe(&ip->auth_key_kp, 0, sizeof(ip->auth_key_kp));
     439          24 :   memwipe(&ip->enc_key_kp, 0, sizeof(ip->enc_key_kp));
     440          24 :   crypto_pk_free(ip->legacy_key);
     441          24 :   replaycache_free(ip->replay_cache);
     442          24 :   hs_intropoint_clear(&ip->base);
     443          24 :   tor_free(ip);
     444             : }
     445             : 
     446             : /** Helper: free an hs_service_intro_point_t object. This function is used by
     447             :  * digest256map_free() which requires a void * pointer. */
     448             : static void
     449           7 : service_intro_point_free_void(void *obj)
     450             : {
     451           7 :   service_intro_point_free_(obj);
     452           7 : }
     453             : 
     454             : /** Return a newly allocated service intro point and fully initialized from the
     455             :  * given node_t node, if non NULL.
     456             :  *
     457             :  * If node is NULL, returns a hs_service_intro_point_t with an empty link
     458             :  * specifier list and no onion key. (This is used for testing.)
     459             :  * On any other error, NULL is returned.
     460             :  *
     461             :  * node must be an node_t with an IPv4 address. */
     462             : STATIC hs_service_intro_point_t *
     463          24 : service_intro_point_new(const node_t *node)
     464             : {
     465          24 :   hs_service_intro_point_t *ip;
     466             : 
     467          24 :   ip = tor_malloc_zero(sizeof(*ip));
     468             :   /* We'll create the key material. No need for extra strong, those are short
     469             :    * term keys. */
     470          24 :   ed25519_keypair_generate(&ip->auth_key_kp, 0);
     471             : 
     472             :   { /* Set introduce2 max cells limit */
     473          24 :     int32_t min_introduce2_cells = get_intro_point_min_introduce2();
     474          24 :     int32_t max_introduce2_cells = get_intro_point_max_introduce2();
     475          24 :     if (BUG(max_introduce2_cells < min_introduce2_cells)) {
     476           0 :       goto err;
     477             :     }
     478          24 :     ip->introduce2_max = crypto_rand_int_range(min_introduce2_cells,
     479             :                                                max_introduce2_cells);
     480             :   }
     481             :   { /* Set intro point lifetime */
     482          24 :     int32_t intro_point_min_lifetime = get_intro_point_min_lifetime();
     483          24 :     int32_t intro_point_max_lifetime = get_intro_point_max_lifetime();
     484          24 :     if (BUG(intro_point_max_lifetime < intro_point_min_lifetime)) {
     485           0 :       goto err;
     486             :     }
     487          24 :     ip->time_to_expire = approx_time() +
     488          24 :       crypto_rand_int_range(intro_point_min_lifetime,intro_point_max_lifetime);
     489             :   }
     490             : 
     491          24 :   ip->replay_cache = replaycache_new(0, 0);
     492             : 
     493             :   /* Initialize the base object. We don't need the certificate object. */
     494          24 :   ip->base.link_specifiers = node_get_link_specifier_smartlist(node, 0);
     495             : 
     496          24 :   if (node == NULL) {
     497          21 :     goto done;
     498             :   }
     499             : 
     500             :   /* Generate the encryption key for this intro point. */
     501           3 :   curve25519_keypair_generate(&ip->enc_key_kp, 0);
     502             :   /* Figure out if this chosen node supports v3 or is legacy only.
     503             :    * NULL nodes are used in the unit tests. */
     504           3 :   if (!node_supports_ed25519_hs_intro(node)) {
     505           3 :     ip->base.is_only_legacy = 1;
     506             :     /* Legacy mode that is doesn't support v3+ with ed25519 auth key. */
     507           3 :     ip->legacy_key = crypto_pk_new();
     508           3 :     if (crypto_pk_generate_key(ip->legacy_key) < 0) {
     509           0 :       goto err;
     510             :     }
     511           3 :     if (crypto_pk_get_digest(ip->legacy_key,
     512           3 :                              (char *) ip->legacy_key_digest) < 0) {
     513           0 :       goto err;
     514             :     }
     515             :   }
     516             : 
     517             :   /* Flag if this intro point supports the INTRO2 dos defenses. */
     518           6 :   ip->support_intro2_dos_defense =
     519           3 :     node_supports_establish_intro_dos_extension(node);
     520             : 
     521             :   /* Finally, copy onion key from the node. */
     522           3 :   memcpy(&ip->onion_key, node_get_curve25519_onion_key(node),
     523             :          sizeof(ip->onion_key));
     524             : 
     525             :  done:
     526             :   return ip;
     527           0 :  err:
     528           0 :   service_intro_point_free(ip);
     529           0 :   return NULL;
     530             : }
     531             : 
     532             : /** Add the given intro point object to the given intro point map. The intro
     533             :  * point MUST have its RSA encryption key set if this is a legacy type or the
     534             :  * authentication key set otherwise. */
     535             : STATIC void
     536          12 : service_intro_point_add(digest256map_t *map, hs_service_intro_point_t *ip)
     537             : {
     538          12 :   hs_service_intro_point_t *old_ip_entry;
     539             : 
     540          12 :   tor_assert(map);
     541          12 :   tor_assert(ip);
     542             : 
     543          12 :   old_ip_entry = digest256map_set(map, ip->auth_key_kp.pubkey.pubkey, ip);
     544             :   /* Make sure we didn't just try to double-add an intro point */
     545          12 :   tor_assert_nonfatal(!old_ip_entry);
     546          12 : }
     547             : 
     548             : /** For a given service, remove the intro point from that service's descriptors
     549             :  * (check both current and next descriptor) */
     550             : STATIC void
     551           1 : service_intro_point_remove(const hs_service_t *service,
     552             :                            const hs_service_intro_point_t *ip)
     553             : {
     554           1 :   tor_assert(service);
     555           1 :   tor_assert(ip);
     556             : 
     557             :   /* Trying all descriptors. */
     558           3 :   FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
     559             :     /* We'll try to remove the descriptor on both descriptors which is not
     560             :      * very expensive to do instead of doing lookup + remove. */
     561           1 :     digest256map_remove(desc->intro_points.map,
     562           1 :                         ip->auth_key_kp.pubkey.pubkey);
     563           1 :   } FOR_EACH_DESCRIPTOR_END;
     564           1 : }
     565             : 
     566             : /** For a given service and authentication key, return the intro point or NULL
     567             :  * if not found. This will check both descriptors in the service. */
     568             : STATIC hs_service_intro_point_t *
     569          12 : service_intro_point_find(const hs_service_t *service,
     570             :                          const ed25519_public_key_t *auth_key)
     571             : {
     572          12 :   hs_service_intro_point_t *ip = NULL;
     573             : 
     574          12 :   tor_assert(service);
     575          12 :   tor_assert(auth_key);
     576             : 
     577             :   /* Trying all descriptors to find the right intro point.
     578             :    *
     579             :    * Even if we use the same node as intro point in both descriptors, the node
     580             :    * will have a different intro auth key for each descriptor since we generate
     581             :    * a new one every time we pick an intro point.
     582             :    *
     583             :    * After #22893 gets implemented, intro points will be moved to be
     584             :    * per-service instead of per-descriptor so this function will need to
     585             :    * change.
     586             :    */
     587          22 :   FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
     588          12 :     if ((ip = digest256map_get(desc->intro_points.map,
     589          12 :                                auth_key->pubkey)) != NULL) {
     590             :       break;
     591             :     }
     592          12 :   } FOR_EACH_DESCRIPTOR_END;
     593             : 
     594          12 :   return ip;
     595             : }
     596             : 
     597             : /** For a given service and intro point, return the descriptor for which the
     598             :  * intro point is assigned to. NULL is returned if not found. */
     599             : STATIC hs_service_descriptor_t *
     600           5 : service_desc_find_by_intro(const hs_service_t *service,
     601             :                            const hs_service_intro_point_t *ip)
     602             : {
     603           5 :   hs_service_descriptor_t *descp = NULL;
     604             : 
     605           5 :   tor_assert(service);
     606           5 :   tor_assert(ip);
     607             : 
     608           5 :   FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
     609           5 :     if (digest256map_get(desc->intro_points.map,
     610           5 :                          ip->auth_key_kp.pubkey.pubkey)) {
     611             :       descp = desc;
     612             :       break;
     613             :     }
     614           5 :   } FOR_EACH_DESCRIPTOR_END;
     615             : 
     616           5 :   return descp;
     617             : }
     618             : 
     619             : /** From a circuit identifier, get all the possible objects associated with the
     620             :  * ident. If not NULL, service, ip or desc are set if the object can be found.
     621             :  * They are untouched if they can't be found.
     622             :  *
     623             :  * This is an helper function because we do those lookups often so it's more
     624             :  * convenient to simply call this functions to get all the things at once. */
     625             : STATIC void
     626          14 : get_objects_from_ident(const hs_ident_circuit_t *ident,
     627             :                        hs_service_t **service, hs_service_intro_point_t **ip,
     628             :                        hs_service_descriptor_t **desc)
     629             : {
     630          14 :   hs_service_t *s;
     631             : 
     632          14 :   tor_assert(ident);
     633             : 
     634             :   /* Get service object from the circuit identifier. */
     635          14 :   s = find_service(hs_service_map, &ident->identity_pk);
     636          14 :   if (s && service) {
     637           8 :     *service = s;
     638             :   }
     639             : 
     640             :   /* From the service object, get the intro point object of that circuit. The
     641             :    * following will query both descriptors intro points list. */
     642          14 :   if (s && ip) {
     643           8 :     *ip = service_intro_point_find(s, &ident->intro_auth_pk);
     644             :   }
     645             : 
     646             :   /* Get the descriptor for this introduction point and service. */
     647          14 :   if (s && ip && *ip && desc) {
     648           4 :     *desc = service_desc_find_by_intro(s, *ip);
     649             :   }
     650          14 : }
     651             : 
     652             : /** From a given intro point, return the first link specifier of type
     653             :  * encountered in the link specifier list. Return NULL if it can't be found.
     654             :  *
     655             :  * The caller does NOT have ownership of the object, the intro point does. */
     656             : static link_specifier_t *
     657          10 : get_link_spec_by_type(const hs_service_intro_point_t *ip, uint8_t type)
     658             : {
     659          10 :   link_specifier_t *lnk_spec = NULL;
     660             : 
     661          10 :   tor_assert(ip);
     662             : 
     663          20 :   SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers,
     664             :                           link_specifier_t *, ls) {
     665          20 :     if (link_specifier_get_ls_type(ls) == type) {
     666          10 :       lnk_spec = ls;
     667          10 :       goto end;
     668             :     }
     669          10 :   } SMARTLIST_FOREACH_END(ls);
     670             : 
     671           0 :  end:
     672          10 :   return lnk_spec;
     673             : }
     674             : 
     675             : /** Given a service intro point, return the node_t associated to it. This can
     676             :  * return NULL if the given intro point has no legacy ID or if the node can't
     677             :  * be found in the consensus. */
     678             : STATIC const node_t *
     679           8 : get_node_from_intro_point(const hs_service_intro_point_t *ip)
     680             : {
     681           8 :   const link_specifier_t *ls;
     682             : 
     683           8 :   tor_assert(ip);
     684             : 
     685           8 :   ls = get_link_spec_by_type(ip, LS_LEGACY_ID);
     686           8 :   if (BUG(!ls)) {
     687           0 :     return NULL;
     688             :   }
     689             :   /* XXX In the future, we want to only use the ed25519 ID (#22173). */
     690           8 :   return node_get_by_id(
     691           8 :     (const char *) link_specifier_getconstarray_un_legacy_id(ls));
     692             : }
     693             : 
     694             : /** Given a service intro point, return the extend_info_t for it. This can
     695             :  * return NULL if the node can't be found for the intro point or the extend
     696             :  * info can't be created for the found node. If direct_conn is set, the extend
     697             :  * info is validated on if we can connect directly. */
     698             : static extend_info_t *
     699           0 : get_extend_info_from_intro_point(const hs_service_intro_point_t *ip,
     700             :                                  unsigned int direct_conn)
     701             : {
     702           0 :   extend_info_t *info = NULL;
     703           0 :   const node_t *node;
     704             : 
     705           0 :   tor_assert(ip);
     706             : 
     707           0 :   node = get_node_from_intro_point(ip);
     708           0 :   if (node == NULL) {
     709             :     /* This can happen if the relay serving as intro point has been removed
     710             :      * from the consensus. In that case, the intro point will be removed from
     711             :      * the descriptor during the scheduled events. */
     712           0 :     goto end;
     713             :   }
     714             : 
     715             :   /* In the case of a direct connection (single onion service), it is possible
     716             :    * our firewall policy won't allow it so this can return a NULL value. */
     717           0 :   info = extend_info_from_node(node, direct_conn);
     718             : 
     719           0 :  end:
     720           0 :   return info;
     721             : }
     722             : 
     723             : /** Return the number of introduction points that are established for the
     724             :  * given descriptor. */
     725           7 : MOCK_IMPL(STATIC unsigned int,
     726             : count_desc_circuit_established, (const hs_service_descriptor_t *desc))
     727             : {
     728           7 :   unsigned int count = 0;
     729             : 
     730           7 :   tor_assert(desc);
     731             : 
     732           7 :   DIGEST256MAP_FOREACH(desc->intro_points.map, key,
     733             :                        const hs_service_intro_point_t *, ip) {
     734           0 :     count += !!hs_circ_service_get_established_intro_circ(ip);
     735           7 :   } DIGEST256MAP_FOREACH_END;
     736             : 
     737           7 :   return count;
     738             : }
     739             : 
     740             : /** For a given service and descriptor of that service, close all active
     741             :  * directory connections. */
     742             : static void
     743           9 : close_directory_connections(const hs_service_t *service,
     744             :                             const hs_service_descriptor_t *desc)
     745             : {
     746           9 :   unsigned int count = 0;
     747           9 :   smartlist_t *dir_conns;
     748             : 
     749           9 :   tor_assert(service);
     750           9 :   tor_assert(desc);
     751             : 
     752             :   /* Close pending HS desc upload connections for the blinded key of 'desc'. */
     753           9 :   dir_conns = connection_list_by_type_purpose(CONN_TYPE_DIR,
     754             :                                               DIR_PURPOSE_UPLOAD_HSDESC);
     755           9 :   SMARTLIST_FOREACH_BEGIN(dir_conns, connection_t *, conn) {
     756           0 :     dir_connection_t *dir_conn = TO_DIR_CONN(conn);
     757           0 :     if (ed25519_pubkey_eq(&dir_conn->hs_ident->identity_pk,
     758           0 :                           &service->keys.identity_pk) &&
     759           0 :         ed25519_pubkey_eq(&dir_conn->hs_ident->blinded_pk,
     760             :                           &desc->blinded_kp.pubkey)) {
     761           0 :       connection_mark_for_close(conn);
     762           0 :       count++;
     763           0 :       continue;
     764             :     }
     765           0 :   } SMARTLIST_FOREACH_END(conn);
     766             : 
     767           9 :   log_info(LD_REND, "Closed %u active service directory connections for "
     768             :                     "descriptor %s of service %s",
     769             :            count, safe_str_client(ed25519_fmt(&desc->blinded_kp.pubkey)),
     770             :            safe_str_client(service->onion_address));
     771             :   /* We don't have ownership of the objects in this list. */
     772           9 :   smartlist_free(dir_conns);
     773           9 : }
     774             : 
     775             : /** Close all rendezvous circuits for the given service. */
     776             : static void
     777           0 : close_service_rp_circuits(hs_service_t *service)
     778             : {
     779           0 :   origin_circuit_t *ocirc = NULL;
     780             : 
     781           0 :   tor_assert(service);
     782             : 
     783             :   /* The reason we go over all circuit instead of using the circuitmap API is
     784             :    * because most hidden service circuits are rendezvous circuits so there is
     785             :    * no real improvement at getting all rendezvous circuits from the
     786             :    * circuitmap and then going over them all to find the right ones.
     787             :    * Furthermore, another option would have been to keep a list of RP cookies
     788             :    * for a service but it creates an engineering complexity since we don't
     789             :    * have a "RP circuit closed" event to clean it up properly so we avoid a
     790             :    * memory DoS possibility. */
     791             : 
     792           0 :   while ((ocirc = circuit_get_next_service_rp_circ(ocirc))) {
     793             :     /* Only close circuits that are v3 and for this service. */
     794           0 :     if (ocirc->hs_ident != NULL &&
     795           0 :         ed25519_pubkey_eq(&ocirc->hs_ident->identity_pk,
     796           0 :                           &service->keys.identity_pk)) {
     797             :       /* Reason is FINISHED because service has been removed and thus the
     798             :        * circuit is considered old/unneeded. When freed, it is removed from the
     799             :        * hs circuitmap. */
     800           0 :       circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED);
     801             :     }
     802             :   }
     803           0 : }
     804             : 
     805             : /** Close the circuit(s) for the given map of introduction points. */
     806             : static void
     807           1 : close_intro_circuits(hs_service_intropoints_t *intro_points)
     808             : {
     809           1 :   tor_assert(intro_points);
     810             : 
     811           1 :   DIGEST256MAP_FOREACH(intro_points->map, key,
     812             :                        const hs_service_intro_point_t *, ip) {
     813           0 :     origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip);
     814           0 :     if (ocirc) {
     815             :       /* Reason is FINISHED because service has been removed and thus the
     816             :        * circuit is considered old/unneeded. When freed, the circuit is removed
     817             :        * from the HS circuitmap. */
     818           0 :       circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED);
     819             :     }
     820           1 :   } DIGEST256MAP_FOREACH_END;
     821           1 : }
     822             : 
     823             : /** Close all introduction circuits for the given service. */
     824             : static void
     825           0 : close_service_intro_circuits(hs_service_t *service)
     826             : {
     827           0 :   tor_assert(service);
     828             : 
     829           0 :   FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
     830           0 :     close_intro_circuits(&desc->intro_points);
     831           0 :   } FOR_EACH_DESCRIPTOR_END;
     832           0 : }
     833             : 
     834             : /** Close any circuits related to the given service. */
     835             : static void
     836           0 : close_service_circuits(hs_service_t *service)
     837             : {
     838           0 :   tor_assert(service);
     839             : 
     840             :   /* Only support for version >= 3. */
     841           0 :   if (BUG(service->config.version < HS_VERSION_THREE)) {
     842           0 :     return;
     843             :   }
     844             :   /* Close intro points. */
     845           0 :   close_service_intro_circuits(service);
     846             :   /* Close rendezvous points. */
     847           0 :   close_service_rp_circuits(service);
     848             : }
     849             : 
     850             : /** Move every ephemeral services from the src service map to the dst service
     851             :  * map. It is possible that a service can't be register to the dst map which
     852             :  * won't stop the process of moving them all but will trigger a log warn. */
     853             : static void
     854           8 : move_ephemeral_services(hs_service_ht *src, hs_service_ht *dst)
     855             : {
     856           8 :   hs_service_t **iter, **next;
     857             : 
     858           8 :   tor_assert(src);
     859           8 :   tor_assert(dst);
     860             : 
     861             :   /* Iterate over the map to find ephemeral service and move them to the other
     862             :    * map. We loop using this method to have a safe removal process. */
     863           8 :   for (iter = HT_START(hs_service_ht, src); iter != NULL; iter = next) {
     864           0 :     hs_service_t *s = *iter;
     865           0 :     if (!s->config.is_ephemeral) {
     866             :       /* Yeah, we are in a very manual loop :). */
     867           0 :       next = HT_NEXT(hs_service_ht, src, iter);
     868           0 :       continue;
     869             :     }
     870             :     /* Remove service from map and then register to it to the other map.
     871             :      * Reminder that "*iter" and "s" are the same thing. */
     872           0 :     next = HT_NEXT_RMV(hs_service_ht, src, iter);
     873           0 :     if (register_service(dst, s) < 0) {
     874           0 :       log_warn(LD_BUG, "Ephemeral service key is already being used. "
     875             :                        "Skipping.");
     876             :     }
     877             :   }
     878           8 : }
     879             : 
     880             : /** Return a const string of the directory path escaped. If this is an
     881             :  * ephemeral service, it returns "[EPHEMERAL]". This can only be called from
     882             :  * the main thread because escaped() uses a static variable. */
     883             : static const char *
     884           4 : service_escaped_dir(const hs_service_t *s)
     885             : {
     886           4 :   return (s->config.is_ephemeral) ? "[EPHEMERAL]" :
     887           4 :                                     escaped(s->config.directory_path);
     888             : }
     889             : 
     890             : /** Move the hidden service state from <b>src</b> to <b>dst</b>. We do this
     891             :  *  when we receive a SIGHUP: <b>dst</b> is the post-HUP service */
     892             : static void
     893           0 : move_hs_state(hs_service_t *src_service, hs_service_t *dst_service)
     894             : {
     895           0 :   tor_assert(src_service);
     896           0 :   tor_assert(dst_service);
     897             : 
     898           0 :   hs_service_state_t *src = &src_service->state;
     899           0 :   hs_service_state_t *dst = &dst_service->state;
     900             : 
     901             :   /* Let's do a shallow copy */
     902           0 :   dst->intro_circ_retry_started_time = src->intro_circ_retry_started_time;
     903           0 :   dst->num_intro_circ_launched = src->num_intro_circ_launched;
     904             :   /* Freeing a NULL replaycache triggers an info LD_BUG. */
     905           0 :   if (dst->replay_cache_rend_cookie != NULL) {
     906           0 :     replaycache_free(dst->replay_cache_rend_cookie);
     907             :   }
     908             : 
     909           0 :   dst->replay_cache_rend_cookie = src->replay_cache_rend_cookie;
     910           0 :   src->replay_cache_rend_cookie = NULL; /* steal pointer reference */
     911             : 
     912           0 :   dst->next_rotation_time = src->next_rotation_time;
     913             : 
     914           0 :   if (src->ob_subcreds) {
     915           0 :     dst->ob_subcreds = src->ob_subcreds;
     916           0 :     dst->n_ob_subcreds =  src->n_ob_subcreds;
     917             : 
     918           0 :     src->ob_subcreds = NULL; /* steal pointer reference */
     919             :   }
     920           0 : }
     921             : 
     922             : /** Register services that are in the staging list. Once this function returns,
     923             :  * the global service map will be set with the right content and all non
     924             :  * surviving services will be cleaned up. */
     925             : static void
     926           8 : register_all_services(void)
     927             : {
     928           8 :   struct hs_service_ht *new_service_map;
     929             : 
     930           8 :   tor_assert(hs_service_staging_list);
     931             : 
     932             :   /* Allocate a new map that will replace the current one. */
     933           8 :   new_service_map = tor_malloc_zero(sizeof(*new_service_map));
     934           8 :   HT_INIT(hs_service_ht, new_service_map);
     935             : 
     936             :   /* First step is to transfer all ephemeral services from the current global
     937             :    * map to the new one we are constructing. We do not prune ephemeral
     938             :    * services as the only way to kill them is by deleting it from the control
     939             :    * port or stopping the tor daemon. */
     940           8 :   move_ephemeral_services(hs_service_map, new_service_map);
     941             : 
     942          12 :   SMARTLIST_FOREACH_BEGIN(hs_service_staging_list, hs_service_t *, snew) {
     943           4 :     hs_service_t *s;
     944             : 
     945             :     /* Check if that service is already in our global map and if so, we'll
     946             :      * transfer the intro points to it. */
     947           4 :     s = find_service(hs_service_map, &snew->keys.identity_pk);
     948           4 :     if (s) {
     949             :       /* Pass ownership of the descriptors from s (the current service) to
     950             :        * snew (the newly configured one). */
     951           0 :       move_descriptors(s, snew);
     952           0 :       move_hs_state(s, snew);
     953             :       /* Remove the service from the global map because after this, we need to
     954             :        * go over the remaining service in that map that aren't surviving the
     955             :        * reload to close their circuits. */
     956           0 :       remove_service(hs_service_map, s);
     957           0 :       hs_service_free(s);
     958             :     }
     959             :     /* Great, this service is now ready to be added to our new map. */
     960           4 :     if (BUG(register_service(new_service_map, snew) < 0)) {
     961             :       /* This should never happen because prior to registration, we validate
     962             :        * every service against the entire set. Not being able to register a
     963             :        * service means we failed to validate correctly. In that case, don't
     964             :        * break tor and ignore the service but tell user. */
     965           0 :       log_warn(LD_BUG, "Unable to register service with directory %s",
     966             :                service_escaped_dir(snew));
     967           0 :       SMARTLIST_DEL_CURRENT(hs_service_staging_list, snew);
     968           0 :       hs_service_free(snew);
     969             :     }
     970           4 :   } SMARTLIST_FOREACH_END(snew);
     971             : 
     972             :   /* Close any circuits associated with the non surviving services. Every
     973             :    * service in the current global map are roaming. */
     974           8 :   FOR_EACH_SERVICE_BEGIN(service) {
     975           0 :     close_service_circuits(service);
     976           8 :   } FOR_EACH_SERVICE_END;
     977             : 
     978             :   /* Time to make the switch. We'll clear the staging list because its content
     979             :    * has now changed ownership to the map. */
     980           8 :   smartlist_clear(hs_service_staging_list);
     981           8 :   service_free_all();
     982           8 :   hs_service_map = new_service_map;
     983             :   /* We've just register services into the new map and now we've replaced the
     984             :    * global map with it so we have to notify that the change happened. When
     985             :    * registering a service, the notify is only triggered if the destination
     986             :    * map is the global map for which in here it was not. */
     987           8 :   hs_service_map_has_changed();
     988           8 : }
     989             : 
     990             : /** Write the onion address of a given service to the given filename fname_ in
     991             :  * the service directory. Return 0 on success else -1 on error. */
     992             : STATIC int
     993           5 : write_address_to_file(const hs_service_t *service, const char *fname_)
     994             : {
     995           5 :   int ret = -1;
     996           5 :   char *fname = NULL;
     997           5 :   char *addr_buf = NULL;
     998             : 
     999           5 :   tor_assert(service);
    1000           5 :   tor_assert(fname_);
    1001             : 
    1002             :   /* Construct the full address with the onion tld and write the hostname file
    1003             :    * to disk. */
    1004           5 :   tor_asprintf(&addr_buf, "%s.%s\n", service->onion_address, address_tld);
    1005             :   /* Notice here that we use the given "fname_". */
    1006           5 :   fname = hs_path_from_filename(service->config.directory_path, fname_);
    1007           5 :   if (write_str_to_file_if_not_equal(fname, addr_buf)) {
    1008           0 :     log_warn(LD_REND, "Could not write onion address to hostname file %s",
    1009             :              escaped(fname));
    1010           0 :     goto end;
    1011             :   }
    1012             : 
    1013             : #ifndef _WIN32
    1014           5 :   if (service->config.dir_group_readable) {
    1015             :     /* Mode to 0640. */
    1016           0 :     if (chmod(fname, S_IRUSR | S_IWUSR | S_IRGRP) < 0) {
    1017           0 :       log_warn(LD_FS, "Unable to make onion service hostname file %s "
    1018             :                       "group-readable.", escaped(fname));
    1019             :     }
    1020             :   }
    1021             : #endif /* !defined(_WIN32) */
    1022             : 
    1023             :   /* Success. */
    1024             :   ret = 0;
    1025           5 :  end:
    1026           5 :   tor_free(fname);
    1027           5 :   tor_free(addr_buf);
    1028           5 :   return ret;
    1029             : }
    1030             : 
    1031             : /** Load and/or generate private keys for the given service. On success, the
    1032             :  * hostname file will be written to disk along with the master private key iff
    1033             :  * the service is not configured for offline keys. Return 0 on success else -1
    1034             :  * on failure. */
    1035             : static int
    1036           4 : load_service_keys(hs_service_t *service)
    1037             : {
    1038           4 :   int ret = -1;
    1039           4 :   char *fname = NULL;
    1040           4 :   ed25519_keypair_t *kp;
    1041           4 :   const hs_service_config_t *config;
    1042             : 
    1043           4 :   tor_assert(service);
    1044             : 
    1045           4 :   config = &service->config;
    1046             : 
    1047             :   /* Create and fix permission on service directory. We are about to write
    1048             :    * files to that directory so make sure it exists and has the right
    1049             :    * permissions. We do this here because at this stage we know that Tor is
    1050             :    * actually running and the service we have has been validated. */
    1051           4 :   if (hs_check_service_private_dir(get_options()->User,
    1052           4 :                                    config->directory_path,
    1053           4 :                                    config->dir_group_readable, 1) < 0) {
    1054           0 :     goto end;
    1055             :   }
    1056             : 
    1057             :   /* Try to load the keys from file or generate it if not found. */
    1058           4 :   fname = hs_path_from_filename(config->directory_path, fname_keyfile_prefix);
    1059             :   /* Don't ask for key creation, we want to know if we were able to load it or
    1060             :    * we had to generate it. Better logging! */
    1061           4 :   kp = ed_key_init_from_file(fname, INIT_ED_KEY_SPLIT, LOG_INFO, NULL, 0, 0,
    1062             :                              0, NULL, NULL);
    1063           4 :   if (!kp) {
    1064           2 :     log_info(LD_REND, "Unable to load keys from %s. Generating it...", fname);
    1065             :     /* We'll now try to generate the keys and for it we want the strongest
    1066             :      * randomness for it. The keypair will be written in different files. */
    1067           2 :     uint32_t key_flags = INIT_ED_KEY_CREATE | INIT_ED_KEY_EXTRA_STRONG |
    1068             :                          INIT_ED_KEY_SPLIT;
    1069           2 :     kp = ed_key_init_from_file(fname, key_flags, LOG_WARN, NULL, 0, 0, 0,
    1070             :                                NULL, NULL);
    1071           2 :     if (!kp) {
    1072           0 :       log_warn(LD_REND, "Unable to generate keys and save in %s.", fname);
    1073           0 :       goto end;
    1074             :     }
    1075             :   }
    1076             : 
    1077             :   /* Copy loaded or generated keys to service object. */
    1078           4 :   ed25519_pubkey_copy(&service->keys.identity_pk, &kp->pubkey);
    1079           4 :   memcpy(&service->keys.identity_sk, &kp->seckey,
    1080             :          sizeof(service->keys.identity_sk));
    1081             :   /* This does a proper memory wipe. */
    1082           4 :   ed25519_keypair_free(kp);
    1083             : 
    1084             :   /* Build onion address from the newly loaded keys. */
    1085           4 :   tor_assert(service->config.version <= UINT8_MAX);
    1086           4 :   hs_build_address(&service->keys.identity_pk,
    1087             :                    (uint8_t) service->config.version,
    1088           4 :                    service->onion_address);
    1089             : 
    1090             :   /* Write onion address to hostname file. */
    1091           4 :   if (write_address_to_file(service, fname_hostname) < 0) {
    1092           0 :     goto end;
    1093             :   }
    1094             : 
    1095             :   /* Load all client authorization keys in the service. */
    1096           4 :   if (load_client_keys(service) < 0) {
    1097           0 :     goto end;
    1098             :   }
    1099             : 
    1100             :   /* Success. */
    1101             :   ret = 0;
    1102           4 :  end:
    1103           4 :   tor_free(fname);
    1104           4 :   return ret;
    1105             : }
    1106             : 
    1107             : /** Check if the client file name is valid or not. Return 1 if valid,
    1108             :  * otherwise return 0. */
    1109             : STATIC int
    1110           7 : client_filename_is_valid(const char *filename)
    1111             : {
    1112           7 :   int ret = 1;
    1113           7 :   const char *valid_extension = ".auth";
    1114             : 
    1115           7 :   tor_assert(filename);
    1116             : 
    1117             :   /* The file extension must match and the total filename length can't be the
    1118             :    * length of the extension else we do not have a filename. */
    1119           7 :   if (!strcmpend(filename, valid_extension) &&
    1120           5 :       strlen(filename) != strlen(valid_extension)) {
    1121             :     ret = 1;
    1122             :   } else {
    1123           3 :     ret = 0;
    1124             :   }
    1125             : 
    1126           7 :   return ret;
    1127             : }
    1128             : 
    1129             : /** Parse an base32-encoded authorized client from a string.
    1130             :  *
    1131             :  * Return the key on success, return NULL, otherwise. */
    1132             : hs_service_authorized_client_t *
    1133           9 : parse_authorized_client_key(const char *key_str, int severity)
    1134             : {
    1135           9 :   hs_service_authorized_client_t *client = NULL;
    1136             : 
    1137             :   /* We expect a specific length of the base64 encoded key so make sure we
    1138             :    * have that so we don't successfully decode a value with a different length
    1139             :    * and end up in trouble when copying the decoded key into a fixed length
    1140             :    * buffer. */
    1141           9 :   if (strlen(key_str) != BASE32_NOPAD_LEN(CURVE25519_PUBKEY_LEN)) {
    1142           4 :     log_fn(severity, LD_REND, "Client authorization encoded base32 public key "
    1143             :                               "length is invalid: %s", key_str);
    1144           4 :     goto err;
    1145             :   }
    1146             : 
    1147           5 :   client = tor_malloc_zero(sizeof(hs_service_authorized_client_t));
    1148           5 :   if (base32_decode((char *) client->client_pk.public_key,
    1149             :                     sizeof(client->client_pk.public_key),
    1150             :                     key_str, strlen(key_str)) !=
    1151             :       sizeof(client->client_pk.public_key)) {
    1152           0 :     log_fn(severity, LD_REND, "Client authorization public key cannot be "
    1153             :              "decoded: %s", key_str);
    1154           0 :     goto err;
    1155             :   }
    1156             : 
    1157             :   return client;
    1158             : 
    1159           0 :  err:
    1160           4 :   if (client != NULL) {
    1161           0 :     service_authorized_client_free(client);
    1162             :   }
    1163             :   return NULL;
    1164             : }
    1165             : 
    1166             : /** Parse an authorized client from a string. The format of a client string
    1167             :  * looks like (see rend-spec-v3.txt):
    1168             :  *
    1169             :  *  <auth-type>:<key-type>:<base32-encoded-public-key>
    1170             :  *
    1171             :  * The <auth-type> can only be "descriptor".
    1172             :  * The <key-type> can only be "x25519".
    1173             :  *
    1174             :  * Return the key on success, return NULL, otherwise. */
    1175             : STATIC hs_service_authorized_client_t *
    1176          11 : parse_authorized_client(const char *client_key_str)
    1177             : {
    1178          11 :   char *auth_type = NULL;
    1179          11 :   char *key_type = NULL;
    1180          11 :   char *pubkey_b32 = NULL;
    1181          11 :   hs_service_authorized_client_t *client = NULL;
    1182          11 :   smartlist_t *fields = smartlist_new();
    1183             : 
    1184          11 :   tor_assert(client_key_str);
    1185             : 
    1186          11 :   smartlist_split_string(fields, client_key_str, ":",
    1187             :                          SPLIT_SKIP_SPACE, 0);
    1188             :   /* Wrong number of fields. */
    1189          11 :   if (smartlist_len(fields) != 3) {
    1190           4 :     log_warn(LD_REND, "Unknown format of client authorization file.");
    1191           4 :     goto err;
    1192             :   }
    1193             : 
    1194           7 :   auth_type = smartlist_get(fields, 0);
    1195           7 :   key_type = smartlist_get(fields, 1);
    1196           7 :   pubkey_b32 = smartlist_get(fields, 2);
    1197             : 
    1198             :   /* Currently, the only supported auth type is "descriptor". */
    1199           7 :   if (strcmp(auth_type, "descriptor")) {
    1200           1 :     log_warn(LD_REND, "Client authorization auth type '%s' not supported.",
    1201             :              auth_type);
    1202           1 :     goto err;
    1203             :   }
    1204             : 
    1205             :   /* Currently, the only supported key type is "x25519". */
    1206           6 :   if (strcmp(key_type, "x25519")) {
    1207           1 :     log_warn(LD_REND, "Client authorization key type '%s' not supported.",
    1208             :              key_type);
    1209           1 :     goto err;
    1210             :   }
    1211             : 
    1212           5 :   if ((client = parse_authorized_client_key(pubkey_b32, LOG_WARN)) == NULL) {
    1213           2 :     goto err;
    1214             :   }
    1215             : 
    1216             :   /* Success. */
    1217           3 :   goto done;
    1218             : 
    1219           8 :  err:
    1220           8 :   service_authorized_client_free(client);
    1221          11 :  done:
    1222             :   /* It is also a good idea to wipe the public key. */
    1223          11 :   if (pubkey_b32) {
    1224           7 :     memwipe(pubkey_b32, 0, strlen(pubkey_b32));
    1225             :   }
    1226          11 :   tor_assert(fields);
    1227          42 :   SMARTLIST_FOREACH(fields, char *, s, tor_free(s));
    1228          11 :   smartlist_free(fields);
    1229          11 :   return client;
    1230             : }
    1231             : 
    1232             : /** Load all the client public keys for the given service. Return 0 on
    1233             :  * success else -1 on failure. */
    1234             : static int
    1235           4 : load_client_keys(hs_service_t *service)
    1236             : {
    1237           4 :   int ret = -1;
    1238           4 :   char *client_key_str = NULL;
    1239           4 :   char *client_key_file_path = NULL;
    1240           4 :   char *client_keys_dir_path = NULL;
    1241           4 :   hs_service_config_t *config;
    1242           4 :   smartlist_t *file_list = NULL;
    1243             : 
    1244           4 :   tor_assert(service);
    1245             : 
    1246           4 :   config = &service->config;
    1247             : 
    1248             :   /* Before calling this function, we already call load_service_keys to make
    1249             :    * sure that the directory exists with the right permission. So, if we
    1250             :    * cannot create a client pubkey key directory, we consider it as a bug. */
    1251           4 :   client_keys_dir_path = hs_path_from_filename(config->directory_path,
    1252             :                                                dname_client_pubkeys);
    1253           4 :   if (BUG(hs_check_service_private_dir(get_options()->User,
    1254             :                                        client_keys_dir_path,
    1255             :                                        config->dir_group_readable, 1) < 0)) {
    1256           0 :     goto end;
    1257             :   }
    1258             : 
    1259             :   /* If the list of clients already exists, we must clear it first. */
    1260           4 :   if (config->clients) {
    1261           0 :     SMARTLIST_FOREACH(config->clients, hs_service_authorized_client_t *, p,
    1262             :                       service_authorized_client_free(p));
    1263           0 :     smartlist_free(config->clients);
    1264             :   }
    1265             : 
    1266           4 :   config->clients = smartlist_new();
    1267             : 
    1268           4 :   file_list = tor_listdir(client_keys_dir_path);
    1269           4 :   if (file_list == NULL) {
    1270           0 :     log_warn(LD_REND, "Client authorization directory %s can't be listed.",
    1271             :              client_keys_dir_path);
    1272           0 :     goto end;
    1273             :   }
    1274             : 
    1275           7 :   SMARTLIST_FOREACH_BEGIN(file_list, const char *, filename) {
    1276           3 :     hs_service_authorized_client_t *client = NULL;
    1277           3 :     log_info(LD_REND, "Loading a client authorization key file %s...",
    1278             :              filename);
    1279             : 
    1280           3 :     if (!client_filename_is_valid(filename)) {
    1281           1 :       log_warn(LD_REND, "Client authorization unrecognized filename %s. "
    1282             :                         "File must end in .auth. Ignoring.", filename);
    1283           1 :       continue;
    1284             :     }
    1285             : 
    1286             :     /* Create a full path for a file. */
    1287           2 :     client_key_file_path = hs_path_from_filename(client_keys_dir_path,
    1288             :                                                  filename);
    1289           2 :     client_key_str = read_file_to_str(client_key_file_path, 0, NULL);
    1290             : 
    1291             :     /* If we cannot read the file, continue with the next file. */
    1292           2 :     if (!client_key_str) {
    1293           0 :       log_warn(LD_REND, "Client authorization file %s can't be read. "
    1294             :                         "Corrupted or verify permission? Ignoring.",
    1295             :                client_key_file_path);
    1296           0 :       tor_free(client_key_file_path);
    1297           0 :       continue;
    1298             :     }
    1299           2 :     tor_free(client_key_file_path);
    1300             : 
    1301           2 :     client = parse_authorized_client(client_key_str);
    1302             :     /* Wipe and free immediately after using it. */
    1303           2 :     memwipe(client_key_str, 0, strlen(client_key_str));
    1304           2 :     tor_free(client_key_str);
    1305             : 
    1306           2 :     if (client) {
    1307           2 :       smartlist_add(config->clients, client);
    1308           2 :       log_info(LD_REND, "Loaded a client authorization key file %s.",
    1309             :                filename);
    1310             :     }
    1311             : 
    1312           3 :   } SMARTLIST_FOREACH_END(filename);
    1313             : 
    1314             :   /* Success. */
    1315             :   ret = 0;
    1316           4 :  end:
    1317           4 :   if (client_key_str) {
    1318           0 :     memwipe(client_key_str, 0, strlen(client_key_str));
    1319             :   }
    1320           4 :   if (file_list) {
    1321           7 :     SMARTLIST_FOREACH(file_list, char *, s, tor_free(s));
    1322           4 :     smartlist_free(file_list);
    1323             :   }
    1324           4 :   tor_free(client_key_str);
    1325           4 :   tor_free(client_key_file_path);
    1326           4 :   tor_free(client_keys_dir_path);
    1327           4 :   return ret;
    1328             : }
    1329             : 
    1330             : /** Release all storage held in <b>client</b>. */
    1331             : void
    1332          91 : service_authorized_client_free_(hs_service_authorized_client_t *client)
    1333             : {
    1334          91 :   if (!client) {
    1335             :     return;
    1336             :   }
    1337          83 :   memwipe(&client->client_pk, 0, sizeof(client->client_pk));
    1338          83 :   tor_free(client);
    1339             : }
    1340             : 
    1341             : /** Free a given service descriptor object and all key material is wiped. */
    1342             : STATIC void
    1343          65 : service_descriptor_free_(hs_service_descriptor_t *desc)
    1344             : {
    1345          65 :   if (!desc) {
    1346             :     return;
    1347             :   }
    1348          65 :   hs_descriptor_free(desc->desc);
    1349          65 :   memwipe(&desc->signing_kp, 0, sizeof(desc->signing_kp));
    1350          65 :   memwipe(&desc->blinded_kp, 0, sizeof(desc->blinded_kp));
    1351             :   /* Cleanup all intro points. */
    1352          65 :   digest256map_free(desc->intro_points.map, service_intro_point_free_void);
    1353          65 :   digestmap_free(desc->intro_points.failed_id, tor_free_);
    1354          65 :   if (desc->previous_hsdirs) {
    1355         119 :     SMARTLIST_FOREACH(desc->previous_hsdirs, char *, s, tor_free(s));
    1356          65 :     smartlist_free(desc->previous_hsdirs);
    1357             :   }
    1358          65 :   crypto_ope_free(desc->ope_cipher);
    1359          65 :   tor_free(desc);
    1360             : }
    1361             : 
    1362             : /** Return a newly allocated service descriptor object. */
    1363             : STATIC hs_service_descriptor_t *
    1364          65 : service_descriptor_new(void)
    1365             : {
    1366          65 :   hs_service_descriptor_t *sdesc = tor_malloc_zero(sizeof(*sdesc));
    1367          65 :   sdesc->desc = tor_malloc_zero(sizeof(hs_descriptor_t));
    1368             :   /* Initialize the intro points map. */
    1369          65 :   sdesc->intro_points.map = digest256map_new();
    1370          65 :   sdesc->intro_points.failed_id = digestmap_new();
    1371          65 :   sdesc->previous_hsdirs = smartlist_new();
    1372          65 :   return sdesc;
    1373             : }
    1374             : 
    1375             : /** Allocate and return a deep copy of client. */
    1376             : static hs_service_authorized_client_t *
    1377          12 : service_authorized_client_dup(const hs_service_authorized_client_t *client)
    1378             : {
    1379          12 :   hs_service_authorized_client_t *client_dup = NULL;
    1380             : 
    1381          12 :   tor_assert(client);
    1382             : 
    1383          12 :   client_dup = tor_malloc_zero(sizeof(hs_service_authorized_client_t));
    1384             :   /* Currently, the public key is the only component of
    1385             :    * hs_service_authorized_client_t. */
    1386          12 :   memcpy(client_dup->client_pk.public_key,
    1387          12 :          client->client_pk.public_key,
    1388             :          CURVE25519_PUBKEY_LEN);
    1389             : 
    1390          12 :   return client_dup;
    1391             : }
    1392             : 
    1393             : /** If two authorized clients are equal, return 0. If the first one should come
    1394             :  * before the second, return less than zero. If the first should come after
    1395             :  * the second, return greater than zero. */
    1396             : static int
    1397          10 : service_authorized_client_cmp(const hs_service_authorized_client_t *client1,
    1398             :                               const hs_service_authorized_client_t *client2)
    1399             : {
    1400          10 :   tor_assert(client1);
    1401          10 :   tor_assert(client2);
    1402             : 
    1403             :   /* Currently, the public key is the only component of
    1404             :    * hs_service_authorized_client_t. */
    1405          20 :   return tor_memcmp(client1->client_pk.public_key,
    1406          10 :                     client2->client_pk.public_key,
    1407             :                     CURVE25519_PUBKEY_LEN);
    1408             : }
    1409             : 
    1410             : /** Helper for sorting authorized clients. */
    1411             : static int
    1412           6 : compare_service_authorzized_client_(const void **_a, const void **_b)
    1413             : {
    1414           6 :   const hs_service_authorized_client_t *a = *_a, *b = *_b;
    1415           6 :   return service_authorized_client_cmp(a, b);
    1416             : }
    1417             : 
    1418             : /** If the list of hs_service_authorized_client_t's is different between
    1419             :  * src and dst, return 1. Otherwise, return 0. */
    1420             : STATIC int
    1421           5 : service_authorized_client_config_equal(const hs_service_config_t *config1,
    1422             :                                        const hs_service_config_t *config2)
    1423             : {
    1424           5 :   int ret = 0;
    1425           5 :   int i;
    1426           5 :   smartlist_t *sl1 = smartlist_new();
    1427           5 :   smartlist_t *sl2 = smartlist_new();
    1428             : 
    1429           5 :   tor_assert(config1);
    1430           5 :   tor_assert(config2);
    1431           5 :   tor_assert(config1->clients);
    1432           5 :   tor_assert(config2->clients);
    1433             : 
    1434             :   /* If the number of clients is different, it is obvious that the list
    1435             :    * changes. */
    1436           5 :   if (smartlist_len(config1->clients) != smartlist_len(config2->clients)) {
    1437           1 :     goto done;
    1438             :   }
    1439             : 
    1440             :   /* We do not want to mutate config1 and config2, so we will duplicate both
    1441             :    * entire client lists here. */
    1442          10 :   SMARTLIST_FOREACH(config1->clients,
    1443             :               hs_service_authorized_client_t *, client,
    1444             :               smartlist_add(sl1, service_authorized_client_dup(client)));
    1445             : 
    1446          10 :   SMARTLIST_FOREACH(config2->clients,
    1447             :               hs_service_authorized_client_t *, client,
    1448             :               smartlist_add(sl2, service_authorized_client_dup(client)));
    1449             : 
    1450           4 :   smartlist_sort(sl1, compare_service_authorzized_client_);
    1451           4 :   smartlist_sort(sl2, compare_service_authorzized_client_);
    1452             : 
    1453          10 :   for (i = 0; i < smartlist_len(sl1); i++) {
    1454             :     /* If the clients at index i in both lists differ, the whole configs
    1455             :      * differ. */
    1456           4 :     if (service_authorized_client_cmp(smartlist_get(sl1, i),
    1457           4 :                                       smartlist_get(sl2, i))) {
    1458           2 :       goto done;
    1459             :     }
    1460             :   }
    1461             : 
    1462             :   /* Success. */
    1463             :   ret = 1;
    1464             : 
    1465           5 :  done:
    1466           5 :   if (sl1) {
    1467          11 :     SMARTLIST_FOREACH(sl1, hs_service_authorized_client_t *, p,
    1468             :                       service_authorized_client_free(p));
    1469           5 :     smartlist_free(sl1);
    1470             :   }
    1471           5 :   if (sl2) {
    1472          11 :     SMARTLIST_FOREACH(sl2, hs_service_authorized_client_t *, p,
    1473             :                       service_authorized_client_free(p));
    1474           5 :     smartlist_free(sl2);
    1475             :   }
    1476           5 :   return ret;
    1477             : }
    1478             : 
    1479             : /** Move descriptor(s) from the src service to the dst service and modify their
    1480             :  * content if necessary. We do this during SIGHUP when we re-create our
    1481             :  * hidden services. */
    1482             : static void
    1483           0 : move_descriptors(hs_service_t *src, hs_service_t *dst)
    1484             : {
    1485           0 :   tor_assert(src);
    1486           0 :   tor_assert(dst);
    1487             : 
    1488           0 :   if (src->desc_current) {
    1489             :     /* Nothing should be there, but clean it up just in case */
    1490           0 :     if (BUG(dst->desc_current)) {
    1491           0 :       service_descriptor_free(dst->desc_current);
    1492             :     }
    1493           0 :     dst->desc_current = src->desc_current;
    1494           0 :     src->desc_current = NULL;
    1495             :   }
    1496             : 
    1497           0 :   if (src->desc_next) {
    1498             :     /* Nothing should be there, but clean it up just in case */
    1499           0 :     if (BUG(dst->desc_next)) {
    1500           0 :       service_descriptor_free(dst->desc_next);
    1501             :     }
    1502           0 :     dst->desc_next = src->desc_next;
    1503           0 :     src->desc_next = NULL;
    1504             :   }
    1505             : 
    1506             :   /* If the client authorization changes, we must rebuild the superencrypted
    1507             :    * section and republish the descriptors. */
    1508           0 :   int client_auth_changed =
    1509           0 :     !service_authorized_client_config_equal(&src->config, &dst->config);
    1510           0 :   if (client_auth_changed && dst->desc_current) {
    1511             :     /* We have to clear the superencrypted content first. */
    1512           0 :     hs_desc_superencrypted_data_free_contents(
    1513           0 :                                 &dst->desc_current->desc->superencrypted_data);
    1514           0 :     if (build_service_desc_superencrypted(dst, dst->desc_current) < 0) {
    1515           0 :       goto err;
    1516             :     }
    1517           0 :     service_desc_schedule_upload(dst->desc_current, time(NULL), 1);
    1518             :   }
    1519           0 :   if (client_auth_changed && dst->desc_next) {
    1520             :     /* We have to clear the superencrypted content first. */
    1521           0 :     hs_desc_superencrypted_data_free_contents(
    1522           0 :                                 &dst->desc_next->desc->superencrypted_data);
    1523           0 :     if (build_service_desc_superencrypted(dst, dst->desc_next) < 0) {
    1524           0 :       goto err;
    1525             :     }
    1526           0 :     service_desc_schedule_upload(dst->desc_next, time(NULL), 1);
    1527             :   }
    1528             : 
    1529             :   return;
    1530             : 
    1531           0 :  err:
    1532             :   /* If there is an error, free all descriptors to make it clean and generate
    1533             :    * them later. */
    1534           0 :   service_descriptor_free(dst->desc_current);
    1535           0 :   service_descriptor_free(dst->desc_next);
    1536             : }
    1537             : 
    1538             : /** From the given service, remove all expired failing intro points for each
    1539             :  * descriptor. */
    1540             : static void
    1541           6 : remove_expired_failing_intro(hs_service_t *service, time_t now)
    1542             : {
    1543           6 :   tor_assert(service);
    1544             : 
    1545             :   /* For both descriptors, cleanup the failing intro points list. */
    1546          18 :   FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
    1547          16 :     DIGESTMAP_FOREACH_MODIFY(desc->intro_points.failed_id, key, time_t *, t) {
    1548           5 :       time_t failure_time = *t;
    1549           5 :       if ((failure_time + INTRO_CIRC_RETRY_PERIOD) <= now) {
    1550           0 :         MAP_DEL_CURRENT(key);
    1551           0 :         tor_free(t);
    1552             :       }
    1553          12 :     } DIGESTMAP_FOREACH_END;
    1554           6 :   } FOR_EACH_DESCRIPTOR_END;
    1555           6 : }
    1556             : 
    1557             : /** For the given descriptor desc, put all node_t object found from its failing
    1558             :  * intro point list and put them in the given node_list. */
    1559             : static void
    1560           4 : setup_intro_point_exclude_list(const hs_service_descriptor_t *desc,
    1561             :                                smartlist_t *node_list)
    1562             : {
    1563           4 :   tor_assert(desc);
    1564           4 :   tor_assert(node_list);
    1565             : 
    1566           4 :   DIGESTMAP_FOREACH(desc->intro_points.failed_id, key, time_t *, t) {
    1567           0 :     (void) t; /* Make gcc happy. */
    1568           0 :     const node_t *node = node_get_by_id(key);
    1569           0 :     if (node) {
    1570           0 :       smartlist_add(node_list, (void *) node);
    1571             :     }
    1572           4 :   } DIGESTMAP_FOREACH_END;
    1573           4 : }
    1574             : 
    1575             : /** For the given failing intro point ip, we add its time of failure to the
    1576             :  * failed map and index it by identity digest (legacy ID) in the descriptor
    1577             :  * desc failed id map. */
    1578             : static void
    1579           2 : remember_failing_intro_point(const hs_service_intro_point_t *ip,
    1580             :                              hs_service_descriptor_t *desc, time_t now)
    1581             : {
    1582           2 :   time_t *time_of_failure, *prev_ptr;
    1583           2 :   const link_specifier_t *legacy_ls;
    1584             : 
    1585           2 :   tor_assert(ip);
    1586           2 :   tor_assert(desc);
    1587             : 
    1588           2 :   time_of_failure = tor_malloc_zero(sizeof(time_t));
    1589           2 :   *time_of_failure = now;
    1590           2 :   legacy_ls = get_link_spec_by_type(ip, LS_LEGACY_ID);
    1591           2 :   tor_assert(legacy_ls);
    1592           2 :   prev_ptr = digestmap_set(
    1593             :     desc->intro_points.failed_id,
    1594           2 :     (const char *) link_specifier_getconstarray_un_legacy_id(legacy_ls),
    1595             :     time_of_failure);
    1596           2 :   tor_free(prev_ptr);
    1597           2 : }
    1598             : 
    1599             : /** Using a given descriptor signing keypair signing_kp, a service intro point
    1600             :  * object ip and the time now, setup the content of an already allocated
    1601             :  * descriptor intro desc_ip.
    1602             :  *
    1603             :  * Return 0 on success else a negative value. */
    1604             : static int
    1605           0 : setup_desc_intro_point(const ed25519_keypair_t *signing_kp,
    1606             :                        const hs_service_intro_point_t *ip,
    1607             :                        time_t now, hs_desc_intro_point_t *desc_ip)
    1608             : {
    1609           0 :   int ret = -1;
    1610           0 :   time_t nearest_hour = now - (now % 3600);
    1611             : 
    1612           0 :   tor_assert(signing_kp);
    1613           0 :   tor_assert(ip);
    1614           0 :   tor_assert(desc_ip);
    1615             : 
    1616             :   /* Copy the onion key. */
    1617           0 :   memcpy(&desc_ip->onion_key, &ip->onion_key, sizeof(desc_ip->onion_key));
    1618             : 
    1619             :   /* Key and certificate material. */
    1620           0 :   desc_ip->auth_key_cert = tor_cert_create_ed25519(signing_kp,
    1621             :                                            CERT_TYPE_AUTH_HS_IP_KEY,
    1622             :                                            &ip->auth_key_kp.pubkey,
    1623             :                                            nearest_hour,
    1624             :                                            HS_DESC_CERT_LIFETIME,
    1625             :                                            CERT_FLAG_INCLUDE_SIGNING_KEY);
    1626           0 :   if (desc_ip->auth_key_cert == NULL) {
    1627           0 :     log_warn(LD_REND, "Unable to create intro point auth-key certificate");
    1628           0 :     goto done;
    1629             :   }
    1630             : 
    1631             :   /* Copy link specifier(s). */
    1632           0 :   SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers,
    1633             :                           const link_specifier_t *, ls) {
    1634           0 :     if (BUG(!ls)) {
    1635           0 :       goto done;
    1636             :     }
    1637           0 :     link_specifier_t *copy = link_specifier_dup(ls);
    1638           0 :     if (BUG(!copy)) {
    1639           0 :       goto done;
    1640             :     }
    1641           0 :     smartlist_add(desc_ip->link_specifiers, copy);
    1642           0 :   } SMARTLIST_FOREACH_END(ls);
    1643             : 
    1644             :   /* For a legacy intro point, we'll use an RSA/ed cross certificate. */
    1645           0 :   if (ip->base.is_only_legacy) {
    1646           0 :     desc_ip->legacy.key = crypto_pk_dup_key(ip->legacy_key);
    1647             :     /* Create cross certification cert. */
    1648           0 :     ssize_t cert_len = tor_make_rsa_ed25519_crosscert(
    1649             :                                     &signing_kp->pubkey,
    1650             :                                     desc_ip->legacy.key,
    1651             :                                     nearest_hour + HS_DESC_CERT_LIFETIME,
    1652             :                                     &desc_ip->legacy.cert.encoded);
    1653           0 :     if (cert_len < 0) {
    1654           0 :       log_warn(LD_REND, "Unable to create enc key legacy cross cert.");
    1655           0 :       goto done;
    1656             :     }
    1657           0 :     desc_ip->legacy.cert.len = cert_len;
    1658             :   }
    1659             : 
    1660             :   /* Encryption key and its cross certificate. */
    1661             :   {
    1662           0 :     ed25519_public_key_t ed25519_pubkey;
    1663             : 
    1664             :     /* Use the public curve25519 key. */
    1665           0 :     memcpy(&desc_ip->enc_key, &ip->enc_key_kp.pubkey,
    1666             :            sizeof(desc_ip->enc_key));
    1667             :     /* The following can't fail. */
    1668           0 :     ed25519_public_key_from_curve25519_public_key(&ed25519_pubkey,
    1669             :                                                   &ip->enc_key_kp.pubkey,
    1670             :                                                   0);
    1671           0 :     desc_ip->enc_key_cert = tor_cert_create_ed25519(signing_kp,
    1672             :                                             CERT_TYPE_CROSS_HS_IP_KEYS,
    1673             :                                             &ed25519_pubkey, nearest_hour,
    1674             :                                             HS_DESC_CERT_LIFETIME,
    1675             :                                             CERT_FLAG_INCLUDE_SIGNING_KEY);
    1676           0 :     if (desc_ip->enc_key_cert == NULL) {
    1677           0 :       log_warn(LD_REND, "Unable to create enc key curve25519 cross cert.");
    1678           0 :       goto done;
    1679             :     }
    1680             :   }
    1681             :   /* Success. */
    1682           0 :   ret = 0;
    1683             : 
    1684           0 :  done:
    1685           0 :   return ret;
    1686             : }
    1687             : 
    1688             : /** Using the given descriptor from the given service, build the descriptor
    1689             :  * intro point list so we can then encode the descriptor for publication. This
    1690             :  * function does not pick intro points, they have to be in the descriptor
    1691             :  * current map. Cryptographic material (keys) must be initialized in the
    1692             :  * descriptor for this function to make sense. */
    1693             : static void
    1694           0 : build_desc_intro_points(const hs_service_t *service,
    1695             :                         hs_service_descriptor_t *desc, time_t now)
    1696             : {
    1697           0 :   hs_desc_encrypted_data_t *encrypted;
    1698             : 
    1699           0 :   tor_assert(service);
    1700           0 :   tor_assert(desc);
    1701             : 
    1702             :   /* Ease our life. */
    1703           0 :   encrypted = &desc->desc->encrypted_data;
    1704             :   /* Cleanup intro points, we are about to set them from scratch. */
    1705           0 :   hs_descriptor_clear_intro_points(desc->desc);
    1706             : 
    1707           0 :   DIGEST256MAP_FOREACH(desc->intro_points.map, key,
    1708             :                        const hs_service_intro_point_t *, ip) {
    1709           0 :     if (!hs_circ_service_get_established_intro_circ(ip)) {
    1710             :       /* Ignore un-established intro points. They can linger in that list
    1711             :        * because their circuit has not opened and they haven't been removed
    1712             :        * yet even though we have enough intro circuits.
    1713             :        *
    1714             :        * Due to #31561, it can stay in that list until rotation so this check
    1715             :        * prevents to publish an intro point without a circuit. */
    1716           0 :       continue;
    1717             :     }
    1718           0 :     hs_desc_intro_point_t *desc_ip = hs_desc_intro_point_new();
    1719           0 :     if (setup_desc_intro_point(&desc->signing_kp, ip, now, desc_ip) < 0) {
    1720           0 :       hs_desc_intro_point_free(desc_ip);
    1721           0 :       continue;
    1722             :     }
    1723             :     /* We have a valid descriptor intro point. Add it to the list. */
    1724           0 :     smartlist_add(encrypted->intro_points, desc_ip);
    1725           0 :   } DIGEST256MAP_FOREACH_END;
    1726           0 : }
    1727             : 
    1728             : /** Build the descriptor signing key certificate. */
    1729             : static void
    1730          44 : build_desc_signing_key_cert(hs_service_descriptor_t *desc, time_t now)
    1731             : {
    1732          44 :   hs_desc_plaintext_data_t *plaintext;
    1733             : 
    1734          44 :   tor_assert(desc);
    1735          44 :   tor_assert(desc->desc);
    1736             : 
    1737             :   /* Ease our life a bit. */
    1738          44 :   plaintext = &desc->desc->plaintext_data;
    1739             : 
    1740             :   /* Get rid of what we have right now. */
    1741          44 :   tor_cert_free(plaintext->signing_key_cert);
    1742             : 
    1743             :   /* Fresh certificate for the signing key. */
    1744          88 :   plaintext->signing_key_cert =
    1745          44 :     tor_cert_create_ed25519(&desc->blinded_kp, CERT_TYPE_SIGNING_HS_DESC,
    1746          44 :                     &desc->signing_kp.pubkey, now, HS_DESC_CERT_LIFETIME,
    1747             :                     CERT_FLAG_INCLUDE_SIGNING_KEY);
    1748             :   /* If the cert creation fails, the descriptor encoding will fail and thus
    1749             :    * ultimately won't be uploaded. We'll get a stack trace to help us learn
    1750             :    * where the call came from and the tor_cert_create_ed25519() will log the
    1751             :    * error. */
    1752          44 :   tor_assert_nonfatal(plaintext->signing_key_cert);
    1753          44 : }
    1754             : 
    1755             : /** Populate the descriptor encrypted section from the given service object.
    1756             :  * This will generate a valid list of introduction points that can be used
    1757             :  * after for circuit creation. Return 0 on success else -1 on error. */
    1758             : static int
    1759          44 : build_service_desc_encrypted(const hs_service_t *service,
    1760             :                              hs_service_descriptor_t *desc)
    1761             : {
    1762          44 :   hs_desc_encrypted_data_t *encrypted;
    1763             : 
    1764          44 :   tor_assert(service);
    1765          44 :   tor_assert(desc);
    1766             : 
    1767          44 :   encrypted = &desc->desc->encrypted_data;
    1768             : 
    1769          44 :   encrypted->create2_ntor = 1;
    1770          44 :   encrypted->single_onion_service = service->config.is_single_onion;
    1771             : 
    1772             :   /* Setup introduction points from what we have in the service. */
    1773          44 :   if (encrypted->intro_points == NULL) {
    1774          44 :     encrypted->intro_points = smartlist_new();
    1775             :   }
    1776             :   /* We do NOT build introduction point yet, we only do that once the circuit
    1777             :    * have been opened. Until we have the right number of introduction points,
    1778             :    * we do not encode anything in the descriptor. */
    1779             : 
    1780             :   /* XXX: Support client authorization (#20700). */
    1781          44 :   encrypted->intro_auth_types = NULL;
    1782          44 :   return 0;
    1783             : }
    1784             : 
    1785             : /** Populate the descriptor superencrypted section from the given service
    1786             :  * object. This will generate a valid list of hs_desc_authorized_client_t
    1787             :  * of clients that are authorized to use the service. Return 0 on success
    1788             :  * else -1 on error. */
    1789             : static int
    1790          44 : build_service_desc_superencrypted(const hs_service_t *service,
    1791             :                                   hs_service_descriptor_t *desc)
    1792             : {
    1793          44 :   const hs_service_config_t *config;
    1794          44 :   int i;
    1795          44 :   hs_desc_superencrypted_data_t *superencrypted;
    1796             : 
    1797          44 :   tor_assert(service);
    1798          44 :   tor_assert(desc);
    1799             : 
    1800          44 :   superencrypted = &desc->desc->superencrypted_data;
    1801          44 :   config = &service->config;
    1802             : 
    1803             :   /* The ephemeral key pair is already generated, so this should not give
    1804             :    * an error. */
    1805          44 :   if (BUG(!curve25519_public_key_is_ok(&desc->auth_ephemeral_kp.pubkey))) {
    1806           0 :     return -1;
    1807             :   }
    1808          44 :   memcpy(&superencrypted->auth_ephemeral_pubkey,
    1809             :          &desc->auth_ephemeral_kp.pubkey,
    1810             :          sizeof(curve25519_public_key_t));
    1811             : 
    1812             :   /* Test that subcred is not zero because we might use it below */
    1813          44 :   if (BUG(fast_mem_is_zero((char*)desc->desc->subcredential.subcred,
    1814             :                            DIGEST256_LEN))) {
    1815           0 :     return -1;
    1816             :   }
    1817             : 
    1818             :   /* Create a smartlist to store clients */
    1819          44 :   superencrypted->clients = smartlist_new();
    1820             : 
    1821             :   /* We do not need to build the desc authorized client if the client
    1822             :    * authorization is disabled */
    1823          44 :   if (is_client_auth_enabled(service)) {
    1824         108 :     SMARTLIST_FOREACH_BEGIN(config->clients,
    1825             :                             hs_service_authorized_client_t *, client) {
    1826         104 :       hs_desc_authorized_client_t *desc_client;
    1827         104 :       desc_client = tor_malloc_zero(sizeof(hs_desc_authorized_client_t));
    1828             : 
    1829             :       /* Prepare the client for descriptor and then add to the list in the
    1830             :        * superencrypted part of the descriptor */
    1831         104 :       hs_desc_build_authorized_client(&desc->desc->subcredential,
    1832         104 :                                       &client->client_pk,
    1833         104 :                                       &desc->auth_ephemeral_kp.seckey,
    1834         104 :                                       desc->descriptor_cookie, desc_client);
    1835         104 :       smartlist_add(superencrypted->clients, desc_client);
    1836             : 
    1837         104 :     } SMARTLIST_FOREACH_END(client);
    1838             :   }
    1839             : 
    1840             :   /* We cannot let the number of auth-clients to be zero, so we need to
    1841             :    * make it be 16. If it is already a multiple of 16, we do not need to
    1842             :    * do anything. Otherwise, add the additional ones to make it a
    1843             :    * multiple of 16. */
    1844          44 :   int num_clients = smartlist_len(superencrypted->clients);
    1845          44 :   int num_clients_to_add;
    1846          44 :   if (num_clients == 0) {
    1847             :     num_clients_to_add = HS_DESC_AUTH_CLIENT_MULTIPLE;
    1848           4 :   } else if (num_clients % HS_DESC_AUTH_CLIENT_MULTIPLE == 0) {
    1849             :     num_clients_to_add = 0;
    1850             :   } else {
    1851           2 :     num_clients_to_add =
    1852             :       HS_DESC_AUTH_CLIENT_MULTIPLE
    1853           2 :       - (num_clients % HS_DESC_AUTH_CLIENT_MULTIPLE);
    1854             :   }
    1855             : 
    1856         708 :   for (i = 0; i < num_clients_to_add; i++) {
    1857         664 :     hs_desc_authorized_client_t *desc_client =
    1858         664 :       hs_desc_build_fake_authorized_client();
    1859         664 :     smartlist_add(superencrypted->clients, desc_client);
    1860             :   }
    1861             : 
    1862             :   /* Shuffle the list to prevent the client know the position in the
    1863             :    * config. */
    1864          44 :   smartlist_shuffle(superencrypted->clients);
    1865             : 
    1866          44 :   return 0;
    1867             : }
    1868             : 
    1869             : /** Populate the descriptor plaintext section from the given service object.
    1870             :  * The caller must make sure that the keys in the descriptors are valid that
    1871             :  * is are non-zero. This can't fail. */
    1872             : static void
    1873          44 : build_service_desc_plaintext(const hs_service_t *service,
    1874             :                              hs_service_descriptor_t *desc)
    1875             : {
    1876          44 :   hs_desc_plaintext_data_t *plaintext;
    1877             : 
    1878          44 :   tor_assert(service);
    1879          44 :   tor_assert(desc);
    1880          44 :   tor_assert(!fast_mem_is_zero((char *) &desc->blinded_kp,
    1881             :                               sizeof(desc->blinded_kp)));
    1882          44 :   tor_assert(!fast_mem_is_zero((char *) &desc->signing_kp,
    1883             :                               sizeof(desc->signing_kp)));
    1884             : 
    1885             :   /* Set the subcredential. */
    1886          44 :   hs_get_subcredential(&service->keys.identity_pk, &desc->blinded_kp.pubkey,
    1887          44 :                        &desc->desc->subcredential);
    1888             : 
    1889          44 :   plaintext = &desc->desc->plaintext_data;
    1890             : 
    1891          44 :   plaintext->version = service->config.version;
    1892          44 :   plaintext->lifetime_sec = HS_DESC_DEFAULT_LIFETIME;
    1893             :   /* Copy public key material to go in the descriptor. */
    1894          44 :   ed25519_pubkey_copy(&plaintext->signing_pubkey, &desc->signing_kp.pubkey);
    1895          44 :   ed25519_pubkey_copy(&plaintext->blinded_pubkey, &desc->blinded_kp.pubkey);
    1896             : 
    1897             :   /* Create the signing key certificate. This will be updated before each
    1898             :    * upload but we create it here so we don't complexify our unit tests. */
    1899          44 :   build_desc_signing_key_cert(desc, approx_time());
    1900          44 : }
    1901             : 
    1902             : /** Compute the descriptor's OPE cipher for encrypting revision counters. */
    1903             : static crypto_ope_t *
    1904          44 : generate_ope_cipher_for_desc(const hs_service_descriptor_t *hs_desc)
    1905             : {
    1906             :   /* Compute OPE key as H("rev-counter-generation" | blinded privkey) */
    1907          44 :   uint8_t key[DIGEST256_LEN];
    1908          44 :   crypto_digest_t *digest = crypto_digest256_new(DIGEST_SHA3_256);
    1909          44 :   const char ope_key_prefix[] = "rev-counter-generation";
    1910          44 :   const ed25519_secret_key_t *eph_privkey = &hs_desc->blinded_kp.seckey;
    1911          44 :   crypto_digest_add_bytes(digest, ope_key_prefix, sizeof(ope_key_prefix));
    1912          44 :   crypto_digest_add_bytes(digest, (char*)eph_privkey->seckey,
    1913             :                           sizeof(eph_privkey->seckey));
    1914          44 :   crypto_digest_get_digest(digest, (char *)key, sizeof(key));
    1915          44 :   crypto_digest_free(digest);
    1916             : 
    1917          44 :   return crypto_ope_new(key);
    1918             : }
    1919             : 
    1920             : /** For the given service and descriptor object, create the key material which
    1921             :  * is the blinded keypair, the descriptor signing keypair, the ephemeral
    1922             :  * keypair, and the descriptor cookie. Return 0 on success else -1 on error
    1923             :  * where the generated keys MUST be ignored. */
    1924             : static int
    1925          44 : build_service_desc_keys(const hs_service_t *service,
    1926             :                         hs_service_descriptor_t *desc)
    1927             : {
    1928          44 :   int ret = -1;
    1929          44 :   ed25519_keypair_t kp;
    1930             : 
    1931          44 :   tor_assert(desc);
    1932          44 :   tor_assert(!fast_mem_is_zero((char *) &service->keys.identity_pk,
    1933             :              ED25519_PUBKEY_LEN));
    1934             : 
    1935             :   /* XXX: Support offline key feature (#18098). */
    1936             : 
    1937             :   /* Copy the identity keys to the keypair so we can use it to create the
    1938             :    * blinded key. */
    1939          44 :   memcpy(&kp.pubkey, &service->keys.identity_pk, sizeof(kp.pubkey));
    1940          44 :   memcpy(&kp.seckey, &service->keys.identity_sk, sizeof(kp.seckey));
    1941             :   /* Build blinded keypair for this time period. */
    1942          44 :   hs_build_blinded_keypair(&kp, NULL, 0, desc->time_period_num,
    1943          44 :                            &desc->blinded_kp);
    1944             :   /* Let's not keep too much traces of our keys in memory. */
    1945          44 :   memwipe(&kp, 0, sizeof(kp));
    1946             : 
    1947             :   /* Compute the OPE cipher struct (it's tied to the current blinded key) */
    1948          44 :   log_info(LD_GENERAL,
    1949             :            "Getting OPE for TP#%u", (unsigned) desc->time_period_num);
    1950          44 :   tor_assert_nonfatal(!desc->ope_cipher);
    1951          44 :   desc->ope_cipher = generate_ope_cipher_for_desc(desc);
    1952             : 
    1953             :   /* No need for extra strong, this is a temporary key only for this
    1954             :    * descriptor. Nothing long term. */
    1955          44 :   if (ed25519_keypair_generate(&desc->signing_kp, 0) < 0) {
    1956           0 :     log_warn(LD_REND, "Can't generate descriptor signing keypair for "
    1957             :                       "service %s",
    1958             :              safe_str_client(service->onion_address));
    1959           0 :     goto end;
    1960             :   }
    1961             : 
    1962             :   /* No need for extra strong, this is a temporary key only for this
    1963             :    * descriptor. Nothing long term. */
    1964          44 :   if (curve25519_keypair_generate(&desc->auth_ephemeral_kp, 0) < 0) {
    1965           0 :     log_warn(LD_REND, "Can't generate auth ephemeral keypair for "
    1966             :                       "service %s",
    1967             :              safe_str_client(service->onion_address));
    1968           0 :     goto end;
    1969             :   }
    1970             : 
    1971             :   /* Random descriptor cookie to be used as a part of a key to encrypt the
    1972             :    * descriptor, only if the client auth is enabled will it be used. */
    1973          44 :   crypto_strongest_rand(desc->descriptor_cookie,
    1974             :                         sizeof(desc->descriptor_cookie));
    1975             : 
    1976             :   /* Success. */
    1977          44 :   ret = 0;
    1978          44 :  end:
    1979          44 :   return ret;
    1980             : }
    1981             : 
    1982             : /** Given a service and the current time, build a descriptor for the service.
    1983             :  * This function does not pick introduction point, this needs to be done by
    1984             :  * the update function. On success, desc_out will point to the newly allocated
    1985             :  * descriptor object.
    1986             :  *
    1987             :  * This can error if we are unable to create keys or certificate. */
    1988             : static void
    1989          44 : build_service_descriptor(hs_service_t *service, uint64_t time_period_num,
    1990             :                          hs_service_descriptor_t **desc_out)
    1991             : {
    1992          44 :   char *encoded_desc;
    1993          44 :   hs_service_descriptor_t *desc;
    1994             : 
    1995          44 :   tor_assert(service);
    1996          44 :   tor_assert(desc_out);
    1997             : 
    1998          44 :   desc = service_descriptor_new();
    1999             : 
    2000             :   /* Set current time period */
    2001          44 :   desc->time_period_num = time_period_num;
    2002             : 
    2003             :   /* Create the needed keys so we can setup the descriptor content. */
    2004          44 :   if (build_service_desc_keys(service, desc) < 0) {
    2005           0 :     goto err;
    2006             :   }
    2007             :   /* Setup plaintext descriptor content. */
    2008          44 :   build_service_desc_plaintext(service, desc);
    2009             : 
    2010             :   /* Setup superencrypted descriptor content. */
    2011          44 :   if (build_service_desc_superencrypted(service, desc) < 0) {
    2012           0 :     goto err;
    2013             :   }
    2014             :   /* Setup encrypted descriptor content. */
    2015          44 :   if (build_service_desc_encrypted(service, desc) < 0) {
    2016           0 :     goto err;
    2017             :   }
    2018             : 
    2019             :   /* Let's make sure that we've created a descriptor that can actually be
    2020             :    * encoded properly. This function also checks if the encoded output is
    2021             :    * decodable after. */
    2022          44 :   if (BUG(service_encode_descriptor(service, desc, &desc->signing_kp,
    2023             :                                     &encoded_desc) < 0)) {
    2024           0 :     goto err;
    2025             :   }
    2026          44 :   tor_free(encoded_desc);
    2027             : 
    2028             :   /* Assign newly built descriptor to the next slot. */
    2029          44 :   *desc_out = desc;
    2030             : 
    2031             :   /* Fire a CREATED control port event. */
    2032          44 :   hs_control_desc_event_created(service->onion_address,
    2033          44 :                                 &desc->blinded_kp.pubkey);
    2034             : 
    2035             :   /* If we are an onionbalance instance, we refresh our keys when we rotate
    2036             :    * descriptors. */
    2037          44 :   hs_ob_refresh_keys(service);
    2038             : 
    2039          44 :   return;
    2040             : 
    2041           0 :  err:
    2042           0 :   service_descriptor_free(desc);
    2043             : }
    2044             : 
    2045             : /** Build both descriptors for the given service that has just booted up.
    2046             :  * Because it's a special case, it deserves its special function ;). */
    2047             : static void
    2048          21 : build_descriptors_for_new_service(hs_service_t *service, time_t now)
    2049             : {
    2050          21 :   uint64_t current_desc_tp, next_desc_tp;
    2051             : 
    2052          21 :   tor_assert(service);
    2053             :   /* These are the conditions for a new service. */
    2054          21 :   tor_assert(!service->desc_current);
    2055          21 :   tor_assert(!service->desc_next);
    2056             : 
    2057             :   /*
    2058             :    * +------------------------------------------------------------------+
    2059             :    * |                                                                  |
    2060             :    * | 00:00      12:00       00:00       12:00       00:00       12:00 |
    2061             :    * | SRV#1      TP#1        SRV#2       TP#2        SRV#3       TP#3  |
    2062             :    * |                                                                  |
    2063             :    * |  $==========|-----------$===========|-----------$===========|    |
    2064             :    * |                             ^         ^                          |
    2065             :    * |                             A         B                          |
    2066             :    * +------------------------------------------------------------------+
    2067             :    *
    2068             :    * Case A: The service boots up before a new time period, the current time
    2069             :    * period is thus TP#1 and the next is TP#2 which for both we have access to
    2070             :    * their SRVs.
    2071             :    *
    2072             :    * Case B: The service boots up inside TP#2, we can't use the TP#3 for the
    2073             :    * next descriptor because we don't have the SRV#3 so the current should be
    2074             :    * TP#1 and next TP#2.
    2075             :    */
    2076             : 
    2077          21 :   if (hs_in_period_between_tp_and_srv(NULL, now)) {
    2078             :     /* Case B from the above, inside of the new time period. */
    2079           7 :     current_desc_tp = hs_get_previous_time_period_num(0); /* TP#1 */
    2080           7 :     next_desc_tp = hs_get_time_period_num(0);             /* TP#2 */
    2081             :   } else {
    2082             :     /* Case A from the above, outside of the new time period. */
    2083          14 :     current_desc_tp = hs_get_time_period_num(0);    /* TP#1 */
    2084          14 :     next_desc_tp = hs_get_next_time_period_num(0);  /* TP#2 */
    2085             :   }
    2086             : 
    2087             :   /* Build descriptors. */
    2088          21 :   build_service_descriptor(service, current_desc_tp, &service->desc_current);
    2089          21 :   build_service_descriptor(service, next_desc_tp, &service->desc_next);
    2090          21 :   log_info(LD_REND, "Hidden service %s has just started. Both descriptors "
    2091             :                     "built. Now scheduled for upload.",
    2092             :            safe_str_client(service->onion_address));
    2093          21 : }
    2094             : 
    2095             : /** Build descriptors for each service if needed. There are conditions to build
    2096             :  * a descriptor which are details in the function. */
    2097             : STATIC void
    2098          23 : build_all_descriptors(time_t now)
    2099             : {
    2100          48 :   FOR_EACH_SERVICE_BEGIN(service) {
    2101             : 
    2102             :     /* A service booting up will have both descriptors to NULL. No other cases
    2103             :      * makes both descriptor non existent. */
    2104          25 :     if (service->desc_current == NULL && service->desc_next == NULL) {
    2105          21 :       build_descriptors_for_new_service(service, now);
    2106          21 :       continue;
    2107             :     }
    2108             : 
    2109             :     /* Reaching this point means we are pass bootup so at runtime. We should
    2110             :      * *never* have an empty current descriptor. If the next descriptor is
    2111             :      * empty, we'll try to build it for the next time period. This only
    2112             :      * happens when we rotate meaning that we are guaranteed to have a new SRV
    2113             :      * at that point for the next time period. */
    2114           4 :     if (BUG(service->desc_current == NULL)) {
    2115           0 :       continue;
    2116             :     }
    2117             : 
    2118           4 :     if (service->desc_next == NULL) {
    2119           2 :       build_service_descriptor(service, hs_get_next_time_period_num(0),
    2120             :                                &service->desc_next);
    2121           2 :       log_info(LD_REND, "Hidden service %s next descriptor successfully "
    2122             :                         "built. Now scheduled for upload.",
    2123             :                safe_str_client(service->onion_address));
    2124             :     }
    2125          23 :   } FOR_EACH_DESCRIPTOR_END;
    2126          23 : }
    2127             : 
    2128             : /** Randomly pick a node to become an introduction point but not present in the
    2129             :  * given exclude_nodes list. The chosen node is put in the exclude list
    2130             :  * regardless of success or not because in case of failure, the node is simply
    2131             :  * unsusable from that point on.
    2132             :  *
    2133             :  * If direct_conn is set, try to pick a node that our local firewall/policy
    2134             :  * allows us to connect to directly. If we can't find any, return NULL.
    2135             :  * This function supports selecting dual-stack nodes for direct single onion
    2136             :  * service IPv6 connections. But it does not send IPv6 addresses in link
    2137             :  * specifiers. (Current clients don't use IPv6 addresses to extend, and
    2138             :  * direct client connections to intro points are not supported.)
    2139             :  *
    2140             :  * Return a newly allocated service intro point ready to be used for encoding.
    2141             :  * Return NULL on error. */
    2142             : static hs_service_intro_point_t *
    2143           6 : pick_intro_point(unsigned int direct_conn, smartlist_t *exclude_nodes)
    2144             : {
    2145           6 :   const or_options_t *options = get_options();
    2146           6 :   const node_t *node;
    2147           6 :   hs_service_intro_point_t *ip = NULL;
    2148             :   /* Normal 3-hop introduction point flags. */
    2149           6 :   router_crn_flags_t flags = CRN_NEED_UPTIME | CRN_NEED_DESC;
    2150             :   /* Single onion flags. */
    2151           6 :   router_crn_flags_t direct_flags = flags | CRN_PREF_ADDR | CRN_DIRECT_CONN;
    2152             : 
    2153          12 :   node = router_choose_random_node(exclude_nodes, options->ExcludeNodes,
    2154             :                                    direct_conn ? direct_flags : flags);
    2155             : 
    2156             :   /* If we are in single onion mode, retry node selection for a 3-hop
    2157             :    * path */
    2158           6 :   if (direct_conn && !node) {
    2159           0 :     log_info(LD_REND,
    2160             :              "Unable to find an intro point that we can connect to "
    2161             :              "directly, falling back to a 3-hop path.");
    2162           0 :     node = router_choose_random_node(exclude_nodes, options->ExcludeNodes,
    2163             :                                      flags);
    2164             :   }
    2165             : 
    2166           6 :   if (!node) {
    2167           4 :     goto err;
    2168             :   }
    2169             : 
    2170             :   /* We have a suitable node, add it to the exclude list. We do this *before*
    2171             :    * we can validate the extend information because even in case of failure,
    2172             :    * we don't want to use that node anymore. */
    2173           2 :   smartlist_add(exclude_nodes, (void *) node);
    2174             : 
    2175             :   /* Create our objects and populate them with the node information. */
    2176           2 :   ip = service_intro_point_new(node);
    2177             : 
    2178           2 :   if (ip == NULL) {
    2179           0 :     goto err;
    2180             :   }
    2181             : 
    2182           2 :   log_info(LD_REND, "Picked intro point: %s", node_describe(node));
    2183           2 :   return ip;
    2184           4 :  err:
    2185           4 :   service_intro_point_free(ip);
    2186           4 :   return NULL;
    2187             : }
    2188             : 
    2189             : /** For a given descriptor from the given service, pick any needed intro points
    2190             :  * and update the current map with those newly picked intro points. Return the
    2191             :  * number node that might have been added to the descriptor current map. */
    2192             : static unsigned int
    2193           4 : pick_needed_intro_points(hs_service_t *service,
    2194             :                          hs_service_descriptor_t *desc)
    2195             : {
    2196           4 :   int i = 0, num_needed_ip;
    2197           4 :   smartlist_t *exclude_nodes = smartlist_new();
    2198             : 
    2199           4 :   tor_assert(service);
    2200           4 :   tor_assert(desc);
    2201             : 
    2202             :   /* Compute how many intro points we actually need to open. */
    2203           8 :   num_needed_ip = service->config.num_intro_points -
    2204           4 :                   digest256map_size(desc->intro_points.map);
    2205           4 :   if (BUG(num_needed_ip < 0)) {
    2206             :     /* Let's not make tor freak out here and just skip this. */
    2207           0 :     goto done;
    2208             :   }
    2209             : 
    2210             :   /* We want to end up with config.num_intro_points intro points, but if we
    2211             :    * have no intro points at all (chances are they all cycled or we are
    2212             :    * starting up), we launch get_intro_point_num_extra() extra circuits and
    2213             :    * use the first config.num_intro_points that complete. See proposal #155,
    2214             :    * section 4 for the rationale of this which is purely for performance.
    2215             :    *
    2216             :    * The ones after the first config.num_intro_points will be converted to
    2217             :    * 'General' internal circuits and then we'll drop them from the list of
    2218             :    * intro points. */
    2219           4 :   if (digest256map_size(desc->intro_points.map) == 0) {
    2220           4 :     num_needed_ip += get_intro_point_num_extra();
    2221             :   }
    2222             : 
    2223             :   /* Build an exclude list of nodes of our intro point(s). The expiring intro
    2224             :    * points are OK to pick again because this is after all a concept of round
    2225             :    * robin so they are considered valid nodes to pick again. */
    2226           4 :   DIGEST256MAP_FOREACH(desc->intro_points.map, key,
    2227             :                        hs_service_intro_point_t *, ip) {
    2228           0 :     const node_t *intro_node = get_node_from_intro_point(ip);
    2229           0 :     if (intro_node) {
    2230           0 :       smartlist_add(exclude_nodes, (void*)intro_node);
    2231             :     }
    2232           4 :   } DIGEST256MAP_FOREACH_END;
    2233             :   /* Also, add the failing intro points that our descriptor encounteered in
    2234             :    * the exclude node list. */
    2235           4 :   setup_intro_point_exclude_list(desc, exclude_nodes);
    2236             : 
    2237          10 :   for (i = 0; i < num_needed_ip; i++) {
    2238           6 :     hs_service_intro_point_t *ip;
    2239             : 
    2240             :     /* This function will add the picked intro point node to the exclude nodes
    2241             :      * list so we don't pick the same one at the next iteration. */
    2242           6 :     ip = pick_intro_point(service->config.is_single_onion, exclude_nodes);
    2243           6 :     if (ip == NULL) {
    2244             :       /* If we end up unable to pick an introduction point it is because we
    2245             :        * can't find suitable node and calling this again is highly unlikely to
    2246             :        * give us a valid node all of the sudden. */
    2247           4 :       log_info(LD_REND, "Unable to find a suitable node to be an "
    2248             :                         "introduction point for service %s.",
    2249             :                safe_str_client(service->onion_address));
    2250           4 :       goto done;
    2251             :     }
    2252             :     /* Valid intro point object, add it to the descriptor current map. */
    2253           2 :     service_intro_point_add(desc->intro_points.map, ip);
    2254             :   }
    2255             :   /* We've successfully picked all our needed intro points thus none are
    2256             :    * missing which will tell our upload process to expect the number of
    2257             :    * circuits to be the number of configured intro points circuits and not the
    2258             :    * number of intro points object that we have. */
    2259           0 :   desc->missing_intro_points = 0;
    2260             : 
    2261             :   /* Success. */
    2262           4 :  done:
    2263             :   /* We don't have ownership of the node_t object in this list. */
    2264           4 :   smartlist_free(exclude_nodes);
    2265           4 :   return i;
    2266             : }
    2267             : 
    2268             : /** Clear previous cached HSDirs in <b>desc</b>. */
    2269             : static void
    2270          12 : service_desc_clear_previous_hsdirs(hs_service_descriptor_t *desc)
    2271             : {
    2272          12 :   if (BUG(!desc->previous_hsdirs)) {
    2273           0 :     return;
    2274             :   }
    2275             : 
    2276          24 :   SMARTLIST_FOREACH(desc->previous_hsdirs, char*, s, tor_free(s));
    2277          12 :   smartlist_clear(desc->previous_hsdirs);
    2278             : }
    2279             : 
    2280             : /** Note that we attempted to upload <b>desc</b> to <b>hsdir</b>. */
    2281             : static void
    2282          66 : service_desc_note_upload(hs_service_descriptor_t *desc, const node_t *hsdir)
    2283             : {
    2284          66 :   char b64_digest[BASE64_DIGEST_LEN+1] = {0};
    2285          66 :   digest_to_base64(b64_digest, hsdir->identity);
    2286             : 
    2287          66 :   if (BUG(!desc->previous_hsdirs)) {
    2288           0 :     return;
    2289             :   }
    2290             : 
    2291          66 :   if (!smartlist_contains_string(desc->previous_hsdirs, b64_digest)) {
    2292          66 :     smartlist_add_strdup(desc->previous_hsdirs, b64_digest);
    2293             :   }
    2294             : }
    2295             : 
    2296             : /** Schedule an upload of <b>desc</b>. If <b>descriptor_changed</b> is set, it
    2297             :  *  means that this descriptor is dirty. */
    2298             : STATIC void
    2299           3 : service_desc_schedule_upload(hs_service_descriptor_t *desc,
    2300             :                              time_t now,
    2301             :                              int descriptor_changed)
    2302             : 
    2303             : {
    2304           3 :   desc->next_upload_time = now;
    2305             : 
    2306             :   /* If the descriptor changed, clean up the old HSDirs list. We want to
    2307             :    * re-upload no matter what. */
    2308           3 :   if (descriptor_changed) {
    2309           3 :     service_desc_clear_previous_hsdirs(desc);
    2310             :   }
    2311           3 : }
    2312             : 
    2313             : /** Pick missing intro points for this descriptor if needed. */
    2314             : static void
    2315           4 : update_service_descriptor_intro_points(hs_service_t *service,
    2316             :                           hs_service_descriptor_t *desc, time_t now)
    2317             : {
    2318           4 :   unsigned int num_intro_points;
    2319             : 
    2320           4 :   tor_assert(service);
    2321           4 :   tor_assert(desc);
    2322           4 :   tor_assert(desc->desc);
    2323             : 
    2324           4 :   num_intro_points = digest256map_size(desc->intro_points.map);
    2325             : 
    2326             :   /* Pick any missing introduction point(s). */
    2327           4 :   if (num_intro_points < service->config.num_intro_points) {
    2328           4 :     unsigned int num_new_intro_points = pick_needed_intro_points(service,
    2329             :                                                                  desc);
    2330           4 :     if (num_new_intro_points != 0) {
    2331           3 :       log_info(LD_REND, "Service %s just picked %u intro points and wanted "
    2332             :                         "%u for %s descriptor. It currently has %d intro "
    2333             :                         "points. Launching ESTABLISH_INTRO circuit shortly.",
    2334             :                safe_str_client(service->onion_address),
    2335             :                num_new_intro_points,
    2336             :                service->config.num_intro_points - num_intro_points,
    2337             :                (desc == service->desc_current) ? "current" : "next",
    2338             :                num_intro_points);
    2339             :       /* We'll build those introduction point into the descriptor once we have
    2340             :        * confirmation that the circuits are opened and ready. However,
    2341             :        * indicate that this descriptor should be uploaded from now on. */
    2342           2 :       service_desc_schedule_upload(desc, now, 1);
    2343             :     }
    2344             :     /* Were we able to pick all the intro points we needed? If not, we'll
    2345             :      * flag the descriptor that it's missing intro points because it
    2346             :      * couldn't pick enough which will trigger a descriptor upload. */
    2347           4 :     if ((num_new_intro_points + num_intro_points) <
    2348           4 :         service->config.num_intro_points) {
    2349           4 :       desc->missing_intro_points = 1;
    2350             :     }
    2351             :   }
    2352           4 : }
    2353             : 
    2354             : /** Update descriptor intro points for each service if needed. We do this as
    2355             :  * part of the periodic event because we need to establish intro point circuits
    2356             :  * before we publish descriptors. */
    2357             : STATIC void
    2358           2 : update_all_descriptors_intro_points(time_t now)
    2359             : {
    2360           4 :   FOR_EACH_SERVICE_BEGIN(service) {
    2361             :     /* We'll try to update each descriptor that is if certain conditions apply
    2362             :      * in order for the descriptor to be updated. */
    2363           6 :     FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
    2364           4 :       update_service_descriptor_intro_points(service, desc, now);
    2365           2 :     } FOR_EACH_DESCRIPTOR_END;
    2366           2 :   } FOR_EACH_SERVICE_END;
    2367           2 : }
    2368             : 
    2369             : /** Return true iff the given intro point has expired that is it has been used
    2370             :  * for too long or we've reached our max seen INTRODUCE2 cell. */
    2371             : STATIC int
    2372           9 : intro_point_should_expire(const hs_service_intro_point_t *ip,
    2373             :                           time_t now)
    2374             : {
    2375           9 :   tor_assert(ip);
    2376             : 
    2377           9 :   if (ip->introduce2_count >= ip->introduce2_max) {
    2378           1 :     goto expired;
    2379             :   }
    2380             : 
    2381           8 :   if (ip->time_to_expire <= now) {
    2382           2 :     goto expired;
    2383             :   }
    2384             : 
    2385             :   /* Not expiring. */
    2386             :   return 0;
    2387           9 :  expired:
    2388             :   return 1;
    2389             : }
    2390             : 
    2391             : /** Return true iff we should remove the intro point ip from its service.
    2392             :  *
    2393             :  * We remove an intro point from the service descriptor list if one of
    2394             :  * these criteria is met:
    2395             :  *    - It has expired (either in INTRO2 count or in time).
    2396             :  *    - No node was found (fell off the consensus).
    2397             :  *    - We are over the maximum amount of retries.
    2398             :  *
    2399             :  * If an established or pending circuit is found for the given ip object, this
    2400             :  * return false indicating it should not be removed. */
    2401             : static bool
    2402           6 : should_remove_intro_point(hs_service_intro_point_t *ip, time_t now)
    2403             : {
    2404           6 :   bool ret = false;
    2405             : 
    2406           6 :   tor_assert(ip);
    2407             : 
    2408             :   /* Any one of the following needs to be True to fulfill the criteria to
    2409             :    * remove an intro point. */
    2410           6 :   bool has_no_retries = (ip->circuit_retries >
    2411             :                          MAX_INTRO_POINT_CIRCUIT_RETRIES);
    2412           6 :   bool has_no_node = (get_node_from_intro_point(ip) == NULL);
    2413           6 :   bool has_expired = intro_point_should_expire(ip, now);
    2414             : 
    2415             :   /* If the node fell off the consensus or the IP has expired, we have to
    2416             :    * remove it now. */
    2417           6 :   if (has_no_node || has_expired) {
    2418           2 :     ret = true;
    2419           2 :     goto end;
    2420             :   }
    2421             : 
    2422             :   /* Pass this point, even though we might be over the retry limit, we check
    2423             :    * if a circuit (established or pending) exists. In that case, we should not
    2424             :    * remove it because it might simply be valid and opened at the previous
    2425             :    * scheduled event for the last retry. */
    2426             : 
    2427             :   /* Do we simply have an existing circuit regardless of its state? */
    2428           4 :   if (hs_circ_service_get_intro_circ(ip)) {
    2429           1 :     goto end;
    2430             :   }
    2431             : 
    2432             :   /* Getting here means we have _no_ circuits so then return if we have any
    2433             :    * remaining retries. */
    2434             :   ret = has_no_retries;
    2435             : 
    2436           3 :  end:
    2437             :   /* Meaningful log in case we are about to remove the IP. */
    2438           6 :   if (ret) {
    2439           6 :     log_info(LD_REND, "Intro point %s%s (retried: %u times). "
    2440             :                       "Removing it.",
    2441             :              describe_intro_point(ip),
    2442             :              has_expired ? " has expired" :
    2443             :                (has_no_node) ?  " fell off the consensus" : "",
    2444             :              ip->circuit_retries);
    2445             :   }
    2446           6 :   return ret;
    2447             : }
    2448             : 
    2449             : /** Go over the given set of intro points for each service and remove any
    2450             :  * invalid ones.
    2451             :  *
    2452             :  * If an intro point is removed, the circuit (if any) is immediately close.
    2453             :  * If a circuit can't be found, the intro point is kept if it hasn't reached
    2454             :  * its maximum circuit retry value and thus should be retried.  */
    2455             : static void
    2456           6 : cleanup_intro_points(hs_service_t *service, time_t now)
    2457             : {
    2458             :   /* List of intro points to close. We can't mark the intro circuits for close
    2459             :    * in the modify loop because doing so calls back into the HS subsystem and
    2460             :    * we need to keep that code path outside of the service/desc loop so those
    2461             :    * maps don't get modified during the close making us in a possible
    2462             :    * use-after-free situation. */
    2463           6 :   smartlist_t *ips_to_free = smartlist_new();
    2464             : 
    2465           6 :   tor_assert(service);
    2466             : 
    2467             :   /* For both descriptors, cleanup the intro points. */
    2468          18 :   FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
    2469             :     /* Go over the current intro points we have, make sure they are still
    2470             :      * valid and remove any of them that aren't. */
    2471          18 :     DIGEST256MAP_FOREACH_MODIFY(desc->intro_points.map, key,
    2472             :                                 hs_service_intro_point_t *, ip) {
    2473           6 :       if (should_remove_intro_point(ip, now)) {
    2474             :         /* We've retried too many times, remember it as a failed intro point
    2475             :          * so we don't pick it up again for INTRO_CIRC_RETRY_PERIOD sec. */
    2476           4 :         if (ip->circuit_retries > MAX_INTRO_POINT_CIRCUIT_RETRIES) {
    2477           2 :           remember_failing_intro_point(ip, desc, approx_time());
    2478             :         }
    2479             : 
    2480             :         /* Remove intro point from descriptor map and add it to the list of
    2481             :          * ips to free for which we'll also try to close the intro circuit. */
    2482           4 :         MAP_DEL_CURRENT(key);
    2483           4 :         smartlist_add(ips_to_free, ip);
    2484             :       }
    2485          12 :     } DIGEST256MAP_FOREACH_END;
    2486           6 :   } FOR_EACH_DESCRIPTOR_END;
    2487             : 
    2488             :   /* Go over the intro points to free and close their circuit if any. */
    2489          10 :   SMARTLIST_FOREACH_BEGIN(ips_to_free, hs_service_intro_point_t *, ip) {
    2490             :     /* See if we need to close the intro point circuit as well */
    2491             : 
    2492             :     /* XXX: Legacy code does NOT close circuits like this: it keeps the circuit
    2493             :      * open until a new descriptor is uploaded and then closed all expiring
    2494             :      * intro point circuit. Here, we close immediately and because we just
    2495             :      * discarded the intro point, a new one will be selected, a new descriptor
    2496             :      * created and uploaded. There is no difference to an attacker between the
    2497             :      * timing of a new consensus and intro point rotation (possibly?). */
    2498           4 :     origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip);
    2499           4 :     if (ocirc && !TO_CIRCUIT(ocirc)->marked_for_close) {
    2500           1 :       circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED);
    2501             :     }
    2502             : 
    2503             :     /* Cleanup the intro point */
    2504           4 :     service_intro_point_free(ip);
    2505           4 :   } SMARTLIST_FOREACH_END(ip);
    2506             : 
    2507           6 :   smartlist_free(ips_to_free);
    2508           6 : }
    2509             : 
    2510             : /** Set the next rotation time of the descriptors for the given service for the
    2511             :  * time now. */
    2512             : static void
    2513           2 : set_rotation_time(hs_service_t *service)
    2514             : {
    2515           2 :   tor_assert(service);
    2516             : 
    2517           4 :   service->state.next_rotation_time =
    2518           2 :     sr_state_get_start_time_of_current_protocol_run() +
    2519           2 :     sr_state_get_protocol_run_duration();
    2520             : 
    2521             :   {
    2522           2 :     char fmt_time[ISO_TIME_LEN + 1];
    2523           2 :     format_local_iso_time(fmt_time, service->state.next_rotation_time);
    2524           2 :     log_info(LD_REND, "Next descriptor rotation time set to %s for %s",
    2525             :              fmt_time, safe_str_client(service->onion_address));
    2526             :   }
    2527           2 : }
    2528             : 
    2529             : /** Return true iff the service should rotate its descriptor. The time now is
    2530             :  * only used to fetch the live consensus and if none can be found, this
    2531             :  * returns false. */
    2532             : static unsigned int
    2533           3 : should_rotate_descriptors(hs_service_t *service, time_t now)
    2534             : {
    2535           3 :   const networkstatus_t *ns;
    2536             : 
    2537           3 :   tor_assert(service);
    2538             : 
    2539           3 :   ns = networkstatus_get_reasonably_live_consensus(now,
    2540             :                                                    usable_consensus_flavor());
    2541           3 :   if (ns == NULL) {
    2542           0 :     goto no_rotation;
    2543             :   }
    2544             : 
    2545           3 :   if (ns->valid_after >= service->state.next_rotation_time) {
    2546             :     /* In theory, we should never get here with no descriptors. We can never
    2547             :      * have a NULL current descriptor except when tor starts up. The next
    2548             :      * descriptor can be NULL after a rotation but we build a new one right
    2549             :      * after.
    2550             :      *
    2551             :      * So, when tor starts, the next rotation time is set to the start of the
    2552             :      * next SRV period using the consensus valid after time so it should
    2553             :      * always be set to a future time value. This means that we should never
    2554             :      * reach this point at bootup that is this check safeguards tor in never
    2555             :      * allowing a rotation if the valid after time is smaller than the next
    2556             :      * rotation time.
    2557             :      *
    2558             :      * This is all good in theory but we've had a NULL descriptor issue here
    2559             :      * so this is why we BUG() on both with extra logging to try to understand
    2560             :      * how this can possibly happens. We'll simply ignore and tor should
    2561             :      * recover from this by skipping rotation and building the missing
    2562             :      * descriptors just after this. */
    2563           1 :     if (BUG(service->desc_current == NULL || service->desc_next == NULL)) {
    2564           0 :       log_warn(LD_BUG, "Service descriptor is NULL (%p/%p). Next rotation "
    2565             :                        "time is %ld (now: %ld). Valid after time from "
    2566             :                        "consensus is %ld",
    2567             :                service->desc_current, service->desc_next,
    2568             :                (long)service->state.next_rotation_time,
    2569             :                (long)now,
    2570             :                (long)ns->valid_after);
    2571           0 :       goto no_rotation;
    2572             :     }
    2573           1 :     goto rotation;
    2574             :   }
    2575             : 
    2576           2 :  no_rotation:
    2577             :   return 0;
    2578           1 :  rotation:
    2579           1 :   return 1;
    2580             : }
    2581             : 
    2582             : /** Rotate the service descriptors of the given service. The current descriptor
    2583             :  * will be freed, the next one put in as the current and finally the next
    2584             :  * descriptor pointer is NULLified. */
    2585             : static void
    2586           1 : rotate_service_descriptors(hs_service_t *service)
    2587             : {
    2588           1 :   if (service->desc_current) {
    2589             :     /* Close all IP circuits for the descriptor. */
    2590           1 :     close_intro_circuits(&service->desc_current->intro_points);
    2591             :     /* We don't need this one anymore, we won't serve any clients coming with
    2592             :      * this service descriptor. */
    2593           1 :     service_descriptor_free(service->desc_current);
    2594             :   }
    2595             :   /* The next one become the current one and emptying the next will trigger
    2596             :    * a descriptor creation for it. */
    2597           1 :   service->desc_current = service->desc_next;
    2598           1 :   service->desc_next = NULL;
    2599             : 
    2600             :   /* We've just rotated, set the next time for the rotation. */
    2601           1 :   set_rotation_time(service);
    2602           1 : }
    2603             : 
    2604             : /** Rotate descriptors for each service if needed. A non existing current
    2605             :  * descriptor will trigger a descriptor build for the next time period. */
    2606             : STATIC void
    2607           3 : rotate_all_descriptors(time_t now)
    2608             : {
    2609             :   /* XXX We rotate all our service descriptors at once. In the future it might
    2610             :    *     be wise, to rotate service descriptors independently to hide that all
    2611             :    *     those descriptors are on the same tor instance */
    2612             : 
    2613           6 :   FOR_EACH_SERVICE_BEGIN(service) {
    2614             : 
    2615             :     /* Note for a service booting up: Both descriptors are NULL in that case
    2616             :      * so this function might return true if we are in the timeframe for a
    2617             :      * rotation leading to basically swapping two NULL pointers which is
    2618             :      * harmless. However, the side effect is that triggering a rotation will
    2619             :      * update the service state and avoid doing anymore rotations after the
    2620             :      * two descriptors have been built. */
    2621           3 :     if (!should_rotate_descriptors(service, now)) {
    2622           2 :       continue;
    2623             :     }
    2624             : 
    2625           1 :     log_info(LD_REND, "Time to rotate our descriptors (%p / %p) for %s",
    2626             :              service->desc_current, service->desc_next,
    2627             :              safe_str_client(service->onion_address));
    2628             : 
    2629           1 :     rotate_service_descriptors(service);
    2630           3 :   } FOR_EACH_SERVICE_END;
    2631           3 : }
    2632             : 
    2633             : /** Scheduled event run from the main loop. Make sure all our services are up
    2634             :  * to date and ready for the other scheduled events. This includes looking at
    2635             :  * the introduction points status and descriptor rotation time. */
    2636             : STATIC void
    2637           6 : run_housekeeping_event(time_t now)
    2638             : {
    2639             :   /* Note that nothing here opens circuit(s) nor uploads descriptor(s). We are
    2640             :    * simply moving things around or removing unneeded elements. */
    2641             : 
    2642          12 :   FOR_EACH_SERVICE_BEGIN(service) {
    2643             : 
    2644             :     /* If the service is starting off, set the rotation time. We can't do that
    2645             :      * at configure time because the get_options() needs to be set for setting
    2646             :      * that time that uses the voting interval. */
    2647           6 :     if (service->state.next_rotation_time == 0) {
    2648             :       /* Set the next rotation time of the descriptors. If it's Oct 25th
    2649             :        * 23:47:00, the next rotation time is when the next SRV is computed
    2650             :        * which is at Oct 26th 00:00:00 that is in 13 minutes. */
    2651           1 :       set_rotation_time(service);
    2652             :     }
    2653             : 
    2654             :     /* Cleanup invalid intro points from the service descriptor. */
    2655           6 :     cleanup_intro_points(service, now);
    2656             : 
    2657             :     /* Remove expired failing intro point from the descriptor failed list. We
    2658             :      * reset them at each INTRO_CIRC_RETRY_PERIOD. */
    2659           6 :     remove_expired_failing_intro(service, now);
    2660             : 
    2661             :     /* At this point, the service is now ready to go through the scheduled
    2662             :      * events guaranteeing a valid state. Intro points might be missing from
    2663             :      * the descriptors after the cleanup but the update/build process will
    2664             :      * make sure we pick those missing ones. */
    2665           6 :   } FOR_EACH_SERVICE_END;
    2666           6 : }
    2667             : 
    2668             : /** Scheduled event run from the main loop. Make sure all descriptors are up to
    2669             :  * date. Once this returns, each service descriptor needs to be considered for
    2670             :  * new introduction circuits and then for upload. */
    2671             : static void
    2672           0 : run_build_descriptor_event(time_t now)
    2673             : {
    2674             :   /* Run v3+ events. */
    2675             :   /* We start by rotating the descriptors only if needed. */
    2676           0 :   rotate_all_descriptors(now);
    2677             : 
    2678             :   /* Then, we'll try to build  new descriptors that we might need. The
    2679             :    * condition is that the next descriptor is non existing because it has
    2680             :    * been rotated or we just started up. */
    2681           0 :   build_all_descriptors(now);
    2682             : 
    2683             :   /* Finally, we'll check if we should update the descriptors' intro
    2684             :    * points. Missing introduction points will be picked in this function which
    2685             :    * is useful for newly built descriptors. */
    2686           0 :   update_all_descriptors_intro_points(now);
    2687           0 : }
    2688             : 
    2689             : /** For the given service, launch any intro point circuits that could be
    2690             :  * needed. This considers every descriptor of the service. */
    2691             : static void
    2692           0 : launch_intro_point_circuits(hs_service_t *service)
    2693             : {
    2694           0 :   tor_assert(service);
    2695             : 
    2696             :   /* For both descriptors, try to launch any missing introduction point
    2697             :    * circuits using the current map. */
    2698           0 :   FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
    2699             :     /* Keep a ref on if we need a direct connection. We use this often. */
    2700           0 :     bool direct_conn = service->config.is_single_onion;
    2701             : 
    2702           0 :     DIGEST256MAP_FOREACH_MODIFY(desc->intro_points.map, key,
    2703             :                                 hs_service_intro_point_t *, ip) {
    2704           0 :       extend_info_t *ei;
    2705             : 
    2706             :       /* Skip the intro point that already has an existing circuit
    2707             :        * (established or not). */
    2708           0 :       if (hs_circ_service_get_intro_circ(ip)) {
    2709           0 :         continue;
    2710             :       }
    2711           0 :       ei = get_extend_info_from_intro_point(ip, direct_conn);
    2712             : 
    2713             :       /* If we can't connect directly to the intro point, get an extend_info
    2714             :        * for a multi-hop path instead. */
    2715           0 :       if (ei == NULL && direct_conn) {
    2716           0 :         direct_conn = false;
    2717           0 :         ei = get_extend_info_from_intro_point(ip, 0);
    2718             :       }
    2719             : 
    2720           0 :       if (ei == NULL) {
    2721             :         /* This is possible if we can get a node_t but not the extend info out
    2722             :          * of it. In this case, we remove the intro point and a new one will
    2723             :          * be picked at the next main loop callback. */
    2724           0 :         MAP_DEL_CURRENT(key);
    2725           0 :         service_intro_point_free(ip);
    2726           0 :         continue;
    2727             :       }
    2728             : 
    2729             :       /* Launch a circuit to the intro point. */
    2730           0 :       ip->circuit_retries++;
    2731           0 :       if (hs_circ_launch_intro_point(service, ip, ei, direct_conn) < 0) {
    2732           0 :         log_info(LD_REND, "Unable to launch intro circuit to node %s "
    2733             :                           "for service %s.",
    2734             :                  safe_str_client(extend_info_describe(ei)),
    2735             :                  safe_str_client(service->onion_address));
    2736             :         /* Intro point will be retried if possible after this. */
    2737             :       }
    2738           0 :       extend_info_free(ei);
    2739           0 :     } DIGEST256MAP_FOREACH_END;
    2740           0 :   } FOR_EACH_DESCRIPTOR_END;
    2741           0 : }
    2742             : 
    2743             : /** Don't try to build more than this many circuits before giving up for a
    2744             :  * while. Dynamically calculated based on the configured number of intro
    2745             :  * points for the given service and how many descriptor exists. The default
    2746             :  * use case of 3 introduction points and two descriptors will allow 28
    2747             :  * circuits for a retry period (((3 + 2) + (3 * 3)) * 2). */
    2748             : static unsigned int
    2749           3 : get_max_intro_circ_per_period(const hs_service_t *service)
    2750             : {
    2751           3 :   unsigned int count = 0;
    2752           3 :   unsigned int multiplier = 0;
    2753           3 :   unsigned int num_wanted_ip;
    2754             : 
    2755           3 :   tor_assert(service);
    2756           3 :   tor_assert(service->config.num_intro_points <=
    2757             :              HS_CONFIG_V3_MAX_INTRO_POINTS);
    2758             : 
    2759             : /** For a testing network, allow to do it for the maximum amount so circuit
    2760             :  * creation and rotation and so on can actually be tested without limit. */
    2761             : #define MAX_INTRO_POINT_CIRCUIT_RETRIES_TESTING -1
    2762           3 :   if (get_options()->TestingTorNetwork) {
    2763             :     return MAX_INTRO_POINT_CIRCUIT_RETRIES_TESTING;
    2764             :   }
    2765             : 
    2766           3 :   num_wanted_ip = service->config.num_intro_points;
    2767             : 
    2768             :   /* The calculation is as follow. We have a number of intro points that we
    2769             :    * want configured as a torrc option (num_intro_points). We then add an
    2770             :    * extra value so we can launch multiple circuits at once and pick the
    2771             :    * quickest ones. For instance, we want 3 intros, we add 2 extra so we'll
    2772             :    * pick 5 intros and launch 5 circuits. */
    2773           3 :   count += (num_wanted_ip + get_intro_point_num_extra());
    2774             : 
    2775             :   /* Then we add the number of retries that is possible to do for each intro
    2776             :    * point. If we want 3 intros, we'll allow 3 times the number of possible
    2777             :    * retry. */
    2778           3 :   count += (num_wanted_ip * MAX_INTRO_POINT_CIRCUIT_RETRIES);
    2779             : 
    2780             :   /* Then, we multiply by a factor of 2 if we have both descriptor or 0 if we
    2781             :    * have none.  */
    2782           3 :   multiplier += (service->desc_current) ? 1 : 0;
    2783           3 :   multiplier += (service->desc_next) ? 1 : 0;
    2784             : 
    2785           3 :   return (count * multiplier);
    2786             : }
    2787             : 
    2788             : /** For the given service, return 1 if the service is allowed to launch more
    2789             :  * introduction circuits else 0 if the maximum has been reached for the retry
    2790             :  * period of INTRO_CIRC_RETRY_PERIOD. */
    2791             : STATIC int
    2792           3 : can_service_launch_intro_circuit(hs_service_t *service, time_t now)
    2793             : {
    2794           3 :   tor_assert(service);
    2795             : 
    2796             :   /* Consider the intro circuit retry period of the service. */
    2797           3 :   if (now > (service->state.intro_circ_retry_started_time +
    2798             :              INTRO_CIRC_RETRY_PERIOD)) {
    2799           1 :     service->state.intro_circ_retry_started_time = now;
    2800           1 :     service->state.num_intro_circ_launched = 0;
    2801           1 :     goto allow;
    2802             :   }
    2803             :   /* Check if we can still launch more circuits in this period. */
    2804           2 :   if (service->state.num_intro_circ_launched <=
    2805           2 :       get_max_intro_circ_per_period(service)) {
    2806           1 :     goto allow;
    2807             :   }
    2808             : 
    2809             :   /* Rate limit log that we've reached our circuit creation limit. */
    2810             :   {
    2811           1 :     char *msg;
    2812           1 :     time_t elapsed_time = now - service->state.intro_circ_retry_started_time;
    2813           1 :     static ratelim_t rlimit = RATELIM_INIT(INTRO_CIRC_RETRY_PERIOD);
    2814           1 :     if ((msg = rate_limit_log(&rlimit, now))) {
    2815           1 :       log_info(LD_REND, "Hidden service %s exceeded its circuit launch limit "
    2816             :                         "of %u per %d seconds. It launched %u circuits in "
    2817             :                         "the last %ld seconds. Will retry in %ld seconds.",
    2818             :                safe_str_client(service->onion_address),
    2819             :                get_max_intro_circ_per_period(service),
    2820             :                INTRO_CIRC_RETRY_PERIOD,
    2821             :                service->state.num_intro_circ_launched,
    2822             :                (long int) elapsed_time,
    2823             :                (long int) (INTRO_CIRC_RETRY_PERIOD - elapsed_time));
    2824           1 :       tor_free(msg);
    2825             :     }
    2826             :   }
    2827             : 
    2828             :   /* Not allow. */
    2829             :   return 0;
    2830             :  allow:
    2831             :   return 1;
    2832             : }
    2833             : 
    2834             : /** Scheduled event run from the main loop. Make sure we have all the circuits
    2835             :  * we need for each service. */
    2836             : static void
    2837           0 : run_build_circuit_event(time_t now)
    2838             : {
    2839             :   /* Make sure we can actually have enough information or able to build
    2840             :    * internal circuits as required by services. */
    2841           0 :   if (router_have_consensus_path() == CONSENSUS_PATH_UNKNOWN ||
    2842           0 :       !have_completed_a_circuit()) {
    2843           0 :     return;
    2844             :   }
    2845             : 
    2846             :   /* Run v3+ check. */
    2847           0 :   FOR_EACH_SERVICE_BEGIN(service) {
    2848             :     /* For introduction circuit, we need to make sure we don't stress too much
    2849             :      * circuit creation so make sure this service is respecting that limit. */
    2850           0 :     if (can_service_launch_intro_circuit(service, now)) {
    2851             :       /* Launch intro point circuits if needed. */
    2852           0 :       launch_intro_point_circuits(service);
    2853             :       /* Once the circuits have opened, we'll make sure to update the
    2854             :        * descriptor intro point list and cleanup any extraneous. */
    2855             :     }
    2856           0 :   } FOR_EACH_SERVICE_END;
    2857             : }
    2858             : 
    2859             : /** Encode and sign the service descriptor desc and upload it to the given
    2860             :  * hidden service directory.  This does nothing if PublishHidServDescriptors
    2861             :  * is false. */
    2862             : static void
    2863          66 : upload_descriptor_to_hsdir(const hs_service_t *service,
    2864             :                            hs_service_descriptor_t *desc, const node_t *hsdir)
    2865             : {
    2866          66 :   char *encoded_desc = NULL;
    2867             : 
    2868          66 :   tor_assert(service);
    2869          66 :   tor_assert(desc);
    2870          66 :   tor_assert(hsdir);
    2871             : 
    2872             :   /* Let's avoid doing that if tor is configured to not publish. */
    2873          66 :   if (!get_options()->PublishHidServDescriptors) {
    2874           0 :     log_info(LD_REND, "Service %s not publishing descriptor. "
    2875             :                       "PublishHidServDescriptors is set to 0.",
    2876             :              safe_str_client(service->onion_address));
    2877           0 :     goto end;
    2878             :   }
    2879             : 
    2880             :   /* First of all, we'll encode the descriptor. This should NEVER fail but
    2881             :    * just in case, let's make sure we have an actual usable descriptor. */
    2882          66 :   if (BUG(service_encode_descriptor(service, desc, &desc->signing_kp,
    2883             :                                     &encoded_desc) < 0)) {
    2884           0 :     goto end;
    2885             :   }
    2886             : 
    2887             :   /* Time to upload the descriptor to the directory. */
    2888          66 :   hs_service_upload_desc_to_dir(encoded_desc, service->config.version,
    2889             :                                 &service->keys.identity_pk,
    2890          66 :                                 &desc->blinded_kp.pubkey, hsdir->rs);
    2891             : 
    2892             :   /* Add this node to previous_hsdirs list */
    2893          66 :   service_desc_note_upload(desc, hsdir);
    2894             : 
    2895             :   /* Logging so we know where it was sent. */
    2896             :   {
    2897          66 :     int is_next_desc = (service->desc_next == desc);
    2898          66 :     const uint8_t *idx = (is_next_desc) ? hsdir->hsdir_index.store_second:
    2899             :                                           hsdir->hsdir_index.store_first;
    2900         132 :     char *blinded_pubkey_log_str =
    2901          66 :       tor_strdup(hex_str((char*)&desc->blinded_kp.pubkey.pubkey, 32));
    2902             :     /* This log message is used by Chutney as part of its bootstrap
    2903             :      * detection mechanism. Please don't change without first checking
    2904             :      * Chutney. */
    2905         108 :     log_info(LD_REND, "Service %s %s descriptor of revision %" PRIu64
    2906             :                       " initiated upload request to %s with index %s (%s)",
    2907             :              safe_str_client(service->onion_address),
    2908             :              (is_next_desc) ? "next" : "current",
    2909             :              desc->desc->plaintext_data.revision_counter,
    2910             :              safe_str_client(node_describe(hsdir)),
    2911             :              safe_str_client(hex_str((const char *) idx, 32)),
    2912             :              safe_str_client(blinded_pubkey_log_str));
    2913          66 :     tor_free(blinded_pubkey_log_str);
    2914             : 
    2915             :     /* Fire a UPLOAD control port event. */
    2916          66 :     hs_control_desc_event_upload(service->onion_address, hsdir->identity,
    2917             :                                  &desc->blinded_kp.pubkey, idx);
    2918             :   }
    2919             : 
    2920          66 :  end:
    2921          66 :   tor_free(encoded_desc);
    2922          66 :   return;
    2923             : }
    2924             : 
    2925             : /** Set the revision counter in <b>hs_desc</b>. We do this by encrypting a
    2926             :  *  timestamp using an OPE scheme and using the ciphertext as our revision
    2927             :  *  counter.
    2928             :  *
    2929             :  *  If <b>is_current</b> is true, then this is the current HS descriptor,
    2930             :  *  otherwise it's the next one. */
    2931             : static void
    2932           0 : set_descriptor_revision_counter(hs_service_descriptor_t *hs_desc, time_t now,
    2933             :                                 bool is_current)
    2934             : {
    2935           0 :   uint64_t rev_counter = 0;
    2936             : 
    2937             :   /* Get current time */
    2938           0 :   time_t srv_start = 0;
    2939             : 
    2940             :   /* As our revision counter plaintext value, we use the seconds since the
    2941             :    * start of the SR protocol run that is relevant to this descriptor. This is
    2942             :    * guaranteed to be a positive value since we need the SRV to start making a
    2943             :    * descriptor (so that we know where to upload it).
    2944             :    *
    2945             :    * Depending on whether we are building the current or the next descriptor,
    2946             :    * services use a different SRV value. See [SERVICEUPLOAD] in
    2947             :    * rend-spec-v3.txt:
    2948             :    *
    2949             :    * In particular, for the current descriptor (aka first descriptor), Tor
    2950             :    * always uses the previous SRV for uploading the descriptor, and hence we
    2951             :    * should use the start time of the previous protocol run here.
    2952             :    *
    2953             :    * Whereas for the next descriptor (aka second descriptor), Tor always uses
    2954             :    * the current SRV for uploading the descriptor.  and hence we use the start
    2955             :    * time of the current protocol run.
    2956             :    */
    2957           0 :   if (is_current) {
    2958           0 :     srv_start = sr_state_get_start_time_of_previous_protocol_run();
    2959             :   } else {
    2960           0 :     srv_start = sr_state_get_start_time_of_current_protocol_run();
    2961             :   }
    2962             : 
    2963           0 :   log_info(LD_REND, "Setting rev counter for TP #%u: "
    2964             :            "SRV started at %d, now %d (%s)",
    2965             :            (unsigned) hs_desc->time_period_num, (int)srv_start,
    2966             :            (int)now, is_current ? "current" : "next");
    2967             : 
    2968           0 :   tor_assert_nonfatal(now >= srv_start);
    2969             : 
    2970             :   /* Compute seconds elapsed since the start of the time period. That's the
    2971             :    * number of seconds of how long this blinded key has been active. */
    2972           0 :   time_t seconds_since_start_of_srv = now - srv_start;
    2973             : 
    2974             :   /* Increment by one so that we are definitely sure this is strictly
    2975             :    * positive and not zero. */
    2976           0 :   seconds_since_start_of_srv++;
    2977             : 
    2978             :   /* Check for too big inputs. */
    2979           0 :   if (BUG(seconds_since_start_of_srv > OPE_INPUT_MAX)) {
    2980             :     seconds_since_start_of_srv = OPE_INPUT_MAX;
    2981             :   }
    2982             : 
    2983             :   /* Now we compute the final revision counter value by encrypting the
    2984             :      plaintext using our OPE cipher: */
    2985           0 :   tor_assert(hs_desc->ope_cipher);
    2986           0 :   rev_counter = crypto_ope_encrypt(hs_desc->ope_cipher,
    2987             :                                    (int) seconds_since_start_of_srv);
    2988             : 
    2989             :   /* The OPE module returns CRYPTO_OPE_ERROR in case of errors. */
    2990           0 :   tor_assert_nonfatal(rev_counter < CRYPTO_OPE_ERROR);
    2991             : 
    2992           0 :   log_info(LD_REND, "Encrypted revision counter %d to %" PRIu64,
    2993             :            (int) seconds_since_start_of_srv, rev_counter);
    2994             : 
    2995           0 :   hs_desc->desc->plaintext_data.revision_counter = rev_counter;
    2996           0 : }
    2997             : 
    2998             : /** Encode and sign the service descriptor desc and upload it to the
    2999             :  * responsible hidden service directories. If for_next_period is true, the set
    3000             :  * of directories are selected using the next hsdir_index. This does nothing
    3001             :  * if PublishHidServDescriptors is false. */
    3002             : STATIC void
    3003           9 : upload_descriptor_to_all(const hs_service_t *service,
    3004             :                          hs_service_descriptor_t *desc)
    3005             : {
    3006           9 :   smartlist_t *responsible_dirs = NULL;
    3007             : 
    3008           9 :   tor_assert(service);
    3009           9 :   tor_assert(desc);
    3010             : 
    3011             :   /* We'll first cancel any directory request that are ongoing for this
    3012             :    * descriptor. It is possible that we can trigger multiple uploads in a
    3013             :    * short time frame which can lead to a race where the second upload arrives
    3014             :    * before the first one leading to a 400 malformed descriptor response from
    3015             :    * the directory. Closing all pending requests avoids that. */
    3016           9 :   close_directory_connections(service, desc);
    3017             : 
    3018             :   /* Get our list of responsible HSDir. */
    3019           9 :   responsible_dirs = smartlist_new();
    3020             :   /* The parameter 0 means that we aren't a client so tell the function to use
    3021             :    * the spread store consensus parameter. */
    3022           9 :   hs_get_responsible_hsdirs(&desc->blinded_kp.pubkey, desc->time_period_num,
    3023           9 :                             service->desc_next == desc, 0, responsible_dirs);
    3024             : 
    3025             :   /** Clear list of previous hsdirs since we are about to upload to a new
    3026             :    *  list. Let's keep it up to date. */
    3027           9 :   service_desc_clear_previous_hsdirs(desc);
    3028             : 
    3029             :   /* For each responsible HSDir we have, initiate an upload command. */
    3030          75 :   SMARTLIST_FOREACH_BEGIN(responsible_dirs, const routerstatus_t *,
    3031             :                           hsdir_rs) {
    3032          66 :     const node_t *hsdir_node = node_get_by_id(hsdir_rs->identity_digest);
    3033             :     /* Getting responsible hsdir implies that the node_t object exists for the
    3034             :      * routerstatus_t found in the consensus else we have a problem. */
    3035          66 :     tor_assert(hsdir_node);
    3036             :     /* Upload this descriptor to the chosen directory. */
    3037          66 :     upload_descriptor_to_hsdir(service, desc, hsdir_node);
    3038          66 :   } SMARTLIST_FOREACH_END(hsdir_rs);
    3039             : 
    3040             :   /* Set the next upload time for this descriptor. Even if we are configured
    3041             :    * to not upload, we still want to follow the right cycle of life for this
    3042             :    * descriptor. */
    3043          18 :   desc->next_upload_time =
    3044           9 :     (time(NULL) + crypto_rand_int_range(HS_SERVICE_NEXT_UPLOAD_TIME_MIN,
    3045             :                                         HS_SERVICE_NEXT_UPLOAD_TIME_MAX));
    3046             :   {
    3047           9 :     char fmt_next_time[ISO_TIME_LEN+1];
    3048           9 :     format_local_iso_time(fmt_next_time, desc->next_upload_time);
    3049           9 :     log_debug(LD_REND, "Service %s set to upload a descriptor at %s",
    3050             :               safe_str_client(service->onion_address), fmt_next_time);
    3051             :   }
    3052             : 
    3053           9 :   smartlist_free(responsible_dirs);
    3054           9 :   return;
    3055             : }
    3056             : 
    3057             : /** The set of HSDirs have changed: check if the change affects our descriptor
    3058             :  *  HSDir placement, and if it does, reupload the desc. */
    3059             : STATIC int
    3060           2 : service_desc_hsdirs_changed(const hs_service_t *service,
    3061             :                             const hs_service_descriptor_t *desc)
    3062             : {
    3063           2 :   int should_reupload = 0;
    3064           2 :   smartlist_t *responsible_dirs = smartlist_new();
    3065             : 
    3066             :   /* No desc upload has happened yet: it will happen eventually */
    3067           2 :   if (!desc->previous_hsdirs || !smartlist_len(desc->previous_hsdirs)) {
    3068           0 :     goto done;
    3069             :   }
    3070             : 
    3071             :   /* Get list of responsible hsdirs */
    3072           2 :   hs_get_responsible_hsdirs(&desc->blinded_kp.pubkey, desc->time_period_num,
    3073           2 :                             service->desc_next == desc, 0, responsible_dirs);
    3074             : 
    3075             :   /* Check if any new hsdirs have been added to the responsible hsdirs set:
    3076             :    * Iterate over the list of new hsdirs, and reupload if any of them is not
    3077             :    * present in the list of previous hsdirs.
    3078             :    */
    3079          12 :   SMARTLIST_FOREACH_BEGIN(responsible_dirs, const routerstatus_t *, hsdir_rs) {
    3080          12 :     char b64_digest[BASE64_DIGEST_LEN+1] = {0};
    3081          12 :     digest_to_base64(b64_digest, hsdir_rs->identity_digest);
    3082             : 
    3083          12 :     if (!smartlist_contains_string(desc->previous_hsdirs, b64_digest)) {
    3084           2 :       should_reupload = 1;
    3085           2 :       break;
    3086             :     }
    3087          10 :   } SMARTLIST_FOREACH_END(hsdir_rs);
    3088             : 
    3089           0 :  done:
    3090           2 :   smartlist_free(responsible_dirs);
    3091             : 
    3092           2 :   return should_reupload;
    3093             : }
    3094             : 
    3095             : /** These are all the reasons why a descriptor upload can't occur. We use
    3096             :  * those to log the reason properly with the right rate limiting and for the
    3097             :  * right descriptor. */
    3098             : typedef enum {
    3099             :   LOG_DESC_UPLOAD_REASON_MISSING_IPS = 0,
    3100             :   LOG_DESC_UPLOAD_REASON_IP_NOT_ESTABLISHED = 1,
    3101             :   LOG_DESC_UPLOAD_REASON_NOT_TIME = 2,
    3102             :   LOG_DESC_UPLOAD_REASON_NO_LIVE_CONSENSUS = 3,
    3103             :   LOG_DESC_UPLOAD_REASON_NO_DIRINFO = 4,
    3104             : } log_desc_upload_reason_t;
    3105             : 
    3106             : /** Maximum number of reasons. This is used to allocate the static array of
    3107             :  * all rate limiting objects. */
    3108             : #define LOG_DESC_UPLOAD_REASON_MAX LOG_DESC_UPLOAD_REASON_NO_DIRINFO
    3109             : 
    3110             : /** Log the reason why we can't upload the given descriptor for the given
    3111             :  * service. This takes a message string (allocated by the caller) and a
    3112             :  * reason.
    3113             :  *
    3114             :  * Depending on the reason and descriptor, different rate limit applies. This
    3115             :  * is done because this function will basically be called every second. Each
    3116             :  * descriptor for each reason uses its own log rate limit object in order to
    3117             :  * avoid message suppression for different reasons and descriptors. */
    3118             : static void
    3119          18 : log_cant_upload_desc(const hs_service_t *service,
    3120             :                      const hs_service_descriptor_t *desc, const char *msg,
    3121             :                      const log_desc_upload_reason_t reason)
    3122             : {
    3123             :   /* Writing the log every minute shouldn't be too annoying for log rate limit
    3124             :    * since this can be emitted every second for each descriptor.
    3125             :    *
    3126             :    * However, for one specific case, we increase it to 10 minutes because it
    3127             :    * is hit constantly, as an expected behavior, which is the reason
    3128             :    * indicating that it is not the time to upload. */
    3129          18 :   static ratelim_t limits[2][LOG_DESC_UPLOAD_REASON_MAX + 1] =
    3130             :     { { RATELIM_INIT(60), RATELIM_INIT(60), RATELIM_INIT(60 * 10),
    3131             :         RATELIM_INIT(60), RATELIM_INIT(60) },
    3132             :       { RATELIM_INIT(60), RATELIM_INIT(60), RATELIM_INIT(60 * 10),
    3133             :         RATELIM_INIT(60), RATELIM_INIT(60) },
    3134             :     };
    3135          18 :   bool is_next_desc = false;
    3136          18 :   unsigned int rlim_pos = 0;
    3137          18 :   ratelim_t *rlim = NULL;
    3138             : 
    3139          18 :   tor_assert(service);
    3140          18 :   tor_assert(desc);
    3141          18 :   tor_assert(msg);
    3142             : 
    3143             :   /* Make sure the reason value is valid. It should never happen because we
    3144             :    * control that value in the code flow but will be apparent during
    3145             :    * development if a reason is added but LOG_DESC_UPLOAD_REASON_NUM_ is not
    3146             :    * updated. */
    3147          18 :   if (BUG(reason > LOG_DESC_UPLOAD_REASON_MAX)) {
    3148           0 :     return;
    3149             :   }
    3150             : 
    3151             :   /* Ease our life. Flag that tells us if the descriptor is the next one. */
    3152          18 :   is_next_desc = (service->desc_next == desc);
    3153             : 
    3154             :   /* Current descriptor is the first element in the ratelimit object array.
    3155             :    * The next descriptor is the second element. */
    3156          18 :   rlim_pos = (is_next_desc ? 1 : 0);
    3157             :   /* Get the ratelimit object for the reason _and_ right descriptor. */
    3158          18 :   rlim = &limits[rlim_pos][reason];
    3159             : 
    3160          27 :   log_fn_ratelim(rlim, LOG_INFO, LD_REND,
    3161             :                  "Service %s can't upload its %s descriptor: %s",
    3162             :                  safe_str_client(service->onion_address),
    3163             :                  (is_next_desc) ? "next" : "current", msg);
    3164             : }
    3165             : 
    3166             : /** Return 1 if the given descriptor from the given service can be uploaded
    3167             :  * else return 0 if it can not. */
    3168             : static int
    3169          18 : should_service_upload_descriptor(const hs_service_t *service,
    3170             :                               const hs_service_descriptor_t *desc, time_t now)
    3171             : {
    3172          18 :   char *msg = NULL;
    3173          18 :   unsigned int num_intro_points, count_ip_established;
    3174             : 
    3175          18 :   tor_assert(service);
    3176          18 :   tor_assert(desc);
    3177             : 
    3178             :   /* If this descriptors has missing intro points that is that it couldn't get
    3179             :    * them all when it was time to pick them, it means that we should upload
    3180             :    * instead of waiting an arbitrary amount of time breaking the service.
    3181             :    * Else, if we have no missing intro points, we use the value taken from the
    3182             :    * service configuration. */
    3183          18 :   if (desc->missing_intro_points) {
    3184           1 :     num_intro_points = digest256map_size(desc->intro_points.map);
    3185             :   } else {
    3186          17 :     num_intro_points = service->config.num_intro_points;
    3187             :   }
    3188             : 
    3189             :   /* This means we tried to pick intro points but couldn't get any so do not
    3190             :    * upload descriptor in this case. We need at least one for the service to
    3191             :    * be reachable. */
    3192          18 :   if (desc->missing_intro_points && num_intro_points == 0) {
    3193           1 :     msg = tor_strdup("Missing intro points");
    3194           1 :     log_cant_upload_desc(service, desc, msg,
    3195             :                          LOG_DESC_UPLOAD_REASON_MISSING_IPS);
    3196           1 :     goto cannot;
    3197             :   }
    3198             : 
    3199             :   /* Check if all our introduction circuit have been established for all the
    3200             :    * intro points we have selected. */
    3201          17 :   count_ip_established = count_desc_circuit_established(desc);
    3202          17 :   if (count_ip_established != num_intro_points) {
    3203           7 :     tor_asprintf(&msg, "Intro circuits aren't yet all established (%d/%d).",
    3204             :                  count_ip_established, num_intro_points);
    3205           7 :     log_cant_upload_desc(service, desc, msg,
    3206             :                          LOG_DESC_UPLOAD_REASON_IP_NOT_ESTABLISHED);
    3207           7 :     goto cannot;
    3208             :   }
    3209             : 
    3210             :   /* Is it the right time to upload? */
    3211          10 :   if (desc->next_upload_time > now) {
    3212           1 :     tor_asprintf(&msg, "Next upload time is %ld, it is now %ld.",
    3213             :                  (long int) desc->next_upload_time, (long int) now);
    3214           1 :     log_cant_upload_desc(service, desc, msg,
    3215             :                          LOG_DESC_UPLOAD_REASON_NOT_TIME);
    3216           1 :     goto cannot;
    3217             :   }
    3218             : 
    3219             :   /* Don't upload desc if we don't have a live consensus */
    3220           9 :   if (!networkstatus_get_reasonably_live_consensus(now,
    3221             :                                             usable_consensus_flavor())) {
    3222           2 :     msg = tor_strdup("No reasonably live consensus");
    3223           2 :     log_cant_upload_desc(service, desc, msg,
    3224             :                          LOG_DESC_UPLOAD_REASON_NO_LIVE_CONSENSUS);
    3225           2 :     goto cannot;
    3226             :   }
    3227             : 
    3228             :   /* Do we know enough router descriptors to have adequate vision of the HSDir
    3229             :      hash ring? */
    3230           7 :   if (!router_have_minimum_dir_info()) {
    3231           7 :     msg = tor_strdup("Not enough directory information");
    3232           7 :     log_cant_upload_desc(service, desc, msg,
    3233             :                          LOG_DESC_UPLOAD_REASON_NO_DIRINFO);
    3234           7 :     goto cannot;
    3235             :   }
    3236             : 
    3237             :   /* Can upload! */
    3238             :   return 1;
    3239             : 
    3240          18 :  cannot:
    3241          18 :   tor_free(msg);
    3242          18 :   return 0;
    3243             : }
    3244             : 
    3245             : /** Refresh the given service descriptor meaning this will update every mutable
    3246             :  * field that needs to be updated before we upload.
    3247             :  *
    3248             :  * This should ONLY be called before uploading a descriptor. It assumes that
    3249             :  * the descriptor has been built (desc->desc) and that all intro point
    3250             :  * circuits have been established.  */
    3251             : static void
    3252           0 : refresh_service_descriptor(const hs_service_t *service,
    3253             :                            hs_service_descriptor_t *desc, time_t now)
    3254             : {
    3255             :   /* There are few fields that we consider "mutable" in the descriptor meaning
    3256             :    * we need to update them regularly over the lifetime for the descriptor.
    3257             :    * The rest are set once and should not be modified.
    3258             :    *
    3259             :    *  - Signing key certificate.
    3260             :    *  - Revision counter.
    3261             :    *  - Introduction points which includes many thing. See
    3262             :    *    hs_desc_intro_point_t. and the setup_desc_intro_point() function.
    3263             :    */
    3264             : 
    3265             :   /* Create the signing key certificate. */
    3266           0 :   build_desc_signing_key_cert(desc, now);
    3267             : 
    3268             :   /* Build the intro points descriptor section. The refresh step is just
    3269             :    * before we upload so all circuits have been properly established. */
    3270           0 :   build_desc_intro_points(service, desc, now);
    3271             : 
    3272             :   /* Set the desc revision counter right before uploading */
    3273           0 :   set_descriptor_revision_counter(desc, now, service->desc_current == desc);
    3274           0 : }
    3275             : 
    3276             : /** Scheduled event run from the main loop. Try to upload the descriptor for
    3277             :  * each service. */
    3278             : STATIC void
    3279           9 : run_upload_descriptor_event(time_t now)
    3280             : {
    3281             :   /* Run v3+ check. */
    3282          18 :   FOR_EACH_SERVICE_BEGIN(service) {
    3283          27 :     FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
    3284             :       /* If we were asked to re-examine the hash ring, and it changed, then
    3285             :          schedule an upload */
    3286          18 :       if (consider_republishing_hs_descriptors &&
    3287           0 :           service_desc_hsdirs_changed(service, desc)) {
    3288           0 :         service_desc_schedule_upload(desc, now, 0);
    3289             :       }
    3290             : 
    3291             :       /* Can this descriptor be uploaded? */
    3292          18 :       if (!should_service_upload_descriptor(service, desc, now)) {
    3293          18 :         continue;
    3294             :       }
    3295             : 
    3296           0 :       log_info(LD_REND, "Initiating upload for hidden service %s descriptor "
    3297             :                         "for service %s with %u/%u introduction points%s.",
    3298             :                (desc == service->desc_current) ? "current" : "next",
    3299             :                safe_str_client(service->onion_address),
    3300             :                digest256map_size(desc->intro_points.map),
    3301             :                service->config.num_intro_points,
    3302             :                (desc->missing_intro_points) ? " (couldn't pick more)" : "");
    3303             : 
    3304             :       /* We are about to upload so we need to do one last step which is to
    3305             :        * update the service's descriptor mutable fields in order to upload a
    3306             :        * coherent descriptor. */
    3307           0 :       refresh_service_descriptor(service, desc, now);
    3308             : 
    3309             :       /* Proceed with the upload, the descriptor is ready to be encoded. */
    3310           0 :       upload_descriptor_to_all(service, desc);
    3311           9 :     } FOR_EACH_DESCRIPTOR_END;
    3312           9 :   } FOR_EACH_SERVICE_END;
    3313             : 
    3314             :   /* We are done considering whether to republish rend descriptors */
    3315           9 :   consider_republishing_hs_descriptors = 0;
    3316           9 : }
    3317             : 
    3318             : /** Called when the introduction point circuit is done building and ready to be
    3319             :  * used. */
    3320             : static void
    3321           3 : service_intro_circ_has_opened(origin_circuit_t *circ)
    3322             : {
    3323           3 :   hs_service_t *service = NULL;
    3324           3 :   hs_service_intro_point_t *ip = NULL;
    3325           3 :   hs_service_descriptor_t *desc = NULL;
    3326             : 
    3327           3 :   tor_assert(circ);
    3328             : 
    3329             :   /* Let's do some basic sanity checking of the circ state */
    3330           3 :   if (BUG(!circ->cpath)) {
    3331           0 :     return;
    3332             :   }
    3333           3 :   if (BUG(TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO)) {
    3334           0 :     return;
    3335             :   }
    3336           3 :   if (BUG(!circ->hs_ident)) {
    3337           0 :     return;
    3338             :   }
    3339             : 
    3340             :   /* Get the corresponding service and intro point. */
    3341           3 :   get_objects_from_ident(circ->hs_ident, &service, &ip, &desc);
    3342             : 
    3343           3 :   if (service == NULL) {
    3344           1 :     log_warn(LD_REND, "Unknown service identity key %s on the introduction "
    3345             :                       "circuit %u. Can't find onion service.",
    3346             :              safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)),
    3347             :              TO_CIRCUIT(circ)->n_circ_id);
    3348           1 :     goto err;
    3349             :   }
    3350           2 :   if (ip == NULL) {
    3351           1 :     log_warn(LD_REND, "Unknown introduction point auth key on circuit %u "
    3352             :                       "for service %s",
    3353             :              TO_CIRCUIT(circ)->n_circ_id,
    3354             :              safe_str_client(service->onion_address));
    3355           1 :     goto err;
    3356             :   }
    3357             :   /* We can't have an IP object without a descriptor. */
    3358           1 :   tor_assert(desc);
    3359             : 
    3360           1 :   if (hs_circ_service_intro_has_opened(service, ip, desc, circ)) {
    3361             :     /* Getting here means that the circuit has been re-purposed because we
    3362             :      * have enough intro circuit opened. Remove the IP from the service. */
    3363           0 :     service_intro_point_remove(service, ip);
    3364           0 :     service_intro_point_free(ip);
    3365             :   }
    3366             : 
    3367           1 :   goto done;
    3368             : 
    3369           2 :  err:
    3370             :   /* Close circuit, we can't use it. */
    3371           2 :   circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_NOSUCHSERVICE);
    3372           3 :  done:
    3373             :   return;
    3374             : }
    3375             : 
    3376             : /** Called when a rendezvous circuit is done building and ready to be used. */
    3377             : static void
    3378           2 : service_rendezvous_circ_has_opened(origin_circuit_t *circ)
    3379             : {
    3380           2 :   hs_service_t *service = NULL;
    3381             : 
    3382           2 :   tor_assert(circ);
    3383           2 :   tor_assert(circ->cpath);
    3384             :   /* Getting here means this is a v3 rendezvous circuit. */
    3385           2 :   tor_assert(circ->hs_ident);
    3386           2 :   tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND);
    3387             : 
    3388             :   /* Declare the circuit dirty to avoid reuse, and for path-bias. We set the
    3389             :    * timestamp regardless of its content because that circuit could have been
    3390             :    * cannibalized so in any cases, we are about to use that circuit more. */
    3391           2 :   TO_CIRCUIT(circ)->timestamp_dirty = time(NULL);
    3392           2 :   pathbias_count_use_attempt(circ);
    3393             : 
    3394             :   /* Get the corresponding service and intro point. */
    3395           2 :   get_objects_from_ident(circ->hs_ident, &service, NULL, NULL);
    3396           2 :   if (service == NULL) {
    3397           1 :     log_warn(LD_REND, "Unknown service identity key %s on the rendezvous "
    3398             :                       "circuit %u with cookie %s. Can't find onion service.",
    3399             :              safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)),
    3400             :              TO_CIRCUIT(circ)->n_circ_id,
    3401             :              hex_str((const char *) circ->hs_ident->rendezvous_cookie,
    3402             :                      REND_COOKIE_LEN));
    3403           1 :     goto err;
    3404             :   }
    3405             : 
    3406             :   /* If the cell can't be sent, the circuit will be closed within this
    3407             :    * function. */
    3408           1 :   hs_circ_service_rp_has_opened(service, circ);
    3409             : 
    3410             :   /* Update metrics that we have an established rendezvous circuit. It is not
    3411             :    * entirely true until the client receives the RENDEZVOUS2 cell and starts
    3412             :    * sending but if that circuit collapes, we'll decrement the counter thus it
    3413             :    * will even out the metric. */
    3414           1 :   if (TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_REND_JOINED) {
    3415           1 :     hs_metrics_new_established_rdv(service);
    3416             :   }
    3417             : 
    3418           1 :   goto done;
    3419             : 
    3420           1 :  err:
    3421           1 :   circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_NOSUCHSERVICE);
    3422           2 :  done:
    3423           2 :   return;
    3424             : }
    3425             : 
    3426             : /** We've been expecting an INTRO_ESTABLISHED cell on this circuit and it just
    3427             :  * arrived. Handle the INTRO_ESTABLISHED cell arriving on the given
    3428             :  * introduction circuit. Return 0 on success else a negative value. */
    3429             : static int
    3430           3 : service_handle_intro_established(origin_circuit_t *circ,
    3431             :                                  const uint8_t *payload,
    3432             :                                  size_t payload_len)
    3433             : {
    3434           3 :   hs_service_t *service = NULL;
    3435           3 :   hs_service_intro_point_t *ip = NULL;
    3436             : 
    3437           3 :   tor_assert(circ);
    3438           3 :   tor_assert(payload);
    3439           3 :   tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO);
    3440             : 
    3441             :   /* We need the service and intro point for this cell. */
    3442           3 :   get_objects_from_ident(circ->hs_ident, &service, &ip, NULL);
    3443             : 
    3444             :   /* Get service object from the circuit identifier. */
    3445           3 :   if (service == NULL) {
    3446           1 :     log_warn(LD_REND, "Unknown service identity key %s on the introduction "
    3447             :                       "circuit %u. Can't find onion service.",
    3448             :              safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)),
    3449             :              TO_CIRCUIT(circ)->n_circ_id);
    3450           1 :     goto err;
    3451             :   }
    3452           2 :   if (ip == NULL) {
    3453             :     /* We don't recognize the key. */
    3454           1 :     log_warn(LD_REND, "Introduction circuit established without an intro "
    3455             :                       "point object on circuit %u for service %s",
    3456             :              TO_CIRCUIT(circ)->n_circ_id,
    3457             :              safe_str_client(service->onion_address));
    3458           1 :     goto err;
    3459             :   }
    3460             : 
    3461             :   /* Try to parse the payload into a cell making sure we do actually have a
    3462             :    * valid cell. On success, the ip object and circuit purpose is updated to
    3463             :    * reflect the fact that the introduction circuit is established. */
    3464           1 :   if (hs_circ_handle_intro_established(service, ip, circ, payload,
    3465             :                                        payload_len) < 0) {
    3466           0 :     goto err;
    3467             :   }
    3468             : 
    3469             :   /* Update metrics. */
    3470           1 :   hs_metrics_new_established_intro(service);
    3471             : 
    3472           1 :   log_info(LD_REND, "Successfully received an INTRO_ESTABLISHED cell "
    3473             :                     "on circuit %u for service %s",
    3474             :            TO_CIRCUIT(circ)->n_circ_id,
    3475             :            safe_str_client(service->onion_address));
    3476           1 :   return 0;
    3477             : 
    3478             :  err:
    3479             :   return -1;
    3480             : }
    3481             : 
    3482             : /** We just received an INTRODUCE2 cell on the established introduction circuit
    3483             :  * circ. Handle the cell and return 0 on success else a negative value. */
    3484             : static int
    3485           3 : service_handle_introduce2(origin_circuit_t *circ, const uint8_t *payload,
    3486             :                           size_t payload_len)
    3487             : {
    3488           3 :   hs_service_t *service = NULL;
    3489           3 :   hs_service_intro_point_t *ip = NULL;
    3490           3 :   hs_service_descriptor_t *desc = NULL;
    3491             : 
    3492           3 :   tor_assert(circ);
    3493           3 :   tor_assert(payload);
    3494           3 :   tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_INTRO);
    3495             : 
    3496             :   /* We'll need every object associated with this circuit. */
    3497           3 :   get_objects_from_ident(circ->hs_ident, &service, &ip, &desc);
    3498             : 
    3499             :   /* Get service object from the circuit identifier. */
    3500           3 :   if (service == NULL) {
    3501           1 :     log_warn(LD_BUG, "Unknown service identity key %s when handling "
    3502             :                      "an INTRODUCE2 cell on circuit %u",
    3503             :              safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)),
    3504             :              TO_CIRCUIT(circ)->n_circ_id);
    3505           1 :     goto err;
    3506             :   }
    3507           2 :   if (ip == NULL) {
    3508             :     /* We don't recognize the key. */
    3509           1 :     log_warn(LD_BUG, "Unknown introduction auth key when handling "
    3510             :                      "an INTRODUCE2 cell on circuit %u for service %s",
    3511             :              TO_CIRCUIT(circ)->n_circ_id,
    3512             :              safe_str_client(service->onion_address));
    3513           1 :     goto err;
    3514             :   }
    3515             :   /* If we have an IP object, we MUST have a descriptor object. */
    3516           1 :   tor_assert(desc);
    3517             : 
    3518             :   /* The following will parse, decode and launch the rendezvous point circuit.
    3519             :    * Both current and legacy cells are handled. */
    3520           1 :   if (hs_circ_handle_introduce2(service, circ, ip, &desc->desc->subcredential,
    3521             :                                 payload, payload_len) < 0) {
    3522           1 :     goto err;
    3523             :   }
    3524             :   /* Update metrics that a new introduction was successful. */
    3525           0 :   hs_metrics_new_introduction(service);
    3526             : 
    3527           0 :   return 0;
    3528             :  err:
    3529             :   return -1;
    3530             : }
    3531             : 
    3532             : /** Add to list every filename used by service. This is used by the sandbox
    3533             :  * subsystem. */
    3534             : static void
    3535           0 : service_add_fnames_to_list(const hs_service_t *service, smartlist_t *list)
    3536             : {
    3537           0 :   const char *s_dir;
    3538           0 :   char fname[128] = {0};
    3539             : 
    3540           0 :   tor_assert(service);
    3541           0 :   tor_assert(list);
    3542             : 
    3543             :   /* Ease our life. */
    3544           0 :   s_dir = service->config.directory_path;
    3545             :   /* The hostname file. */
    3546           0 :   smartlist_add(list, hs_path_from_filename(s_dir, fname_hostname));
    3547             :   /* The key files split in two. */
    3548           0 :   tor_snprintf(fname, sizeof(fname), "%s_secret_key", fname_keyfile_prefix);
    3549           0 :   smartlist_add(list, hs_path_from_filename(s_dir, fname));
    3550           0 :   tor_snprintf(fname, sizeof(fname), "%s_public_key", fname_keyfile_prefix);
    3551           0 :   smartlist_add(list, hs_path_from_filename(s_dir, fname));
    3552           0 : }
    3553             : 
    3554             : /** Return true iff the given service identity key is present on disk. */
    3555             : static int
    3556          11 : service_key_on_disk(const char *directory_path)
    3557             : {
    3558          11 :   int ret = 0;
    3559          11 :   char *fname;
    3560          11 :   ed25519_keypair_t *kp = NULL;
    3561             : 
    3562          11 :   tor_assert(directory_path);
    3563             : 
    3564             :   /* Build the v3 key path name and then try to load it. */
    3565          11 :   fname = hs_path_from_filename(directory_path, fname_keyfile_prefix);
    3566          11 :   kp = ed_key_init_from_file(fname, INIT_ED_KEY_SPLIT,
    3567             :                              LOG_DEBUG, NULL, 0, 0, 0, NULL, NULL);
    3568          11 :   if (kp) {
    3569           0 :     ret = 1;
    3570             :   }
    3571             : 
    3572          11 :   ed25519_keypair_free(kp);
    3573          11 :   tor_free(fname);
    3574             : 
    3575          11 :   return ret;
    3576             : }
    3577             : 
    3578             : /** This is a proxy function before actually calling hs_desc_encode_descriptor
    3579             :  * because we need some preprocessing here */
    3580             : static int
    3581         110 : service_encode_descriptor(const hs_service_t *service,
    3582             :                           const hs_service_descriptor_t *desc,
    3583             :                           const ed25519_keypair_t *signing_kp,
    3584             :                           char **encoded_out)
    3585             : {
    3586         110 :   int ret;
    3587         110 :   const uint8_t *descriptor_cookie = NULL;
    3588             : 
    3589         110 :   tor_assert(service);
    3590         110 :   tor_assert(desc);
    3591         110 :   tor_assert(encoded_out);
    3592             : 
    3593             :   /* If the client authorization is enabled, send the descriptor cookie to
    3594             :    * hs_desc_encode_descriptor. Otherwise, send NULL */
    3595         110 :   if (is_client_auth_enabled(service)) {
    3596           4 :     descriptor_cookie = desc->descriptor_cookie;
    3597             :   }
    3598             : 
    3599         110 :   ret = hs_desc_encode_descriptor(desc->desc, signing_kp,
    3600             :                                   descriptor_cookie, encoded_out);
    3601             : 
    3602         110 :   return ret;
    3603             : }
    3604             : 
    3605             : /* ========== */
    3606             : /* Public API */
    3607             : /* ========== */
    3608             : 
    3609             : /* Are HiddenServiceSingleHopMode and HiddenServiceNonAnonymousMode consistent?
    3610             :  */
    3611             : static int
    3612        2186 : hs_service_non_anonymous_mode_consistent(const or_options_t *options)
    3613             : {
    3614             :   /* !! is used to make these options boolean */
    3615        2186 :   return (!! options->HiddenServiceSingleHopMode ==
    3616        2186 :           !! options->HiddenServiceNonAnonymousMode);
    3617             : }
    3618             : 
    3619             : /* Do the options allow onion services to make direct (non-anonymous)
    3620             :  * connections to introduction or rendezvous points?
    3621             :  * Must only be called after options_validate_single_onion() has successfully
    3622             :  * checked onion service option consistency.
    3623             :  * Returns true if tor is in HiddenServiceSingleHopMode. */
    3624             : int
    3625         930 : hs_service_allow_non_anonymous_connection(const or_options_t *options)
    3626             : {
    3627         930 :   tor_assert(hs_service_non_anonymous_mode_consistent(options));
    3628         930 :   return options->HiddenServiceSingleHopMode ? 1 : 0;
    3629             : }
    3630             : 
    3631             : /* Do the options allow us to reveal the exact startup time of the onion
    3632             :  * service?
    3633             :  * Single Onion Services prioritise availability over hiding their
    3634             :  * startup time, as their IP address is publicly discoverable anyway.
    3635             :  * Must only be called after options_validate_single_onion() has successfully
    3636             :  * checked onion service option consistency.
    3637             :  * Returns true if tor is in non-anonymous hidden service mode. */
    3638             : int
    3639           0 : hs_service_reveal_startup_time(const or_options_t *options)
    3640             : {
    3641           0 :   tor_assert(hs_service_non_anonymous_mode_consistent(options));
    3642           0 :   return hs_service_non_anonymous_mode_enabled(options);
    3643             : }
    3644             : 
    3645             : /* Is non-anonymous mode enabled using the HiddenServiceNonAnonymousMode
    3646             :  * config option?
    3647             :  * Must only be called after options_validate_single_onion() has successfully
    3648             :  * checked onion service option consistency.
    3649             :  */
    3650             : int
    3651        1256 : hs_service_non_anonymous_mode_enabled(const or_options_t *options)
    3652             : {
    3653        1256 :   tor_assert(hs_service_non_anonymous_mode_consistent(options));
    3654        1256 :   return options->HiddenServiceNonAnonymousMode ? 1 : 0;
    3655             : }
    3656             : 
    3657             : /** Called when a circuit was just cleaned up. This is done right before the
    3658             :  * circuit is marked for close. */
    3659             : void
    3660           1 : hs_service_circuit_cleanup_on_close(const circuit_t *circ)
    3661             : {
    3662           1 :   tor_assert(circ);
    3663           1 :   tor_assert(CIRCUIT_IS_ORIGIN(circ));
    3664             : 
    3665           1 :   switch (circ->purpose) {
    3666           0 :   case CIRCUIT_PURPOSE_S_INTRO:
    3667             :     /* About to close an established introduction circuit. Update the metrics
    3668             :      * to reflect how many we have at the moment. */
    3669           0 :     hs_metrics_close_established_intro(
    3670             :       &CONST_TO_ORIGIN_CIRCUIT(circ)->hs_ident->identity_pk);
    3671           0 :     break;
    3672           0 :   case CIRCUIT_PURPOSE_S_REND_JOINED:
    3673             :     /* About to close an established rendezvous circuit. Update the metrics to
    3674             :      * reflect how many we have at the moment. */
    3675           0 :     hs_metrics_close_established_rdv(
    3676             :       &CONST_TO_ORIGIN_CIRCUIT(circ)->hs_ident->identity_pk);
    3677           0 :     break;
    3678             :   default:
    3679             :     break;
    3680             :   }
    3681           1 : }
    3682             : 
    3683             : /** This is called every time the service map changes that is if an
    3684             :  * element is added or removed. */
    3685             : void
    3686          67 : hs_service_map_has_changed(void)
    3687             : {
    3688             :   /* If we now have services where previously we had not, we need to enable
    3689             :    * the HS service main loop event. If we changed to having no services, we
    3690             :    * need to disable the event. */
    3691          67 :   rescan_periodic_events(get_options());
    3692          67 : }
    3693             : 
    3694             : /** Upload an encoded descriptor in encoded_desc of the given version. This
    3695             :  * descriptor is for the service identity_pk and blinded_pk used to setup the
    3696             :  * directory connection identifier. It is uploaded to the directory hsdir_rs
    3697             :  * routerstatus_t object.
    3698             :  *
    3699             :  * NOTE: This function does NOT check for PublishHidServDescriptors because it
    3700             :  * is only used by the control port command HSPOST outside of this subsystem.
    3701             :  * Inside this code, upload_descriptor_to_hsdir() should be used. */
    3702             : void
    3703          66 : hs_service_upload_desc_to_dir(const char *encoded_desc,
    3704             :                               const uint8_t version,
    3705             :                               const ed25519_public_key_t *identity_pk,
    3706             :                               const ed25519_public_key_t *blinded_pk,
    3707             :                               const routerstatus_t *hsdir_rs)
    3708             : {
    3709          66 :   char version_str[4] = {0};
    3710          66 :   directory_request_t *dir_req;
    3711          66 :   hs_ident_dir_conn_t ident;
    3712             : 
    3713          66 :   tor_assert(encoded_desc);
    3714          66 :   tor_assert(identity_pk);
    3715          66 :   tor_assert(blinded_pk);
    3716          66 :   tor_assert(hsdir_rs);
    3717             : 
    3718             :   /* Setup the connection identifier. */
    3719          66 :   memset(&ident, 0, sizeof(ident));
    3720          66 :   hs_ident_dir_conn_init(identity_pk, blinded_pk, &ident);
    3721             : 
    3722             :   /* This is our resource when uploading which is used to construct the URL
    3723             :    * with the version number: "/tor/hs/<version>/publish". */
    3724          66 :   tor_snprintf(version_str, sizeof(version_str), "%u", version);
    3725             : 
    3726             :   /* Build the directory request for this HSDir. */
    3727          66 :   dir_req = directory_request_new(DIR_PURPOSE_UPLOAD_HSDESC);
    3728          66 :   directory_request_set_routerstatus(dir_req, hsdir_rs);
    3729          66 :   directory_request_set_indirection(dir_req, DIRIND_ANONYMOUS);
    3730          66 :   directory_request_set_resource(dir_req, version_str);
    3731          66 :   directory_request_set_payload(dir_req, encoded_desc,
    3732             :                                 strlen(encoded_desc));
    3733             :   /* The ident object is copied over the directory connection object once
    3734             :    * the directory request is initiated. */
    3735          66 :   directory_request_upload_set_hs_ident(dir_req, &ident);
    3736             : 
    3737             :   /* Initiate the directory request to the hsdir.*/
    3738          66 :   directory_initiate_request(dir_req);
    3739          66 :   directory_request_free(dir_req);
    3740          66 : }
    3741             : 
    3742             : /** Add the ephemeral service using the secret key sk and ports. Both max
    3743             :  * streams parameter will be set in the newly created service.
    3744             :  *
    3745             :  * Ownership of sk, ports, and auth_clients_v3 is passed to this routine.
    3746             :  * Regardless of success/failure, callers should not touch these values
    3747             :  * after calling this routine, and may assume that correct cleanup has
    3748             :  * been done on failure.
    3749             :  *
    3750             :  * Return an appropriate hs_service_add_ephemeral_status_t. */
    3751             : hs_service_add_ephemeral_status_t
    3752           4 : hs_service_add_ephemeral(ed25519_secret_key_t *sk, smartlist_t *ports,
    3753             :                          int max_streams_per_rdv_circuit,
    3754             :                          int max_streams_close_circuit,
    3755             :                          smartlist_t *auth_clients_v3, char **address_out)
    3756             : {
    3757           4 :   hs_service_add_ephemeral_status_t ret;
    3758           4 :   hs_service_t *service = NULL;
    3759             : 
    3760           4 :   tor_assert(sk);
    3761           4 :   tor_assert(ports);
    3762           4 :   tor_assert(address_out);
    3763             : 
    3764           4 :   service = hs_service_new(get_options());
    3765             : 
    3766             :   /* Setup the service configuration with specifics. A default service is
    3767             :    * HS_VERSION_TWO so explicitly set it. */
    3768           4 :   service->config.version = HS_VERSION_THREE;
    3769           4 :   service->config.max_streams_per_rdv_circuit = max_streams_per_rdv_circuit;
    3770           4 :   service->config.max_streams_close_circuit = !!max_streams_close_circuit;
    3771           4 :   service->config.is_ephemeral = 1;
    3772           4 :   smartlist_free(service->config.ports);
    3773           4 :   service->config.ports = ports;
    3774             : 
    3775             :   /* Handle the keys. */
    3776           4 :   memcpy(&service->keys.identity_sk, sk, sizeof(service->keys.identity_sk));
    3777           4 :   if (ed25519_public_key_generate(&service->keys.identity_pk,
    3778             :                                   &service->keys.identity_sk) < 0) {
    3779           0 :     log_warn(LD_CONFIG, "Unable to generate ed25519 public key"
    3780             :                         "for v3 service.");
    3781           0 :     ret = RSAE_BADPRIVKEY;
    3782           0 :     goto err;
    3783             :   }
    3784             : 
    3785           4 :   if (ed25519_validate_pubkey(&service->keys.identity_pk) < 0) {
    3786           1 :     log_warn(LD_CONFIG, "Bad ed25519 private key was provided");
    3787           1 :     ret = RSAE_BADPRIVKEY;
    3788           1 :     goto err;
    3789             :   }
    3790             : 
    3791             :   /* Make sure we have at least one port. */
    3792           3 :   if (smartlist_len(service->config.ports) == 0) {
    3793           0 :     log_warn(LD_CONFIG, "At least one VIRTPORT/TARGET must be specified "
    3794             :                         "for v3 service.");
    3795           0 :     ret = RSAE_BADVIRTPORT;
    3796           0 :     goto err;
    3797             :   }
    3798             : 
    3799           3 :   if (auth_clients_v3) {
    3800           3 :     service->config.clients = smartlist_new();
    3801           6 :     SMARTLIST_FOREACH(auth_clients_v3, hs_service_authorized_client_t *, c, {
    3802             :       if (c != NULL) {
    3803             :         smartlist_add(service->config.clients, c);
    3804             :       }
    3805             :     });
    3806           3 :     smartlist_free(auth_clients_v3);
    3807             :   }
    3808             : 
    3809             :   /* Build the onion address for logging purposes but also the control port
    3810             :    * uses it for the HS_DESC event. */
    3811           3 :   hs_build_address(&service->keys.identity_pk,
    3812           3 :                    (uint8_t) service->config.version,
    3813           3 :                    service->onion_address);
    3814             : 
    3815             :   /* The only way the registration can fail is if the service public key
    3816             :    * already exists. */
    3817           3 :   if (BUG(register_service(hs_service_map, service) < 0)) {
    3818           0 :     log_warn(LD_CONFIG, "Onion Service private key collides with an "
    3819             :                         "existing v3 service.");
    3820           0 :     ret = RSAE_ADDREXISTS;
    3821           0 :     goto err;
    3822             :   }
    3823             : 
    3824           3 :   log_info(LD_CONFIG, "Added ephemeral v3 onion service: %s",
    3825             :            safe_str_client(service->onion_address));
    3826             : 
    3827           3 :   *address_out = tor_strdup(service->onion_address);
    3828           3 :   ret = RSAE_OKAY;
    3829           3 :   goto end;
    3830             : 
    3831           1 :  err:
    3832           1 :   hs_service_free(service);
    3833             : 
    3834           4 :  end:
    3835           4 :   memwipe(sk, 0, sizeof(ed25519_secret_key_t));
    3836           4 :   tor_free(sk);
    3837           4 :   return ret;
    3838             : }
    3839             : 
    3840             : /** For the given onion address, delete the ephemeral service. Return 0 on
    3841             :  * success else -1 on error. */
    3842             : int
    3843           0 : hs_service_del_ephemeral(const char *address)
    3844             : {
    3845           0 :   uint8_t version;
    3846           0 :   ed25519_public_key_t pk;
    3847           0 :   hs_service_t *service = NULL;
    3848             : 
    3849           0 :   tor_assert(address);
    3850             : 
    3851           0 :   if (hs_parse_address(address, &pk, NULL, &version) < 0) {
    3852           0 :     log_warn(LD_CONFIG, "Requested malformed v3 onion address for removal.");
    3853           0 :     goto err;
    3854             :   }
    3855             : 
    3856           0 :   if (version != HS_VERSION_THREE) {
    3857           0 :     log_warn(LD_CONFIG, "Requested version of onion address for removal "
    3858             :                         "is not supported.");
    3859           0 :     goto err;
    3860             :   }
    3861             : 
    3862           0 :   service = find_service(hs_service_map, &pk);
    3863           0 :   if (service == NULL) {
    3864           0 :     log_warn(LD_CONFIG, "Requested non-existent v3 hidden service for "
    3865             :                         "removal.");
    3866           0 :     goto err;
    3867             :   }
    3868             : 
    3869           0 :   if (!service->config.is_ephemeral) {
    3870           0 :     log_warn(LD_CONFIG, "Requested non-ephemeral v3 hidden service for "
    3871             :                         "removal.");
    3872           0 :     goto err;
    3873             :   }
    3874             : 
    3875             :   /* Close introduction circuits, remove from map and finally free. Notice
    3876             :    * that the rendezvous circuits aren't closed in order for any existing
    3877             :    * connections to finish. We let the application terminate them. */
    3878           0 :   close_service_intro_circuits(service);
    3879           0 :   remove_service(hs_service_map, service);
    3880           0 :   hs_service_free(service);
    3881             : 
    3882           0 :   log_info(LD_CONFIG, "Removed ephemeral v3 hidden service: %s",
    3883             :            safe_str_client(address));
    3884           0 :   return 0;
    3885             : 
    3886             :  err:
    3887             :   return -1;
    3888             : }
    3889             : 
    3890             : /** Using the ed25519 public key pk, find a service for that key and return the
    3891             :  * current encoded descriptor as a newly allocated string or NULL if not
    3892             :  * found. This is used by the control port subsystem. */
    3893             : char *
    3894           0 : hs_service_lookup_current_desc(const ed25519_public_key_t *pk)
    3895             : {
    3896           0 :   const hs_service_t *service;
    3897             : 
    3898           0 :   tor_assert(pk);
    3899             : 
    3900           0 :   service = find_service(hs_service_map, pk);
    3901           0 :   if (service && service->desc_current) {
    3902           0 :     char *encoded_desc = NULL;
    3903             :     /* No matter what is the result (which should never be a failure), return
    3904             :      * the encoded variable, if success it will contain the right thing else
    3905             :      * it will be NULL. */
    3906           0 :     service_encode_descriptor(service,
    3907             :                               service->desc_current,
    3908           0 :                               &service->desc_current->signing_kp,
    3909             :                               &encoded_desc);
    3910           0 :     return encoded_desc;
    3911             :   }
    3912             : 
    3913             :   return NULL;
    3914             : }
    3915             : 
    3916             : /** Return the number of service we have configured and usable. */
    3917       45493 : MOCK_IMPL(unsigned int,
    3918             : hs_service_get_num_services,(void))
    3919             : {
    3920       45493 :   if (hs_service_map == NULL) {
    3921             :     return 0;
    3922             :   }
    3923       42335 :   return HT_SIZE(hs_service_map);
    3924             : }
    3925             : 
    3926             : /** Given conn, a rendezvous edge connection acting as an exit stream, look up
    3927             :  * the hidden service for the circuit circ, and look up the port and address
    3928             :  * based on the connection port. Assign the actual connection address.
    3929             :  *
    3930             :  * Return 0 on success. Return -1 on failure and the caller should NOT close
    3931             :  * the circuit. Return -2 on failure and the caller MUST close the circuit for
    3932             :  * security reasons. */
    3933             : int
    3934           0 : hs_service_set_conn_addr_port(const origin_circuit_t *circ,
    3935             :                               edge_connection_t *conn)
    3936             : {
    3937           0 :   hs_service_t *service = NULL;
    3938             : 
    3939           0 :   tor_assert(circ);
    3940           0 :   tor_assert(conn);
    3941           0 :   tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_REND_JOINED);
    3942           0 :   tor_assert(circ->hs_ident);
    3943             : 
    3944           0 :   get_objects_from_ident(circ->hs_ident, &service, NULL, NULL);
    3945             : 
    3946           0 :   if (service == NULL) {
    3947           0 :     log_warn(LD_REND, "Unable to find any hidden service associated "
    3948             :                       "identity key %s on rendezvous circuit %u.",
    3949             :              ed25519_fmt(&circ->hs_ident->identity_pk),
    3950             :              TO_CIRCUIT(circ)->n_circ_id);
    3951             :     /* We want the caller to close the circuit because it's not a valid
    3952             :      * service so no danger. Attempting to bruteforce the entire key space by
    3953             :      * opening circuits to learn which service is being hosted here is
    3954             :      * impractical. */
    3955           0 :     goto err_close;
    3956             :   }
    3957             : 
    3958             :   /* Enforce the streams-per-circuit limit, and refuse to provide a mapping if
    3959             :    * this circuit will exceed the limit. */
    3960           0 :   if (service->config.max_streams_per_rdv_circuit > 0 &&
    3961           0 :       (circ->hs_ident->num_rdv_streams >=
    3962             :        service->config.max_streams_per_rdv_circuit)) {
    3963             : #define MAX_STREAM_WARN_INTERVAL 600
    3964           0 :     static struct ratelim_t stream_ratelim =
    3965             :       RATELIM_INIT(MAX_STREAM_WARN_INTERVAL);
    3966           0 :     log_fn_ratelim(&stream_ratelim, LOG_WARN, LD_REND,
    3967             :                    "Maximum streams per circuit limit reached on "
    3968             :                    "rendezvous circuit %u for service %s. Circuit has "
    3969             :                    "%" PRIu64 " out of %" PRIu64 " streams. %s.",
    3970             :                    TO_CIRCUIT(circ)->n_circ_id,
    3971             :                    service->onion_address,
    3972             :                    circ->hs_ident->num_rdv_streams,
    3973             :                    service->config.max_streams_per_rdv_circuit,
    3974             :                    service->config.max_streams_close_circuit ?
    3975             :                     "Closing circuit" : "Ignoring open stream request");
    3976           0 :     if (service->config.max_streams_close_circuit) {
    3977             :       /* Service explicitly configured to close immediately. */
    3978           0 :       goto err_close;
    3979             :     }
    3980             :     /* Exceeding the limit makes tor silently ignore the stream creation
    3981             :      * request and keep the circuit open. */
    3982           0 :     goto err_no_close;
    3983             :   }
    3984             : 
    3985             :   /* Find a virtual port of that service matching the one in the connection if
    3986             :    * successful, set the address in the connection. */
    3987           0 :   if (hs_set_conn_addr_port(service->config.ports, conn) < 0) {
    3988           0 :     log_info(LD_REND, "No virtual port mapping exists for port %d for "
    3989             :                       "hidden service %s.",
    3990             :              TO_CONN(conn)->port, service->onion_address);
    3991           0 :     if (service->config.allow_unknown_ports) {
    3992             :       /* Service explicitly allow connection to unknown ports so close right
    3993             :        * away because we do not care about port mapping. */
    3994           0 :       goto err_close;
    3995             :     }
    3996             :     /* If the service didn't explicitly allow it, we do NOT close the circuit
    3997             :      * here to raise the bar in terms of performance for port mapping. */
    3998           0 :     goto err_no_close;
    3999             :   }
    4000             : 
    4001             :   /* Success. */
    4002             :   return 0;
    4003             :  err_close:
    4004             :   /* Indicate the caller that the circuit should be closed. */
    4005             :   return -2;
    4006             :  err_no_close:
    4007             :   /* Indicate the caller to NOT close the circuit. */
    4008             :   return -1;
    4009             : }
    4010             : 
    4011             : /** Does the service with identity pubkey <b>pk</b> export the circuit IDs of
    4012             :  *  its clients?  */
    4013             : hs_circuit_id_protocol_t
    4014           2 : hs_service_exports_circuit_id(const ed25519_public_key_t *pk)
    4015             : {
    4016           2 :   hs_service_t *service = find_service(hs_service_map, pk);
    4017           2 :   if (!service) {
    4018             :     return HS_CIRCUIT_ID_PROTOCOL_NONE;
    4019             :   }
    4020             : 
    4021           2 :   return service->config.circuit_id_protocol;
    4022             : }
    4023             : 
    4024             : /** Add to file_list every filename used by a configured hidden service, and to
    4025             :  * dir_list every directory path used by a configured hidden service. This is
    4026             :  * used by the sandbox subsystem to allowlist those. */
    4027             : void
    4028           0 : hs_service_lists_fnames_for_sandbox(smartlist_t *file_list,
    4029             :                                     smartlist_t *dir_list)
    4030             : {
    4031           0 :   tor_assert(file_list);
    4032           0 :   tor_assert(dir_list);
    4033             : 
    4034             :   /* Add files and dirs for v3+. */
    4035           0 :   FOR_EACH_SERVICE_BEGIN(service) {
    4036             :     /* Skip ephemeral service, they don't touch the disk. */
    4037           0 :     if (service->config.is_ephemeral) {
    4038           0 :       continue;
    4039             :     }
    4040           0 :     service_add_fnames_to_list(service, file_list);
    4041           0 :     smartlist_add_strdup(dir_list, service->config.directory_path);
    4042           0 :     smartlist_add_strdup(dir_list, dname_client_pubkeys);
    4043           0 :   } FOR_EACH_DESCRIPTOR_END;
    4044           0 : }
    4045             : 
    4046             : /** Called when our internal view of the directory has changed. We might have
    4047             :  * received a new batch of descriptors which might affect the shape of the
    4048             :  * HSDir hash ring. Signal that we should reexamine the hash ring and
    4049             :  * re-upload our HS descriptors if needed. */
    4050             : void
    4051       45174 : hs_service_dir_info_changed(void)
    4052             : {
    4053       45174 :   if (hs_service_get_num_services() > 0) {
    4054             :     /* New directory information usually goes every consensus so rate limit
    4055             :      * every 30 minutes to not be too conservative. */
    4056           3 :     static struct ratelim_t dir_info_changed_ratelim = RATELIM_INIT(30 * 60);
    4057           3 :     log_fn_ratelim(&dir_info_changed_ratelim, LOG_INFO, LD_REND,
    4058             :                    "New dirinfo arrived: consider reuploading descriptor");
    4059           3 :     consider_republishing_hs_descriptors = 1;
    4060             :   }
    4061       45174 : }
    4062             : 
    4063             : /** Called when we get an INTRODUCE2 cell on the circ. Respond to the cell and
    4064             :  * launch a circuit to the rendezvous point. */
    4065             : int
    4066           4 : hs_service_receive_introduce2(origin_circuit_t *circ, const uint8_t *payload,
    4067             :                               size_t payload_len)
    4068             : {
    4069           4 :   int ret = -1;
    4070             : 
    4071           4 :   tor_assert(circ);
    4072           4 :   tor_assert(payload);
    4073             : 
    4074             :   /* Do some initial validation and logging before we parse the cell */
    4075           4 :   if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_INTRO) {
    4076           1 :     log_warn(LD_PROTOCOL, "Received an INTRODUCE2 cell on a "
    4077             :                           "non introduction circuit of purpose %d",
    4078             :              TO_CIRCUIT(circ)->purpose);
    4079           1 :     goto done;
    4080             :   }
    4081             : 
    4082           3 :   if (circ->hs_ident) {
    4083           3 :     ret = service_handle_introduce2(circ, payload, payload_len);
    4084           3 :     hs_stats_note_introduce2_cell();
    4085             :   }
    4086             : 
    4087           0 :  done:
    4088           4 :   return ret;
    4089             : }
    4090             : 
    4091             : /** Called when we get an INTRO_ESTABLISHED cell. Mark the circuit as an
    4092             :  * established introduction point. Return 0 on success else a negative value
    4093             :  * and the circuit is closed. */
    4094             : int
    4095           4 : hs_service_receive_intro_established(origin_circuit_t *circ,
    4096             :                                      const uint8_t *payload,
    4097             :                                      size_t payload_len)
    4098             : {
    4099           4 :   int ret = -1;
    4100             : 
    4101           4 :   tor_assert(circ);
    4102           4 :   tor_assert(payload);
    4103             : 
    4104           4 :   if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) {
    4105           1 :     log_warn(LD_PROTOCOL, "Received an INTRO_ESTABLISHED cell on a "
    4106             :                           "non introduction circuit of purpose %d",
    4107             :              TO_CIRCUIT(circ)->purpose);
    4108           1 :     goto err;
    4109             :   }
    4110             : 
    4111           3 :   if (circ->hs_ident) {
    4112           3 :     ret = service_handle_intro_established(circ, payload, payload_len);
    4113             :   }
    4114             : 
    4115           3 :   if (ret < 0) {
    4116           2 :     goto err;
    4117             :   }
    4118             :   return 0;
    4119           3 :  err:
    4120           3 :   circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
    4121           3 :   return -1;
    4122             : }
    4123             : 
    4124             : /** Called when any kind of hidden service circuit is done building thus
    4125             :  * opened. This is the entry point from the circuit subsystem. */
    4126             : void
    4127           5 : hs_service_circuit_has_opened(origin_circuit_t *circ)
    4128             : {
    4129           5 :   tor_assert(circ);
    4130             : 
    4131           5 :   switch (TO_CIRCUIT(circ)->purpose) {
    4132           3 :   case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO:
    4133           3 :     if (circ->hs_ident) {
    4134           3 :       service_intro_circ_has_opened(circ);
    4135             :     }
    4136             :     break;
    4137           2 :   case CIRCUIT_PURPOSE_S_CONNECT_REND:
    4138           2 :     if (circ->hs_ident) {
    4139           2 :       service_rendezvous_circ_has_opened(circ);
    4140             :     }
    4141             :     break;
    4142             :   default:
    4143           0 :     tor_assert(0);
    4144             :   }
    4145           5 : }
    4146             : 
    4147             : /** Return the service version by looking at the key in the service directory.
    4148             :  * If the key is not found or unrecognized, -1 is returned. Else, the service
    4149             :  * version is returned. */
    4150             : int
    4151          11 : hs_service_get_version_from_key(const hs_service_t *service)
    4152             : {
    4153          11 :   int version = -1; /* Unknown version. */
    4154          11 :   const char *directory_path;
    4155             : 
    4156          11 :   tor_assert(service);
    4157             : 
    4158             :   /* We'll try to load the key for version 3. If not found, we'll try version
    4159             :    * 2 and if not found, we'll send back an unknown version (-1). */
    4160          11 :   directory_path = service->config.directory_path;
    4161             : 
    4162             :   /* Version 3 check. */
    4163          11 :   if (service_key_on_disk(directory_path)) {
    4164           0 :     version = HS_VERSION_THREE;
    4165           0 :     goto end;
    4166             :   }
    4167             : 
    4168          11 :  end:
    4169          11 :   return version;
    4170             : }
    4171             : 
    4172             : /** Load and/or generate keys for all onion services including the client
    4173             :  * authorization if any. Return 0 on success, -1 on failure. */
    4174             : int
    4175           8 : hs_service_load_all_keys(void)
    4176             : {
    4177             :   /* Load or/and generate them for v3+. */
    4178          12 :   SMARTLIST_FOREACH_BEGIN(hs_service_staging_list, hs_service_t *, service) {
    4179             :     /* Ignore ephemeral service, they already have their keys set. */
    4180           4 :     if (service->config.is_ephemeral) {
    4181           0 :       continue;
    4182             :     }
    4183           4 :     log_info(LD_REND, "Loading v3 onion service keys from %s",
    4184             :              service_escaped_dir(service));
    4185           4 :     if (load_service_keys(service) < 0) {
    4186           0 :       goto err;
    4187             :     }
    4188           4 :   } SMARTLIST_FOREACH_END(service);
    4189             : 
    4190             :   /* Final step, the staging list contains service in a quiescent state that
    4191             :    * is ready to be used. Register them to the global map. Once this is over,
    4192             :    * the staging list will be cleaned up. */
    4193           8 :   register_all_services();
    4194             : 
    4195             :   /* All keys have been loaded successfully. */
    4196           8 :   return 0;
    4197           0 :  err:
    4198           0 :   return -1;
    4199             : }
    4200             : 
    4201             : /** Log the status of introduction points for all version 3 onion services
    4202             :  * at log severity <b>severity</b>.
    4203             :  */
    4204             : void
    4205           0 : hs_service_dump_stats(int severity)
    4206             : {
    4207           0 :   origin_circuit_t *circ;
    4208             : 
    4209           0 :   FOR_EACH_SERVICE_BEGIN(hs) {
    4210             : 
    4211           0 :     tor_log(severity, LD_GENERAL, "Service configured in %s:",
    4212             :             service_escaped_dir(hs));
    4213           0 :     FOR_EACH_DESCRIPTOR_BEGIN(hs, desc) {
    4214             : 
    4215           0 :       DIGEST256MAP_FOREACH(desc->intro_points.map, key,
    4216             :                            hs_service_intro_point_t *, ip) {
    4217           0 :         const node_t *intro_node;
    4218           0 :         const char *nickname;
    4219             : 
    4220           0 :         intro_node = get_node_from_intro_point(ip);
    4221           0 :         if (!intro_node) {
    4222           0 :           tor_log(severity, LD_GENERAL, "  Couldn't find intro point, "
    4223             :                   "skipping");
    4224           0 :           continue;
    4225             :         }
    4226           0 :         nickname = node_get_nickname(intro_node);
    4227           0 :         if (!nickname) {
    4228           0 :           continue;
    4229             :         }
    4230             : 
    4231           0 :         circ = hs_circ_service_get_intro_circ(ip);
    4232           0 :         if (!circ) {
    4233           0 :           tor_log(severity, LD_GENERAL, "  Intro point at %s: no circuit",
    4234             :                   nickname);
    4235           0 :           continue;
    4236             :         }
    4237           0 :         tor_log(severity, LD_GENERAL, "  Intro point %s: circuit is %s",
    4238           0 :                 nickname, circuit_state_to_string(circ->base_.state));
    4239           0 :       } DIGEST256MAP_FOREACH_END;
    4240             : 
    4241           0 :     } FOR_EACH_DESCRIPTOR_END;
    4242           0 :   } FOR_EACH_SERVICE_END;
    4243           0 : }
    4244             : 
    4245             : /** Put all service object in the given service list. After this, the caller
    4246             :  * looses ownership of every elements in the list and responsible to free the
    4247             :  * list pointer. */
    4248             : void
    4249          10 : hs_service_stage_services(const smartlist_t *service_list)
    4250             : {
    4251          10 :   tor_assert(service_list);
    4252             :   /* This list is freed at registration time but this function can be called
    4253             :    * multiple time. */
    4254          10 :   if (hs_service_staging_list == NULL) {
    4255           0 :     hs_service_staging_list = smartlist_new();
    4256             :   }
    4257             :   /* Add all service object to our staging list. Caller is responsible for
    4258             :    * freeing the service_list. */
    4259          10 :   smartlist_add_all(hs_service_staging_list, service_list);
    4260          10 : }
    4261             : 
    4262             : /** Return a newly allocated list of all the service's metrics store. */
    4263             : smartlist_t *
    4264           1 : hs_service_get_metrics_stores(void)
    4265             : {
    4266           1 :   smartlist_t *list = smartlist_new();
    4267             : 
    4268           1 :   if (hs_service_map) {
    4269           0 :     FOR_EACH_SERVICE_BEGIN(service) {
    4270           0 :       smartlist_add(list, service->metrics.store);
    4271           1 :     } FOR_EACH_SERVICE_END;
    4272             :   }
    4273             : 
    4274           1 :   return list;
    4275             : }
    4276             : 
    4277             : /** Lookup the global service map for the given identitiy public key and
    4278             :  * return the service object if found, NULL if not. */
    4279             : hs_service_t *
    4280           1 : hs_service_find(const ed25519_public_key_t *identity_pk)
    4281             : {
    4282           1 :   tor_assert(identity_pk);
    4283             : 
    4284           1 :   if (!hs_service_map) {
    4285             :     return NULL;
    4286             :   }
    4287           1 :   return find_service(hs_service_map, identity_pk);
    4288             : }
    4289             : 
    4290             : /** Allocate and initialize a service object. The service configuration will
    4291             :  * contain the default values. Return the newly allocated object pointer. This
    4292             :  * function can't fail. */
    4293             : hs_service_t *
    4294          70 : hs_service_new(const or_options_t *options)
    4295             : {
    4296          70 :   hs_service_t *service = tor_malloc_zero(sizeof(hs_service_t));
    4297             :   /* Set default configuration value. */
    4298          70 :   set_service_default_config(&service->config, options);
    4299             :   /* Set the default service version. */
    4300          70 :   service->config.version = HS_SERVICE_DEFAULT_VERSION;
    4301             :   /* Allocate the CLIENT_PK replay cache in service state. */
    4302         140 :   service->state.replay_cache_rend_cookie =
    4303          70 :     replaycache_new(REND_REPLAY_TIME_INTERVAL, REND_REPLAY_TIME_INTERVAL);
    4304             : 
    4305          70 :   return service;
    4306             : }
    4307             : 
    4308             : /** Free the given <b>service</b> object and all its content. This function
    4309             :  * also takes care of wiping service keys from memory. It is safe to pass a
    4310             :  * NULL pointer. */
    4311             : void
    4312          74 : hs_service_free_(hs_service_t *service)
    4313             : {
    4314          74 :   if (service == NULL) {
    4315             :     return;
    4316             :   }
    4317             : 
    4318             :   /* Free descriptors. Go over both descriptor with this loop. */
    4319         219 :   FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
    4320         146 :     service_descriptor_free(desc);
    4321          73 :   } FOR_EACH_DESCRIPTOR_END;
    4322             : 
    4323             :   /* Free service configuration. */
    4324          73 :   service_clear_config(&service->config);
    4325             : 
    4326             :   /* Free replay cache from state. */
    4327          73 :   if (service->state.replay_cache_rend_cookie) {
    4328          69 :     replaycache_free(service->state.replay_cache_rend_cookie);
    4329             :   }
    4330             : 
    4331             :   /* Free onionbalance subcredentials (if any) */
    4332          73 :   if (service->state.ob_subcreds) {
    4333           0 :     tor_free(service->state.ob_subcreds);
    4334             :   }
    4335             : 
    4336             :   /* Free metrics object. */
    4337          73 :   hs_metrics_service_free(service);
    4338             : 
    4339             :   /* Wipe service keys. */
    4340          73 :   memwipe(&service->keys.identity_sk, 0, sizeof(service->keys.identity_sk));
    4341             : 
    4342          73 :   tor_free(service);
    4343             : }
    4344             : 
    4345             : /** Periodic callback. Entry point from the main loop to the HS service
    4346             :  * subsystem. This is call every second. This is skipped if tor can't build a
    4347             :  * circuit or the network is disabled. */
    4348             : void
    4349           0 : hs_service_run_scheduled_events(time_t now)
    4350             : {
    4351             :   /* First thing we'll do here is to make sure our services are in a
    4352             :    * quiescent state for the scheduled events. */
    4353           0 :   run_housekeeping_event(now);
    4354             : 
    4355             :   /* Order matters here. We first make sure the descriptor object for each
    4356             :    * service contains the latest data. Once done, we check if we need to open
    4357             :    * new introduction circuit. Finally, we try to upload the descriptor for
    4358             :    * each service. */
    4359             : 
    4360             :   /* Make sure descriptors are up to date. */
    4361           0 :   run_build_descriptor_event(now);
    4362             :   /* Make sure services have enough circuits. */
    4363           0 :   run_build_circuit_event(now);
    4364             :   /* Upload the descriptors if needed/possible. */
    4365           0 :   run_upload_descriptor_event(now);
    4366           0 : }
    4367             : 
    4368             : /** Initialize the service HS subsystem. */
    4369             : void
    4370         291 : hs_service_init(void)
    4371             : {
    4372             :   /* Should never be called twice. */
    4373         291 :   tor_assert(!hs_service_map);
    4374         291 :   tor_assert(!hs_service_staging_list);
    4375             : 
    4376         291 :   hs_service_map = tor_malloc_zero(sizeof(struct hs_service_ht));
    4377         291 :   HT_INIT(hs_service_ht, hs_service_map);
    4378             : 
    4379         291 :   hs_service_staging_list = smartlist_new();
    4380         291 : }
    4381             : 
    4382             : /** Release all global storage of the hidden service subsystem. */
    4383             : void
    4384         285 : hs_service_free_all(void)
    4385             : {
    4386         285 :   service_free_all();
    4387         285 :   hs_config_free_all();
    4388         285 : }
    4389             : 
    4390             : #ifdef TOR_UNIT_TESTS
    4391             : 
    4392             : /** Return the global service map size. Only used by unit test. */
    4393             : STATIC unsigned int
    4394           7 : get_hs_service_map_size(void)
    4395             : {
    4396           7 :   return HT_SIZE(hs_service_map);
    4397             : }
    4398             : 
    4399             : /** Return the staging list size. Only used by unit test. */
    4400             : STATIC int
    4401           5 : get_hs_service_staging_list_size(void)
    4402             : {
    4403           5 :   return smartlist_len(hs_service_staging_list);
    4404             : }
    4405             : 
    4406             : STATIC hs_service_ht *
    4407          53 : get_hs_service_map(void)
    4408             : {
    4409          53 :   return hs_service_map;
    4410             : }
    4411             : 
    4412             : STATIC hs_service_t *
    4413           4 : get_first_service(void)
    4414             : {
    4415           4 :   hs_service_t **obj = HT_START(hs_service_ht, hs_service_map);
    4416           4 :   if (obj == NULL) {
    4417             :     return NULL;
    4418             :   }
    4419           4 :   return *obj;
    4420             : }
    4421             : 
    4422             : #endif /* defined(TOR_UNIT_TESTS) */

Generated by: LCOV version 1.14