tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

microdesc_st.h (3136B)


      1 /* Copyright (c) 2001 Matej Pfajfar.
      2 * Copyright (c) 2001-2004, Roger Dingledine.
      3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
      4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
      5 /* See LICENSE for licensing information */
      6 
      7 /**
      8 * @file microdesc_st.h
      9 * @brief Microdescriptor structure
     10 **/
     11 
     12 #ifndef MICRODESC_ST_H
     13 #define MICRODESC_ST_H
     14 
     15 struct curve25519_public_key_t;
     16 struct ed25519_public_key_t;
     17 struct nodefamily_t;
     18 struct short_policy_t;
     19 struct smartlist_t;
     20 
     21 #include "ext/ht.h"
     22 
     23 /** A microdescriptor is the smallest amount of information needed to build a
     24 * circuit through a router.  They are generated by the directory authorities,
     25 * using information from the uploaded routerinfo documents.  They are not
     26 * self-signed, but are rather authenticated by having their hash in a signed
     27 * networkstatus document. */
     28 struct microdesc_t {
     29  /** Hashtable node, used to look up the microdesc by its digest. */
     30  HT_ENTRY(microdesc_t) node;
     31 
     32  /* Cache information */
     33 
     34  /**  When was this microdescriptor last listed in a consensus document?
     35   * Once a microdesc has been unlisted long enough, we can drop it.
     36   */
     37  time_t last_listed;
     38  /** Where is this microdescriptor currently stored? */
     39  saved_location_bitfield_t saved_location : 3;
     40  /** If true, do not attempt to cache this microdescriptor on disk. */
     41  unsigned int no_save : 1;
     42  /** If true, this microdesc has an entry in the microdesc_map */
     43  unsigned int held_in_map : 1;
     44  /** True iff the exit policy for this router rejects everything. */
     45  unsigned int policy_is_reject_star : 1;
     46  /** Reference count: how many node_ts have a reference to this microdesc? */
     47  unsigned int held_by_nodes;
     48 
     49  /** If saved_location == SAVED_IN_CACHE, this field holds the offset of the
     50   * microdescriptor in the cache. */
     51  off_t off;
     52 
     53  /* The string containing the microdesc. */
     54 
     55  /** A pointer to the encoded body of the microdescriptor.  If the
     56   * saved_location is SAVED_IN_CACHE, then the body is a pointer into an
     57   * mmap'd region.  Otherwise, it is a malloc'd string.  The string might not
     58   * be NUL-terminated; take the length from <b>bodylen</b>. */
     59  char *body;
     60  /** The length of the microdescriptor in <b>body</b>. */
     61  size_t bodylen;
     62  /** A SHA256-digest of the microdescriptor. */
     63  char digest[DIGEST256_LEN];
     64 
     65  /* Fields in the microdescriptor. */
     66 
     67  /** As routerinfo_t.onion_curve25519_pkey */
     68  struct curve25519_public_key_t *onion_curve25519_pkey;
     69  /** Ed25519 identity key, if included. */
     70  struct ed25519_public_key_t *ed25519_identity_pkey;
     71  /** As routerinfo_t.ipv6_addr */
     72  tor_addr_t ipv6_addr;
     73  /** As routerinfo_t.ipv6_orport */
     74  uint16_t ipv6_orport;
     75  /** As routerinfo_t.family, with readable members parsed. */
     76  struct nodefamily_t *family;
     77  /** A list of strings representing router family IDs.
     78   * May be null; Copied from family-ids.
     79   * (Happy families only.) */
     80  struct smartlist_t *family_ids;
     81 
     82  /** IPv4 exit policy summary */
     83  struct short_policy_t *exit_policy;
     84  /** IPv6 exit policy summary */
     85  struct short_policy_t *ipv6_exit_policy;
     86 };
     87 
     88 #endif /* !defined(MICRODESC_ST_H) */