#ifndef TOR_HS_CACHE_H
#define TOR_HS_CACHE_H
#include <stdint.h>
#include "feature/hs/hs_common.h"
#include "feature/hs/hs_descriptor.h"
#include "feature/rend/rendcommon.h"
#include "feature/nodelist/torcert.h"
struct ed25519_public_key_t;
#define HS_CACHE_CLIENT_INTRO_STATE_MAX_AGE (2 * 60)
#define HS_CACHE_MAX_AGE (2*24*60*60)
#define HS_CACHE_MAX_SKEW (24*60*60)
#define HS_CACHE_FAILURE_MAX_AGE (5*60)
typedef struct hs_cache_intro_state_t {
time_t created_ts;
unsigned int error : 1;
unsigned int timed_out : 1;
uint32_t unreachable_count;
} hs_cache_intro_state_t;
typedef struct hs_cache_client_intro_state_t {
digest256map_t *intro_points;
} hs_cache_client_intro_state_t;
typedef struct hs_cache_dir_descriptor_t {
const uint8_t *key;
time_t created_ts;
hs_desc_plaintext_data_t *plaintext_data;
char *encoded_desc;
} hs_cache_dir_descriptor_t;
static inline time_t
hs_cache_max_entry_lifetime(void)
{
return HS_CACHE_MAX_AGE + HS_CACHE_MAX_SKEW;
}
void hs_cache_init(void);
void hs_cache_free_all(void);
void hs_cache_clean_as_dir(time_t now);
size_t hs_cache_handle_oom(time_t now, size_t min_remove_bytes);
unsigned int hs_cache_get_max_descriptor_size(void);
int hs_cache_store_as_dir(const char *desc);
int hs_cache_lookup_as_dir(uint32_t version, const char *query,
const char **desc_out);
const hs_descriptor_t *
hs_cache_lookup_as_client(const struct ed25519_public_key_t *key);
const char *
hs_cache_lookup_encoded_as_client(const struct ed25519_public_key_t *key);
hs_desc_decode_status_t hs_cache_store_as_client(const char *desc_str,
const struct ed25519_public_key_t *identity_pk);
void hs_cache_remove_as_client(const struct ed25519_public_key_t *key);
void hs_cache_clean_as_client(time_t now);
void hs_cache_purge_as_client(void);
void hs_cache_client_intro_state_note(
const struct ed25519_public_key_t *service_pk,
const struct ed25519_public_key_t *auth_key,
rend_intro_point_failure_t failure);
const hs_cache_intro_state_t *hs_cache_client_intro_state_find(
const struct ed25519_public_key_t *service_pk,
const struct ed25519_public_key_t *auth_key);
void hs_cache_client_intro_state_clean(time_t now);
void hs_cache_client_intro_state_purge(void);
bool hs_cache_client_new_auth_parse(const ed25519_public_key_t *service_pk);
size_t hs_cache_get_total_allocation(void);
void hs_cache_decrement_allocation(size_t n);
void hs_cache_increment_allocation(size_t n);
#ifdef HS_CACHE_PRIVATE
#include "lib/crypt_ops/crypto_ed25519.h"
typedef struct hs_cache_client_descriptor_t {
struct ed25519_public_key_t key;
time_t expiration_ts;
hs_descriptor_t *desc;
char *encoded_desc;
} hs_cache_client_descriptor_t;
STATIC size_t cache_clean_v3_as_dir(time_t now, time_t global_cutoff);
STATIC hs_cache_client_descriptor_t *
lookup_v3_desc_as_client(const uint8_t *key);
#endif
#endif