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 @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 @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 @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, 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, RSA_PSS_SHA512 => 0x0806, 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 @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 @U8
568 pub enum CompressionAlgorithm {
569 Null => 0x00,
570 Deflate => 0x01,
571 }
572}
573
574enum_builder! {
575 @U8
579 pub enum ECPointFormat {
580 Uncompressed => 0x00,
581 ANSIX962CompressedPrime => 0x01,
582 ANSIX962CompressedChar2 => 0x02,
583 }
584}
585
586enum_builder! {
587 @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 @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 @U16
720 pub enum CertificateCompressionAlgorithm {
721 Zlib => 0x0001,
722 Brotli => 0x0002,
723 Zstd => 0x0003,
724 }
725}
726
727enum_builder! {
728 @U16
730 pub enum KeyDerivationFunction {
731 HKDF_SHA256 => 0x0001,
732 HKDF_SHA384 => 0x0002,
733 HKDF_SHA512 => 0x0003,
734 }
735}
736
737enum_builder! {
738 @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}