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