xref: /openbsd/lib/libssl/ssl_methods.c (revision 8dc90bba)
1*8dc90bbaSjsing /* $OpenBSD: ssl_methods.c,v 1.9 2020/01/23 03:17:40 jsing Exp $ */
29158af98Sjsing /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
39158af98Sjsing  * All rights reserved.
49158af98Sjsing  *
59158af98Sjsing  * This package is an SSL implementation written
69158af98Sjsing  * by Eric Young (eay@cryptsoft.com).
79158af98Sjsing  * The implementation was written so as to conform with Netscapes SSL.
89158af98Sjsing  *
99158af98Sjsing  * This library is free for commercial and non-commercial use as long as
109158af98Sjsing  * the following conditions are aheared to.  The following conditions
119158af98Sjsing  * apply to all code found in this distribution, be it the RC4, RSA,
129158af98Sjsing  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
139158af98Sjsing  * included with this distribution is covered by the same copyright terms
149158af98Sjsing  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
159158af98Sjsing  *
169158af98Sjsing  * Copyright remains Eric Young's, and as such any Copyright notices in
179158af98Sjsing  * the code are not to be removed.
189158af98Sjsing  * If this package is used in a product, Eric Young should be given attribution
199158af98Sjsing  * as the author of the parts of the library used.
209158af98Sjsing  * This can be in the form of a textual message at program startup or
219158af98Sjsing  * in documentation (online or textual) provided with the package.
229158af98Sjsing  *
239158af98Sjsing  * Redistribution and use in source and binary forms, with or without
249158af98Sjsing  * modification, are permitted provided that the following conditions
259158af98Sjsing  * are met:
269158af98Sjsing  * 1. Redistributions of source code must retain the copyright
279158af98Sjsing  *    notice, this list of conditions and the following disclaimer.
289158af98Sjsing  * 2. Redistributions in binary form must reproduce the above copyright
299158af98Sjsing  *    notice, this list of conditions and the following disclaimer in the
309158af98Sjsing  *    documentation and/or other materials provided with the distribution.
319158af98Sjsing  * 3. All advertising materials mentioning features or use of this software
329158af98Sjsing  *    must display the following acknowledgement:
339158af98Sjsing  *    "This product includes cryptographic software written by
349158af98Sjsing  *     Eric Young (eay@cryptsoft.com)"
359158af98Sjsing  *    The word 'cryptographic' can be left out if the rouines from the library
369158af98Sjsing  *    being used are not cryptographic related :-).
379158af98Sjsing  * 4. If you include any Windows specific code (or a derivative thereof) from
389158af98Sjsing  *    the apps directory (application code) you must include an acknowledgement:
399158af98Sjsing  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
409158af98Sjsing  *
419158af98Sjsing  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
429158af98Sjsing  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
439158af98Sjsing  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
449158af98Sjsing  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
459158af98Sjsing  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
469158af98Sjsing  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
479158af98Sjsing  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
489158af98Sjsing  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
499158af98Sjsing  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
509158af98Sjsing  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
519158af98Sjsing  * SUCH DAMAGE.
529158af98Sjsing  *
539158af98Sjsing  * The licence and distribution terms for any publically available version or
549158af98Sjsing  * derivative of this code cannot be changed.  i.e. this code cannot simply be
559158af98Sjsing  * copied and put under another distribution licence
569158af98Sjsing  * [including the GNU Public Licence.]
579158af98Sjsing  */
589158af98Sjsing 
599158af98Sjsing #include "ssl_locl.h"
60efee3f2fSjsing #include "tls13_internal.h"
619158af98Sjsing 
629158af98Sjsing static const SSL_METHOD_INTERNAL DTLSv1_client_method_internal_data = {
639158af98Sjsing 	.version = DTLS1_VERSION,
649158af98Sjsing 	.min_version = DTLS1_VERSION,
659158af98Sjsing 	.max_version = DTLS1_VERSION,
669158af98Sjsing 	.ssl_new = dtls1_new,
679158af98Sjsing 	.ssl_clear = dtls1_clear,
689158af98Sjsing 	.ssl_free = dtls1_free,
699158af98Sjsing 	.ssl_accept = ssl_undefined_function,
709158af98Sjsing 	.ssl_connect = ssl3_connect,
711a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
729158af98Sjsing 	.get_ssl_method = dtls1_get_client_method,
739158af98Sjsing 	.get_timeout = dtls1_default_timeout,
749158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
759158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
769158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
779158af98Sjsing 	.ssl_get_message = dtls1_get_message,
78*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
799158af98Sjsing 	.ssl_read_bytes = dtls1_read_bytes,
809158af98Sjsing 	.ssl_write_bytes = dtls1_write_app_data_bytes,
819158af98Sjsing 	.ssl3_enc = &DTLSv1_enc_data,
829158af98Sjsing };
839158af98Sjsing 
849158af98Sjsing static const SSL_METHOD DTLSv1_client_method_data = {
859158af98Sjsing 	.ssl_dispatch_alert = dtls1_dispatch_alert,
869158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
879158af98Sjsing 	.get_cipher = dtls1_get_cipher,
889158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
899158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
909158af98Sjsing 	.internal = &DTLSv1_client_method_internal_data,
919158af98Sjsing };
929158af98Sjsing 
939158af98Sjsing const SSL_METHOD *
949158af98Sjsing DTLSv1_client_method(void)
959158af98Sjsing {
969158af98Sjsing 	return &DTLSv1_client_method_data;
979158af98Sjsing }
989158af98Sjsing 
999158af98Sjsing const SSL_METHOD *
10071023d34Sjsing DTLS_client_method(void)
10171023d34Sjsing {
10271023d34Sjsing 	return DTLSv1_client_method();
10371023d34Sjsing }
10471023d34Sjsing 
10571023d34Sjsing const SSL_METHOD *
1069158af98Sjsing dtls1_get_client_method(int ver)
1079158af98Sjsing {
1089158af98Sjsing 	if (ver == DTLS1_VERSION)
1099158af98Sjsing 		return (DTLSv1_client_method());
1109158af98Sjsing 	return (NULL);
1119158af98Sjsing }
1129158af98Sjsing 
1139158af98Sjsing static const SSL_METHOD *dtls1_get_method(int ver);
1149158af98Sjsing 
1159158af98Sjsing static const SSL_METHOD_INTERNAL DTLSv1_method_internal_data = {
1169158af98Sjsing 	.version = DTLS1_VERSION,
1179158af98Sjsing 	.min_version = DTLS1_VERSION,
1189158af98Sjsing 	.max_version = DTLS1_VERSION,
1199158af98Sjsing 	.ssl_new = dtls1_new,
1209158af98Sjsing 	.ssl_clear = dtls1_clear,
1219158af98Sjsing 	.ssl_free = dtls1_free,
1229158af98Sjsing 	.ssl_accept = ssl3_accept,
1239158af98Sjsing 	.ssl_connect = ssl3_connect,
1241a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
1259158af98Sjsing 	.get_ssl_method = dtls1_get_method,
1269158af98Sjsing 	.get_timeout = dtls1_default_timeout,
1279158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
1289158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
1299158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
1309158af98Sjsing 	.ssl_get_message = dtls1_get_message,
131*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
1329158af98Sjsing 	.ssl_read_bytes = dtls1_read_bytes,
1339158af98Sjsing 	.ssl_write_bytes = dtls1_write_app_data_bytes,
1349158af98Sjsing 	.ssl3_enc = &DTLSv1_enc_data,
1359158af98Sjsing };
1369158af98Sjsing 
1379158af98Sjsing static const SSL_METHOD DTLSv1_method_data = {
1389158af98Sjsing 	.ssl_dispatch_alert = dtls1_dispatch_alert,
1399158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
1409158af98Sjsing 	.get_cipher = dtls1_get_cipher,
1419158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
1429158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
1439158af98Sjsing 	.internal = &DTLSv1_method_internal_data,
1449158af98Sjsing };
1459158af98Sjsing 
1469158af98Sjsing const SSL_METHOD *
1479158af98Sjsing DTLSv1_method(void)
1489158af98Sjsing {
1499158af98Sjsing 	return &DTLSv1_method_data;
1509158af98Sjsing }
1519158af98Sjsing 
15271023d34Sjsing const SSL_METHOD *
15371023d34Sjsing DTLS_method(void)
15471023d34Sjsing {
15571023d34Sjsing 	return DTLSv1_method();
15671023d34Sjsing }
15771023d34Sjsing 
1589158af98Sjsing static const SSL_METHOD *
1599158af98Sjsing dtls1_get_method(int ver)
1609158af98Sjsing {
1619158af98Sjsing 	if (ver == DTLS1_VERSION)
1629158af98Sjsing 		return (DTLSv1_method());
1639158af98Sjsing 	return (NULL);
1649158af98Sjsing }
1659158af98Sjsing 
1669158af98Sjsing static const SSL_METHOD_INTERNAL DTLSv1_server_method_internal_data = {
1679158af98Sjsing 	.version = DTLS1_VERSION,
1689158af98Sjsing 	.min_version = DTLS1_VERSION,
1699158af98Sjsing 	.max_version = DTLS1_VERSION,
1709158af98Sjsing 	.ssl_new = dtls1_new,
1719158af98Sjsing 	.ssl_clear = dtls1_clear,
1729158af98Sjsing 	.ssl_free = dtls1_free,
1739158af98Sjsing 	.ssl_accept = ssl3_accept,
1749158af98Sjsing 	.ssl_connect = ssl_undefined_function,
1751a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
1769158af98Sjsing 	.get_ssl_method = dtls1_get_server_method,
1779158af98Sjsing 	.get_timeout = dtls1_default_timeout,
1789158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
1799158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
1809158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
1819158af98Sjsing 	.ssl_get_message = dtls1_get_message,
182*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
1839158af98Sjsing 	.ssl_read_bytes = dtls1_read_bytes,
1849158af98Sjsing 	.ssl_write_bytes = dtls1_write_app_data_bytes,
1859158af98Sjsing 	.ssl3_enc = &DTLSv1_enc_data,
1869158af98Sjsing };
1879158af98Sjsing 
1889158af98Sjsing static const SSL_METHOD DTLSv1_server_method_data = {
1899158af98Sjsing 	.ssl_dispatch_alert = dtls1_dispatch_alert,
1909158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
1919158af98Sjsing 	.get_cipher = dtls1_get_cipher,
1929158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
1939158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
1949158af98Sjsing 	.internal = &DTLSv1_server_method_internal_data,
1959158af98Sjsing };
1969158af98Sjsing 
1979158af98Sjsing const SSL_METHOD *
1989158af98Sjsing DTLSv1_server_method(void)
1999158af98Sjsing {
2009158af98Sjsing 	return &DTLSv1_server_method_data;
2019158af98Sjsing }
2029158af98Sjsing 
2039158af98Sjsing const SSL_METHOD *
20471023d34Sjsing DTLS_server_method(void)
20571023d34Sjsing {
20671023d34Sjsing 	return DTLSv1_server_method();
20771023d34Sjsing }
20871023d34Sjsing 
20971023d34Sjsing const SSL_METHOD *
2109158af98Sjsing dtls1_get_server_method(int ver)
2119158af98Sjsing {
2129158af98Sjsing 	if (ver == DTLS1_VERSION)
2139158af98Sjsing 		return (DTLSv1_server_method());
2149158af98Sjsing 	return (NULL);
2159158af98Sjsing }
2169158af98Sjsing 
2177214807fSjsing #ifdef LIBRESSL_HAS_TLS1_3_CLIENT
2189158af98Sjsing static const SSL_METHOD_INTERNAL TLS_client_method_internal_data = {
219efee3f2fSjsing 	.version = TLS1_3_VERSION,
220efee3f2fSjsing 	.min_version = TLS1_VERSION,
221efee3f2fSjsing 	.max_version = TLS1_3_VERSION,
222efee3f2fSjsing 	.ssl_new = tls1_new,
223efee3f2fSjsing 	.ssl_clear = tls1_clear,
224efee3f2fSjsing 	.ssl_free = tls1_free,
225efee3f2fSjsing 	.ssl_accept = ssl_undefined_function,
226efee3f2fSjsing 	.ssl_connect = tls13_legacy_connect,
227df62dce5Sjsing 	.ssl_shutdown = tls13_legacy_shutdown,
228efee3f2fSjsing 	.get_ssl_method = tls1_get_client_method,
229efee3f2fSjsing 	.get_timeout = tls1_default_timeout,
230efee3f2fSjsing 	.ssl_version = ssl_undefined_void_function,
231efee3f2fSjsing 	.ssl_renegotiate = ssl_undefined_function,
232efee3f2fSjsing 	.ssl_renegotiate_check = ssl_ok,
233efee3f2fSjsing 	.ssl_get_message = ssl3_get_message,
234*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
235efee3f2fSjsing 	.ssl_read_bytes = tls13_legacy_read_bytes,
236efee3f2fSjsing 	.ssl_write_bytes = tls13_legacy_write_bytes,
237efee3f2fSjsing 	.ssl3_enc = &TLSv1_2_enc_data,
238efee3f2fSjsing };
239efee3f2fSjsing 
240efee3f2fSjsing static const SSL_METHOD TLS_client_method_data = {
241efee3f2fSjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
242efee3f2fSjsing 	.num_ciphers = ssl3_num_ciphers,
243efee3f2fSjsing 	.get_cipher = ssl3_get_cipher,
244efee3f2fSjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
245efee3f2fSjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
246efee3f2fSjsing 	.internal = &TLS_client_method_internal_data,
247efee3f2fSjsing };
248efee3f2fSjsing #endif
249efee3f2fSjsing 
250efee3f2fSjsing static const SSL_METHOD_INTERNAL TLS_legacy_client_method_internal_data = {
2519158af98Sjsing 	.version = TLS1_2_VERSION,
2529158af98Sjsing 	.min_version = TLS1_VERSION,
2539158af98Sjsing 	.max_version = TLS1_2_VERSION,
2549158af98Sjsing 	.ssl_new = tls1_new,
2559158af98Sjsing 	.ssl_clear = tls1_clear,
2569158af98Sjsing 	.ssl_free = tls1_free,
2579158af98Sjsing 	.ssl_accept = ssl_undefined_function,
2589158af98Sjsing 	.ssl_connect = ssl3_connect,
2591a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
2609158af98Sjsing 	.get_ssl_method = tls1_get_client_method,
2619158af98Sjsing 	.get_timeout = tls1_default_timeout,
2629158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
2639158af98Sjsing 	.ssl_renegotiate = ssl_undefined_function,
2649158af98Sjsing 	.ssl_renegotiate_check = ssl_ok,
2659158af98Sjsing 	.ssl_get_message = ssl3_get_message,
266*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
2679158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
2689158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
2699158af98Sjsing 	.ssl3_enc = &TLSv1_2_enc_data,
2709158af98Sjsing };
2719158af98Sjsing 
272efee3f2fSjsing static const SSL_METHOD TLS_legacy_client_method_data = {
2739158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
2749158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
2759158af98Sjsing 	.get_cipher = ssl3_get_cipher,
2769158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
2779158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
278efee3f2fSjsing 	.internal = &TLS_legacy_client_method_internal_data,
2799158af98Sjsing };
2809158af98Sjsing 
2819158af98Sjsing static const SSL_METHOD_INTERNAL TLSv1_client_method_internal_data = {
2829158af98Sjsing 	.version = TLS1_VERSION,
2839158af98Sjsing 	.min_version = TLS1_VERSION,
2849158af98Sjsing 	.max_version = TLS1_VERSION,
2859158af98Sjsing 	.ssl_new = tls1_new,
2869158af98Sjsing 	.ssl_clear = tls1_clear,
2879158af98Sjsing 	.ssl_free = tls1_free,
2889158af98Sjsing 	.ssl_accept = ssl_undefined_function,
2899158af98Sjsing 	.ssl_connect = ssl3_connect,
2901a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
2919158af98Sjsing 	.get_ssl_method = tls1_get_client_method,
2929158af98Sjsing 	.get_timeout = tls1_default_timeout,
2939158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
2949158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
2959158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
2969158af98Sjsing 	.ssl_get_message = ssl3_get_message,
297*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
2989158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
2999158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
3009158af98Sjsing 	.ssl3_enc = &TLSv1_enc_data,
3019158af98Sjsing };
3029158af98Sjsing 
3039158af98Sjsing static const SSL_METHOD TLSv1_client_method_data = {
3049158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
3059158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
3069158af98Sjsing 	.get_cipher = ssl3_get_cipher,
3079158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
3089158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
3099158af98Sjsing 	.internal = &TLSv1_client_method_internal_data,
3109158af98Sjsing };
3119158af98Sjsing 
3129158af98Sjsing static const SSL_METHOD_INTERNAL TLSv1_1_client_method_internal_data = {
3139158af98Sjsing 	.version = TLS1_1_VERSION,
3149158af98Sjsing 	.min_version = TLS1_1_VERSION,
3159158af98Sjsing 	.max_version = TLS1_1_VERSION,
3169158af98Sjsing 	.ssl_new = tls1_new,
3179158af98Sjsing 	.ssl_clear = tls1_clear,
3189158af98Sjsing 	.ssl_free = tls1_free,
3199158af98Sjsing 	.ssl_accept = ssl_undefined_function,
3209158af98Sjsing 	.ssl_connect = ssl3_connect,
3211a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
3229158af98Sjsing 	.get_ssl_method = tls1_get_client_method,
3239158af98Sjsing 	.get_timeout = tls1_default_timeout,
3249158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
3259158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
3269158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
3279158af98Sjsing 	.ssl_get_message = ssl3_get_message,
328*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
3299158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
3309158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
3319158af98Sjsing 	.ssl3_enc = &TLSv1_1_enc_data,
3329158af98Sjsing };
3339158af98Sjsing 
3349158af98Sjsing static const SSL_METHOD TLSv1_1_client_method_data = {
3359158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
3369158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
3379158af98Sjsing 	.get_cipher = ssl3_get_cipher,
3389158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
3399158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
3409158af98Sjsing 	.internal = &TLSv1_1_client_method_internal_data,
3419158af98Sjsing };
3429158af98Sjsing 
3439158af98Sjsing static const SSL_METHOD_INTERNAL TLSv1_2_client_method_internal_data = {
3449158af98Sjsing 	.version = TLS1_2_VERSION,
3459158af98Sjsing 	.min_version = TLS1_2_VERSION,
3469158af98Sjsing 	.max_version = TLS1_2_VERSION,
3479158af98Sjsing 	.ssl_new = tls1_new,
3489158af98Sjsing 	.ssl_clear = tls1_clear,
3499158af98Sjsing 	.ssl_free = tls1_free,
3509158af98Sjsing 	.ssl_accept = ssl_undefined_function,
3519158af98Sjsing 	.ssl_connect = ssl3_connect,
3521a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
3539158af98Sjsing 	.get_ssl_method = tls1_get_client_method,
3549158af98Sjsing 	.get_timeout = tls1_default_timeout,
3559158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
3569158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
3579158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
3589158af98Sjsing 	.ssl_get_message = ssl3_get_message,
359*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
3609158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
3619158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
3629158af98Sjsing 	.ssl3_enc = &TLSv1_2_enc_data,
3639158af98Sjsing };
3649158af98Sjsing 
3659158af98Sjsing static const SSL_METHOD TLSv1_2_client_method_data = {
3669158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
3679158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
3689158af98Sjsing 	.get_cipher = ssl3_get_cipher,
3699158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
3709158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
3719158af98Sjsing 	.internal = &TLSv1_2_client_method_internal_data,
3729158af98Sjsing };
3739158af98Sjsing 
3749158af98Sjsing const SSL_METHOD *
3759158af98Sjsing tls1_get_client_method(int ver)
3769158af98Sjsing {
3779158af98Sjsing 	if (ver == TLS1_2_VERSION)
3789158af98Sjsing 		return (TLSv1_2_client_method());
3799158af98Sjsing 	if (ver == TLS1_1_VERSION)
3809158af98Sjsing 		return (TLSv1_1_client_method());
3819158af98Sjsing 	if (ver == TLS1_VERSION)
3829158af98Sjsing 		return (TLSv1_client_method());
3839158af98Sjsing 	return (NULL);
3849158af98Sjsing }
3859158af98Sjsing 
3869158af98Sjsing const SSL_METHOD *
3879158af98Sjsing SSLv23_client_method(void)
3889158af98Sjsing {
3899158af98Sjsing 	return (TLS_client_method());
3909158af98Sjsing }
3919158af98Sjsing 
3929158af98Sjsing const SSL_METHOD *
3939158af98Sjsing TLS_client_method(void)
3949158af98Sjsing {
3957214807fSjsing #ifdef LIBRESSL_HAS_TLS1_3_CLIENT
3969158af98Sjsing 	return (&TLS_client_method_data);
397efee3f2fSjsing #else
398efee3f2fSjsing 	return tls_legacy_client_method();
399efee3f2fSjsing #endif
400efee3f2fSjsing }
401efee3f2fSjsing 
402efee3f2fSjsing const SSL_METHOD *
403efee3f2fSjsing tls_legacy_client_method(void)
404efee3f2fSjsing {
405efee3f2fSjsing 	return (&TLS_legacy_client_method_data);
4069158af98Sjsing }
4079158af98Sjsing 
4089158af98Sjsing const SSL_METHOD *
4099158af98Sjsing TLSv1_client_method(void)
4109158af98Sjsing {
4119158af98Sjsing 	return (&TLSv1_client_method_data);
4129158af98Sjsing }
4139158af98Sjsing 
4149158af98Sjsing const SSL_METHOD *
4159158af98Sjsing TLSv1_1_client_method(void)
4169158af98Sjsing {
4179158af98Sjsing 	return (&TLSv1_1_client_method_data);
4189158af98Sjsing }
4199158af98Sjsing 
4209158af98Sjsing const SSL_METHOD *
4219158af98Sjsing TLSv1_2_client_method(void)
4229158af98Sjsing {
4239158af98Sjsing 	return (&TLSv1_2_client_method_data);
4249158af98Sjsing }
4259158af98Sjsing 
4269158af98Sjsing static const SSL_METHOD *tls1_get_method(int ver);
4279158af98Sjsing 
4289158af98Sjsing static const SSL_METHOD_INTERNAL TLS_method_internal_data = {
4299158af98Sjsing 	.version = TLS1_2_VERSION,
4309158af98Sjsing 	.min_version = TLS1_VERSION,
4319158af98Sjsing 	.max_version = TLS1_2_VERSION,
4329158af98Sjsing 	.ssl_new = tls1_new,
4339158af98Sjsing 	.ssl_clear = tls1_clear,
4349158af98Sjsing 	.ssl_free = tls1_free,
4359158af98Sjsing 	.ssl_accept = ssl3_accept,
4369158af98Sjsing 	.ssl_connect = ssl3_connect,
4371a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
4389158af98Sjsing 	.get_ssl_method = tls1_get_method,
4399158af98Sjsing 	.get_timeout = tls1_default_timeout,
4409158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
4419158af98Sjsing 	.ssl_renegotiate = ssl_undefined_function,
4429158af98Sjsing 	.ssl_renegotiate_check = ssl_ok,
4439158af98Sjsing 	.ssl_get_message = ssl3_get_message,
444*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
4459158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
4469158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
4479158af98Sjsing 	.ssl3_enc = &TLSv1_2_enc_data,
4489158af98Sjsing };
4499158af98Sjsing 
4509158af98Sjsing static const SSL_METHOD TLS_method_data = {
4519158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
4529158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
4539158af98Sjsing 	.get_cipher = ssl3_get_cipher,
4549158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
4559158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
4569158af98Sjsing 	.internal = &TLS_method_internal_data,
4579158af98Sjsing };
4589158af98Sjsing 
4599158af98Sjsing static const SSL_METHOD_INTERNAL TLSv1_method_internal_data = {
4609158af98Sjsing 	.version = TLS1_VERSION,
4619158af98Sjsing 	.min_version = TLS1_VERSION,
4629158af98Sjsing 	.max_version = TLS1_VERSION,
4639158af98Sjsing 	.ssl_new = tls1_new,
4649158af98Sjsing 	.ssl_clear = tls1_clear,
4659158af98Sjsing 	.ssl_free = tls1_free,
4669158af98Sjsing 	.ssl_accept = ssl3_accept,
4679158af98Sjsing 	.ssl_connect = ssl3_connect,
4681a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
4699158af98Sjsing 	.get_ssl_method = tls1_get_method,
4709158af98Sjsing 	.get_timeout = tls1_default_timeout,
4719158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
4729158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
4739158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
4749158af98Sjsing 	.ssl_get_message = ssl3_get_message,
475*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
4769158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
4779158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
4789158af98Sjsing 	.ssl3_enc = &TLSv1_enc_data,
4799158af98Sjsing };
4809158af98Sjsing 
4819158af98Sjsing static const SSL_METHOD TLSv1_method_data = {
4829158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
4839158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
4849158af98Sjsing 	.get_cipher = ssl3_get_cipher,
4859158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
4869158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
4879158af98Sjsing 	.internal = &TLSv1_method_internal_data,
4889158af98Sjsing };
4899158af98Sjsing 
4909158af98Sjsing static const SSL_METHOD_INTERNAL TLSv1_1_method_internal_data = {
4919158af98Sjsing 	.version = TLS1_1_VERSION,
4929158af98Sjsing 	.min_version = TLS1_1_VERSION,
4939158af98Sjsing 	.max_version = TLS1_1_VERSION,
4949158af98Sjsing 	.ssl_new = tls1_new,
4959158af98Sjsing 	.ssl_clear = tls1_clear,
4969158af98Sjsing 	.ssl_free = tls1_free,
4979158af98Sjsing 	.ssl_accept = ssl3_accept,
4989158af98Sjsing 	.ssl_connect = ssl3_connect,
4991a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
5009158af98Sjsing 	.get_ssl_method = tls1_get_method,
5019158af98Sjsing 	.get_timeout = tls1_default_timeout,
5029158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
5039158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
5049158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
5059158af98Sjsing 	.ssl_get_message = ssl3_get_message,
506*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
5079158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
5089158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
5099158af98Sjsing 	.ssl3_enc = &TLSv1_1_enc_data,
5109158af98Sjsing };
5119158af98Sjsing 
5129158af98Sjsing static const SSL_METHOD TLSv1_1_method_data = {
5139158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
5149158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
5159158af98Sjsing 	.get_cipher = ssl3_get_cipher,
5169158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
5179158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
5189158af98Sjsing 	.internal = &TLSv1_1_method_internal_data,
5199158af98Sjsing };
5209158af98Sjsing 
5219158af98Sjsing static const SSL_METHOD_INTERNAL TLSv1_2_method_internal_data = {
5229158af98Sjsing 	.version = TLS1_2_VERSION,
5239158af98Sjsing 	.min_version = TLS1_2_VERSION,
5249158af98Sjsing 	.max_version = TLS1_2_VERSION,
5259158af98Sjsing 	.ssl_new = tls1_new,
5269158af98Sjsing 	.ssl_clear = tls1_clear,
5279158af98Sjsing 	.ssl_free = tls1_free,
5289158af98Sjsing 	.ssl_accept = ssl3_accept,
5299158af98Sjsing 	.ssl_connect = ssl3_connect,
5301a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
5319158af98Sjsing 	.get_ssl_method = tls1_get_method,
5329158af98Sjsing 	.get_timeout = tls1_default_timeout,
5339158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
5349158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
5359158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
5369158af98Sjsing 	.ssl_get_message = ssl3_get_message,
537*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
5389158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
5399158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
5409158af98Sjsing 	.ssl3_enc = &TLSv1_2_enc_data,
5419158af98Sjsing };
5429158af98Sjsing 
5439158af98Sjsing static const SSL_METHOD TLSv1_2_method_data = {
5449158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
5459158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
5469158af98Sjsing 	.get_cipher = ssl3_get_cipher,
5479158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
5489158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
5499158af98Sjsing 	.internal = &TLSv1_2_method_internal_data,
5509158af98Sjsing };
5519158af98Sjsing 
5529158af98Sjsing static const SSL_METHOD *
5539158af98Sjsing tls1_get_method(int ver)
5549158af98Sjsing {
5559158af98Sjsing 	if (ver == TLS1_2_VERSION)
5569158af98Sjsing 		return (TLSv1_2_method());
5579158af98Sjsing 	if (ver == TLS1_1_VERSION)
5589158af98Sjsing 		return (TLSv1_1_method());
5599158af98Sjsing 	if (ver == TLS1_VERSION)
5609158af98Sjsing 		return (TLSv1_method());
5619158af98Sjsing 	return (NULL);
5629158af98Sjsing }
5639158af98Sjsing 
5649158af98Sjsing const SSL_METHOD *
5659158af98Sjsing SSLv23_method(void)
5669158af98Sjsing {
5679158af98Sjsing 	return (TLS_method());
5689158af98Sjsing }
5699158af98Sjsing 
5709158af98Sjsing const SSL_METHOD *
5719158af98Sjsing TLS_method(void)
5729158af98Sjsing {
5739158af98Sjsing 	return &TLS_method_data;
5749158af98Sjsing }
5759158af98Sjsing 
5769158af98Sjsing const SSL_METHOD *
5779158af98Sjsing TLSv1_method(void)
5789158af98Sjsing {
5799158af98Sjsing 	return (&TLSv1_method_data);
5809158af98Sjsing }
5819158af98Sjsing 
5829158af98Sjsing const SSL_METHOD *
5839158af98Sjsing TLSv1_1_method(void)
5849158af98Sjsing {
5859158af98Sjsing 	return (&TLSv1_1_method_data);
5869158af98Sjsing }
5879158af98Sjsing 
5889158af98Sjsing const SSL_METHOD *
5899158af98Sjsing TLSv1_2_method(void)
5909158af98Sjsing {
5919158af98Sjsing 	return (&TLSv1_2_method_data);
5929158af98Sjsing }
5939158af98Sjsing 
5940dbd9f91Sjsing #ifdef LIBRESSL_HAS_TLS1_3_SERVER
5959158af98Sjsing static const SSL_METHOD_INTERNAL TLS_server_method_internal_data = {
5960dbd9f91Sjsing 	.version = TLS1_3_VERSION,
5970dbd9f91Sjsing 	.min_version = TLS1_VERSION,
5980dbd9f91Sjsing 	.max_version = TLS1_3_VERSION,
5990dbd9f91Sjsing 	.ssl_new = tls1_new,
6000dbd9f91Sjsing 	.ssl_clear = tls1_clear,
6010dbd9f91Sjsing 	.ssl_free = tls1_free,
6020dbd9f91Sjsing 	.ssl_accept = tls13_legacy_accept,
6030dbd9f91Sjsing 	.ssl_connect = ssl_undefined_function,
6040dbd9f91Sjsing 	.ssl_shutdown = tls13_legacy_shutdown,
6050dbd9f91Sjsing 	.get_ssl_method = tls1_get_server_method,
6060dbd9f91Sjsing 	.get_timeout = tls1_default_timeout,
6070dbd9f91Sjsing 	.ssl_version = ssl_undefined_void_function,
6080dbd9f91Sjsing 	.ssl_renegotiate = ssl_undefined_function,
6090dbd9f91Sjsing 	.ssl_renegotiate_check = ssl_ok,
6100dbd9f91Sjsing 	.ssl_get_message = ssl3_get_message,
611*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
6120dbd9f91Sjsing 	.ssl_read_bytes = tls13_legacy_read_bytes,
6130dbd9f91Sjsing 	.ssl_write_bytes = tls13_legacy_write_bytes,
6140dbd9f91Sjsing 	.ssl3_enc = &TLSv1_2_enc_data,
6150dbd9f91Sjsing };
6160dbd9f91Sjsing 
6170dbd9f91Sjsing static const SSL_METHOD TLS_server_method_data = {
6180dbd9f91Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
6190dbd9f91Sjsing 	.num_ciphers = ssl3_num_ciphers,
6200dbd9f91Sjsing 	.get_cipher = ssl3_get_cipher,
6210dbd9f91Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
6220dbd9f91Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
6230dbd9f91Sjsing 	.internal = &TLS_server_method_internal_data,
6240dbd9f91Sjsing };
6250dbd9f91Sjsing #endif
6260dbd9f91Sjsing 
6270dbd9f91Sjsing static const SSL_METHOD_INTERNAL TLS_legacy_server_method_internal_data = {
6289158af98Sjsing 	.version = TLS1_2_VERSION,
6299158af98Sjsing 	.min_version = TLS1_VERSION,
6309158af98Sjsing 	.max_version = TLS1_2_VERSION,
6319158af98Sjsing 	.ssl_new = tls1_new,
6329158af98Sjsing 	.ssl_clear = tls1_clear,
6339158af98Sjsing 	.ssl_free = tls1_free,
6349158af98Sjsing 	.ssl_accept = ssl3_accept,
6359158af98Sjsing 	.ssl_connect = ssl_undefined_function,
6361a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
6379158af98Sjsing 	.get_ssl_method = tls1_get_server_method,
6389158af98Sjsing 	.get_timeout = tls1_default_timeout,
6399158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
6409158af98Sjsing 	.ssl_renegotiate = ssl_undefined_function,
6419158af98Sjsing 	.ssl_renegotiate_check = ssl_ok,
6429158af98Sjsing 	.ssl_get_message = ssl3_get_message,
643*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
6449158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
6459158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
6469158af98Sjsing 	.ssl3_enc = &TLSv1_2_enc_data,
6479158af98Sjsing };
6489158af98Sjsing 
6490dbd9f91Sjsing static const SSL_METHOD TLS_legacy_server_method_data = {
6509158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
6519158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
6529158af98Sjsing 	.get_cipher = ssl3_get_cipher,
6539158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
6549158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
6550dbd9f91Sjsing 	.internal = &TLS_legacy_server_method_internal_data,
6569158af98Sjsing };
6579158af98Sjsing 
6589158af98Sjsing static const SSL_METHOD_INTERNAL TLSv1_server_method_internal_data = {
6599158af98Sjsing 	.version = TLS1_VERSION,
6609158af98Sjsing 	.min_version = TLS1_VERSION,
6619158af98Sjsing 	.max_version = TLS1_VERSION,
6629158af98Sjsing 	.ssl_new = tls1_new,
6639158af98Sjsing 	.ssl_clear = tls1_clear,
6649158af98Sjsing 	.ssl_free = tls1_free,
6659158af98Sjsing 	.ssl_accept = ssl3_accept,
6669158af98Sjsing 	.ssl_connect = ssl_undefined_function,
6671a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
6689158af98Sjsing 	.get_ssl_method = tls1_get_server_method,
6699158af98Sjsing 	.get_timeout = tls1_default_timeout,
6709158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
6719158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
6729158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
6739158af98Sjsing 	.ssl_get_message = ssl3_get_message,
674*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
6759158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
6769158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
6779158af98Sjsing 	.ssl3_enc = &TLSv1_enc_data,
6789158af98Sjsing };
6799158af98Sjsing 
6809158af98Sjsing static const SSL_METHOD TLSv1_server_method_data = {
6819158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
6829158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
6839158af98Sjsing 	.get_cipher = ssl3_get_cipher,
6849158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
6859158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
6869158af98Sjsing 	.internal = &TLSv1_server_method_internal_data,
6879158af98Sjsing };
6889158af98Sjsing 
6899158af98Sjsing static const SSL_METHOD_INTERNAL TLSv1_1_server_method_internal_data = {
6909158af98Sjsing 	.version = TLS1_1_VERSION,
6919158af98Sjsing 	.min_version = TLS1_1_VERSION,
6929158af98Sjsing 	.max_version = TLS1_1_VERSION,
6939158af98Sjsing 	.ssl_new = tls1_new,
6949158af98Sjsing 	.ssl_clear = tls1_clear,
6959158af98Sjsing 	.ssl_free = tls1_free,
6969158af98Sjsing 	.ssl_accept = ssl3_accept,
6979158af98Sjsing 	.ssl_connect = ssl_undefined_function,
6981a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
6999158af98Sjsing 	.get_ssl_method = tls1_get_server_method,
7009158af98Sjsing 	.get_timeout = tls1_default_timeout,
7019158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
7029158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
7039158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
7049158af98Sjsing 	.ssl_get_message = ssl3_get_message,
705*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
7069158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
7079158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
7089158af98Sjsing 	.ssl3_enc = &TLSv1_1_enc_data,
7099158af98Sjsing };
7109158af98Sjsing 
7119158af98Sjsing static const SSL_METHOD TLSv1_1_server_method_data = {
7129158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
7139158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
7149158af98Sjsing 	.get_cipher = ssl3_get_cipher,
7159158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
7169158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
7179158af98Sjsing 	.internal = &TLSv1_1_server_method_internal_data,
7189158af98Sjsing };
7199158af98Sjsing 
7209158af98Sjsing static const SSL_METHOD_INTERNAL TLSv1_2_server_method_internal_data = {
7219158af98Sjsing 	.version = TLS1_2_VERSION,
7229158af98Sjsing 	.min_version = TLS1_2_VERSION,
7239158af98Sjsing 	.max_version = TLS1_2_VERSION,
7249158af98Sjsing 	.ssl_new = tls1_new,
7259158af98Sjsing 	.ssl_clear = tls1_clear,
7269158af98Sjsing 	.ssl_free = tls1_free,
7279158af98Sjsing 	.ssl_accept = ssl3_accept,
7289158af98Sjsing 	.ssl_connect = ssl_undefined_function,
7291a6e1177Sjsing 	.ssl_shutdown = ssl3_shutdown,
7309158af98Sjsing 	.get_ssl_method = tls1_get_server_method,
7319158af98Sjsing 	.get_timeout = tls1_default_timeout,
7329158af98Sjsing 	.ssl_version = ssl_undefined_void_function,
7339158af98Sjsing 	.ssl_renegotiate = ssl3_renegotiate,
7349158af98Sjsing 	.ssl_renegotiate_check = ssl3_renegotiate_check,
7359158af98Sjsing 	.ssl_get_message = ssl3_get_message,
736*8dc90bbaSjsing 	.ssl_pending = ssl3_pending,
7379158af98Sjsing 	.ssl_read_bytes = ssl3_read_bytes,
7389158af98Sjsing 	.ssl_write_bytes = ssl3_write_bytes,
7399158af98Sjsing 	.ssl3_enc = &TLSv1_2_enc_data,
7409158af98Sjsing };
7419158af98Sjsing 
7429158af98Sjsing static const SSL_METHOD TLSv1_2_server_method_data = {
7439158af98Sjsing 	.ssl_dispatch_alert = ssl3_dispatch_alert,
7449158af98Sjsing 	.num_ciphers = ssl3_num_ciphers,
7459158af98Sjsing 	.get_cipher = ssl3_get_cipher,
7469158af98Sjsing 	.get_cipher_by_char = ssl3_get_cipher_by_char,
7479158af98Sjsing 	.put_cipher_by_char = ssl3_put_cipher_by_char,
7489158af98Sjsing 	.internal = &TLSv1_2_server_method_internal_data,
7499158af98Sjsing };
7509158af98Sjsing 
7519158af98Sjsing const SSL_METHOD *
7529158af98Sjsing tls1_get_server_method(int ver)
7539158af98Sjsing {
7549158af98Sjsing 	if (ver == TLS1_2_VERSION)
7559158af98Sjsing 		return (TLSv1_2_server_method());
7569158af98Sjsing 	if (ver == TLS1_1_VERSION)
7579158af98Sjsing 		return (TLSv1_1_server_method());
7589158af98Sjsing 	if (ver == TLS1_VERSION)
7599158af98Sjsing 		return (TLSv1_server_method());
7609158af98Sjsing 	return (NULL);
7619158af98Sjsing }
7629158af98Sjsing 
7639158af98Sjsing const SSL_METHOD *
7649158af98Sjsing SSLv23_server_method(void)
7659158af98Sjsing {
7669158af98Sjsing 	return (TLS_server_method());
7679158af98Sjsing }
7689158af98Sjsing 
7699158af98Sjsing const SSL_METHOD *
7709158af98Sjsing TLS_server_method(void)
7719158af98Sjsing {
7720dbd9f91Sjsing #ifdef LIBRESSL_HAS_TLS1_3_SERVER
7739158af98Sjsing 	return (&TLS_server_method_data);
7740dbd9f91Sjsing #else
7750dbd9f91Sjsing 	return tls_legacy_server_method();
7760dbd9f91Sjsing #endif
7770dbd9f91Sjsing }
7780dbd9f91Sjsing 
7790dbd9f91Sjsing const SSL_METHOD *
7800dbd9f91Sjsing tls_legacy_server_method(void)
7810dbd9f91Sjsing {
7820dbd9f91Sjsing 	return (&TLS_legacy_server_method_data);
7839158af98Sjsing }
7849158af98Sjsing 
7859158af98Sjsing const SSL_METHOD *
7869158af98Sjsing TLSv1_server_method(void)
7879158af98Sjsing {
7889158af98Sjsing 	return (&TLSv1_server_method_data);
7899158af98Sjsing }
7909158af98Sjsing 
7919158af98Sjsing const SSL_METHOD *
7929158af98Sjsing TLSv1_1_server_method(void)
7939158af98Sjsing {
7949158af98Sjsing 	return (&TLSv1_1_server_method_data);
7959158af98Sjsing }
7969158af98Sjsing 
7979158af98Sjsing const SSL_METHOD *
7989158af98Sjsing TLSv1_2_server_method(void)
7999158af98Sjsing {
8009158af98Sjsing 	return (&TLSv1_2_server_method_data);
8019158af98Sjsing }
802