Merge branch 'vendor/BYACC'
[dragonfly.git] / crypto / libressl / ssl / ssl_methods.c
1 /* $OpenBSD: ssl_methods.c,v 1.12 2020/02/06 16:05:58 jsing Exp $ */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58
59 #include "ssl_locl.h"
60 #include "tls13_internal.h"
61
62 static const SSL_METHOD_INTERNAL DTLSv1_client_method_internal_data = {
63         .version = DTLS1_VERSION,
64         .min_version = DTLS1_VERSION,
65         .max_version = DTLS1_VERSION,
66         .ssl_new = dtls1_new,
67         .ssl_clear = dtls1_clear,
68         .ssl_free = dtls1_free,
69         .ssl_accept = ssl_undefined_function,
70         .ssl_connect = ssl3_connect,
71         .ssl_shutdown = ssl3_shutdown,
72         .get_ssl_method = dtls1_get_client_method,
73         .get_timeout = dtls1_default_timeout,
74         .ssl_version = ssl_undefined_void_function,
75         .ssl_renegotiate = ssl3_renegotiate,
76         .ssl_renegotiate_check = ssl3_renegotiate_check,
77         .ssl_pending = ssl3_pending,
78         .ssl_read_bytes = dtls1_read_bytes,
79         .ssl_write_bytes = dtls1_write_app_data_bytes,
80         .ssl3_enc = &DTLSv1_enc_data,
81 };
82
83 static const SSL_METHOD DTLSv1_client_method_data = {
84         .ssl_dispatch_alert = dtls1_dispatch_alert,
85         .num_ciphers = ssl3_num_ciphers,
86         .get_cipher = dtls1_get_cipher,
87         .get_cipher_by_char = ssl3_get_cipher_by_char,
88         .put_cipher_by_char = ssl3_put_cipher_by_char,
89         .internal = &DTLSv1_client_method_internal_data,
90 };
91
92 const SSL_METHOD *
93 DTLSv1_client_method(void)
94 {
95         return &DTLSv1_client_method_data;
96 }
97
98 const SSL_METHOD *
99 DTLS_client_method(void)
100 {
101         return DTLSv1_client_method();
102 }
103
104 const SSL_METHOD *
105 dtls1_get_client_method(int ver)
106 {
107         if (ver == DTLS1_VERSION)
108                 return (DTLSv1_client_method());
109         return (NULL);
110 }
111
112 static const SSL_METHOD *dtls1_get_method(int ver);
113
114 static const SSL_METHOD_INTERNAL DTLSv1_method_internal_data = {
115         .version = DTLS1_VERSION,
116         .min_version = DTLS1_VERSION,
117         .max_version = DTLS1_VERSION,
118         .ssl_new = dtls1_new,
119         .ssl_clear = dtls1_clear,
120         .ssl_free = dtls1_free,
121         .ssl_accept = ssl3_accept,
122         .ssl_connect = ssl3_connect,
123         .ssl_shutdown = ssl3_shutdown,
124         .get_ssl_method = dtls1_get_method,
125         .get_timeout = dtls1_default_timeout,
126         .ssl_version = ssl_undefined_void_function,
127         .ssl_renegotiate = ssl3_renegotiate,
128         .ssl_renegotiate_check = ssl3_renegotiate_check,
129         .ssl_pending = ssl3_pending,
130         .ssl_read_bytes = dtls1_read_bytes,
131         .ssl_write_bytes = dtls1_write_app_data_bytes,
132         .ssl3_enc = &DTLSv1_enc_data,
133 };
134
135 static const SSL_METHOD DTLSv1_method_data = {
136         .ssl_dispatch_alert = dtls1_dispatch_alert,
137         .num_ciphers = ssl3_num_ciphers,
138         .get_cipher = dtls1_get_cipher,
139         .get_cipher_by_char = ssl3_get_cipher_by_char,
140         .put_cipher_by_char = ssl3_put_cipher_by_char,
141         .internal = &DTLSv1_method_internal_data,
142 };
143
144 const SSL_METHOD *
145 DTLSv1_method(void)
146 {
147         return &DTLSv1_method_data;
148 }
149
150 const SSL_METHOD *
151 DTLS_method(void)
152 {
153         return DTLSv1_method();
154 }
155
156 static const SSL_METHOD *
157 dtls1_get_method(int ver)
158 {
159         if (ver == DTLS1_VERSION)
160                 return (DTLSv1_method());
161         return (NULL);
162 }
163
164 static const SSL_METHOD_INTERNAL DTLSv1_server_method_internal_data = {
165         .version = DTLS1_VERSION,
166         .min_version = DTLS1_VERSION,
167         .max_version = DTLS1_VERSION,
168         .ssl_new = dtls1_new,
169         .ssl_clear = dtls1_clear,
170         .ssl_free = dtls1_free,
171         .ssl_accept = ssl3_accept,
172         .ssl_connect = ssl_undefined_function,
173         .ssl_shutdown = ssl3_shutdown,
174         .get_ssl_method = dtls1_get_server_method,
175         .get_timeout = dtls1_default_timeout,
176         .ssl_version = ssl_undefined_void_function,
177         .ssl_renegotiate = ssl3_renegotiate,
178         .ssl_renegotiate_check = ssl3_renegotiate_check,
179         .ssl_pending = ssl3_pending,
180         .ssl_read_bytes = dtls1_read_bytes,
181         .ssl_write_bytes = dtls1_write_app_data_bytes,
182         .ssl3_enc = &DTLSv1_enc_data,
183 };
184
185 static const SSL_METHOD DTLSv1_server_method_data = {
186         .ssl_dispatch_alert = dtls1_dispatch_alert,
187         .num_ciphers = ssl3_num_ciphers,
188         .get_cipher = dtls1_get_cipher,
189         .get_cipher_by_char = ssl3_get_cipher_by_char,
190         .put_cipher_by_char = ssl3_put_cipher_by_char,
191         .internal = &DTLSv1_server_method_internal_data,
192 };
193
194 const SSL_METHOD *
195 DTLSv1_server_method(void)
196 {
197         return &DTLSv1_server_method_data;
198 }
199
200 const SSL_METHOD *
201 DTLS_server_method(void)
202 {
203         return DTLSv1_server_method();
204 }
205
206 const SSL_METHOD *
207 dtls1_get_server_method(int ver)
208 {
209         if (ver == DTLS1_VERSION)
210                 return (DTLSv1_server_method());
211         return (NULL);
212 }
213
214 #ifdef LIBRESSL_HAS_TLS1_3_CLIENT
215 static const SSL_METHOD_INTERNAL TLS_client_method_internal_data = {
216         .version = TLS1_3_VERSION,
217         .min_version = TLS1_VERSION,
218         .max_version = TLS1_3_VERSION,
219         .ssl_new = tls1_new,
220         .ssl_clear = tls1_clear,
221         .ssl_free = tls1_free,
222         .ssl_accept = ssl_undefined_function,
223         .ssl_connect = tls13_legacy_connect,
224         .ssl_shutdown = tls13_legacy_shutdown,
225         .get_ssl_method = tls1_get_client_method,
226         .get_timeout = tls1_default_timeout,
227         .ssl_version = ssl_undefined_void_function,
228         .ssl_renegotiate = ssl_undefined_function,
229         .ssl_renegotiate_check = ssl_ok,
230         .ssl_pending = tls13_legacy_pending,
231         .ssl_read_bytes = tls13_legacy_read_bytes,
232         .ssl_write_bytes = tls13_legacy_write_bytes,
233         .ssl3_enc = &TLSv1_3_enc_data,
234 };
235
236 static const SSL_METHOD TLS_client_method_data = {
237         .ssl_dispatch_alert = ssl3_dispatch_alert,
238         .num_ciphers = ssl3_num_ciphers,
239         .get_cipher = ssl3_get_cipher,
240         .get_cipher_by_char = ssl3_get_cipher_by_char,
241         .put_cipher_by_char = ssl3_put_cipher_by_char,
242         .internal = &TLS_client_method_internal_data,
243 };
244 #endif
245
246 static const SSL_METHOD_INTERNAL TLS_legacy_client_method_internal_data = {
247         .version = TLS1_2_VERSION,
248         .min_version = TLS1_VERSION,
249         .max_version = TLS1_2_VERSION,
250         .ssl_new = tls1_new,
251         .ssl_clear = tls1_clear,
252         .ssl_free = tls1_free,
253         .ssl_accept = ssl_undefined_function,
254         .ssl_connect = ssl3_connect,
255         .ssl_shutdown = ssl3_shutdown,
256         .get_ssl_method = tls1_get_client_method,
257         .get_timeout = tls1_default_timeout,
258         .ssl_version = ssl_undefined_void_function,
259         .ssl_renegotiate = ssl_undefined_function,
260         .ssl_renegotiate_check = ssl_ok,
261         .ssl_pending = ssl3_pending,
262         .ssl_read_bytes = ssl3_read_bytes,
263         .ssl_write_bytes = ssl3_write_bytes,
264         .ssl3_enc = &TLSv1_2_enc_data,
265 };
266
267 static const SSL_METHOD TLS_legacy_client_method_data = {
268         .ssl_dispatch_alert = ssl3_dispatch_alert,
269         .num_ciphers = ssl3_num_ciphers,
270         .get_cipher = ssl3_get_cipher,
271         .get_cipher_by_char = ssl3_get_cipher_by_char,
272         .put_cipher_by_char = ssl3_put_cipher_by_char,
273         .internal = &TLS_legacy_client_method_internal_data,
274 };
275
276 static const SSL_METHOD_INTERNAL TLSv1_client_method_internal_data = {
277         .version = TLS1_VERSION,
278         .min_version = TLS1_VERSION,
279         .max_version = TLS1_VERSION,
280         .ssl_new = tls1_new,
281         .ssl_clear = tls1_clear,
282         .ssl_free = tls1_free,
283         .ssl_accept = ssl_undefined_function,
284         .ssl_connect = ssl3_connect,
285         .ssl_shutdown = ssl3_shutdown,
286         .get_ssl_method = tls1_get_client_method,
287         .get_timeout = tls1_default_timeout,
288         .ssl_version = ssl_undefined_void_function,
289         .ssl_renegotiate = ssl3_renegotiate,
290         .ssl_renegotiate_check = ssl3_renegotiate_check,
291         .ssl_pending = ssl3_pending,
292         .ssl_read_bytes = ssl3_read_bytes,
293         .ssl_write_bytes = ssl3_write_bytes,
294         .ssl3_enc = &TLSv1_enc_data,
295 };
296
297 static const SSL_METHOD TLSv1_client_method_data = {
298         .ssl_dispatch_alert = ssl3_dispatch_alert,
299         .num_ciphers = ssl3_num_ciphers,
300         .get_cipher = ssl3_get_cipher,
301         .get_cipher_by_char = ssl3_get_cipher_by_char,
302         .put_cipher_by_char = ssl3_put_cipher_by_char,
303         .internal = &TLSv1_client_method_internal_data,
304 };
305
306 static const SSL_METHOD_INTERNAL TLSv1_1_client_method_internal_data = {
307         .version = TLS1_1_VERSION,
308         .min_version = TLS1_1_VERSION,
309         .max_version = TLS1_1_VERSION,
310         .ssl_new = tls1_new,
311         .ssl_clear = tls1_clear,
312         .ssl_free = tls1_free,
313         .ssl_accept = ssl_undefined_function,
314         .ssl_connect = ssl3_connect,
315         .ssl_shutdown = ssl3_shutdown,
316         .get_ssl_method = tls1_get_client_method,
317         .get_timeout = tls1_default_timeout,
318         .ssl_version = ssl_undefined_void_function,
319         .ssl_renegotiate = ssl3_renegotiate,
320         .ssl_renegotiate_check = ssl3_renegotiate_check,
321         .ssl_pending = ssl3_pending,
322         .ssl_read_bytes = ssl3_read_bytes,
323         .ssl_write_bytes = ssl3_write_bytes,
324         .ssl3_enc = &TLSv1_1_enc_data,
325 };
326
327 static const SSL_METHOD TLSv1_1_client_method_data = {
328         .ssl_dispatch_alert = ssl3_dispatch_alert,
329         .num_ciphers = ssl3_num_ciphers,
330         .get_cipher = ssl3_get_cipher,
331         .get_cipher_by_char = ssl3_get_cipher_by_char,
332         .put_cipher_by_char = ssl3_put_cipher_by_char,
333         .internal = &TLSv1_1_client_method_internal_data,
334 };
335
336 static const SSL_METHOD_INTERNAL TLSv1_2_client_method_internal_data = {
337         .version = TLS1_2_VERSION,
338         .min_version = TLS1_2_VERSION,
339         .max_version = TLS1_2_VERSION,
340         .ssl_new = tls1_new,
341         .ssl_clear = tls1_clear,
342         .ssl_free = tls1_free,
343         .ssl_accept = ssl_undefined_function,
344         .ssl_connect = ssl3_connect,
345         .ssl_shutdown = ssl3_shutdown,
346         .get_ssl_method = tls1_get_client_method,
347         .get_timeout = tls1_default_timeout,
348         .ssl_version = ssl_undefined_void_function,
349         .ssl_renegotiate = ssl3_renegotiate,
350         .ssl_renegotiate_check = ssl3_renegotiate_check,
351         .ssl_pending = ssl3_pending,
352         .ssl_read_bytes = ssl3_read_bytes,
353         .ssl_write_bytes = ssl3_write_bytes,
354         .ssl3_enc = &TLSv1_2_enc_data,
355 };
356
357 static const SSL_METHOD TLSv1_2_client_method_data = {
358         .ssl_dispatch_alert = ssl3_dispatch_alert,
359         .num_ciphers = ssl3_num_ciphers,
360         .get_cipher = ssl3_get_cipher,
361         .get_cipher_by_char = ssl3_get_cipher_by_char,
362         .put_cipher_by_char = ssl3_put_cipher_by_char,
363         .internal = &TLSv1_2_client_method_internal_data,
364 };
365
366 const SSL_METHOD *
367 tls1_get_client_method(int ver)
368 {
369 #ifdef LIBRESSL_HAS_TLS1_3_CLIENT
370         if (ver == TLS1_3_VERSION)
371                 return (TLS_client_method());
372 #endif
373         if (ver == TLS1_2_VERSION)
374                 return (TLSv1_2_client_method());
375         if (ver == TLS1_1_VERSION)
376                 return (TLSv1_1_client_method());
377         if (ver == TLS1_VERSION)
378                 return (TLSv1_client_method());
379         return (NULL);
380 }
381
382 const SSL_METHOD *
383 SSLv23_client_method(void)
384 {
385         return (TLS_client_method());
386 }
387
388 const SSL_METHOD *
389 TLS_client_method(void)
390 {
391 #ifdef LIBRESSL_HAS_TLS1_3_CLIENT
392         return (&TLS_client_method_data);
393 #else
394         return tls_legacy_client_method();
395 #endif
396 }
397
398 const SSL_METHOD *
399 tls_legacy_client_method(void)
400 {
401         return (&TLS_legacy_client_method_data);
402 }
403
404 const SSL_METHOD *
405 TLSv1_client_method(void)
406 {
407         return (&TLSv1_client_method_data);
408 }
409
410 const SSL_METHOD *
411 TLSv1_1_client_method(void)
412 {
413         return (&TLSv1_1_client_method_data);
414 }
415
416 const SSL_METHOD *
417 TLSv1_2_client_method(void)
418 {
419         return (&TLSv1_2_client_method_data);
420 }
421
422 static const SSL_METHOD *tls1_get_method(int ver);
423
424 static const SSL_METHOD_INTERNAL TLS_method_internal_data = {
425         .version = TLS1_2_VERSION,
426         .min_version = TLS1_VERSION,
427         .max_version = TLS1_2_VERSION,
428         .ssl_new = tls1_new,
429         .ssl_clear = tls1_clear,
430         .ssl_free = tls1_free,
431         .ssl_accept = ssl3_accept,
432         .ssl_connect = ssl3_connect,
433         .ssl_shutdown = ssl3_shutdown,
434         .get_ssl_method = tls1_get_method,
435         .get_timeout = tls1_default_timeout,
436         .ssl_version = ssl_undefined_void_function,
437         .ssl_renegotiate = ssl_undefined_function,
438         .ssl_renegotiate_check = ssl_ok,
439         .ssl_pending = ssl3_pending,
440         .ssl_read_bytes = ssl3_read_bytes,
441         .ssl_write_bytes = ssl3_write_bytes,
442         .ssl3_enc = &TLSv1_2_enc_data,
443 };
444
445 static const SSL_METHOD TLS_method_data = {
446         .ssl_dispatch_alert = ssl3_dispatch_alert,
447         .num_ciphers = ssl3_num_ciphers,
448         .get_cipher = ssl3_get_cipher,
449         .get_cipher_by_char = ssl3_get_cipher_by_char,
450         .put_cipher_by_char = ssl3_put_cipher_by_char,
451         .internal = &TLS_method_internal_data,
452 };
453
454 static const SSL_METHOD_INTERNAL TLSv1_method_internal_data = {
455         .version = TLS1_VERSION,
456         .min_version = TLS1_VERSION,
457         .max_version = TLS1_VERSION,
458         .ssl_new = tls1_new,
459         .ssl_clear = tls1_clear,
460         .ssl_free = tls1_free,
461         .ssl_accept = ssl3_accept,
462         .ssl_connect = ssl3_connect,
463         .ssl_shutdown = ssl3_shutdown,
464         .get_ssl_method = tls1_get_method,
465         .get_timeout = tls1_default_timeout,
466         .ssl_version = ssl_undefined_void_function,
467         .ssl_renegotiate = ssl3_renegotiate,
468         .ssl_renegotiate_check = ssl3_renegotiate_check,
469         .ssl_pending = ssl3_pending,
470         .ssl_read_bytes = ssl3_read_bytes,
471         .ssl_write_bytes = ssl3_write_bytes,
472         .ssl3_enc = &TLSv1_enc_data,
473 };
474
475 static const SSL_METHOD TLSv1_method_data = {
476         .ssl_dispatch_alert = ssl3_dispatch_alert,
477         .num_ciphers = ssl3_num_ciphers,
478         .get_cipher = ssl3_get_cipher,
479         .get_cipher_by_char = ssl3_get_cipher_by_char,
480         .put_cipher_by_char = ssl3_put_cipher_by_char,
481         .internal = &TLSv1_method_internal_data,
482 };
483
484 static const SSL_METHOD_INTERNAL TLSv1_1_method_internal_data = {
485         .version = TLS1_1_VERSION,
486         .min_version = TLS1_1_VERSION,
487         .max_version = TLS1_1_VERSION,
488         .ssl_new = tls1_new,
489         .ssl_clear = tls1_clear,
490         .ssl_free = tls1_free,
491         .ssl_accept = ssl3_accept,
492         .ssl_connect = ssl3_connect,
493         .ssl_shutdown = ssl3_shutdown,
494         .get_ssl_method = tls1_get_method,
495         .get_timeout = tls1_default_timeout,
496         .ssl_version = ssl_undefined_void_function,
497         .ssl_renegotiate = ssl3_renegotiate,
498         .ssl_renegotiate_check = ssl3_renegotiate_check,
499         .ssl_pending = ssl3_pending,
500         .ssl_read_bytes = ssl3_read_bytes,
501         .ssl_write_bytes = ssl3_write_bytes,
502         .ssl3_enc = &TLSv1_1_enc_data,
503 };
504
505 static const SSL_METHOD TLSv1_1_method_data = {
506         .ssl_dispatch_alert = ssl3_dispatch_alert,
507         .num_ciphers = ssl3_num_ciphers,
508         .get_cipher = ssl3_get_cipher,
509         .get_cipher_by_char = ssl3_get_cipher_by_char,
510         .put_cipher_by_char = ssl3_put_cipher_by_char,
511         .internal = &TLSv1_1_method_internal_data,
512 };
513
514 static const SSL_METHOD_INTERNAL TLSv1_2_method_internal_data = {
515         .version = TLS1_2_VERSION,
516         .min_version = TLS1_2_VERSION,
517         .max_version = TLS1_2_VERSION,
518         .ssl_new = tls1_new,
519         .ssl_clear = tls1_clear,
520         .ssl_free = tls1_free,
521         .ssl_accept = ssl3_accept,
522         .ssl_connect = ssl3_connect,
523         .ssl_shutdown = ssl3_shutdown,
524         .get_ssl_method = tls1_get_method,
525         .get_timeout = tls1_default_timeout,
526         .ssl_version = ssl_undefined_void_function,
527         .ssl_renegotiate = ssl3_renegotiate,
528         .ssl_renegotiate_check = ssl3_renegotiate_check,
529         .ssl_pending = ssl3_pending,
530         .ssl_read_bytes = ssl3_read_bytes,
531         .ssl_write_bytes = ssl3_write_bytes,
532         .ssl3_enc = &TLSv1_2_enc_data,
533 };
534
535 static const SSL_METHOD TLSv1_2_method_data = {
536         .ssl_dispatch_alert = ssl3_dispatch_alert,
537         .num_ciphers = ssl3_num_ciphers,
538         .get_cipher = ssl3_get_cipher,
539         .get_cipher_by_char = ssl3_get_cipher_by_char,
540         .put_cipher_by_char = ssl3_put_cipher_by_char,
541         .internal = &TLSv1_2_method_internal_data,
542 };
543
544 static const SSL_METHOD *
545 tls1_get_method(int ver)
546 {
547         if (ver == TLS1_2_VERSION)
548                 return (TLSv1_2_method());
549         if (ver == TLS1_1_VERSION)
550                 return (TLSv1_1_method());
551         if (ver == TLS1_VERSION)
552                 return (TLSv1_method());
553         return (NULL);
554 }
555
556 const SSL_METHOD *
557 SSLv23_method(void)
558 {
559         return (TLS_method());
560 }
561
562 const SSL_METHOD *
563 TLS_method(void)
564 {
565         return &TLS_method_data;
566 }
567
568 const SSL_METHOD *
569 TLSv1_method(void)
570 {
571         return (&TLSv1_method_data);
572 }
573
574 const SSL_METHOD *
575 TLSv1_1_method(void)
576 {
577         return (&TLSv1_1_method_data);
578 }
579
580 const SSL_METHOD *
581 TLSv1_2_method(void)
582 {
583         return (&TLSv1_2_method_data);
584 }
585
586 #ifdef LIBRESSL_HAS_TLS1_3_SERVER
587 static const SSL_METHOD_INTERNAL TLS_server_method_internal_data = {
588         .version = TLS1_3_VERSION,
589         .min_version = TLS1_VERSION,
590         .max_version = TLS1_3_VERSION,
591         .ssl_new = tls1_new,
592         .ssl_clear = tls1_clear,
593         .ssl_free = tls1_free,
594         .ssl_accept = tls13_legacy_accept,
595         .ssl_connect = ssl_undefined_function,
596         .ssl_shutdown = tls13_legacy_shutdown,
597         .get_ssl_method = tls1_get_server_method,
598         .get_timeout = tls1_default_timeout,
599         .ssl_version = ssl_undefined_void_function,
600         .ssl_renegotiate = ssl_undefined_function,
601         .ssl_renegotiate_check = ssl_ok,
602         .ssl_pending = tls13_legacy_pending,
603         .ssl_read_bytes = tls13_legacy_read_bytes,
604         .ssl_write_bytes = tls13_legacy_write_bytes,
605         .ssl3_enc = &TLSv1_3_enc_data,
606 };
607
608 static const SSL_METHOD TLS_server_method_data = {
609         .ssl_dispatch_alert = ssl3_dispatch_alert,
610         .num_ciphers = ssl3_num_ciphers,
611         .get_cipher = ssl3_get_cipher,
612         .get_cipher_by_char = ssl3_get_cipher_by_char,
613         .put_cipher_by_char = ssl3_put_cipher_by_char,
614         .internal = &TLS_server_method_internal_data,
615 };
616 #endif
617
618 static const SSL_METHOD_INTERNAL TLS_legacy_server_method_internal_data = {
619         .version = TLS1_2_VERSION,
620         .min_version = TLS1_VERSION,
621         .max_version = TLS1_2_VERSION,
622         .ssl_new = tls1_new,
623         .ssl_clear = tls1_clear,
624         .ssl_free = tls1_free,
625         .ssl_accept = ssl3_accept,
626         .ssl_connect = ssl_undefined_function,
627         .ssl_shutdown = ssl3_shutdown,
628         .get_ssl_method = tls1_get_server_method,
629         .get_timeout = tls1_default_timeout,
630         .ssl_version = ssl_undefined_void_function,
631         .ssl_renegotiate = ssl_undefined_function,
632         .ssl_renegotiate_check = ssl_ok,
633         .ssl_pending = ssl3_pending,
634         .ssl_read_bytes = ssl3_read_bytes,
635         .ssl_write_bytes = ssl3_write_bytes,
636         .ssl3_enc = &TLSv1_2_enc_data,
637 };
638
639 static const SSL_METHOD TLS_legacy_server_method_data = {
640         .ssl_dispatch_alert = ssl3_dispatch_alert,
641         .num_ciphers = ssl3_num_ciphers,
642         .get_cipher = ssl3_get_cipher,
643         .get_cipher_by_char = ssl3_get_cipher_by_char,
644         .put_cipher_by_char = ssl3_put_cipher_by_char,
645         .internal = &TLS_legacy_server_method_internal_data,
646 };
647
648 static const SSL_METHOD_INTERNAL TLSv1_server_method_internal_data = {
649         .version = TLS1_VERSION,
650         .min_version = TLS1_VERSION,
651         .max_version = TLS1_VERSION,
652         .ssl_new = tls1_new,
653         .ssl_clear = tls1_clear,
654         .ssl_free = tls1_free,
655         .ssl_accept = ssl3_accept,
656         .ssl_connect = ssl_undefined_function,
657         .ssl_shutdown = ssl3_shutdown,
658         .get_ssl_method = tls1_get_server_method,
659         .get_timeout = tls1_default_timeout,
660         .ssl_version = ssl_undefined_void_function,
661         .ssl_renegotiate = ssl3_renegotiate,
662         .ssl_renegotiate_check = ssl3_renegotiate_check,
663         .ssl_pending = ssl3_pending,
664         .ssl_read_bytes = ssl3_read_bytes,
665         .ssl_write_bytes = ssl3_write_bytes,
666         .ssl3_enc = &TLSv1_enc_data,
667 };
668
669 static const SSL_METHOD TLSv1_server_method_data = {
670         .ssl_dispatch_alert = ssl3_dispatch_alert,
671         .num_ciphers = ssl3_num_ciphers,
672         .get_cipher = ssl3_get_cipher,
673         .get_cipher_by_char = ssl3_get_cipher_by_char,
674         .put_cipher_by_char = ssl3_put_cipher_by_char,
675         .internal = &TLSv1_server_method_internal_data,
676 };
677
678 static const SSL_METHOD_INTERNAL TLSv1_1_server_method_internal_data = {
679         .version = TLS1_1_VERSION,
680         .min_version = TLS1_1_VERSION,
681         .max_version = TLS1_1_VERSION,
682         .ssl_new = tls1_new,
683         .ssl_clear = tls1_clear,
684         .ssl_free = tls1_free,
685         .ssl_accept = ssl3_accept,
686         .ssl_connect = ssl_undefined_function,
687         .ssl_shutdown = ssl3_shutdown,
688         .get_ssl_method = tls1_get_server_method,
689         .get_timeout = tls1_default_timeout,
690         .ssl_version = ssl_undefined_void_function,
691         .ssl_renegotiate = ssl3_renegotiate,
692         .ssl_renegotiate_check = ssl3_renegotiate_check,
693         .ssl_pending = ssl3_pending,
694         .ssl_read_bytes = ssl3_read_bytes,
695         .ssl_write_bytes = ssl3_write_bytes,
696         .ssl3_enc = &TLSv1_1_enc_data,
697 };
698
699 static const SSL_METHOD TLSv1_1_server_method_data = {
700         .ssl_dispatch_alert = ssl3_dispatch_alert,
701         .num_ciphers = ssl3_num_ciphers,
702         .get_cipher = ssl3_get_cipher,
703         .get_cipher_by_char = ssl3_get_cipher_by_char,
704         .put_cipher_by_char = ssl3_put_cipher_by_char,
705         .internal = &TLSv1_1_server_method_internal_data,
706 };
707
708 static const SSL_METHOD_INTERNAL TLSv1_2_server_method_internal_data = {
709         .version = TLS1_2_VERSION,
710         .min_version = TLS1_2_VERSION,
711         .max_version = TLS1_2_VERSION,
712         .ssl_new = tls1_new,
713         .ssl_clear = tls1_clear,
714         .ssl_free = tls1_free,
715         .ssl_accept = ssl3_accept,
716         .ssl_connect = ssl_undefined_function,
717         .ssl_shutdown = ssl3_shutdown,
718         .get_ssl_method = tls1_get_server_method,
719         .get_timeout = tls1_default_timeout,
720         .ssl_version = ssl_undefined_void_function,
721         .ssl_renegotiate = ssl3_renegotiate,
722         .ssl_renegotiate_check = ssl3_renegotiate_check,
723         .ssl_pending = ssl3_pending,
724         .ssl_read_bytes = ssl3_read_bytes,
725         .ssl_write_bytes = ssl3_write_bytes,
726         .ssl3_enc = &TLSv1_2_enc_data,
727 };
728
729 static const SSL_METHOD TLSv1_2_server_method_data = {
730         .ssl_dispatch_alert = ssl3_dispatch_alert,
731         .num_ciphers = ssl3_num_ciphers,
732         .get_cipher = ssl3_get_cipher,
733         .get_cipher_by_char = ssl3_get_cipher_by_char,
734         .put_cipher_by_char = ssl3_put_cipher_by_char,
735         .internal = &TLSv1_2_server_method_internal_data,
736 };
737
738 const SSL_METHOD *
739 tls1_get_server_method(int ver)
740 {
741 #ifdef LIBRESSL_HAS_TLS1_3_SERVER
742         if (ver == TLS1_3_VERSION)
743                 return (TLS_server_method());
744 #endif
745         if (ver == TLS1_2_VERSION)
746                 return (TLSv1_2_server_method());
747         if (ver == TLS1_1_VERSION)
748                 return (TLSv1_1_server_method());
749         if (ver == TLS1_VERSION)
750                 return (TLSv1_server_method());
751         return (NULL);
752 }
753
754 const SSL_METHOD *
755 SSLv23_server_method(void)
756 {
757         return (TLS_server_method());
758 }
759
760 const SSL_METHOD *
761 TLS_server_method(void)
762 {
763 #ifdef LIBRESSL_HAS_TLS1_3_SERVER
764         return (&TLS_server_method_data);
765 #else
766         return tls_legacy_server_method();
767 #endif
768 }
769
770 const SSL_METHOD *
771 tls_legacy_server_method(void)
772 {
773         return (&TLS_legacy_server_method_data);
774 }
775
776 const SSL_METHOD *
777 TLSv1_server_method(void)
778 {
779         return (&TLSv1_server_method_data);
780 }
781
782 const SSL_METHOD *
783 TLSv1_1_server_method(void)
784 {
785         return (&TLSv1_1_server_method_data);
786 }
787
788 const SSL_METHOD *
789 TLSv1_2_server_method(void)
790 {
791         return (&TLSv1_2_server_method_data);
792 }