mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-28 14:23:30 +01:00
hs_service.c: repair doxygen comments
This commit is contained in:
parent
0e9e5c37b7
commit
ca26ea03fc
@ -67,7 +67,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Helper macro. Iterate over every service in the global map. The var is the
|
/** Helper macro. Iterate over every service in the global map. The var is the
|
||||||
* name of the service pointer. */
|
* name of the service pointer. */
|
||||||
#define FOR_EACH_SERVICE_BEGIN(var) \
|
#define FOR_EACH_SERVICE_BEGIN(var) \
|
||||||
STMT_BEGIN \
|
STMT_BEGIN \
|
||||||
@ -76,7 +76,7 @@
|
|||||||
var = *var##_iter;
|
var = *var##_iter;
|
||||||
#define FOR_EACH_SERVICE_END } STMT_END ;
|
#define FOR_EACH_SERVICE_END } STMT_END ;
|
||||||
|
|
||||||
/* Helper macro. Iterate over both current and previous descriptor of a
|
/** Helper macro. Iterate over both current and previous descriptor of a
|
||||||
* service. The var is the name of the descriptor pointer. This macro skips
|
* service. The var is the name of the descriptor pointer. This macro skips
|
||||||
* any descriptor object of the service that is NULL. */
|
* any descriptor object of the service that is NULL. */
|
||||||
#define FOR_EACH_DESCRIPTOR_BEGIN(service, var) \
|
#define FOR_EACH_DESCRIPTOR_BEGIN(service, var) \
|
||||||
@ -95,7 +95,7 @@ static const char dname_client_pubkeys[] = "authorized_clients";
|
|||||||
static const char fname_hostname[] = "hostname";
|
static const char fname_hostname[] = "hostname";
|
||||||
static const char address_tld[] = "onion";
|
static const char address_tld[] = "onion";
|
||||||
|
|
||||||
/* Staging list of service object. When configuring service, we add them to
|
/** Staging list of service object. When configuring service, we add them to
|
||||||
* this list considered a staging area and they will get added to our global
|
* this list considered a staging area and they will get added to our global
|
||||||
* map once the keys have been loaded. These two steps are separated because
|
* map once the keys have been loaded. These two steps are separated because
|
||||||
* loading keys requires that we are an actual running tor process. */
|
* loading keys requires that we are an actual running tor process. */
|
||||||
@ -118,7 +118,7 @@ static int service_encode_descriptor(const hs_service_t *service,
|
|||||||
const ed25519_keypair_t *signing_kp,
|
const ed25519_keypair_t *signing_kp,
|
||||||
char **encoded_out);
|
char **encoded_out);
|
||||||
|
|
||||||
/* Helper: Function to compare two objects in the service map. Return 1 if the
|
/** Helper: Function to compare two objects in the service map. Return 1 if the
|
||||||
* two service have the same master public identity key. */
|
* two service have the same master public identity key. */
|
||||||
static inline int
|
static inline int
|
||||||
hs_service_ht_eq(const hs_service_t *first, const hs_service_t *second)
|
hs_service_ht_eq(const hs_service_t *first, const hs_service_t *second)
|
||||||
@ -130,7 +130,7 @@ hs_service_ht_eq(const hs_service_t *first, const hs_service_t *second)
|
|||||||
&second->keys.identity_pk);
|
&second->keys.identity_pk);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper: Function for the service hash table code below. The key used is the
|
/** Helper: Function for the service hash table code below. The key used is the
|
||||||
* master public identity key which is ultimately the onion address. */
|
* master public identity key which is ultimately the onion address. */
|
||||||
static inline unsigned int
|
static inline unsigned int
|
||||||
hs_service_ht_hash(const hs_service_t *service)
|
hs_service_ht_hash(const hs_service_t *service)
|
||||||
@ -140,7 +140,7 @@ hs_service_ht_hash(const hs_service_t *service)
|
|||||||
sizeof(service->keys.identity_pk.pubkey));
|
sizeof(service->keys.identity_pk.pubkey));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is _the_ global hash map of hidden services which indexed the service
|
/** This is _the_ global hash map of hidden services which indexed the service
|
||||||
* contained in it by master public identity key which is roughly the onion
|
* contained in it by master public identity key which is roughly the onion
|
||||||
* address of the service. */
|
* address of the service. */
|
||||||
static struct hs_service_ht *hs_service_map;
|
static struct hs_service_ht *hs_service_map;
|
||||||
@ -156,7 +156,7 @@ HT_GENERATE2(hs_service_ht, hs_service_t, hs_service_node,
|
|||||||
hs_service_ht_hash, hs_service_ht_eq,
|
hs_service_ht_hash, hs_service_ht_eq,
|
||||||
0.6, tor_reallocarray, tor_free_)
|
0.6, tor_reallocarray, tor_free_)
|
||||||
|
|
||||||
/* Query the given service map with a public key and return a service object
|
/** Query the given service map with a public key and return a service object
|
||||||
* if found else NULL. It is also possible to set a directory path in the
|
* if found else NULL. It is also possible to set a directory path in the
|
||||||
* search query. If pk is NULL, then it will be set to zero indicating the
|
* search query. If pk is NULL, then it will be set to zero indicating the
|
||||||
* hash table to compare the directory path instead. */
|
* hash table to compare the directory path instead. */
|
||||||
@ -171,7 +171,7 @@ find_service(hs_service_ht *map, const ed25519_public_key_t *pk)
|
|||||||
return HT_FIND(hs_service_ht, map, &dummy_service);
|
return HT_FIND(hs_service_ht, map, &dummy_service);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register the given service in the given map. If the service already exists
|
/** Register the given service in the given map. If the service already exists
|
||||||
* in the map, -1 is returned. On success, 0 is returned and the service
|
* in the map, -1 is returned. On success, 0 is returned and the service
|
||||||
* ownership has been transferred to the global map. */
|
* ownership has been transferred to the global map. */
|
||||||
STATIC int
|
STATIC int
|
||||||
@ -196,7 +196,7 @@ register_service(hs_service_ht *map, hs_service_t *service)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove a given service from the given map. If service is NULL or the
|
/** Remove a given service from the given map. If service is NULL or the
|
||||||
* service key is unset, return gracefully. */
|
* service key is unset, return gracefully. */
|
||||||
STATIC void
|
STATIC void
|
||||||
remove_service(hs_service_ht *map, hs_service_t *service)
|
remove_service(hs_service_ht *map, hs_service_t *service)
|
||||||
@ -226,7 +226,7 @@ remove_service(hs_service_ht *map, hs_service_t *service)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the default values for a service configuration object <b>c</b>. */
|
/** Set the default values for a service configuration object <b>c</b>. */
|
||||||
static void
|
static void
|
||||||
set_service_default_config(hs_service_config_t *c,
|
set_service_default_config(hs_service_config_t *c,
|
||||||
const or_options_t *options)
|
const or_options_t *options)
|
||||||
@ -247,7 +247,7 @@ set_service_default_config(hs_service_config_t *c,
|
|||||||
c->intro_dos_burst_per_sec = HS_CONFIG_V3_DOS_DEFENSE_BURST_PER_SEC_DEFAULT;
|
c->intro_dos_burst_per_sec = HS_CONFIG_V3_DOS_DEFENSE_BURST_PER_SEC_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* From a service configuration object config, clear everything from it
|
/** From a service configuration object config, clear everything from it
|
||||||
* meaning free allocated pointers and reset the values. */
|
* meaning free allocated pointers and reset the values. */
|
||||||
STATIC void
|
STATIC void
|
||||||
service_clear_config(hs_service_config_t *config)
|
service_clear_config(hs_service_config_t *config)
|
||||||
@ -269,7 +269,7 @@ service_clear_config(hs_service_config_t *config)
|
|||||||
memset(config, 0, sizeof(*config));
|
memset(config, 0, sizeof(*config));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper function to return a human readable description of the given intro
|
/** Helper function to return a human readable description of the given intro
|
||||||
* point object.
|
* point object.
|
||||||
*
|
*
|
||||||
* This function is not thread-safe. Each call to this invalidates the
|
* This function is not thread-safe. Each call to this invalidates the
|
||||||
@ -301,7 +301,7 @@ describe_intro_point(const hs_service_intro_point_t *ip)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the lower bound of maximum INTRODUCE2 cells per circuit before we
|
/** Return the lower bound of maximum INTRODUCE2 cells per circuit before we
|
||||||
* rotate intro point (defined by a consensus parameter or the default
|
* rotate intro point (defined by a consensus parameter or the default
|
||||||
* value). */
|
* value). */
|
||||||
static int32_t
|
static int32_t
|
||||||
@ -314,7 +314,7 @@ get_intro_point_min_introduce2(void)
|
|||||||
0, INT32_MAX);
|
0, INT32_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the upper bound of maximum INTRODUCE2 cells per circuit before we
|
/** Return the upper bound of maximum INTRODUCE2 cells per circuit before we
|
||||||
* rotate intro point (defined by a consensus parameter or the default
|
* rotate intro point (defined by a consensus parameter or the default
|
||||||
* value). */
|
* value). */
|
||||||
static int32_t
|
static int32_t
|
||||||
@ -327,8 +327,8 @@ get_intro_point_max_introduce2(void)
|
|||||||
0, INT32_MAX);
|
0, INT32_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the minimum lifetime in seconds of an introduction point defined by a
|
/** Return the minimum lifetime in seconds of an introduction point defined by
|
||||||
* consensus parameter or the default value. */
|
* a consensus parameter or the default value. */
|
||||||
static int32_t
|
static int32_t
|
||||||
get_intro_point_min_lifetime(void)
|
get_intro_point_min_lifetime(void)
|
||||||
{
|
{
|
||||||
@ -344,8 +344,8 @@ get_intro_point_min_lifetime(void)
|
|||||||
0, INT32_MAX);
|
0, INT32_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the maximum lifetime in seconds of an introduction point defined by a
|
/** Return the maximum lifetime in seconds of an introduction point defined by
|
||||||
* consensus parameter or the default value. */
|
* a consensus parameter or the default value. */
|
||||||
static int32_t
|
static int32_t
|
||||||
get_intro_point_max_lifetime(void)
|
get_intro_point_max_lifetime(void)
|
||||||
{
|
{
|
||||||
@ -361,7 +361,7 @@ get_intro_point_max_lifetime(void)
|
|||||||
0, INT32_MAX);
|
0, INT32_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the number of extra introduction point defined by a consensus
|
/** Return the number of extra introduction point defined by a consensus
|
||||||
* parameter or the default value. */
|
* parameter or the default value. */
|
||||||
static int32_t
|
static int32_t
|
||||||
get_intro_point_num_extra(void)
|
get_intro_point_num_extra(void)
|
||||||
@ -372,7 +372,7 @@ get_intro_point_num_extra(void)
|
|||||||
NUM_INTRO_POINTS_EXTRA, 0, 128);
|
NUM_INTRO_POINTS_EXTRA, 0, 128);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper: Function that needs to return 1 for the HT for each loop which
|
/** Helper: Function that needs to return 1 for the HT for each loop which
|
||||||
* frees every service in an hash map. */
|
* frees every service in an hash map. */
|
||||||
static int
|
static int
|
||||||
ht_free_service_(struct hs_service_t *service, void *data)
|
ht_free_service_(struct hs_service_t *service, void *data)
|
||||||
@ -384,7 +384,7 @@ ht_free_service_(struct hs_service_t *service, void *data)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free every service that can be found in the global map. Once done, clear
|
/** Free every service that can be found in the global map. Once done, clear
|
||||||
* and free the global map. */
|
* and free the global map. */
|
||||||
static void
|
static void
|
||||||
service_free_all(void)
|
service_free_all(void)
|
||||||
@ -406,7 +406,7 @@ service_free_all(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free a given service intro point object. */
|
/** Free a given service intro point object. */
|
||||||
STATIC void
|
STATIC void
|
||||||
service_intro_point_free_(hs_service_intro_point_t *ip)
|
service_intro_point_free_(hs_service_intro_point_t *ip)
|
||||||
{
|
{
|
||||||
@ -421,7 +421,7 @@ service_intro_point_free_(hs_service_intro_point_t *ip)
|
|||||||
tor_free(ip);
|
tor_free(ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper: free an hs_service_intro_point_t object. This function is used by
|
/** Helper: free an hs_service_intro_point_t object. This function is used by
|
||||||
* digest256map_free() which requires a void * pointer. */
|
* digest256map_free() which requires a void * pointer. */
|
||||||
static void
|
static void
|
||||||
service_intro_point_free_void(void *obj)
|
service_intro_point_free_void(void *obj)
|
||||||
@ -429,7 +429,7 @@ service_intro_point_free_void(void *obj)
|
|||||||
service_intro_point_free_(obj);
|
service_intro_point_free_(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return a newly allocated service intro point and fully initialized from the
|
/** Return a newly allocated service intro point and fully initialized from the
|
||||||
* given node_t node, if non NULL.
|
* given node_t node, if non NULL.
|
||||||
*
|
*
|
||||||
* If node is NULL, returns a hs_service_intro_point_t with an empty link
|
* If node is NULL, returns a hs_service_intro_point_t with an empty link
|
||||||
@ -523,7 +523,7 @@ service_intro_point_add(digest256map_t *map, hs_service_intro_point_t *ip)
|
|||||||
tor_assert_nonfatal(!old_ip_entry);
|
tor_assert_nonfatal(!old_ip_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For a given service, remove the intro point from that service's descriptors
|
/** For a given service, remove the intro point from that service's descriptors
|
||||||
* (check both current and next descriptor) */
|
* (check both current and next descriptor) */
|
||||||
STATIC void
|
STATIC void
|
||||||
service_intro_point_remove(const hs_service_t *service,
|
service_intro_point_remove(const hs_service_t *service,
|
||||||
@ -541,7 +541,7 @@ service_intro_point_remove(const hs_service_t *service,
|
|||||||
} FOR_EACH_DESCRIPTOR_END;
|
} FOR_EACH_DESCRIPTOR_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For a given service and authentication key, return the intro point or NULL
|
/** For a given service and authentication key, return the intro point or NULL
|
||||||
* if not found. This will check both descriptors in the service. */
|
* if not found. This will check both descriptors in the service. */
|
||||||
STATIC hs_service_intro_point_t *
|
STATIC hs_service_intro_point_t *
|
||||||
service_intro_point_find(const hs_service_t *service,
|
service_intro_point_find(const hs_service_t *service,
|
||||||
@ -572,7 +572,7 @@ service_intro_point_find(const hs_service_t *service,
|
|||||||
return ip;
|
return ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For a given service and intro point, return the descriptor for which the
|
/** For a given service and intro point, return the descriptor for which the
|
||||||
* intro point is assigned to. NULL is returned if not found. */
|
* intro point is assigned to. NULL is returned if not found. */
|
||||||
STATIC hs_service_descriptor_t *
|
STATIC hs_service_descriptor_t *
|
||||||
service_desc_find_by_intro(const hs_service_t *service,
|
service_desc_find_by_intro(const hs_service_t *service,
|
||||||
@ -594,7 +594,7 @@ service_desc_find_by_intro(const hs_service_t *service,
|
|||||||
return descp;
|
return descp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* From a circuit identifier, get all the possible objects associated with the
|
/** From a circuit identifier, get all the possible objects associated with the
|
||||||
* ident. If not NULL, service, ip or desc are set if the object can be found.
|
* ident. If not NULL, service, ip or desc are set if the object can be found.
|
||||||
* They are untouched if they can't be found.
|
* They are untouched if they can't be found.
|
||||||
*
|
*
|
||||||
@ -627,7 +627,7 @@ get_objects_from_ident(const hs_ident_circuit_t *ident,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* From a given intro point, return the first link specifier of type
|
/** From a given intro point, return the first link specifier of type
|
||||||
* encountered in the link specifier list. Return NULL if it can't be found.
|
* encountered in the link specifier list. Return NULL if it can't be found.
|
||||||
*
|
*
|
||||||
* The caller does NOT have ownership of the object, the intro point does. */
|
* The caller does NOT have ownership of the object, the intro point does. */
|
||||||
@ -650,7 +650,7 @@ get_link_spec_by_type(const hs_service_intro_point_t *ip, uint8_t type)
|
|||||||
return lnk_spec;
|
return lnk_spec;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given a service intro point, return the node_t associated to it. This can
|
/** Given a service intro point, return the node_t associated to it. This can
|
||||||
* return NULL if the given intro point has no legacy ID or if the node can't
|
* return NULL if the given intro point has no legacy ID or if the node can't
|
||||||
* be found in the consensus. */
|
* be found in the consensus. */
|
||||||
STATIC const node_t *
|
STATIC const node_t *
|
||||||
@ -669,7 +669,7 @@ get_node_from_intro_point(const hs_service_intro_point_t *ip)
|
|||||||
(const char *) link_specifier_getconstarray_un_legacy_id(ls));
|
(const char *) link_specifier_getconstarray_un_legacy_id(ls));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given a service intro point, return the extend_info_t for it. This can
|
/** Given a service intro point, return the extend_info_t for it. This can
|
||||||
* return NULL if the node can't be found for the intro point or the extend
|
* return NULL if the node can't be found for the intro point or the extend
|
||||||
* info can't be created for the found node. If direct_conn is set, the extend
|
* info can't be created for the found node. If direct_conn is set, the extend
|
||||||
* info is validated on if we can connect directly. */
|
* info is validated on if we can connect directly. */
|
||||||
@ -698,7 +698,7 @@ get_extend_info_from_intro_point(const hs_service_intro_point_t *ip,
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the number of introduction points that are established for the
|
/** Return the number of introduction points that are established for the
|
||||||
* given descriptor. */
|
* given descriptor. */
|
||||||
static unsigned int
|
static unsigned int
|
||||||
count_desc_circuit_established(const hs_service_descriptor_t *desc)
|
count_desc_circuit_established(const hs_service_descriptor_t *desc)
|
||||||
@ -715,7 +715,7 @@ count_desc_circuit_established(const hs_service_descriptor_t *desc)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For a given service and descriptor of that service, close all active
|
/** For a given service and descriptor of that service, close all active
|
||||||
* directory connections. */
|
* directory connections. */
|
||||||
static void
|
static void
|
||||||
close_directory_connections(const hs_service_t *service,
|
close_directory_connections(const hs_service_t *service,
|
||||||
@ -750,7 +750,7 @@ close_directory_connections(const hs_service_t *service,
|
|||||||
smartlist_free(dir_conns);
|
smartlist_free(dir_conns);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close all rendezvous circuits for the given service. */
|
/** Close all rendezvous circuits for the given service. */
|
||||||
static void
|
static void
|
||||||
close_service_rp_circuits(hs_service_t *service)
|
close_service_rp_circuits(hs_service_t *service)
|
||||||
{
|
{
|
||||||
@ -780,7 +780,7 @@ close_service_rp_circuits(hs_service_t *service)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close the circuit(s) for the given map of introduction points. */
|
/** Close the circuit(s) for the given map of introduction points. */
|
||||||
static void
|
static void
|
||||||
close_intro_circuits(hs_service_intropoints_t *intro_points)
|
close_intro_circuits(hs_service_intropoints_t *intro_points)
|
||||||
{
|
{
|
||||||
@ -798,7 +798,7 @@ close_intro_circuits(hs_service_intropoints_t *intro_points)
|
|||||||
} DIGEST256MAP_FOREACH_END;
|
} DIGEST256MAP_FOREACH_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close all introduction circuits for the given service. */
|
/** Close all introduction circuits for the given service. */
|
||||||
static void
|
static void
|
||||||
close_service_intro_circuits(hs_service_t *service)
|
close_service_intro_circuits(hs_service_t *service)
|
||||||
{
|
{
|
||||||
@ -809,7 +809,7 @@ close_service_intro_circuits(hs_service_t *service)
|
|||||||
} FOR_EACH_DESCRIPTOR_END;
|
} FOR_EACH_DESCRIPTOR_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close any circuits related to the given service. */
|
/** Close any circuits related to the given service. */
|
||||||
static void
|
static void
|
||||||
close_service_circuits(hs_service_t *service)
|
close_service_circuits(hs_service_t *service)
|
||||||
{
|
{
|
||||||
@ -825,7 +825,7 @@ close_service_circuits(hs_service_t *service)
|
|||||||
close_service_rp_circuits(service);
|
close_service_rp_circuits(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move every ephemeral services from the src service map to the dst service
|
/** Move every ephemeral services from the src service map to the dst service
|
||||||
* map. It is possible that a service can't be register to the dst map which
|
* map. It is possible that a service can't be register to the dst map which
|
||||||
* won't stop the process of moving them all but will trigger a log warn. */
|
* won't stop the process of moving them all but will trigger a log warn. */
|
||||||
static void
|
static void
|
||||||
@ -855,7 +855,7 @@ move_ephemeral_services(hs_service_ht *src, hs_service_ht *dst)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return a const string of the directory path escaped. If this is an
|
/** Return a const string of the directory path escaped. If this is an
|
||||||
* ephemeral service, it returns "[EPHEMERAL]". This can only be called from
|
* ephemeral service, it returns "[EPHEMERAL]". This can only be called from
|
||||||
* the main thread because escaped() uses a static variable. */
|
* the main thread because escaped() uses a static variable. */
|
||||||
static const char *
|
static const char *
|
||||||
@ -889,7 +889,7 @@ move_hs_state(hs_service_t *src_service, hs_service_t *dst_service)
|
|||||||
src->replay_cache_rend_cookie = NULL; /* steal pointer reference */
|
src->replay_cache_rend_cookie = NULL; /* steal pointer reference */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register services that are in the staging list. Once this function returns,
|
/** Register services that are in the staging list. Once this function returns,
|
||||||
* the global service map will be set with the right content and all non
|
* the global service map will be set with the right content and all non
|
||||||
* surviving services will be cleaned up. */
|
* surviving services will be cleaned up. */
|
||||||
static void
|
static void
|
||||||
@ -957,7 +957,7 @@ register_all_services(void)
|
|||||||
hs_service_map_has_changed();
|
hs_service_map_has_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write the onion address of a given service to the given filename fname_ in
|
/** Write the onion address of a given service to the given filename fname_ in
|
||||||
* the service directory. Return 0 on success else -1 on error. */
|
* the service directory. Return 0 on success else -1 on error. */
|
||||||
STATIC int
|
STATIC int
|
||||||
write_address_to_file(const hs_service_t *service, const char *fname_)
|
write_address_to_file(const hs_service_t *service, const char *fname_)
|
||||||
@ -998,7 +998,7 @@ write_address_to_file(const hs_service_t *service, const char *fname_)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load and/or generate private keys for the given service. On success, the
|
/** Load and/or generate private keys for the given service. On success, the
|
||||||
* hostname file will be written to disk along with the master private key iff
|
* hostname file will be written to disk along with the master private key iff
|
||||||
* the service is not configured for offline keys. Return 0 on success else -1
|
* the service is not configured for offline keys. Return 0 on success else -1
|
||||||
* on failure. */
|
* on failure. */
|
||||||
@ -1096,7 +1096,7 @@ client_filename_is_valid(const char *filename)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse an authorized client from a string. The format of a client string
|
/** Parse an authorized client from a string. The format of a client string
|
||||||
* looks like (see rend-spec-v3.txt):
|
* looks like (see rend-spec-v3.txt):
|
||||||
*
|
*
|
||||||
* <auth-type>:<key-type>:<base32-encoded-public-key>
|
* <auth-type>:<key-type>:<base32-encoded-public-key>
|
||||||
@ -1178,7 +1178,7 @@ parse_authorized_client(const char *client_key_str)
|
|||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load all the client public keys for the given service. Return 0 on
|
/** Load all the client public keys for the given service. Return 0 on
|
||||||
* success else -1 on failure. */
|
* success else -1 on failure. */
|
||||||
static int
|
static int
|
||||||
load_client_keys(hs_service_t *service)
|
load_client_keys(hs_service_t *service)
|
||||||
@ -1281,6 +1281,7 @@ load_client_keys(hs_service_t *service)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Release all storage held in <b>client</b>. */
|
||||||
STATIC void
|
STATIC void
|
||||||
service_authorized_client_free_(hs_service_authorized_client_t *client)
|
service_authorized_client_free_(hs_service_authorized_client_t *client)
|
||||||
{
|
{
|
||||||
@ -1291,7 +1292,7 @@ service_authorized_client_free_(hs_service_authorized_client_t *client)
|
|||||||
tor_free(client);
|
tor_free(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free a given service descriptor object and all key material is wiped. */
|
/** Free a given service descriptor object and all key material is wiped. */
|
||||||
STATIC void
|
STATIC void
|
||||||
service_descriptor_free_(hs_service_descriptor_t *desc)
|
service_descriptor_free_(hs_service_descriptor_t *desc)
|
||||||
{
|
{
|
||||||
@ -1312,7 +1313,7 @@ service_descriptor_free_(hs_service_descriptor_t *desc)
|
|||||||
tor_free(desc);
|
tor_free(desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return a newly allocated service descriptor object. */
|
/** Return a newly allocated service descriptor object. */
|
||||||
STATIC hs_service_descriptor_t *
|
STATIC hs_service_descriptor_t *
|
||||||
service_descriptor_new(void)
|
service_descriptor_new(void)
|
||||||
{
|
{
|
||||||
@ -1325,7 +1326,7 @@ service_descriptor_new(void)
|
|||||||
return sdesc;
|
return sdesc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate and return a deep copy of client. */
|
/** Allocate and return a deep copy of client. */
|
||||||
static hs_service_authorized_client_t *
|
static hs_service_authorized_client_t *
|
||||||
service_authorized_client_dup(const hs_service_authorized_client_t *client)
|
service_authorized_client_dup(const hs_service_authorized_client_t *client)
|
||||||
{
|
{
|
||||||
@ -1343,7 +1344,7 @@ service_authorized_client_dup(const hs_service_authorized_client_t *client)
|
|||||||
return client_dup;
|
return client_dup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If two authorized clients are equal, return 0. If the first one should come
|
/** If two authorized clients are equal, return 0. If the first one should come
|
||||||
* before the second, return less than zero. If the first should come after
|
* before the second, return less than zero. If the first should come after
|
||||||
* the second, return greater than zero. */
|
* the second, return greater than zero. */
|
||||||
static int
|
static int
|
||||||
@ -1360,7 +1361,7 @@ service_authorized_client_cmp(const hs_service_authorized_client_t *client1,
|
|||||||
CURVE25519_PUBKEY_LEN);
|
CURVE25519_PUBKEY_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper for sorting authorized clients. */
|
/** Helper for sorting authorized clients. */
|
||||||
static int
|
static int
|
||||||
compare_service_authorzized_client_(const void **_a, const void **_b)
|
compare_service_authorzized_client_(const void **_a, const void **_b)
|
||||||
{
|
{
|
||||||
@ -1368,7 +1369,7 @@ compare_service_authorzized_client_(const void **_a, const void **_b)
|
|||||||
return service_authorized_client_cmp(a, b);
|
return service_authorized_client_cmp(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the list of hs_service_authorized_client_t's is different between
|
/** If the list of hs_service_authorized_client_t's is different between
|
||||||
* src and dst, return 1. Otherwise, return 0. */
|
* src and dst, return 1. Otherwise, return 0. */
|
||||||
STATIC int
|
STATIC int
|
||||||
service_authorized_client_config_equal(const hs_service_config_t *config1,
|
service_authorized_client_config_equal(const hs_service_config_t *config1,
|
||||||
@ -1429,7 +1430,7 @@ service_authorized_client_config_equal(const hs_service_config_t *config1,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move descriptor(s) from the src service to the dst service and modify their
|
/** Move descriptor(s) from the src service to the dst service and modify their
|
||||||
* content if necessary. We do this during SIGHUP when we re-create our
|
* content if necessary. We do this during SIGHUP when we re-create our
|
||||||
* hidden services. */
|
* hidden services. */
|
||||||
static void
|
static void
|
||||||
@ -1488,7 +1489,7 @@ move_descriptors(hs_service_t *src, hs_service_t *dst)
|
|||||||
service_descriptor_free(dst->desc_next);
|
service_descriptor_free(dst->desc_next);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* From the given service, remove all expired failing intro points for each
|
/** From the given service, remove all expired failing intro points for each
|
||||||
* descriptor. */
|
* descriptor. */
|
||||||
static void
|
static void
|
||||||
remove_expired_failing_intro(hs_service_t *service, time_t now)
|
remove_expired_failing_intro(hs_service_t *service, time_t now)
|
||||||
@ -1507,7 +1508,7 @@ remove_expired_failing_intro(hs_service_t *service, time_t now)
|
|||||||
} FOR_EACH_DESCRIPTOR_END;
|
} FOR_EACH_DESCRIPTOR_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For the given descriptor desc, put all node_t object found from its failing
|
/** For the given descriptor desc, put all node_t object found from its failing
|
||||||
* intro point list and put them in the given node_list. */
|
* intro point list and put them in the given node_list. */
|
||||||
static void
|
static void
|
||||||
setup_intro_point_exclude_list(const hs_service_descriptor_t *desc,
|
setup_intro_point_exclude_list(const hs_service_descriptor_t *desc,
|
||||||
@ -1525,7 +1526,7 @@ setup_intro_point_exclude_list(const hs_service_descriptor_t *desc,
|
|||||||
} DIGESTMAP_FOREACH_END;
|
} DIGESTMAP_FOREACH_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For the given failing intro point ip, we add its time of failure to the
|
/** For the given failing intro point ip, we add its time of failure to the
|
||||||
* failed map and index it by identity digest (legacy ID) in the descriptor
|
* failed map and index it by identity digest (legacy ID) in the descriptor
|
||||||
* desc failed id map. */
|
* desc failed id map. */
|
||||||
static void
|
static void
|
||||||
@ -1549,7 +1550,7 @@ remember_failing_intro_point(const hs_service_intro_point_t *ip,
|
|||||||
tor_free(prev_ptr);
|
tor_free(prev_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Using a given descriptor signing keypair signing_kp, a service intro point
|
/** Using a given descriptor signing keypair signing_kp, a service intro point
|
||||||
* object ip and the time now, setup the content of an already allocated
|
* object ip and the time now, setup the content of an already allocated
|
||||||
* descriptor intro desc_ip.
|
* descriptor intro desc_ip.
|
||||||
*
|
*
|
||||||
@ -1638,7 +1639,7 @@ setup_desc_intro_point(const ed25519_keypair_t *signing_kp,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Using the given descriptor from the given service, build the descriptor
|
/** Using the given descriptor from the given service, build the descriptor
|
||||||
* intro point list so we can then encode the descriptor for publication. This
|
* intro point list so we can then encode the descriptor for publication. This
|
||||||
* function does not pick intro points, they have to be in the descriptor
|
* function does not pick intro points, they have to be in the descriptor
|
||||||
* current map. Cryptographic material (keys) must be initialized in the
|
* current map. Cryptographic material (keys) must be initialized in the
|
||||||
@ -1678,7 +1679,7 @@ build_desc_intro_points(const hs_service_t *service,
|
|||||||
} DIGEST256MAP_FOREACH_END;
|
} DIGEST256MAP_FOREACH_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Build the descriptor signing key certificate. */
|
/** Build the descriptor signing key certificate. */
|
||||||
static void
|
static void
|
||||||
build_desc_signing_key_cert(hs_service_descriptor_t *desc, time_t now)
|
build_desc_signing_key_cert(hs_service_descriptor_t *desc, time_t now)
|
||||||
{
|
{
|
||||||
@ -1704,7 +1705,7 @@ build_desc_signing_key_cert(hs_service_descriptor_t *desc, time_t now)
|
|||||||
tor_assert_nonfatal(plaintext->signing_key_cert);
|
tor_assert_nonfatal(plaintext->signing_key_cert);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Populate the descriptor encrypted section from the given service object.
|
/** Populate the descriptor encrypted section from the given service object.
|
||||||
* This will generate a valid list of introduction points that can be used
|
* This will generate a valid list of introduction points that can be used
|
||||||
* after for circuit creation. Return 0 on success else -1 on error. */
|
* after for circuit creation. Return 0 on success else -1 on error. */
|
||||||
static int
|
static int
|
||||||
@ -1817,7 +1818,7 @@ build_service_desc_superencrypted(const hs_service_t *service,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Populate the descriptor plaintext section from the given service object.
|
/** Populate the descriptor plaintext section from the given service object.
|
||||||
* The caller must make sure that the keys in the descriptors are valid that
|
* The caller must make sure that the keys in the descriptors are valid that
|
||||||
* is are non-zero. This can't fail. */
|
* is are non-zero. This can't fail. */
|
||||||
static void
|
static void
|
||||||
@ -1868,7 +1869,7 @@ generate_ope_cipher_for_desc(const hs_service_descriptor_t *hs_desc)
|
|||||||
return crypto_ope_new(key);
|
return crypto_ope_new(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For the given service and descriptor object, create the key material which
|
/** For the given service and descriptor object, create the key material which
|
||||||
* is the blinded keypair, the descriptor signing keypair, the ephemeral
|
* is the blinded keypair, the descriptor signing keypair, the ephemeral
|
||||||
* keypair, and the descriptor cookie. Return 0 on success else -1 on error
|
* keypair, and the descriptor cookie. Return 0 on success else -1 on error
|
||||||
* where the generated keys MUST be ignored. */
|
* where the generated keys MUST be ignored. */
|
||||||
@ -1930,7 +1931,7 @@ build_service_desc_keys(const hs_service_t *service,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given a service and the current time, build a descriptor for the service.
|
/** Given a service and the current time, build a descriptor for the service.
|
||||||
* This function does not pick introduction point, this needs to be done by
|
* This function does not pick introduction point, this needs to be done by
|
||||||
* the update function. On success, desc_out will point to the newly allocated
|
* the update function. On success, desc_out will point to the newly allocated
|
||||||
* descriptor object.
|
* descriptor object.
|
||||||
@ -1987,7 +1988,7 @@ build_service_descriptor(hs_service_t *service, uint64_t time_period_num,
|
|||||||
service_descriptor_free(desc);
|
service_descriptor_free(desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Build both descriptors for the given service that has just booted up.
|
/** Build both descriptors for the given service that has just booted up.
|
||||||
* Because it's a special case, it deserves its special function ;). */
|
* Because it's a special case, it deserves its special function ;). */
|
||||||
static void
|
static void
|
||||||
build_descriptors_for_new_service(hs_service_t *service, time_t now)
|
build_descriptors_for_new_service(hs_service_t *service, time_t now)
|
||||||
@ -2037,7 +2038,7 @@ build_descriptors_for_new_service(hs_service_t *service, time_t now)
|
|||||||
safe_str_client(service->onion_address));
|
safe_str_client(service->onion_address));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Build descriptors for each service if needed. There are conditions to build
|
/** Build descriptors for each service if needed. There are conditions to build
|
||||||
* a descriptor which are details in the function. */
|
* a descriptor which are details in the function. */
|
||||||
STATIC void
|
STATIC void
|
||||||
build_all_descriptors(time_t now)
|
build_all_descriptors(time_t now)
|
||||||
@ -2070,7 +2071,7 @@ build_all_descriptors(time_t now)
|
|||||||
} FOR_EACH_DESCRIPTOR_END;
|
} FOR_EACH_DESCRIPTOR_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Randomly pick a node to become an introduction point but not present in the
|
/** Randomly pick a node to become an introduction point but not present in the
|
||||||
* given exclude_nodes list. The chosen node is put in the exclude list
|
* given exclude_nodes list. The chosen node is put in the exclude list
|
||||||
* regardless of success or not because in case of failure, the node is simply
|
* regardless of success or not because in case of failure, the node is simply
|
||||||
* unsusable from that point on.
|
* unsusable from that point on.
|
||||||
@ -2131,7 +2132,7 @@ pick_intro_point(unsigned int direct_conn, smartlist_t *exclude_nodes)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For a given descriptor from the given service, pick any needed intro points
|
/** For a given descriptor from the given service, pick any needed intro points
|
||||||
* and update the current map with those newly picked intro points. Return the
|
* and update the current map with those newly picked intro points. Return the
|
||||||
* number node that might have been added to the descriptor current map. */
|
* number node that might have been added to the descriptor current map. */
|
||||||
static unsigned int
|
static unsigned int
|
||||||
@ -2255,7 +2256,7 @@ service_desc_schedule_upload(hs_service_descriptor_t *desc,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pick missing intro points for this descriptor if needed. */
|
/** Pick missing intro points for this descriptor if needed. */
|
||||||
static void
|
static void
|
||||||
update_service_descriptor_intro_points(hs_service_t *service,
|
update_service_descriptor_intro_points(hs_service_t *service,
|
||||||
hs_service_descriptor_t *desc, time_t now)
|
hs_service_descriptor_t *desc, time_t now)
|
||||||
@ -2296,7 +2297,7 @@ update_service_descriptor_intro_points(hs_service_t *service,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update descriptor intro points for each service if needed. We do this as
|
/** Update descriptor intro points for each service if needed. We do this as
|
||||||
* part of the periodic event because we need to establish intro point circuits
|
* part of the periodic event because we need to establish intro point circuits
|
||||||
* before we publish descriptors. */
|
* before we publish descriptors. */
|
||||||
STATIC void
|
STATIC void
|
||||||
@ -2311,7 +2312,7 @@ update_all_descriptors_intro_points(time_t now)
|
|||||||
} FOR_EACH_SERVICE_END;
|
} FOR_EACH_SERVICE_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return true iff the given intro point has expired that is it has been used
|
/** Return true iff the given intro point has expired that is it has been used
|
||||||
* for too long or we've reached our max seen INTRODUCE2 cell. */
|
* for too long or we've reached our max seen INTRODUCE2 cell. */
|
||||||
STATIC int
|
STATIC int
|
||||||
intro_point_should_expire(const hs_service_intro_point_t *ip,
|
intro_point_should_expire(const hs_service_intro_point_t *ip,
|
||||||
@ -2333,7 +2334,7 @@ intro_point_should_expire(const hs_service_intro_point_t *ip,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return true iff we should remove the intro point ip from its service.
|
/** Return true iff we should remove the intro point ip from its service.
|
||||||
*
|
*
|
||||||
* We remove an intro point from the service descriptor list if one of
|
* We remove an intro point from the service descriptor list if one of
|
||||||
* these criteria is met:
|
* these criteria is met:
|
||||||
@ -2395,7 +2396,7 @@ should_remove_intro_point(hs_service_intro_point_t *ip, time_t now)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Go over the given set of intro points for each service and remove any
|
/** Go over the given set of intro points for each service and remove any
|
||||||
* invalid ones.
|
* invalid ones.
|
||||||
*
|
*
|
||||||
* If an intro point is removed, the circuit (if any) is immediately close.
|
* If an intro point is removed, the circuit (if any) is immediately close.
|
||||||
@ -2458,7 +2459,7 @@ cleanup_intro_points(hs_service_t *service, time_t now)
|
|||||||
smartlist_free(ips_to_free);
|
smartlist_free(ips_to_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the next rotation time of the descriptors for the given service for the
|
/** Set the next rotation time of the descriptors for the given service for the
|
||||||
* time now. */
|
* time now. */
|
||||||
static void
|
static void
|
||||||
set_rotation_time(hs_service_t *service)
|
set_rotation_time(hs_service_t *service)
|
||||||
@ -2477,7 +2478,7 @@ set_rotation_time(hs_service_t *service)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return true iff the service should rotate its descriptor. The time now is
|
/** Return true iff the service should rotate its descriptor. The time now is
|
||||||
* only used to fetch the live consensus and if none can be found, this
|
* only used to fetch the live consensus and if none can be found, this
|
||||||
* returns false. */
|
* returns false. */
|
||||||
static unsigned int
|
static unsigned int
|
||||||
@ -2529,7 +2530,7 @@ should_rotate_descriptors(hs_service_t *service, time_t now)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Rotate the service descriptors of the given service. The current descriptor
|
/** Rotate the service descriptors of the given service. The current descriptor
|
||||||
* will be freed, the next one put in as the current and finally the next
|
* will be freed, the next one put in as the current and finally the next
|
||||||
* descriptor pointer is NULLified. */
|
* descriptor pointer is NULLified. */
|
||||||
static void
|
static void
|
||||||
@ -2551,7 +2552,7 @@ rotate_service_descriptors(hs_service_t *service)
|
|||||||
set_rotation_time(service);
|
set_rotation_time(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Rotate descriptors for each service if needed. A non existing current
|
/** Rotate descriptors for each service if needed. A non existing current
|
||||||
* descriptor will trigger a descriptor build for the next time period. */
|
* descriptor will trigger a descriptor build for the next time period. */
|
||||||
STATIC void
|
STATIC void
|
||||||
rotate_all_descriptors(time_t now)
|
rotate_all_descriptors(time_t now)
|
||||||
@ -2580,7 +2581,7 @@ rotate_all_descriptors(time_t now)
|
|||||||
} FOR_EACH_SERVICE_END;
|
} FOR_EACH_SERVICE_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scheduled event run from the main loop. Make sure all our services are up
|
/** Scheduled event run from the main loop. Make sure all our services are up
|
||||||
* to date and ready for the other scheduled events. This includes looking at
|
* to date and ready for the other scheduled events. This includes looking at
|
||||||
* the introduction points status and descriptor rotation time. */
|
* the introduction points status and descriptor rotation time. */
|
||||||
STATIC void
|
STATIC void
|
||||||
@ -2615,7 +2616,7 @@ run_housekeeping_event(time_t now)
|
|||||||
} FOR_EACH_SERVICE_END;
|
} FOR_EACH_SERVICE_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scheduled event run from the main loop. Make sure all descriptors are up to
|
/** Scheduled event run from the main loop. Make sure all descriptors are up to
|
||||||
* date. Once this returns, each service descriptor needs to be considered for
|
* date. Once this returns, each service descriptor needs to be considered for
|
||||||
* new introduction circuits and then for upload. */
|
* new introduction circuits and then for upload. */
|
||||||
static void
|
static void
|
||||||
@ -2692,7 +2693,7 @@ launch_intro_point_circuits(hs_service_t *service)
|
|||||||
} FOR_EACH_DESCRIPTOR_END;
|
} FOR_EACH_DESCRIPTOR_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't try to build more than this many circuits before giving up for a
|
/** Don't try to build more than this many circuits before giving up for a
|
||||||
* while. Dynamically calculated based on the configured number of intro
|
* while. Dynamically calculated based on the configured number of intro
|
||||||
* points for the given service and how many descriptor exists. The default
|
* points for the given service and how many descriptor exists. The default
|
||||||
* use case of 3 introduction points and two descriptors will allow 28
|
* use case of 3 introduction points and two descriptors will allow 28
|
||||||
@ -2708,7 +2709,7 @@ get_max_intro_circ_per_period(const hs_service_t *service)
|
|||||||
tor_assert(service->config.num_intro_points <=
|
tor_assert(service->config.num_intro_points <=
|
||||||
HS_CONFIG_V3_MAX_INTRO_POINTS);
|
HS_CONFIG_V3_MAX_INTRO_POINTS);
|
||||||
|
|
||||||
/* For a testing network, allow to do it for the maximum amount so circuit
|
/** For a testing network, allow to do it for the maximum amount so circuit
|
||||||
* creation and rotation and so on can actually be tested without limit. */
|
* creation and rotation and so on can actually be tested without limit. */
|
||||||
#define MAX_INTRO_POINT_CIRCUIT_RETRIES_TESTING -1
|
#define MAX_INTRO_POINT_CIRCUIT_RETRIES_TESTING -1
|
||||||
if (get_options()->TestingTorNetwork) {
|
if (get_options()->TestingTorNetwork) {
|
||||||
@ -2737,7 +2738,7 @@ get_max_intro_circ_per_period(const hs_service_t *service)
|
|||||||
return (count * multiplier);
|
return (count * multiplier);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For the given service, return 1 if the service is allowed to launch more
|
/** For the given service, return 1 if the service is allowed to launch more
|
||||||
* introduction circuits else 0 if the maximum has been reached for the retry
|
* introduction circuits else 0 if the maximum has been reached for the retry
|
||||||
* period of INTRO_CIRC_RETRY_PERIOD. */
|
* period of INTRO_CIRC_RETRY_PERIOD. */
|
||||||
STATIC int
|
STATIC int
|
||||||
@ -2783,7 +2784,7 @@ can_service_launch_intro_circuit(hs_service_t *service, time_t now)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scheduled event run from the main loop. Make sure we have all the circuits
|
/** Scheduled event run from the main loop. Make sure we have all the circuits
|
||||||
* we need for each service. */
|
* we need for each service. */
|
||||||
static void
|
static void
|
||||||
run_build_circuit_event(time_t now)
|
run_build_circuit_event(time_t now)
|
||||||
@ -2813,7 +2814,7 @@ run_build_circuit_event(time_t now)
|
|||||||
} FOR_EACH_SERVICE_END;
|
} FOR_EACH_SERVICE_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Encode and sign the service descriptor desc and upload it to the given
|
/** Encode and sign the service descriptor desc and upload it to the given
|
||||||
* hidden service directory. This does nothing if PublishHidServDescriptors
|
* hidden service directory. This does nothing if PublishHidServDescriptors
|
||||||
* is false. */
|
* is false. */
|
||||||
static void
|
static void
|
||||||
@ -2949,7 +2950,7 @@ set_descriptor_revision_counter(hs_service_descriptor_t *hs_desc, time_t now,
|
|||||||
hs_desc->desc->plaintext_data.revision_counter = rev_counter;
|
hs_desc->desc->plaintext_data.revision_counter = rev_counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Encode and sign the service descriptor desc and upload it to the
|
/** Encode and sign the service descriptor desc and upload it to the
|
||||||
* responsible hidden service directories. If for_next_period is true, the set
|
* responsible hidden service directories. If for_next_period is true, the set
|
||||||
* of directories are selected using the next hsdir_index. This does nothing
|
* of directories are selected using the next hsdir_index. This does nothing
|
||||||
* if PublishHidServDescriptors is false. */
|
* if PublishHidServDescriptors is false. */
|
||||||
@ -3046,7 +3047,7 @@ service_desc_hsdirs_changed(const hs_service_t *service,
|
|||||||
return should_reupload;
|
return should_reupload;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return 1 if the given descriptor from the given service can be uploaded
|
/** Return 1 if the given descriptor from the given service can be uploaded
|
||||||
* else return 0 if it can not. */
|
* else return 0 if it can not. */
|
||||||
static int
|
static int
|
||||||
should_service_upload_descriptor(const hs_service_t *service,
|
should_service_upload_descriptor(const hs_service_t *service,
|
||||||
@ -3103,7 +3104,7 @@ should_service_upload_descriptor(const hs_service_t *service,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Refresh the given service descriptor meaning this will update every mutable
|
/** Refresh the given service descriptor meaning this will update every mutable
|
||||||
* field that needs to be updated before we upload.
|
* field that needs to be updated before we upload.
|
||||||
*
|
*
|
||||||
* This should ONLY be called before uploading a descriptor. It assumes that
|
* This should ONLY be called before uploading a descriptor. It assumes that
|
||||||
@ -3134,7 +3135,7 @@ refresh_service_descriptor(const hs_service_t *service,
|
|||||||
set_descriptor_revision_counter(desc, now, service->desc_current == desc);
|
set_descriptor_revision_counter(desc, now, service->desc_current == desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scheduled event run from the main loop. Try to upload the descriptor for
|
/** Scheduled event run from the main loop. Try to upload the descriptor for
|
||||||
* each service. */
|
* each service. */
|
||||||
STATIC void
|
STATIC void
|
||||||
run_upload_descriptor_event(time_t now)
|
run_upload_descriptor_event(time_t now)
|
||||||
@ -3183,7 +3184,7 @@ run_upload_descriptor_event(time_t now)
|
|||||||
consider_republishing_hs_descriptors = 0;
|
consider_republishing_hs_descriptors = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called when the introduction point circuit is done building and ready to be
|
/** Called when the introduction point circuit is done building and ready to be
|
||||||
* used. */
|
* used. */
|
||||||
static void
|
static void
|
||||||
service_intro_circ_has_opened(origin_circuit_t *circ)
|
service_intro_circ_has_opened(origin_circuit_t *circ)
|
||||||
@ -3241,7 +3242,7 @@ service_intro_circ_has_opened(origin_circuit_t *circ)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called when a rendezvous circuit is done building and ready to be used. */
|
/** Called when a rendezvous circuit is done building and ready to be used. */
|
||||||
static void
|
static void
|
||||||
service_rendezvous_circ_has_opened(origin_circuit_t *circ)
|
service_rendezvous_circ_has_opened(origin_circuit_t *circ)
|
||||||
{
|
{
|
||||||
@ -3282,7 +3283,7 @@ service_rendezvous_circ_has_opened(origin_circuit_t *circ)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We've been expecting an INTRO_ESTABLISHED cell on this circuit and it just
|
/** We've been expecting an INTRO_ESTABLISHED cell on this circuit and it just
|
||||||
* arrived. Handle the INTRO_ESTABLISHED cell arriving on the given
|
* arrived. Handle the INTRO_ESTABLISHED cell arriving on the given
|
||||||
* introduction circuit. Return 0 on success else a negative value. */
|
* introduction circuit. Return 0 on success else a negative value. */
|
||||||
static int
|
static int
|
||||||
@ -3340,7 +3341,7 @@ service_handle_intro_established(origin_circuit_t *circ,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We just received an INTRODUCE2 cell on the established introduction circuit
|
/** We just received an INTRODUCE2 cell on the established introduction circuit
|
||||||
* circ. Handle the cell and return 0 on success else a negative value. */
|
* circ. Handle the cell and return 0 on success else a negative value. */
|
||||||
static int
|
static int
|
||||||
service_handle_introduce2(origin_circuit_t *circ, const uint8_t *payload,
|
service_handle_introduce2(origin_circuit_t *circ, const uint8_t *payload,
|
||||||
@ -3388,7 +3389,7 @@ service_handle_introduce2(origin_circuit_t *circ, const uint8_t *payload,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add to list every filename used by service. This is used by the sandbox
|
/** Add to list every filename used by service. This is used by the sandbox
|
||||||
* subsystem. */
|
* subsystem. */
|
||||||
static void
|
static void
|
||||||
service_add_fnames_to_list(const hs_service_t *service, smartlist_t *list)
|
service_add_fnames_to_list(const hs_service_t *service, smartlist_t *list)
|
||||||
@ -3410,7 +3411,7 @@ service_add_fnames_to_list(const hs_service_t *service, smartlist_t *list)
|
|||||||
smartlist_add(list, hs_path_from_filename(s_dir, fname));
|
smartlist_add(list, hs_path_from_filename(s_dir, fname));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return true iff the given service identity key is present on disk. */
|
/** Return true iff the given service identity key is present on disk. */
|
||||||
static int
|
static int
|
||||||
service_key_on_disk(const char *directory_path)
|
service_key_on_disk(const char *directory_path)
|
||||||
{
|
{
|
||||||
@ -3434,7 +3435,7 @@ service_key_on_disk(const char *directory_path)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is a proxy function before actually calling hs_desc_encode_descriptor
|
/** This is a proxy function before actually calling hs_desc_encode_descriptor
|
||||||
* because we need some preprocessing here */
|
* because we need some preprocessing here */
|
||||||
static int
|
static int
|
||||||
service_encode_descriptor(const hs_service_t *service,
|
service_encode_descriptor(const hs_service_t *service,
|
||||||
@ -3465,7 +3466,7 @@ service_encode_descriptor(const hs_service_t *service,
|
|||||||
/* Public API */
|
/* Public API */
|
||||||
/* ========== */
|
/* ========== */
|
||||||
|
|
||||||
/* This is called everytime the service map (v2 or v3) changes that is if an
|
/** This is called everytime the service map (v2 or v3) changes that is if an
|
||||||
* element is added or removed. */
|
* element is added or removed. */
|
||||||
void
|
void
|
||||||
hs_service_map_has_changed(void)
|
hs_service_map_has_changed(void)
|
||||||
@ -3476,7 +3477,7 @@ hs_service_map_has_changed(void)
|
|||||||
rescan_periodic_events(get_options());
|
rescan_periodic_events(get_options());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Upload an encoded descriptor in encoded_desc of the given version. This
|
/** Upload an encoded descriptor in encoded_desc of the given version. This
|
||||||
* descriptor is for the service identity_pk and blinded_pk used to setup the
|
* descriptor is for the service identity_pk and blinded_pk used to setup the
|
||||||
* directory connection identifier. It is uploaded to the directory hsdir_rs
|
* directory connection identifier. It is uploaded to the directory hsdir_rs
|
||||||
* routerstatus_t object.
|
* routerstatus_t object.
|
||||||
@ -3524,7 +3525,7 @@ hs_service_upload_desc_to_dir(const char *encoded_desc,
|
|||||||
directory_request_free(dir_req);
|
directory_request_free(dir_req);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add the ephemeral service using the secret key sk and ports. Both max
|
/** Add the ephemeral service using the secret key sk and ports. Both max
|
||||||
* streams parameter will be set in the newly created service.
|
* streams parameter will be set in the newly created service.
|
||||||
*
|
*
|
||||||
* Ownership of sk and ports is passed to this routine. Regardless of
|
* Ownership of sk and ports is passed to this routine. Regardless of
|
||||||
@ -3604,7 +3605,7 @@ hs_service_add_ephemeral(ed25519_secret_key_t *sk, smartlist_t *ports,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For the given onion address, delete the ephemeral service. Return 0 on
|
/** For the given onion address, delete the ephemeral service. Return 0 on
|
||||||
* success else -1 on error. */
|
* success else -1 on error. */
|
||||||
int
|
int
|
||||||
hs_service_del_ephemeral(const char *address)
|
hs_service_del_ephemeral(const char *address)
|
||||||
@ -3654,7 +3655,7 @@ hs_service_del_ephemeral(const char *address)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Using the ed25519 public key pk, find a service for that key and return the
|
/** Using the ed25519 public key pk, find a service for that key and return the
|
||||||
* current encoded descriptor as a newly allocated string or NULL if not
|
* current encoded descriptor as a newly allocated string or NULL if not
|
||||||
* found. This is used by the control port subsystem. */
|
* found. This is used by the control port subsystem. */
|
||||||
char *
|
char *
|
||||||
@ -3680,7 +3681,7 @@ hs_service_lookup_current_desc(const ed25519_public_key_t *pk)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the number of service we have configured and usable. */
|
/** Return the number of service we have configured and usable. */
|
||||||
MOCK_IMPL(unsigned int,
|
MOCK_IMPL(unsigned int,
|
||||||
hs_service_get_num_services,(void))
|
hs_service_get_num_services,(void))
|
||||||
{
|
{
|
||||||
@ -3690,7 +3691,7 @@ hs_service_get_num_services,(void))
|
|||||||
return HT_SIZE(hs_service_map);
|
return HT_SIZE(hs_service_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called once an introduction circuit is closed. If the circuit doesn't have
|
/** Called once an introduction circuit is closed. If the circuit doesn't have
|
||||||
* a v3 identifier, it is ignored. */
|
* a v3 identifier, it is ignored. */
|
||||||
void
|
void
|
||||||
hs_service_intro_circ_has_closed(origin_circuit_t *circ)
|
hs_service_intro_circ_has_closed(origin_circuit_t *circ)
|
||||||
@ -3732,7 +3733,7 @@ hs_service_intro_circ_has_closed(origin_circuit_t *circ)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given conn, a rendezvous edge connection acting as an exit stream, look up
|
/** Given conn, a rendezvous edge connection acting as an exit stream, look up
|
||||||
* the hidden service for the circuit circ, and look up the port and address
|
* the hidden service for the circuit circ, and look up the port and address
|
||||||
* based on the connection port. Assign the actual connection address.
|
* based on the connection port. Assign the actual connection address.
|
||||||
*
|
*
|
||||||
@ -3830,7 +3831,7 @@ hs_service_exports_circuit_id(const ed25519_public_key_t *pk)
|
|||||||
return service->config.circuit_id_protocol;
|
return service->config.circuit_id_protocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add to file_list every filename used by a configured hidden service, and to
|
/** Add to file_list every filename used by a configured hidden service, and to
|
||||||
* dir_list every directory path used by a configured hidden service. This is
|
* dir_list every directory path used by a configured hidden service. This is
|
||||||
* used by the sandbox subsystem to whitelist those. */
|
* used by the sandbox subsystem to whitelist those. */
|
||||||
void
|
void
|
||||||
@ -3855,7 +3856,7 @@ hs_service_lists_fnames_for_sandbox(smartlist_t *file_list,
|
|||||||
} FOR_EACH_DESCRIPTOR_END;
|
} FOR_EACH_DESCRIPTOR_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called when our internal view of the directory has changed. We might have
|
/** Called when our internal view of the directory has changed. We might have
|
||||||
* received a new batch of descriptors which might affect the shape of the
|
* received a new batch of descriptors which might affect the shape of the
|
||||||
* HSDir hash ring. Signal that we should reexamine the hash ring and
|
* HSDir hash ring. Signal that we should reexamine the hash ring and
|
||||||
* re-upload our HS descriptors if needed. */
|
* re-upload our HS descriptors if needed. */
|
||||||
@ -3872,7 +3873,7 @@ hs_service_dir_info_changed(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called when we get an INTRODUCE2 cell on the circ. Respond to the cell and
|
/** Called when we get an INTRODUCE2 cell on the circ. Respond to the cell and
|
||||||
* launch a circuit to the rendezvous point. */
|
* launch a circuit to the rendezvous point. */
|
||||||
int
|
int
|
||||||
hs_service_receive_introduce2(origin_circuit_t *circ, const uint8_t *payload,
|
hs_service_receive_introduce2(origin_circuit_t *circ, const uint8_t *payload,
|
||||||
@ -3903,7 +3904,7 @@ hs_service_receive_introduce2(origin_circuit_t *circ, const uint8_t *payload,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called when we get an INTRO_ESTABLISHED cell. Mark the circuit as an
|
/** Called when we get an INTRO_ESTABLISHED cell. Mark the circuit as an
|
||||||
* established introduction point. Return 0 on success else a negative value
|
* established introduction point. Return 0 on success else a negative value
|
||||||
* and the circuit is closed. */
|
* and the circuit is closed. */
|
||||||
int
|
int
|
||||||
@ -3940,7 +3941,7 @@ hs_service_receive_intro_established(origin_circuit_t *circ,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called when any kind of hidden service circuit is done building thus
|
/** Called when any kind of hidden service circuit is done building thus
|
||||||
* opened. This is the entry point from the circuit subsystem. */
|
* opened. This is the entry point from the circuit subsystem. */
|
||||||
void
|
void
|
||||||
hs_service_circuit_has_opened(origin_circuit_t *circ)
|
hs_service_circuit_has_opened(origin_circuit_t *circ)
|
||||||
@ -3969,7 +3970,7 @@ hs_service_circuit_has_opened(origin_circuit_t *circ)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the service version by looking at the key in the service directory.
|
/** Return the service version by looking at the key in the service directory.
|
||||||
* If the key is not found or unrecognized, -1 is returned. Else, the service
|
* If the key is not found or unrecognized, -1 is returned. Else, the service
|
||||||
* version is returned. */
|
* version is returned. */
|
||||||
int
|
int
|
||||||
@ -3999,7 +4000,7 @@ hs_service_get_version_from_key(const hs_service_t *service)
|
|||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load and/or generate keys for all onion services including the client
|
/** Load and/or generate keys for all onion services including the client
|
||||||
* authorization if any. Return 0 on success, -1 on failure. */
|
* authorization if any. Return 0 on success, -1 on failure. */
|
||||||
int
|
int
|
||||||
hs_service_load_all_keys(void)
|
hs_service_load_all_keys(void)
|
||||||
@ -4035,7 +4036,7 @@ hs_service_load_all_keys(void)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Put all service object in the given service list. After this, the caller
|
/** Put all service object in the given service list. After this, the caller
|
||||||
* looses ownership of every elements in the list and responsible to free the
|
* looses ownership of every elements in the list and responsible to free the
|
||||||
* list pointer. */
|
* list pointer. */
|
||||||
void
|
void
|
||||||
@ -4052,7 +4053,7 @@ hs_service_stage_services(const smartlist_t *service_list)
|
|||||||
smartlist_add_all(hs_service_staging_list, service_list);
|
smartlist_add_all(hs_service_staging_list, service_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate and initilize a service object. The service configuration will
|
/** Allocate and initilize a service object. The service configuration will
|
||||||
* contain the default values. Return the newly allocated object pointer. This
|
* contain the default values. Return the newly allocated object pointer. This
|
||||||
* function can't fail. */
|
* function can't fail. */
|
||||||
hs_service_t *
|
hs_service_t *
|
||||||
@ -4070,7 +4071,7 @@ hs_service_new(const or_options_t *options)
|
|||||||
return service;
|
return service;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free the given <b>service</b> object and all its content. This function
|
/** Free the given <b>service</b> object and all its content. This function
|
||||||
* also takes care of wiping service keys from memory. It is safe to pass a
|
* also takes care of wiping service keys from memory. It is safe to pass a
|
||||||
* NULL pointer. */
|
* NULL pointer. */
|
||||||
void
|
void
|
||||||
@ -4099,7 +4100,7 @@ hs_service_free_(hs_service_t *service)
|
|||||||
tor_free(service);
|
tor_free(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Periodic callback. Entry point from the main loop to the HS service
|
/** Periodic callback. Entry point from the main loop to the HS service
|
||||||
* subsystem. This is call every second. This is skipped if tor can't build a
|
* subsystem. This is call every second. This is skipped if tor can't build a
|
||||||
* circuit or the network is disabled. */
|
* circuit or the network is disabled. */
|
||||||
void
|
void
|
||||||
@ -4122,7 +4123,7 @@ hs_service_run_scheduled_events(time_t now)
|
|||||||
run_upload_descriptor_event(now);
|
run_upload_descriptor_event(now);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the service HS subsystem. */
|
/** Initialize the service HS subsystem. */
|
||||||
void
|
void
|
||||||
hs_service_init(void)
|
hs_service_init(void)
|
||||||
{
|
{
|
||||||
@ -4139,7 +4140,7 @@ hs_service_init(void)
|
|||||||
hs_service_staging_list = smartlist_new();
|
hs_service_staging_list = smartlist_new();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Release all global storage of the hidden service subsystem. */
|
/** Release all global storage of the hidden service subsystem. */
|
||||||
void
|
void
|
||||||
hs_service_free_all(void)
|
hs_service_free_all(void)
|
||||||
{
|
{
|
||||||
@ -4149,14 +4150,14 @@ hs_service_free_all(void)
|
|||||||
|
|
||||||
#ifdef TOR_UNIT_TESTS
|
#ifdef TOR_UNIT_TESTS
|
||||||
|
|
||||||
/* Return the global service map size. Only used by unit test. */
|
/** Return the global service map size. Only used by unit test. */
|
||||||
STATIC unsigned int
|
STATIC unsigned int
|
||||||
get_hs_service_map_size(void)
|
get_hs_service_map_size(void)
|
||||||
{
|
{
|
||||||
return HT_SIZE(hs_service_map);
|
return HT_SIZE(hs_service_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the staging list size. Only used by unit test. */
|
/** Return the staging list size. Only used by unit test. */
|
||||||
STATIC int
|
STATIC int
|
||||||
get_hs_service_staging_list_size(void)
|
get_hs_service_staging_list_size(void)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user