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 @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 @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 @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, 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, RSA_PSS_SHA512 => 0x0806, 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 @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 @U8
559 pub enum CompressionAlgorithm {
560 Null => 0x00,
561 Deflate => 0x01,
562 }
563}
564
565enum_builder! {
566 @U8
570 pub enum ECPointFormat {
571 Uncompressed => 0x00,
572 ANSIX962CompressedPrime => 0x01,
573 ANSIX962CompressedChar2 => 0x02,
574 }
575}
576
577enum_builder! {
578 @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 @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 @U16
711 pub enum CertificateCompressionAlgorithm {
712 Zlib => 0x0001,
713 Brotli => 0x0002,
714 Zstd => 0x0003,
715 }
716}
717
718enum_builder! {
719 @U16
721 pub enum KeyDerivationFunction {
722 HKDF_SHA256 => 0x0001,
723 HKDF_SHA384 => 0x0002,
724 HKDF_SHA512 => 0x0003,
725 }
726}
727
728enum_builder! {
729 @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}