rama_net/tls/enums/
mod.rs

1#![allow(missing_docs)]
2#![allow(non_camel_case_types)]
3
4use rama_core::error::OpaqueError;
5use rama_utils::macros::enums::enum_builder;
6
7#[cfg(feature = "rustls")]
8mod rustls;
9
10#[cfg(feature = "boring")]
11mod boring;
12#[cfg(feature = "boring")]
13#[doc(inline)]
14pub use boring::openssl_cipher_list_str_from_cipher_list;
15
16enum_builder! {
17    /// The `ProtocolVersion` TLS protocol enum.  Values in this enum are taken
18    /// from the various RFCs covering TLS, and are listed by IANA.
19    /// The `Unknown` item is used when processing unrecognised ordinals.
20    @U16
21    pub enum ProtocolVersion {
22        SSLv2 => 0x0200,
23        SSLv3 => 0x0300,
24        TLSv1_0 => 0x0301,
25        TLSv1_1 => 0x0302,
26        TLSv1_2 => 0x0303,
27        TLSv1_3 => 0x0304,
28        DTLSv1_0 => 0xFEFF,
29        DTLSv1_2 => 0xFEFD,
30        DTLSv1_3 => 0xFEFC,
31    }
32}
33
34enum_builder! {
35    /// The `CipherSuite` TLS protocol enum.  Values in this enum are taken
36    /// from the various RFCs covering TLS, and are listed by IANA.
37    /// The `Unknown` item is used when processing unrecognised ordinals.
38    @U16
39    pub enum CipherSuite {
40        TLS_NULL_WITH_NULL_NULL => 0x0000,
41        TLS_RSA_WITH_NULL_MD5 => 0x0001,
42        TLS_RSA_WITH_NULL_SHA => 0x0002,
43        TLS_RSA_EXPORT_WITH_RC4_40_MD5 => 0x0003,
44        TLS_RSA_WITH_RC4_128_MD5 => 0x0004,
45        TLS_RSA_WITH_RC4_128_SHA => 0x0005,
46        TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 => 0x0006,
47        TLS_RSA_WITH_IDEA_CBC_SHA => 0x0007,
48        TLS_RSA_EXPORT_WITH_DES40_CBC_SHA => 0x0008,
49        TLS_RSA_WITH_DES_CBC_SHA => 0x0009,
50        TLS_RSA_WITH_3DES_EDE_CBC_SHA => 0x000a,
51        TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA => 0x000b,
52        TLS_DH_DSS_WITH_DES_CBC_SHA => 0x000c,
53        TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA => 0x000d,
54        TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA => 0x000e,
55        TLS_DH_RSA_WITH_DES_CBC_SHA => 0x000f,
56        TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA => 0x0010,
57        TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA => 0x0011,
58        TLS_DHE_DSS_WITH_DES_CBC_SHA => 0x0012,
59        TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA => 0x0013,
60        TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA => 0x0014,
61        TLS_DHE_RSA_WITH_DES_CBC_SHA => 0x0015,
62        TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA => 0x0016,
63        TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 => 0x0017,
64        TLS_DH_anon_WITH_RC4_128_MD5 => 0x0018,
65        TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA => 0x0019,
66        TLS_DH_anon_WITH_DES_CBC_SHA => 0x001a,
67        TLS_DH_anon_WITH_3DES_EDE_CBC_SHA => 0x001b,
68        SSL_FORTEZZA_KEA_WITH_NULL_SHA => 0x001c,
69        SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA => 0x001d,
70        TLS_KRB5_WITH_DES_CBC_SHA_or_SSL_FORTEZZA_KEA_WITH_RC4_128_SHA => 0x001e,
71        TLS_KRB5_WITH_3DES_EDE_CBC_SHA => 0x001f,
72        TLS_KRB5_WITH_RC4_128_SHA => 0x0020,
73        TLS_KRB5_WITH_IDEA_CBC_SHA => 0x0021,
74        TLS_KRB5_WITH_DES_CBC_MD5 => 0x0022,
75        TLS_KRB5_WITH_3DES_EDE_CBC_MD5 => 0x0023,
76        TLS_KRB5_WITH_RC4_128_MD5 => 0x0024,
77        TLS_KRB5_WITH_IDEA_CBC_MD5 => 0x0025,
78        TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA => 0x0026,
79        TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA => 0x0027,
80        TLS_KRB5_EXPORT_WITH_RC4_40_SHA => 0x0028,
81        TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 => 0x0029,
82        TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5 => 0x002a,
83        TLS_KRB5_EXPORT_WITH_RC4_40_MD5 => 0x002b,
84        TLS_PSK_WITH_NULL_SHA => 0x002c,
85        TLS_DHE_PSK_WITH_NULL_SHA => 0x002d,
86        TLS_RSA_PSK_WITH_NULL_SHA => 0x002e,
87        TLS_RSA_WITH_AES_128_CBC_SHA => 0x002f,
88        TLS_DH_DSS_WITH_AES_128_CBC_SHA => 0x0030,
89        TLS_DH_RSA_WITH_AES_128_CBC_SHA => 0x0031,
90        TLS_DHE_DSS_WITH_AES_128_CBC_SHA => 0x0032,
91        TLS_DHE_RSA_WITH_AES_128_CBC_SHA => 0x0033,
92        TLS_DH_anon_WITH_AES_128_CBC_SHA => 0x0034,
93        TLS_RSA_WITH_AES_256_CBC_SHA => 0x0035,
94        TLS_DH_DSS_WITH_AES_256_CBC_SHA => 0x0036,
95        TLS_DH_RSA_WITH_AES_256_CBC_SHA => 0x0037,
96        TLS_DHE_DSS_WITH_AES_256_CBC_SHA => 0x0038,
97        TLS_DHE_RSA_WITH_AES_256_CBC_SHA => 0x0039,
98        TLS_DH_anon_WITH_AES_256_CBC_SHA => 0x003a,
99        TLS_RSA_WITH_NULL_SHA256 => 0x003b,
100        TLS_RSA_WITH_AES_128_CBC_SHA256 => 0x003c,
101        TLS_RSA_WITH_AES_256_CBC_SHA256 => 0x003d,
102        TLS_DH_DSS_WITH_AES_128_CBC_SHA256 => 0x003e,
103        TLS_DH_RSA_WITH_AES_128_CBC_SHA256 => 0x003f,
104        TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 => 0x0040,
105        TLS_RSA_WITH_CAMELLIA_128_CBC_SHA => 0x0041,
106        TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA => 0x0042,
107        TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA => 0x0043,
108        TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA => 0x0044,
109        TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA => 0x0045,
110        TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA => 0x0046,
111        TLS_ECDH_ECDSA_WITH_NULL_SHA_draft => 0x0047,
112        TLS_ECDH_ECDSA_WITH_RC4_128_SHA_draft => 0x0048,
113        TLS_ECDH_ECDSA_WITH_DES_CBC_SHA_draft => 0x0049,
114        TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA_draft => 0x004a,
115        TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA_draft => 0x004b,
116        TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA_draft => 0x004c,
117        TLS_ECDH_ECNRA_WITH_DES_CBC_SHA_draft => 0x004d,
118        TLS_ECDH_ECNRA_WITH_3DES_EDE_CBC_SHA_draft => 0x004e,
119        TLS_ECMQV_ECDSA_NULL_SHA_draft => 0x004f,
120        TLS_ECMQV_ECDSA_WITH_RC4_128_SHA_draft => 0x0050,
121        TLS_ECMQV_ECDSA_WITH_DES_CBC_SHA_draft => 0x0051,
122        TLS_ECMQV_ECDSA_WITH_3DES_EDE_CBC_SHA_draft => 0x0052,
123        TLS_ECMQV_ECNRA_NULL_SHA_draft => 0x0053,
124        TLS_ECMQV_ECNRA_WITH_RC4_128_SHA_draft => 0x0054,
125        TLS_ECMQV_ECNRA_WITH_DES_CBC_SHA_draft => 0x0055,
126        TLS_ECMQV_ECNRA_WITH_3DES_EDE_CBC_SHA_draft => 0x0056,
127        TLS_ECDH_anon_NULL_WITH_SHA_draft => 0x0057,
128        TLS_ECDH_anon_WITH_RC4_128_SHA_draft => 0x0058,
129        TLS_ECDH_anon_WITH_DES_CBC_SHA_draft => 0x0059,
130        TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA_draft => 0x005a,
131        TLS_ECDH_anon_EXPORT_WITH_DES40_CBC_SHA_draft => 0x005b,
132        TLS_ECDH_anon_EXPORT_WITH_RC4_40_SHA_draft => 0x005c,
133        TLS_RSA_EXPORT1024_WITH_RC4_56_MD5 => 0x0060,
134        TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 => 0x0061,
135        TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA => 0x0062,
136        TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA => 0x0063,
137        TLS_RSA_EXPORT1024_WITH_RC4_56_SHA => 0x0064,
138        TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA => 0x0065,
139        TLS_DHE_DSS_WITH_RC4_128_SHA => 0x0066,
140        TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 => 0x0067,
141        TLS_DH_DSS_WITH_AES_256_CBC_SHA256 => 0x0068,
142        TLS_DH_RSA_WITH_AES_256_CBC_SHA256 => 0x0069,
143        TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 => 0x006a,
144        TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 => 0x006b,
145        TLS_DH_anon_WITH_AES_128_CBC_SHA256 => 0x006c,
146        TLS_DH_anon_WITH_AES_256_CBC_SHA256 => 0x006d,
147        TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD => 0x0072,
148        TLS_DHE_DSS_WITH_AES_128_CBC_RMD => 0x0073,
149        TLS_DHE_DSS_WITH_AES_256_CBC_RMD => 0x0074,
150        TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD => 0x0077,
151        TLS_DHE_RSA_WITH_AES_128_CBC_RMD => 0x0078,
152        TLS_DHE_RSA_WITH_AES_256_CBC_RMD => 0x0079,
153        TLS_RSA_WITH_3DES_EDE_CBC_RMD => 0x007c,
154        TLS_RSA_WITH_AES_128_CBC_RMD => 0x007d,
155        TLS_RSA_WITH_AES_256_CBC_RMD => 0x007e,
156        TLS_GOSTR341094_WITH_28147_CNT_IMIT => 0x0080,
157        TLS_GOSTR341001_WITH_28147_CNT_IMIT => 0x0081,
158        TLS_GOSTR341094_WITH_NULL_GOSTR3411 => 0x0082,
159        TLS_GOSTR341001_WITH_NULL_GOSTR3411 => 0x0083,
160        TLS_RSA_WITH_CAMELLIA_256_CBC_SHA => 0x0084,
161        TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA => 0x0085,
162        TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA => 0x0086,
163        TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA => 0x0087,
164        TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA => 0x0088,
165        TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA => 0x0089,
166        TLS_PSK_WITH_RC4_128_SHA => 0x008a,
167        TLS_PSK_WITH_3DES_EDE_CBC_SHA => 0x008b,
168        TLS_PSK_WITH_AES_128_CBC_SHA => 0x008c,
169        TLS_PSK_WITH_AES_256_CBC_SHA => 0x008d,
170        TLS_DHE_PSK_WITH_RC4_128_SHA => 0x008e,
171        TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA => 0x008f,
172        TLS_DHE_PSK_WITH_AES_128_CBC_SHA => 0x0090,
173        TLS_DHE_PSK_WITH_AES_256_CBC_SHA => 0x0091,
174        TLS_RSA_PSK_WITH_RC4_128_SHA => 0x0092,
175        TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA => 0x0093,
176        TLS_RSA_PSK_WITH_AES_128_CBC_SHA => 0x0094,
177        TLS_RSA_PSK_WITH_AES_256_CBC_SHA => 0x0095,
178        TLS_RSA_WITH_SEED_CBC_SHA => 0x0096,
179        TLS_DH_DSS_WITH_SEED_CBC_SHA => 0x0097,
180        TLS_DH_RSA_WITH_SEED_CBC_SHA => 0x0098,
181        TLS_DHE_DSS_WITH_SEED_CBC_SHA => 0x0099,
182        TLS_DHE_RSA_WITH_SEED_CBC_SHA => 0x009a,
183        TLS_DH_anon_WITH_SEED_CBC_SHA => 0x009b,
184        TLS_RSA_WITH_AES_128_GCM_SHA256 => 0x009c,
185        TLS_RSA_WITH_AES_256_GCM_SHA384 => 0x009d,
186        TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 => 0x009e,
187        TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 => 0x009f,
188        TLS_DH_RSA_WITH_AES_128_GCM_SHA256 => 0x00a0,
189        TLS_DH_RSA_WITH_AES_256_GCM_SHA384 => 0x00a1,
190        TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 => 0x00a2,
191        TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 => 0x00a3,
192        TLS_DH_DSS_WITH_AES_128_GCM_SHA256 => 0x00a4,
193        TLS_DH_DSS_WITH_AES_256_GCM_SHA384 => 0x00a5,
194        TLS_DH_anon_WITH_AES_128_GCM_SHA256 => 0x00a6,
195        TLS_DH_anon_WITH_AES_256_GCM_SHA384 => 0x00a7,
196        TLS_PSK_WITH_AES_128_GCM_SHA256 => 0x00a8,
197        TLS_PSK_WITH_AES_256_GCM_SHA384 => 0x00a9,
198        TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 => 0x00aa,
199        TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 => 0x00ab,
200        TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 => 0x00ac,
201        TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 => 0x00ad,
202        TLS_PSK_WITH_AES_128_CBC_SHA256 => 0x00ae,
203        TLS_PSK_WITH_AES_256_CBC_SHA384 => 0x00af,
204        TLS_PSK_WITH_NULL_SHA256 => 0x00b0,
205        TLS_PSK_WITH_NULL_SHA384 => 0x00b1,
206        TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 => 0x00b2,
207        TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 => 0x00b3,
208        TLS_DHE_PSK_WITH_NULL_SHA256 => 0x00b4,
209        TLS_DHE_PSK_WITH_NULL_SHA384 => 0x00b5,
210        TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 => 0x00b6,
211        TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 => 0x00b7,
212        TLS_RSA_PSK_WITH_NULL_SHA256 => 0x00b8,
213        TLS_RSA_PSK_WITH_NULL_SHA384 => 0x00b9,
214        TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 => 0x00ba,
215        TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 => 0x00bb,
216        TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 => 0x00bc,
217        TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 => 0x00bd,
218        TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 => 0x00be,
219        TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 => 0x00bf,
220        TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c0,
221        TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c1,
222        TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c2,
223        TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c3,
224        TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c4,
225        TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c5,
226        TLS_SM4_GCM_SM3 => 0x00C6,
227        TLS_SM4_CCM_SM3 => 0x00C7,
228        TLS_EMPTY_RENEGOTIATION_INFO_SCSV => 0x00ff,
229        TLS13_AES_128_GCM_SHA256 => 0x1301,
230        TLS13_AES_256_GCM_SHA384 => 0x1302,
231        TLS13_CHACHA20_POLY1305_SHA256 => 0x1303,
232        TLS13_AES_128_CCM_SHA256 => 0x1304,
233        TLS13_AES_128_CCM_8_SHA256 => 0x1305,
234        TLS_AEGIS_256_SHA512 => 0x1306,
235        TLS_AEGIS_128L_SHA256 => 0x1307,
236        TLS_FALLBACK_SCSV => 0x5600,
237        TLS_ECDH_ECDSA_WITH_NULL_SHA => 0xc001,
238        TLS_ECDH_ECDSA_WITH_RC4_128_SHA => 0xc002,
239        TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA => 0xc003,
240        TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA => 0xc004,
241        TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA => 0xc005,
242        TLS_ECDHE_ECDSA_WITH_NULL_SHA => 0xc006,
243        TLS_ECDHE_ECDSA_WITH_RC4_128_SHA => 0xc007,
244        TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA => 0xc008,
245        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA => 0xc009,
246        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA => 0xc00a,
247        TLS_ECDH_RSA_WITH_NULL_SHA => 0xc00b,
248        TLS_ECDH_RSA_WITH_RC4_128_SHA => 0xc00c,
249        TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA => 0xc00d,
250        TLS_ECDH_RSA_WITH_AES_128_CBC_SHA => 0xc00e,
251        TLS_ECDH_RSA_WITH_AES_256_CBC_SHA => 0xc00f,
252        TLS_ECDHE_RSA_WITH_NULL_SHA => 0xc010,
253        TLS_ECDHE_RSA_WITH_RC4_128_SHA => 0xc011,
254        TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA => 0xc012,
255        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA => 0xc013,
256        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA => 0xc014,
257        TLS_ECDH_anon_WITH_NULL_SHA => 0xc015,
258        TLS_ECDH_anon_WITH_RC4_128_SHA => 0xc016,
259        TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA => 0xc017,
260        TLS_ECDH_anon_WITH_AES_128_CBC_SHA => 0xc018,
261        TLS_ECDH_anon_WITH_AES_256_CBC_SHA => 0xc019,
262        TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA => 0xc01a,
263        TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA => 0xc01b,
264        TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA => 0xc01c,
265        TLS_SRP_SHA_WITH_AES_128_CBC_SHA => 0xc01d,
266        TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA => 0xc01e,
267        TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA => 0xc01f,
268        TLS_SRP_SHA_WITH_AES_256_CBC_SHA => 0xc020,
269        TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA => 0xc021,
270        TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA => 0xc022,
271        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 => 0xc023,
272        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 => 0xc024,
273        TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 => 0xc025,
274        TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 => 0xc026,
275        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 => 0xc027,
276        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 => 0xc028,
277        TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 => 0xc029,
278        TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 => 0xc02a,
279        TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 => 0xc02b,
280        TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 => 0xc02c,
281        TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 => 0xc02d,
282        TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 => 0xc02e,
283        TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 => 0xc02f,
284        TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 => 0xc030,
285        TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 => 0xc031,
286        TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 => 0xc032,
287        TLS_ECDHE_PSK_WITH_RC4_128_SHA => 0xc033,
288        TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA => 0xc034,
289        TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA => 0xc035,
290        TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA => 0xc036,
291        TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 => 0xc037,
292        TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 => 0xc038,
293        TLS_ECDHE_PSK_WITH_NULL_SHA => 0xc039,
294        TLS_ECDHE_PSK_WITH_NULL_SHA256 => 0xc03a,
295        TLS_ECDHE_PSK_WITH_NULL_SHA384 => 0xc03b,
296        TLS_RSA_WITH_ARIA_128_CBC_SHA256 => 0xc03c,
297        TLS_RSA_WITH_ARIA_256_CBC_SHA384 => 0xc03d,
298        TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256 => 0xc03e,
299        TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384 => 0xc03f,
300        TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256 => 0xc040,
301        TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384 => 0xc041,
302        TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256 => 0xc042,
303        TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384 => 0xc043,
304        TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 => 0xc044,
305        TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 => 0xc045,
306        TLS_DH_anon_WITH_ARIA_128_CBC_SHA256 => 0xc046,
307        TLS_DH_anon_WITH_ARIA_256_CBC_SHA384 => 0xc047,
308        TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 => 0xc048,
309        TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 => 0xc049,
310        TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 => 0xc04a,
311        TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 => 0xc04b,
312        TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 => 0xc04c,
313        TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 => 0xc04d,
314        TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 => 0xc04e,
315        TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 => 0xc04f,
316        TLS_RSA_WITH_ARIA_128_GCM_SHA256 => 0xc050,
317        TLS_RSA_WITH_ARIA_256_GCM_SHA384 => 0xc051,
318        TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 => 0xc052,
319        TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 => 0xc053,
320        TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256 => 0xc054,
321        TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384 => 0xc055,
322        TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256 => 0xc056,
323        TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384 => 0xc057,
324        TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256 => 0xc058,
325        TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384 => 0xc059,
326        TLS_DH_anon_WITH_ARIA_128_GCM_SHA256 => 0xc05a,
327        TLS_DH_anon_WITH_ARIA_256_GCM_SHA384 => 0xc05b,
328        TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 => 0xc05c,
329        TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 => 0xc05d,
330        TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 => 0xc05e,
331        TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 => 0xc05f,
332        TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 => 0xc060,
333        TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 => 0xc061,
334        TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 => 0xc062,
335        TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 => 0xc063,
336        TLS_PSK_WITH_ARIA_128_CBC_SHA256 => 0xc064,
337        TLS_PSK_WITH_ARIA_256_CBC_SHA384 => 0xc065,
338        TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 => 0xc066,
339        TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 => 0xc067,
340        TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 => 0xc068,
341        TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 => 0xc069,
342        TLS_PSK_WITH_ARIA_128_GCM_SHA256 => 0xc06a,
343        TLS_PSK_WITH_ARIA_256_GCM_SHA384 => 0xc06b,
344        TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 => 0xc06c,
345        TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 => 0xc06d,
346        TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 => 0xc06e,
347        TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 => 0xc06f,
348        TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 => 0xc070,
349        TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 => 0xc071,
350        TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 => 0xc072,
351        TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 => 0xc073,
352        TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 => 0xc074,
353        TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 => 0xc075,
354        TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 => 0xc076,
355        TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 => 0xc077,
356        TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 => 0xc078,
357        TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 => 0xc079,
358        TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc07a,
359        TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc07b,
360        TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc07c,
361        TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc07d,
362        TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc07e,
363        TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc07f,
364        TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 => 0xc080,
365        TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 => 0xc081,
366        TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256 => 0xc082,
367        TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384 => 0xc083,
368        TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256 => 0xc084,
369        TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384 => 0xc085,
370        TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc086,
371        TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc087,
372        TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc088,
373        TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc089,
374        TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc08a,
375        TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc08b,
376        TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc08c,
377        TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc08d,
378        TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 => 0xc08e,
379        TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 => 0xc08f,
380        TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 => 0xc090,
381        TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 => 0xc091,
382        TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 => 0xc092,
383        TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 => 0xc093,
384        TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 => 0xc094,
385        TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 => 0xc095,
386        TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 => 0xc096,
387        TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 => 0xc097,
388        TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 => 0xc098,
389        TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 => 0xc099,
390        TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 => 0xc09a,
391        TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 => 0xc09b,
392        TLS_RSA_WITH_AES_128_CCM => 0xc09c,
393        TLS_RSA_WITH_AES_256_CCM => 0xc09d,
394        TLS_DHE_RSA_WITH_AES_128_CCM => 0xc09e,
395        TLS_DHE_RSA_WITH_AES_256_CCM => 0xc09f,
396        TLS_RSA_WITH_AES_128_CCM_8 => 0xc0a0,
397        TLS_RSA_WITH_AES_256_CCM_8 => 0xc0a1,
398        TLS_DHE_RSA_WITH_AES_128_CCM_8 => 0xc0a2,
399        TLS_DHE_RSA_WITH_AES_256_CCM_8 => 0xc0a3,
400        TLS_PSK_WITH_AES_128_CCM => 0xc0a4,
401        TLS_PSK_WITH_AES_256_CCM => 0xc0a5,
402        TLS_DHE_PSK_WITH_AES_128_CCM => 0xc0a6,
403        TLS_DHE_PSK_WITH_AES_256_CCM => 0xc0a7,
404        TLS_PSK_WITH_AES_128_CCM_8 => 0xc0a8,
405        TLS_PSK_WITH_AES_256_CCM_8 => 0xc0a9,
406        TLS_PSK_DHE_WITH_AES_128_CCM_8 => 0xc0aa,
407        TLS_PSK_DHE_WITH_AES_256_CCM_8 => 0xc0ab,
408        TLS_ECDHE_ECDSA_WITH_AES_128_CCM => 0xc0ac,
409        TLS_ECDHE_ECDSA_WITH_AES_256_CCM => 0xc0ad,
410        TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 => 0xc0ae,
411        TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 => 0xc0af,
412        TLS_ECCPWD_WITH_AES_128_GCM_SHA256 => 0xc0b0,
413        TLS_ECCPWD_WITH_AES_256_GCM_SHA384 => 0xc0b1,
414        TLS_ECCPWD_WITH_AES_128_CCM_SHA256 => 0xc0b2,
415        TLS_ECCPWD_WITH_AES_256_CCM_SHA384 => 0xc0b3,
416        TLS_SHA256_SHA256 => 0xc0b4,
417        TLS_SHA384_SHA384 => 0xC0B5,
418        TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC => 0xc100,
419        TLS_GOSTR341112_256_WITH_MAGMA_CTR_OMAC => 0xc101,
420        TLS_GOSTR341112_256_WITH_28147_CNT_IMIT => 0xc102,
421        TLS_GOSTR341112_256_WITH_KUZNYECHIK_MGM_L => 0xc103,
422        TLS_GOSTR341112_256_WITH_MAGMA_MGM_L => 0xC104,
423        TLS_GOSTR341112_256_WITH_KUZNYECHIK_MGM_S => 0xC105,
424        TLS_GOSTR341112_256_WITH_MAGMA_MGM_S => 0xC106,
425        TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 => 0xcca8,
426        TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 => 0xcca9,
427        TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 => 0xccaa,
428        TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 => 0xccab,
429        TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 => 0xccac,
430        TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 => 0xccad,
431        TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 => 0xccae,
432        TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 => 0xd001,
433        TLS_ECDHE_PSK_WITH_AES_256_GCM_SHA384 => 0xd002,
434        TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256 => 0xd003,
435        TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256 => 0xd005,
436        SSL_RSA_FIPS_WITH_DES_CBC_SHA => 0xfefe,
437        SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA => 0xfeff,
438    }
439}
440
441enum_builder! {
442    /// The `SignatureScheme` TLS protocol enum.  Values in this enum are taken
443    /// from the various RFCs covering TLS, and are listed by IANA.
444    /// The `Unknown` item is used when processing unrecognised ordinals.
445    @U16
446    pub enum SignatureScheme {
447        RSA_PKCS1_SHA1 => 0x0201,
448        ECDSA_SHA1_Legacy => 0x0203,
449        SHA224_ECDSA => 0x0303,
450        SHA224_RSA => 0x0301,
451        SHA224_DSA => 0x0302,
452        RSA_PKCS1_SHA256 => 0x0401,
453        SHA256_DSA => 0x0402,
454        ECDSA_NISTP256_SHA256 => 0x0403,
455        RSA_PKCS1_SHA256_LEGACY => 0x0420,
456        RSA_PKCS1_SHA384 => 0x0501,
457        SHA384_DSA => 0x0502,
458        ECDSA_NISTP384_SHA384 => 0x0503,  // also labeled as ecdsa_secp384r1_sha384
459        RSA_PKCS1_SHA384_LEGACY => 0x0520,
460        RSA_PKCS1_SHA512 => 0x0601,
461        SHA512_DSA => 0x0602,
462        ECDSA_NISTP521_SHA512 => 0x0603,
463        RSA_PKCS1_SHA512_LEGACY => 0x0620,
464        ECCSI_SHA256 => 0x0704,
465        ISO_IBS1 => 0x0705,
466        ISO_IBS2 => 0x0706,
467        ISO_CHINESE_IBS => 0x0707,
468        SM2SIG_SM3 => 0x0708,
469        GOSTR34102012_256A => 0x0709,
470        GOSTR34102012_256B => 0x070a,
471        GOSTR34102012_256C => 0x070b,
472        GOSTR34102012_256D => 0x070c,
473        GOSTR34102012_512A => 0x070d,
474        GOSTR34102012_512B => 0x070e,
475        GOSTR34102012_512C => 0x070f,
476        RSA_PSS_SHA256 => 0x0804,
477        RSA_PSS_SHA384 => 0x0805,  // also known as RSA_PSS_RSAE_SHA384
478        RSA_PSS_SHA512 => 0x0806,  // also known as RSA_PSS_RSAE_SHA512
479        ED25519 => 0x0807,
480        ED448 => 0x0808,
481        RSA_PSS_PSS_SHA256 => 0x0809,
482        RSA_PSS_PSS_SHA384 => 0x080a,
483        RSA_PSS_PSS_SHA512 => 0x080b,
484        ECDSA_BRAINPOOLP256R1TLS13_SHA256 => 0x081a,
485        ECDSA_BRAINPOOLP384R1TLS13_SHA384 => 0x081b,
486        ECDSA_BRAINPOOLP512R1TLS13_SHA512 => 0x081c,
487        RSA_PKCS1_MD5_SHA1 => 0xff01,
488    }
489}
490
491enum_builder! {
492    /// The `ExtensionId` enum.  Values in this enum are taken
493    /// from the various RFCs covering TLS, and are listed by IANA.
494    /// The `Unknown` item is used when processing unrecognised ordinals.
495    @U16
496    pub enum ExtensionId {
497        SERVER_NAME => 0,
498        MAX_FRAGMENT_LENGTH => 1,
499        CLIENT_CERTIFICATE_URL => 2,
500        TRUSTED_CA_KEYS => 3,
501        TRUNCATED_HMAC => 4,
502        STATUS_REQUEST => 5,
503        USER_MAPPING => 6,
504        CLIENT_AUTHZ => 7,
505        SERVER_AUTHZ => 8,
506        CERT_TYPE => 9,
507        SUPPORTED_GROUPS => 10,
508        EC_POINT_FORMATS => 11,
509        SRP => 12,
510        SIGNATURE_ALGORITHMS => 13,
511        USE_SRTP => 14,
512        HEARTBEAT => 15,
513        APPLICATION_LAYER_PROTOCOL_NEGOTIATION => 16,
514        STATUS_REQUEST_V2 => 17,
515        SIGNED_CERTIFICATE_TIMESTAMP => 18,
516        CLIENT_CERTIFICATE_TYPE => 19,
517        SERVER_CERTIFICATE_TYPE => 20,
518        PADDING => 21,
519        ENCRYPT_THEN_MAC => 22,
520        EXTENDED_MASTER_SECRET => 23,
521        TOKEN_BINDING => 24,
522        CACHED_INFO => 25,
523        TLS_LTS => 26,
524        COMPRESS_CERTIFICATE => 27,
525        RECORD_SIZE_LIMIT => 28,
526        PWD_PROTECT => 29,
527        PWD_CLEAR => 30,
528        PASSWORD_SALT => 31,
529        TICKET_PINNING => 32,
530        TLS_CERT_WITH_EXTERN_PSK => 33,
531        DELEGATED_CREDENTIAL => 34,
532        SESSION_TICKET => 35,
533        TLMSP => 36,
534        TLMSP_PROXYING => 37,
535        TLMSP_DELEGATE => 38,
536        SUPPORTED_EKT_CIPHERS => 39,
537        PRE_SHARED_KEY => 41,
538        EARLY_DATA => 42,
539        SUPPORTED_VERSIONS => 43,
540        COOKIE => 44,
541        PSK_KEY_EXCHANGE_MODES => 45,
542        CERTIFICATE_AUTHORITIES => 47,
543        OID_FILTERS => 48,
544        POST_HANDSHAKE_AUTH => 49,
545        SIGNATURE_ALGORITHMS_CERT => 50,
546        KEY_SHARE => 51,
547        TRANSPARENCY_INFO => 52,
548        CONNECTION_ID => 54,
549        EXTERNAL_ID_HASH => 55,
550        EXTERNAL_SESSION_ID => 56,
551        QUIC_TRANSPORT_PARAMETERS => 57,
552        TICKET_REQUEST => 58,
553        DNSSEC_CHAIN => 59,
554        SEQUENCE_NUMBER_ENCRYPTION_ALGORITHMS => 60,
555        RRC => 61,
556        NEXT_PROTOCOL_NEGOTIATION => 13172,
557        ECH_OUTER_EXTENSIONS => 64768,
558        ENCRYPTED_CLIENT_HELLO => 65037,
559        RENEGOTIATION_INFO => 65281,
560    }
561}
562
563enum_builder! {
564    /// The `CompressionAlgorithm` TLS protocol enum.  Values in this enum are taken
565    /// from the various RFCs covering TLS, and are listed by IANA.
566    /// The `Unknown` item is used when processing unrecognised ordinals.
567    @U8
568    pub enum CompressionAlgorithm {
569        Null => 0x00,
570        Deflate => 0x01,
571    }
572}
573
574enum_builder! {
575    /// The `ECPointFormat` TLS protocol enum.  Values in this enum are taken
576    /// from the various RFCs covering TLS, and are listed by IANA.
577    /// The `Unknown` item is used when processing unrecognised ordinals.
578    @U8
579    pub enum ECPointFormat {
580        Uncompressed => 0x00,
581        ANSIX962CompressedPrime => 0x01,
582        ANSIX962CompressedChar2 => 0x02,
583    }
584}
585
586enum_builder! {
587    /// The `SupportedGroup` TLS protocol enum.  Values in this enum are taken
588    /// from the various RFCs covering TLS, and are listed by IANA.
589    /// The `Unknown` item is used when processing unrecognised ordinals.
590    @U16
591    pub enum SupportedGroup {
592        SECT163K1 => 0x0001,
593        SECT163R1 => 0x0002,
594        SECT163R2 => 0x0003,
595        SECT193R1 => 0x0004,
596        SECT193R2 => 0x0005,
597        SECT233K1 => 0x0006,
598        SECT233R1 => 0x0007,
599        SECT239K1 => 0x0008,
600        SECT283K1 => 0x0009,
601        SECT283R1 => 0x000a,
602        SECT409K1 => 0x000b,
603        SECT409R1 => 0x000c,
604        SECT571K1 => 0x000d,
605        SECT571R1 => 0x000e,
606        SECP160K1 => 0x000f,
607        SECP160R1 => 0x0010,
608        SECP160R2 => 0x0011,
609        SECP192K1 => 0x0012,
610        SECP192R1 => 0x0013,
611        SECP224K1 => 0x0014,
612        SECP224R1 => 0x0015,
613        SECP256K1 => 0x0016,
614        SECP256R1 => 0x0017,
615        SECP384R1 => 0x0018,
616        SECP521R1 => 0x0019,
617        BRAINPOOLP256R1 => 0x001a,
618        BRAINPOOLP384R1 => 0x001b,
619        BRAINPOOLP512R1 => 0x001c,
620        X25519 => 0x001d,
621        X448 => 0x001e,
622        BRAINPOOLP256R1TLS13 => 0x001f,
623        BRAINPOOLP384R1TLS13 => 0x0020,
624        BRAINPOOLP512R1TLS13 => 0x0021,
625        GC256A => 0x0022,
626        GC256B => 0x0023,
627        GC256C => 0x0024,
628        GC256D => 0x0025,
629        GC512A => 0x0026,
630        GC512B => 0x0027,
631        GC512C => 0x0028,
632        CURVESM2 => 0x0029,
633        FFDHE2048 => 0x0100,
634        FFDHE3072 => 0x0101,
635        FFDHE4096 => 0x0102,
636        FFDHE6144 => 0x0103,
637        FFDHE8192 => 0x0104,
638        X25519KYBER768DRAFT00 => 0x6399,
639        SECP256R1KYBER768DRAFT00 => 0x639a,
640        ARBITRARY_EXPLICIT_PRIME_CURVES => 0xff01,
641        ARBITRARY_EXPLICIT_CHAR2_CURVES => 0xff02,
642    }
643}
644
645enum_builder! {
646    /// The Application Layer Negotiation Protocol (ALPN) identifiers
647    /// as found in the IANA registry for Tls ExtensionType values.
648    @Bytes
649    pub enum ApplicationProtocol {
650        HTTP_09 => b"http/0.9",
651        HTTP_10 => b"http/1.0",
652        HTTP_11 => b"http/1.1",
653        SPDY_1 => b"spdy/1",
654        SPDY_2 => b"spdy/2",
655        SPDY_3 => b"spdy/3",
656        STUN_TURN => b"stun.turn",
657        STUN_NAT_DISCOVERY => b"stun.nat-discovery",
658        HTTP_2 => b"h2",
659        HTTP_2_TCP => b"h2c",
660        WebRTC => b"webrtc",
661        CWebRTC => b"c-webrtc",
662        FTP => b"ftp",
663        IMAP => b"imap",
664        POP3 => b"pop3",
665        ManageSieve => b"managesieve",
666        CoAP_TLS => b"coap",
667        CoAP_DTLS => b"co",
668        XMPP_CLIENT => b"xmpp-client",
669        XMPP_SERVER => b"xmpp-server",
670        ACME_TLS => b"acme-tls/1",
671        MQTT => b"mqtt",
672        DNS_OVER_TLS => b"dot",
673        NTSKE_1 => b"ntske/1",
674        SunRPC => b"sunrpc",
675        HTTP_3 => b"h3",
676        SMB2 => b"smb",
677        IRC => b"irc",
678        NNTP => b"nntp",
679        NNSP => b"nnsp",
680        DoQ => b"doq",
681        SIP => b"sip/2",
682        TDS_80 => b"tds/8.0",
683        DICOM => b"dicom",
684        PostgreSQL => b"postgresql",
685    }
686}
687
688impl ApplicationProtocol {
689    pub fn encode_wire_format(&self, w: &mut impl std::io::Write) -> std::io::Result<usize> {
690        let b = self.as_bytes();
691        if b.len() > 255 {
692            return Err(std::io::Error::new(
693                std::io::ErrorKind::InvalidData,
694                OpaqueError::from_display("application protocol is too large"),
695            ));
696        }
697
698        w.write_all(&[b.len() as u8])?;
699        w.write_all(b)?;
700        Ok(b.len() + 1)
701    }
702
703    pub fn decode_wire_format(r: &mut impl std::io::Read) -> std::io::Result<ApplicationProtocol> {
704        let mut length = [0];
705        r.read_exact(&mut length)?;
706
707        let length = length[0] as usize;
708
709        let mut buf = vec![0; length];
710        r.read_exact(&mut buf[..])?;
711
712        Ok(buf.into())
713    }
714}
715
716enum_builder! {
717    /// The `CertificateCompressionAlgorithm` TLS protocol enum, the algorithm used to compress the certificate.
718    /// The algorithm MUST be one of the algorithms listed in the peer's compress_certificate extension.
719    @U16
720    pub enum CertificateCompressionAlgorithm {
721        Zlib => 0x0001,
722        Brotli => 0x0002,
723        Zstd => 0x0003,
724    }
725}
726
727enum_builder! {
728    /// Key derivation function used in hybrid public key encryption
729    @U16
730    pub enum KeyDerivationFunction {
731        HKDF_SHA256 => 0x0001,
732        HKDF_SHA384 => 0x0002,
733        HKDF_SHA512 => 0x0003,
734    }
735}
736
737enum_builder! {
738    /// Authenticated encryption with associated data (AEAD) used in hybrid public key encryption
739    @U16
740    pub enum AuthenticatedEncryptionWithAssociatedData {
741        AES_128_GCM => 0x0001,
742        AES_256_GCM => 0x0002,
743        ChaCha20Poly1305 => 0x0003,
744        ExportOnly => 0xffff,
745    }
746}
747
748#[cfg(test)]
749mod tests {
750    use super::*;
751
752    #[test]
753    fn test_enum_uint_display() {
754        assert_eq!("X25519 (0x001d)", SupportedGroup::X25519.to_string());
755        assert_eq!("Unknown (0xffff)", SupportedGroup::from(0xffff).to_string());
756        assert_eq!("GREASE (0xdada)", SupportedGroup::from(0xdada).to_string());
757    }
758
759    #[test]
760    fn test_enum_bytes_display() {
761        assert_eq!("http/1.1", ApplicationProtocol::HTTP_11.to_string());
762        assert_eq!(
763            "Unknown (h42)",
764            ApplicationProtocol::from(b"h42").to_string()
765        );
766        assert_eq!(
767            "GREASE (0xdada)",
768            ApplicationProtocol::from(&[0xda, 0xda]).to_string()
769        );
770        assert_eq!("Unknown (\0)", ApplicationProtocol::from(&[0]).to_string());
771    }
772
773    #[test]
774    fn test_application_protocol_wire_format() {
775        let test_cases = [
776            (ApplicationProtocol::HTTP_11, "\x08http/1.1"),
777            (ApplicationProtocol::HTTP_2, "\x02h2"),
778        ];
779        for (proto, expected_wire_format) in test_cases {
780            let mut buf = Vec::new();
781            proto.encode_wire_format(&mut buf).unwrap();
782            assert_eq!(
783                &buf[..],
784                expected_wire_format.as_bytes(),
785                "proto({}) => expected_wire_format({})",
786                proto,
787                expected_wire_format
788            );
789
790            let mut reader = std::io::Cursor::new(&buf[..]);
791            let output_proto = ApplicationProtocol::decode_wire_format(&mut reader).unwrap();
792            assert_eq!(
793                output_proto, proto,
794                "expected_wire_format({}) => proto({})",
795                expected_wire_format, proto,
796            );
797        }
798    }
799
800    #[test]
801    fn test_application_protocol_decode_wire_format_multiple() {
802        const INPUT: &str = "\x02h2\x08http/1.1";
803        let mut r = std::io::Cursor::new(INPUT);
804        assert_eq!(
805            ApplicationProtocol::HTTP_2,
806            ApplicationProtocol::decode_wire_format(&mut r).unwrap()
807        );
808        assert_eq!(3, r.position());
809        assert_eq!(&INPUT.as_bytes()[0..3], b"\x02h2");
810        assert_eq!(
811            ApplicationProtocol::HTTP_11,
812            ApplicationProtocol::decode_wire_format(&mut r).unwrap()
813        );
814        assert_eq!(12, r.position());
815        assert_eq!(&INPUT.as_bytes()[3..12], b"\x08http/1.1");
816    }
817
818    #[test]
819    fn test_enum_u8_serialize_deserialize() {
820        let p: ECPointFormat = serde_json::from_str(
821            &serde_json::to_string(&ECPointFormat::ANSIX962CompressedChar2).unwrap(),
822        )
823        .unwrap();
824        assert_eq!(ECPointFormat::ANSIX962CompressedChar2, p);
825
826        let p: ECPointFormat =
827            serde_json::from_str(&serde_json::to_string(&ECPointFormat::from(42u8)).unwrap())
828                .unwrap();
829        assert_eq!(ECPointFormat::from(42u8), p);
830    }
831
832    #[test]
833    fn test_enum_u16_serialize_deserialize() {
834        let p: SupportedGroup =
835            serde_json::from_str(&serde_json::to_string(&SupportedGroup::BRAINPOOLP384R1).unwrap())
836                .unwrap();
837        assert_eq!(SupportedGroup::BRAINPOOLP384R1, p);
838
839        let p: SupportedGroup =
840            serde_json::from_str(&serde_json::to_string(&SupportedGroup::from(0xffffu16)).unwrap())
841                .unwrap();
842        assert_eq!(SupportedGroup::from(0xffffu16), p);
843    }
844
845    #[test]
846    fn test_enum_bytes_serialize_deserialize() {
847        let p: ApplicationProtocol =
848            serde_json::from_str(&serde_json::to_string(&ApplicationProtocol::HTTP_3).unwrap())
849                .unwrap();
850        assert_eq!(ApplicationProtocol::HTTP_3, p);
851
852        let p: ApplicationProtocol = serde_json::from_str(
853            &serde_json::to_string(&ApplicationProtocol::from(b"foobar")).unwrap(),
854        )
855        .unwrap();
856        assert_eq!(ApplicationProtocol::from(b"foobar"), p);
857    }
858}