tor

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

protover.h (4998B)


      1 /* Copyright (c) 2016-2021, The Tor Project, Inc. */
      2 /* See LICENSE for licensing information */
      3 
      4 /**
      5 * \file protover.h
      6 * \brief Headers and type declarations for protover.c
      7 **/
      8 
      9 #ifndef TOR_PROTOVER_H
     10 #define TOR_PROTOVER_H
     11 
     12 #include <stdbool.h>
     13 #include "lib/cc/torint.h"
     14 #include "lib/testsupport/testsupport.h"
     15 struct smartlist_t;
     16 
     17 /** The first version of Tor that included "proto" entries in its
     18 * descriptors.  Authorities should use this to decide whether to
     19 * guess proto lines. */
     20 /* This is a guess. */
     21 /// C_RUST_COUPLED: src/rust/protover/protover.rs
     22 ///                 `FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS`
     23 #define FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS "0.2.9.3-alpha"
     24 
     25 /** The protover version number that signifies ed25519 link handshake support
     26 */
     27 #define PROTOVER_LINKAUTH_ED25519_HANDSHAKE 3
     28 
     29 /** The protover version number that signifies extend2 cell support */
     30 #define PROTOVER_RELAY_EXTEND2 2
     31 /** The protover version number where relays can accept IPv6 connections */
     32 #define PROTOVER_RELAY_ACCEPT_IPV6 2
     33 /** The protover version number where relays can initiate IPv6 extends */
     34 #define PROTOVER_RELAY_EXTEND_IPV6 3
     35 /** The protover version number where relays can consider IPv6 connections
     36 *  canonical */
     37 #define PROTOVER_RELAY_CANONICAL_IPV6 3
     38 /** The protover version number where relays can accept ntorv3 */
     39 #define PROTOVER_RELAY_NTOR_V3 4
     40 /** The protover that signals conflux support. */
     41 #define PROTOVER_CONFLUX_V1 1
     42 
     43 /** The protover version number that signifies HSv3 intro point support */
     44 #define PROTOVER_HS_INTRO_V3 4
     45 /** The protover version number where intro points support denial of service
     46 * resistance */
     47 #define PROTOVER_HS_INTRO_DOS 5
     48 
     49 /** The protover version number that signifies HSv3 rendezvous point support */
     50 #define PROTOVER_HS_RENDEZVOUS_POINT_V3 2
     51 
     52 /** The protover version number that signifies HSDir support for HSv3 */
     53 #define PROTOVER_HSDIR_V3 2
     54 
     55 /** The protover that signals support for HS circuit setup padding machines */
     56 #define PROTOVER_HS_SETUP_PADDING 2
     57 
     58 /** The protover that signals support for congestion control */
     59 #define PROTOVER_FLOWCTRL_CC 2
     60 
     61 /** The protover required for negotiating protovers as part of the circuit
     62 * extension handshake. */
     63 #define PROTOVER_RELAY_NEGOTIATE_SUBPROTO 5
     64 
     65 /** The protover required for negotiating protovers as part of the circuit
     66 * extension handshake. */
     67 #define PROTOVER_RELAY_CRYPT_CGO 6
     68 
     69 /** List of recognized subprotocols. */
     70 /// C_RUST_COUPLED: src/rust/protover/ffi.rs `translate_to_rust`
     71 /// C_RUST_COUPLED: src/rust/protover/protover.rs `Proto`
     72 typedef enum protocol_type_t {
     73  PRT_LINK      = 0,
     74  PRT_LINKAUTH  = 1,
     75  PRT_RELAY     = 2,
     76  PRT_DIRCACHE  = 3,
     77  PRT_HSDIR     = 4,
     78  PRT_HSINTRO   = 5,
     79  PRT_HSREND    = 6,
     80  PRT_DESC      = 7,
     81  PRT_MICRODESC = 8,
     82  PRT_CONS      = 9,
     83  PRT_PADDING   = 10,
     84  PRT_FLOWCTRL  = 11,
     85  PRT_CONFLUX   = 12,
     86 } protocol_type_t;
     87 
     88 bool protover_list_is_invalid(const char *s);
     89 const char *protover_get_supported(const protocol_type_t type);
     90 int protover_all_supported(const char *s, char **missing);
     91 int protover_is_supported_here(protocol_type_t pr, uint32_t ver);
     92 const char *protover_get_supported_protocols(void);
     93 const char *protover_get_recommended_client_protocols(void);
     94 const char *protover_get_recommended_relay_protocols(void);
     95 const char *protover_get_required_client_protocols(void);
     96 const char *protover_get_required_relay_protocols(void);
     97 
     98 char *protover_compute_vote(const struct smartlist_t *list_of_proto_strings,
     99                            int threshold);
    100 const char *protover_compute_for_old_tor(const char *version);
    101 int protocol_list_supports_protocol(const char *list, protocol_type_t tp,
    102                                    uint32_t version);
    103 int protocol_list_supports_protocol_or_later(const char *list,
    104                                             protocol_type_t tp,
    105                                             uint32_t version);
    106 
    107 void protover_free_all(void);
    108 
    109 #ifdef PROTOVER_PRIVATE
    110 /** Represents a set of ranges of subprotocols of a given type. */
    111 typedef struct proto_entry_t {
    112  /** The name of the protocol.
    113   *
    114   * (This needs to handle voting on protocols which
    115   * we don't recognize yet, so it's a char* rather than a protocol_type_t.)
    116   */
    117  char *name;
    118  /** Bitmask of supported protocols.  Version 'x' is included in this
    119   * entry if and only if bit '1<<x' is set here. */
    120  uint64_t bitmask;
    121 } proto_entry_t;
    122 
    123 #if defined(TOR_UNIT_TESTS)
    124 STATIC struct smartlist_t *parse_protocol_list(const char *s);
    125 STATIC char *encode_protocol_list(const struct smartlist_t *sl);
    126 STATIC const char *protocol_type_to_str(protocol_type_t pr);
    127 STATIC int str_to_protocol_type(const char *s, protocol_type_t *pr_out);
    128 STATIC void proto_entry_free_(proto_entry_t *entry);
    129 #endif /* defined(TOR_UNIT_TESTS) */
    130 
    131 #define proto_entry_free(entry) \
    132  FREE_AND_NULL(proto_entry_t, proto_entry_free_, (entry))
    133 
    134 #endif /* defined(PROTOVER_PRIVATE) */
    135 
    136 #endif /* !defined(TOR_PROTOVER_H) */