1 /* Copyright (c) 2016-2021, The Tor Project, Inc. */
2 /* See LICENSE for licensing information */
6 * \brief Headers and type declarations for protover.c
10 #define TOR_PROTOVER_H
13 #include "lib/cc/torint.h"
14 #include "lib/testsupport/testsupport.h"
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"
25 /** The protover version number that signifies ed25519 link handshake support
27 #define PROTOVER_LINKAUTH_ED25519_HANDSHAKE 3
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
37 #define PROTOVER_RELAY_CANONICAL_IPV6 3
39 /** The protover version number that signifies HSv3 intro point support */
40 #define PROTOVER_HS_INTRO_V3 4
41 /** The protover version number where intro points support denial of service
43 #define PROTOVER_HS_INTRO_DOS 5
45 /** The protover version number that signifies HSv3 rendezvous point support */
46 #define PROTOVER_HS_RENDEZVOUS_POINT_V3 2
48 /** The protover version number that signifies HSDir support for HSv3 */
49 #define PROTOVER_HSDIR_V3 2
51 /** The protover that signals support for HS circuit setup padding machines */
52 #define PROTOVER_HS_SETUP_PADDING 2
54 /** List of recognized subprotocols. */
55 /// C_RUST_COUPLED: src/rust/protover/ffi.rs `translate_to_rust`
56 /// C_RUST_COUPLED: src/rust/protover/protover.rs `Proto`
57 typedef enum protocol_type_t
{
72 bool protover_list_is_invalid(const char *s
);
73 int protover_all_supported(const char *s
, char **missing
);
74 int protover_is_supported_here(protocol_type_t pr
, uint32_t ver
);
75 const char *protover_get_supported_protocols(void);
76 const char *protover_get_recommended_client_protocols(void);
77 const char *protover_get_recommended_relay_protocols(void);
78 const char *protover_get_required_client_protocols(void);
79 const char *protover_get_required_relay_protocols(void);
81 char *protover_compute_vote(const struct smartlist_t
*list_of_proto_strings
,
83 const char *protover_compute_for_old_tor(const char *version
);
84 int protocol_list_supports_protocol(const char *list
, protocol_type_t tp
,
86 int protocol_list_supports_protocol_or_later(const char *list
,
90 void protover_free_all(void);
92 #ifdef PROTOVER_PRIVATE
93 /** Represents a set of ranges of subprotocols of a given type. */
94 typedef struct proto_entry_t
{
95 /** The name of the protocol.
97 * (This needs to handle voting on protocols which
98 * we don't recognize yet, so it's a char* rather than a protocol_type_t.)
101 /** Bitmask of supported protocols. Version 'x' is included in this
102 * entry if and only if bit '1<<x' is set here. */
106 #if !defined(HAVE_RUST) && defined(TOR_UNIT_TESTS)
107 STATIC
struct smartlist_t
*parse_protocol_list(const char *s
);
108 STATIC
char *encode_protocol_list(const struct smartlist_t
*sl
);
109 STATIC
const char *protocol_type_to_str(protocol_type_t pr
);
110 STATIC
int str_to_protocol_type(const char *s
, protocol_type_t
*pr_out
);
111 STATIC
void proto_entry_free_(proto_entry_t
*entry
);
112 #endif /* !defined(HAVE_RUST) && defined(TOR_UNIT_TESTS) */
114 #define proto_entry_free(entry) \
115 FREE_AND_NULL(proto_entry_t, proto_entry_free_, (entry))
117 #endif /* defined(PROTOVER_PRIVATE) */
119 #endif /* !defined(TOR_PROTOVER_H) */