xref: /dflybsd-src/crypto/libressl/ssl/ssl_methods.c (revision cca6fc5243d2098262ea81f83ad5b28d3b800f4a)
1*cca6fc52SDaniel Fojt /* $OpenBSD: ssl_methods.c,v 1.12 2020/02/06 16:05:58 jsing Exp $ */
272c33676SMaxim Ag /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
372c33676SMaxim Ag  * All rights reserved.
472c33676SMaxim Ag  *
572c33676SMaxim Ag  * This package is an SSL implementation written
672c33676SMaxim Ag  * by Eric Young (eay@cryptsoft.com).
772c33676SMaxim Ag  * The implementation was written so as to conform with Netscapes SSL.
872c33676SMaxim Ag  *
972c33676SMaxim Ag  * This library is free for commercial and non-commercial use as long as
1072c33676SMaxim Ag  * the following conditions are aheared to.  The following conditions
1172c33676SMaxim Ag  * apply to all code found in this distribution, be it the RC4, RSA,
1272c33676SMaxim Ag  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1372c33676SMaxim Ag  * included with this distribution is covered by the same copyright terms
1472c33676SMaxim Ag  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
1572c33676SMaxim Ag  *
1672c33676SMaxim Ag  * Copyright remains Eric Young's, and as such any Copyright notices in
1772c33676SMaxim Ag  * the code are not to be removed.
1872c33676SMaxim Ag  * If this package is used in a product, Eric Young should be given attribution
1972c33676SMaxim Ag  * as the author of the parts of the library used.
2072c33676SMaxim Ag  * This can be in the form of a textual message at program startup or
2172c33676SMaxim Ag  * in documentation (online or textual) provided with the package.
2272c33676SMaxim Ag  *
2372c33676SMaxim Ag  * Redistribution and use in source and binary forms, with or without
2472c33676SMaxim Ag  * modification, are permitted provided that the following conditions
2572c33676SMaxim Ag  * are met:
2672c33676SMaxim Ag  * 1. Redistributions of source code must retain the copyright
2772c33676SMaxim Ag  *    notice, this list of conditions and the following disclaimer.
2872c33676SMaxim Ag  * 2. Redistributions in binary form must reproduce the above copyright
2972c33676SMaxim Ag  *    notice, this list of conditions and the following disclaimer in the
3072c33676SMaxim Ag  *    documentation and/or other materials provided with the distribution.
3172c33676SMaxim Ag  * 3. All advertising materials mentioning features or use of this software
3272c33676SMaxim Ag  *    must display the following acknowledgement:
3372c33676SMaxim Ag  *    "This product includes cryptographic software written by
3472c33676SMaxim Ag  *     Eric Young (eay@cryptsoft.com)"
3572c33676SMaxim Ag  *    The word 'cryptographic' can be left out if the rouines from the library
3672c33676SMaxim Ag  *    being used are not cryptographic related :-).
3772c33676SMaxim Ag  * 4. If you include any Windows specific code (or a derivative thereof) from
3872c33676SMaxim Ag  *    the apps directory (application code) you must include an acknowledgement:
3972c33676SMaxim Ag  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
4072c33676SMaxim Ag  *
4172c33676SMaxim Ag  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4272c33676SMaxim Ag  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4372c33676SMaxim Ag  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4472c33676SMaxim Ag  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4572c33676SMaxim Ag  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4672c33676SMaxim Ag  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4772c33676SMaxim Ag  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4872c33676SMaxim Ag  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4972c33676SMaxim Ag  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5072c33676SMaxim Ag  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5172c33676SMaxim Ag  * SUCH DAMAGE.
5272c33676SMaxim Ag  *
5372c33676SMaxim Ag  * The licence and distribution terms for any publically available version or
5472c33676SMaxim Ag  * derivative of this code cannot be changed.  i.e. this code cannot simply be
5572c33676SMaxim Ag  * copied and put under another distribution licence
5672c33676SMaxim Ag  * [including the GNU Public Licence.]
5772c33676SMaxim Ag  */
5872c33676SMaxim Ag 
5972c33676SMaxim Ag #include "ssl_locl.h"
6072c33676SMaxim Ag #include "tls13_internal.h"
6172c33676SMaxim Ag 
6272c33676SMaxim Ag static const SSL_METHOD_INTERNAL DTLSv1_client_method_internal_data = {
6372c33676SMaxim Ag 	.version = DTLS1_VERSION,
6472c33676SMaxim Ag 	.min_version = DTLS1_VERSION,
6572c33676SMaxim Ag 	.max_version = DTLS1_VERSION,
6672c33676SMaxim Ag 	.ssl_new = dtls1_new,
6772c33676SMaxim Ag 	.ssl_clear = dtls1_clear,
6872c33676SMaxim Ag 	.ssl_free = dtls1_free,
6972c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
7072c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
71*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
7272c33676SMaxim Ag 	.get_ssl_method = dtls1_get_client_method,
7372c33676SMaxim Ag 	.get_timeout = dtls1_default_timeout,
7472c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
7572c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
7672c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
77*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
7872c33676SMaxim Ag 	.ssl_read_bytes = dtls1_read_bytes,
7972c33676SMaxim Ag 	.ssl_write_bytes = dtls1_write_app_data_bytes,
8072c33676SMaxim Ag 	.ssl3_enc = &DTLSv1_enc_data,
8172c33676SMaxim Ag };
8272c33676SMaxim Ag 
8372c33676SMaxim Ag static const SSL_METHOD DTLSv1_client_method_data = {
8472c33676SMaxim Ag 	.ssl_dispatch_alert = dtls1_dispatch_alert,
8572c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
8672c33676SMaxim Ag 	.get_cipher = dtls1_get_cipher,
8772c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
8872c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
8972c33676SMaxim Ag 	.internal = &DTLSv1_client_method_internal_data,
9072c33676SMaxim Ag };
9172c33676SMaxim Ag 
9272c33676SMaxim Ag const SSL_METHOD *
9372c33676SMaxim Ag DTLSv1_client_method(void)
9472c33676SMaxim Ag {
9572c33676SMaxim Ag 	return &DTLSv1_client_method_data;
9672c33676SMaxim Ag }
9772c33676SMaxim Ag 
9872c33676SMaxim Ag const SSL_METHOD *
9972c33676SMaxim Ag DTLS_client_method(void)
10072c33676SMaxim Ag {
10172c33676SMaxim Ag 	return DTLSv1_client_method();
10272c33676SMaxim Ag }
10372c33676SMaxim Ag 
10472c33676SMaxim Ag const SSL_METHOD *
10572c33676SMaxim Ag dtls1_get_client_method(int ver)
10672c33676SMaxim Ag {
10772c33676SMaxim Ag 	if (ver == DTLS1_VERSION)
10872c33676SMaxim Ag 		return (DTLSv1_client_method());
10972c33676SMaxim Ag 	return (NULL);
11072c33676SMaxim Ag }
11172c33676SMaxim Ag 
11272c33676SMaxim Ag static const SSL_METHOD *dtls1_get_method(int ver);
11372c33676SMaxim Ag 
11472c33676SMaxim Ag static const SSL_METHOD_INTERNAL DTLSv1_method_internal_data = {
11572c33676SMaxim Ag 	.version = DTLS1_VERSION,
11672c33676SMaxim Ag 	.min_version = DTLS1_VERSION,
11772c33676SMaxim Ag 	.max_version = DTLS1_VERSION,
11872c33676SMaxim Ag 	.ssl_new = dtls1_new,
11972c33676SMaxim Ag 	.ssl_clear = dtls1_clear,
12072c33676SMaxim Ag 	.ssl_free = dtls1_free,
12172c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
12272c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
123*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
12472c33676SMaxim Ag 	.get_ssl_method = dtls1_get_method,
12572c33676SMaxim Ag 	.get_timeout = dtls1_default_timeout,
12672c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
12772c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
12872c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
129*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
13072c33676SMaxim Ag 	.ssl_read_bytes = dtls1_read_bytes,
13172c33676SMaxim Ag 	.ssl_write_bytes = dtls1_write_app_data_bytes,
13272c33676SMaxim Ag 	.ssl3_enc = &DTLSv1_enc_data,
13372c33676SMaxim Ag };
13472c33676SMaxim Ag 
13572c33676SMaxim Ag static const SSL_METHOD DTLSv1_method_data = {
13672c33676SMaxim Ag 	.ssl_dispatch_alert = dtls1_dispatch_alert,
13772c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
13872c33676SMaxim Ag 	.get_cipher = dtls1_get_cipher,
13972c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
14072c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
14172c33676SMaxim Ag 	.internal = &DTLSv1_method_internal_data,
14272c33676SMaxim Ag };
14372c33676SMaxim Ag 
14472c33676SMaxim Ag const SSL_METHOD *
14572c33676SMaxim Ag DTLSv1_method(void)
14672c33676SMaxim Ag {
14772c33676SMaxim Ag 	return &DTLSv1_method_data;
14872c33676SMaxim Ag }
14972c33676SMaxim Ag 
15072c33676SMaxim Ag const SSL_METHOD *
15172c33676SMaxim Ag DTLS_method(void)
15272c33676SMaxim Ag {
15372c33676SMaxim Ag 	return DTLSv1_method();
15472c33676SMaxim Ag }
15572c33676SMaxim Ag 
15672c33676SMaxim Ag static const SSL_METHOD *
15772c33676SMaxim Ag dtls1_get_method(int ver)
15872c33676SMaxim Ag {
15972c33676SMaxim Ag 	if (ver == DTLS1_VERSION)
16072c33676SMaxim Ag 		return (DTLSv1_method());
16172c33676SMaxim Ag 	return (NULL);
16272c33676SMaxim Ag }
16372c33676SMaxim Ag 
16472c33676SMaxim Ag static const SSL_METHOD_INTERNAL DTLSv1_server_method_internal_data = {
16572c33676SMaxim Ag 	.version = DTLS1_VERSION,
16672c33676SMaxim Ag 	.min_version = DTLS1_VERSION,
16772c33676SMaxim Ag 	.max_version = DTLS1_VERSION,
16872c33676SMaxim Ag 	.ssl_new = dtls1_new,
16972c33676SMaxim Ag 	.ssl_clear = dtls1_clear,
17072c33676SMaxim Ag 	.ssl_free = dtls1_free,
17172c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
17272c33676SMaxim Ag 	.ssl_connect = ssl_undefined_function,
173*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
17472c33676SMaxim Ag 	.get_ssl_method = dtls1_get_server_method,
17572c33676SMaxim Ag 	.get_timeout = dtls1_default_timeout,
17672c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
17772c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
17872c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
179*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
18072c33676SMaxim Ag 	.ssl_read_bytes = dtls1_read_bytes,
18172c33676SMaxim Ag 	.ssl_write_bytes = dtls1_write_app_data_bytes,
18272c33676SMaxim Ag 	.ssl3_enc = &DTLSv1_enc_data,
18372c33676SMaxim Ag };
18472c33676SMaxim Ag 
18572c33676SMaxim Ag static const SSL_METHOD DTLSv1_server_method_data = {
18672c33676SMaxim Ag 	.ssl_dispatch_alert = dtls1_dispatch_alert,
18772c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
18872c33676SMaxim Ag 	.get_cipher = dtls1_get_cipher,
18972c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
19072c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
19172c33676SMaxim Ag 	.internal = &DTLSv1_server_method_internal_data,
19272c33676SMaxim Ag };
19372c33676SMaxim Ag 
19472c33676SMaxim Ag const SSL_METHOD *
19572c33676SMaxim Ag DTLSv1_server_method(void)
19672c33676SMaxim Ag {
19772c33676SMaxim Ag 	return &DTLSv1_server_method_data;
19872c33676SMaxim Ag }
19972c33676SMaxim Ag 
20072c33676SMaxim Ag const SSL_METHOD *
20172c33676SMaxim Ag DTLS_server_method(void)
20272c33676SMaxim Ag {
20372c33676SMaxim Ag 	return DTLSv1_server_method();
20472c33676SMaxim Ag }
20572c33676SMaxim Ag 
20672c33676SMaxim Ag const SSL_METHOD *
20772c33676SMaxim Ag dtls1_get_server_method(int ver)
20872c33676SMaxim Ag {
20972c33676SMaxim Ag 	if (ver == DTLS1_VERSION)
21072c33676SMaxim Ag 		return (DTLSv1_server_method());
21172c33676SMaxim Ag 	return (NULL);
21272c33676SMaxim Ag }
21372c33676SMaxim Ag 
214*cca6fc52SDaniel Fojt #ifdef LIBRESSL_HAS_TLS1_3_CLIENT
21572c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLS_client_method_internal_data = {
21672c33676SMaxim Ag 	.version = TLS1_3_VERSION,
21772c33676SMaxim Ag 	.min_version = TLS1_VERSION,
21872c33676SMaxim Ag 	.max_version = TLS1_3_VERSION,
21972c33676SMaxim Ag 	.ssl_new = tls1_new,
22072c33676SMaxim Ag 	.ssl_clear = tls1_clear,
22172c33676SMaxim Ag 	.ssl_free = tls1_free,
22272c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
22372c33676SMaxim Ag 	.ssl_connect = tls13_legacy_connect,
224*cca6fc52SDaniel Fojt 	.ssl_shutdown = tls13_legacy_shutdown,
22572c33676SMaxim Ag 	.get_ssl_method = tls1_get_client_method,
22672c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
22772c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
22872c33676SMaxim Ag 	.ssl_renegotiate = ssl_undefined_function,
22972c33676SMaxim Ag 	.ssl_renegotiate_check = ssl_ok,
230*cca6fc52SDaniel Fojt 	.ssl_pending = tls13_legacy_pending,
23172c33676SMaxim Ag 	.ssl_read_bytes = tls13_legacy_read_bytes,
23272c33676SMaxim Ag 	.ssl_write_bytes = tls13_legacy_write_bytes,
233*cca6fc52SDaniel Fojt 	.ssl3_enc = &TLSv1_3_enc_data,
23472c33676SMaxim Ag };
23572c33676SMaxim Ag 
23672c33676SMaxim Ag static const SSL_METHOD TLS_client_method_data = {
23772c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
23872c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
23972c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
24072c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
24172c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
24272c33676SMaxim Ag 	.internal = &TLS_client_method_internal_data,
24372c33676SMaxim Ag };
24472c33676SMaxim Ag #endif
24572c33676SMaxim Ag 
24672c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLS_legacy_client_method_internal_data = {
24772c33676SMaxim Ag 	.version = TLS1_2_VERSION,
24872c33676SMaxim Ag 	.min_version = TLS1_VERSION,
24972c33676SMaxim Ag 	.max_version = TLS1_2_VERSION,
25072c33676SMaxim Ag 	.ssl_new = tls1_new,
25172c33676SMaxim Ag 	.ssl_clear = tls1_clear,
25272c33676SMaxim Ag 	.ssl_free = tls1_free,
25372c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
25472c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
255*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
25672c33676SMaxim Ag 	.get_ssl_method = tls1_get_client_method,
25772c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
25872c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
25972c33676SMaxim Ag 	.ssl_renegotiate = ssl_undefined_function,
26072c33676SMaxim Ag 	.ssl_renegotiate_check = ssl_ok,
261*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
26272c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
26372c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
26472c33676SMaxim Ag 	.ssl3_enc = &TLSv1_2_enc_data,
26572c33676SMaxim Ag };
26672c33676SMaxim Ag 
26772c33676SMaxim Ag static const SSL_METHOD TLS_legacy_client_method_data = {
26872c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
26972c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
27072c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
27172c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
27272c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
27372c33676SMaxim Ag 	.internal = &TLS_legacy_client_method_internal_data,
27472c33676SMaxim Ag };
27572c33676SMaxim Ag 
27672c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_client_method_internal_data = {
27772c33676SMaxim Ag 	.version = TLS1_VERSION,
27872c33676SMaxim Ag 	.min_version = TLS1_VERSION,
27972c33676SMaxim Ag 	.max_version = TLS1_VERSION,
28072c33676SMaxim Ag 	.ssl_new = tls1_new,
28172c33676SMaxim Ag 	.ssl_clear = tls1_clear,
28272c33676SMaxim Ag 	.ssl_free = tls1_free,
28372c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
28472c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
285*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
28672c33676SMaxim Ag 	.get_ssl_method = tls1_get_client_method,
28772c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
28872c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
28972c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
29072c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
291*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
29272c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
29372c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
29472c33676SMaxim Ag 	.ssl3_enc = &TLSv1_enc_data,
29572c33676SMaxim Ag };
29672c33676SMaxim Ag 
29772c33676SMaxim Ag static const SSL_METHOD TLSv1_client_method_data = {
29872c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
29972c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
30072c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
30172c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
30272c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
30372c33676SMaxim Ag 	.internal = &TLSv1_client_method_internal_data,
30472c33676SMaxim Ag };
30572c33676SMaxim Ag 
30672c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_1_client_method_internal_data = {
30772c33676SMaxim Ag 	.version = TLS1_1_VERSION,
30872c33676SMaxim Ag 	.min_version = TLS1_1_VERSION,
30972c33676SMaxim Ag 	.max_version = TLS1_1_VERSION,
31072c33676SMaxim Ag 	.ssl_new = tls1_new,
31172c33676SMaxim Ag 	.ssl_clear = tls1_clear,
31272c33676SMaxim Ag 	.ssl_free = tls1_free,
31372c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
31472c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
315*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
31672c33676SMaxim Ag 	.get_ssl_method = tls1_get_client_method,
31772c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
31872c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
31972c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
32072c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
321*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
32272c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
32372c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
32472c33676SMaxim Ag 	.ssl3_enc = &TLSv1_1_enc_data,
32572c33676SMaxim Ag };
32672c33676SMaxim Ag 
32772c33676SMaxim Ag static const SSL_METHOD TLSv1_1_client_method_data = {
32872c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
32972c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
33072c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
33172c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
33272c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
33372c33676SMaxim Ag 	.internal = &TLSv1_1_client_method_internal_data,
33472c33676SMaxim Ag };
33572c33676SMaxim Ag 
33672c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_2_client_method_internal_data = {
33772c33676SMaxim Ag 	.version = TLS1_2_VERSION,
33872c33676SMaxim Ag 	.min_version = TLS1_2_VERSION,
33972c33676SMaxim Ag 	.max_version = TLS1_2_VERSION,
34072c33676SMaxim Ag 	.ssl_new = tls1_new,
34172c33676SMaxim Ag 	.ssl_clear = tls1_clear,
34272c33676SMaxim Ag 	.ssl_free = tls1_free,
34372c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
34472c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
345*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
34672c33676SMaxim Ag 	.get_ssl_method = tls1_get_client_method,
34772c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
34872c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
34972c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
35072c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
351*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
35272c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
35372c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
35472c33676SMaxim Ag 	.ssl3_enc = &TLSv1_2_enc_data,
35572c33676SMaxim Ag };
35672c33676SMaxim Ag 
35772c33676SMaxim Ag static const SSL_METHOD TLSv1_2_client_method_data = {
35872c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
35972c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
36072c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
36172c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
36272c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
36372c33676SMaxim Ag 	.internal = &TLSv1_2_client_method_internal_data,
36472c33676SMaxim Ag };
36572c33676SMaxim Ag 
36672c33676SMaxim Ag const SSL_METHOD *
36772c33676SMaxim Ag tls1_get_client_method(int ver)
36872c33676SMaxim Ag {
369*cca6fc52SDaniel Fojt #ifdef LIBRESSL_HAS_TLS1_3_CLIENT
370*cca6fc52SDaniel Fojt 	if (ver == TLS1_3_VERSION)
371*cca6fc52SDaniel Fojt 		return (TLS_client_method());
372*cca6fc52SDaniel Fojt #endif
37372c33676SMaxim Ag 	if (ver == TLS1_2_VERSION)
37472c33676SMaxim Ag 		return (TLSv1_2_client_method());
37572c33676SMaxim Ag 	if (ver == TLS1_1_VERSION)
37672c33676SMaxim Ag 		return (TLSv1_1_client_method());
37772c33676SMaxim Ag 	if (ver == TLS1_VERSION)
37872c33676SMaxim Ag 		return (TLSv1_client_method());
37972c33676SMaxim Ag 	return (NULL);
38072c33676SMaxim Ag }
38172c33676SMaxim Ag 
38272c33676SMaxim Ag const SSL_METHOD *
38372c33676SMaxim Ag SSLv23_client_method(void)
38472c33676SMaxim Ag {
38572c33676SMaxim Ag 	return (TLS_client_method());
38672c33676SMaxim Ag }
38772c33676SMaxim Ag 
38872c33676SMaxim Ag const SSL_METHOD *
38972c33676SMaxim Ag TLS_client_method(void)
39072c33676SMaxim Ag {
391*cca6fc52SDaniel Fojt #ifdef LIBRESSL_HAS_TLS1_3_CLIENT
39272c33676SMaxim Ag 	return (&TLS_client_method_data);
39372c33676SMaxim Ag #else
39472c33676SMaxim Ag 	return tls_legacy_client_method();
39572c33676SMaxim Ag #endif
39672c33676SMaxim Ag }
39772c33676SMaxim Ag 
39872c33676SMaxim Ag const SSL_METHOD *
39972c33676SMaxim Ag tls_legacy_client_method(void)
40072c33676SMaxim Ag {
40172c33676SMaxim Ag 	return (&TLS_legacy_client_method_data);
40272c33676SMaxim Ag }
40372c33676SMaxim Ag 
40472c33676SMaxim Ag const SSL_METHOD *
40572c33676SMaxim Ag TLSv1_client_method(void)
40672c33676SMaxim Ag {
40772c33676SMaxim Ag 	return (&TLSv1_client_method_data);
40872c33676SMaxim Ag }
40972c33676SMaxim Ag 
41072c33676SMaxim Ag const SSL_METHOD *
41172c33676SMaxim Ag TLSv1_1_client_method(void)
41272c33676SMaxim Ag {
41372c33676SMaxim Ag 	return (&TLSv1_1_client_method_data);
41472c33676SMaxim Ag }
41572c33676SMaxim Ag 
41672c33676SMaxim Ag const SSL_METHOD *
41772c33676SMaxim Ag TLSv1_2_client_method(void)
41872c33676SMaxim Ag {
41972c33676SMaxim Ag 	return (&TLSv1_2_client_method_data);
42072c33676SMaxim Ag }
42172c33676SMaxim Ag 
42272c33676SMaxim Ag static const SSL_METHOD *tls1_get_method(int ver);
42372c33676SMaxim Ag 
42472c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLS_method_internal_data = {
42572c33676SMaxim Ag 	.version = TLS1_2_VERSION,
42672c33676SMaxim Ag 	.min_version = TLS1_VERSION,
42772c33676SMaxim Ag 	.max_version = TLS1_2_VERSION,
42872c33676SMaxim Ag 	.ssl_new = tls1_new,
42972c33676SMaxim Ag 	.ssl_clear = tls1_clear,
43072c33676SMaxim Ag 	.ssl_free = tls1_free,
43172c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
43272c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
433*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
43472c33676SMaxim Ag 	.get_ssl_method = tls1_get_method,
43572c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
43672c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
43772c33676SMaxim Ag 	.ssl_renegotiate = ssl_undefined_function,
43872c33676SMaxim Ag 	.ssl_renegotiate_check = ssl_ok,
439*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
44072c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
44172c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
44272c33676SMaxim Ag 	.ssl3_enc = &TLSv1_2_enc_data,
44372c33676SMaxim Ag };
44472c33676SMaxim Ag 
44572c33676SMaxim Ag static const SSL_METHOD TLS_method_data = {
44672c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
44772c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
44872c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
44972c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
45072c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
45172c33676SMaxim Ag 	.internal = &TLS_method_internal_data,
45272c33676SMaxim Ag };
45372c33676SMaxim Ag 
45472c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_method_internal_data = {
45572c33676SMaxim Ag 	.version = TLS1_VERSION,
45672c33676SMaxim Ag 	.min_version = TLS1_VERSION,
45772c33676SMaxim Ag 	.max_version = TLS1_VERSION,
45872c33676SMaxim Ag 	.ssl_new = tls1_new,
45972c33676SMaxim Ag 	.ssl_clear = tls1_clear,
46072c33676SMaxim Ag 	.ssl_free = tls1_free,
46172c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
46272c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
463*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
46472c33676SMaxim Ag 	.get_ssl_method = tls1_get_method,
46572c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
46672c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
46772c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
46872c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
469*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
47072c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
47172c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
47272c33676SMaxim Ag 	.ssl3_enc = &TLSv1_enc_data,
47372c33676SMaxim Ag };
47472c33676SMaxim Ag 
47572c33676SMaxim Ag static const SSL_METHOD TLSv1_method_data = {
47672c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
47772c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
47872c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
47972c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
48072c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
48172c33676SMaxim Ag 	.internal = &TLSv1_method_internal_data,
48272c33676SMaxim Ag };
48372c33676SMaxim Ag 
48472c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_1_method_internal_data = {
48572c33676SMaxim Ag 	.version = TLS1_1_VERSION,
48672c33676SMaxim Ag 	.min_version = TLS1_1_VERSION,
48772c33676SMaxim Ag 	.max_version = TLS1_1_VERSION,
48872c33676SMaxim Ag 	.ssl_new = tls1_new,
48972c33676SMaxim Ag 	.ssl_clear = tls1_clear,
49072c33676SMaxim Ag 	.ssl_free = tls1_free,
49172c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
49272c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
493*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
49472c33676SMaxim Ag 	.get_ssl_method = tls1_get_method,
49572c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
49672c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
49772c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
49872c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
499*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
50072c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
50172c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
50272c33676SMaxim Ag 	.ssl3_enc = &TLSv1_1_enc_data,
50372c33676SMaxim Ag };
50472c33676SMaxim Ag 
50572c33676SMaxim Ag static const SSL_METHOD TLSv1_1_method_data = {
50672c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
50772c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
50872c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
50972c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
51072c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
51172c33676SMaxim Ag 	.internal = &TLSv1_1_method_internal_data,
51272c33676SMaxim Ag };
51372c33676SMaxim Ag 
51472c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_2_method_internal_data = {
51572c33676SMaxim Ag 	.version = TLS1_2_VERSION,
51672c33676SMaxim Ag 	.min_version = TLS1_2_VERSION,
51772c33676SMaxim Ag 	.max_version = TLS1_2_VERSION,
51872c33676SMaxim Ag 	.ssl_new = tls1_new,
51972c33676SMaxim Ag 	.ssl_clear = tls1_clear,
52072c33676SMaxim Ag 	.ssl_free = tls1_free,
52172c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
52272c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
523*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
52472c33676SMaxim Ag 	.get_ssl_method = tls1_get_method,
52572c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
52672c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
52772c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
52872c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
529*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
53072c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
53172c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
53272c33676SMaxim Ag 	.ssl3_enc = &TLSv1_2_enc_data,
53372c33676SMaxim Ag };
53472c33676SMaxim Ag 
53572c33676SMaxim Ag static const SSL_METHOD TLSv1_2_method_data = {
53672c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
53772c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
53872c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
53972c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
54072c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
54172c33676SMaxim Ag 	.internal = &TLSv1_2_method_internal_data,
54272c33676SMaxim Ag };
54372c33676SMaxim Ag 
54472c33676SMaxim Ag static const SSL_METHOD *
54572c33676SMaxim Ag tls1_get_method(int ver)
54672c33676SMaxim Ag {
54772c33676SMaxim Ag 	if (ver == TLS1_2_VERSION)
54872c33676SMaxim Ag 		return (TLSv1_2_method());
54972c33676SMaxim Ag 	if (ver == TLS1_1_VERSION)
55072c33676SMaxim Ag 		return (TLSv1_1_method());
55172c33676SMaxim Ag 	if (ver == TLS1_VERSION)
55272c33676SMaxim Ag 		return (TLSv1_method());
55372c33676SMaxim Ag 	return (NULL);
55472c33676SMaxim Ag }
55572c33676SMaxim Ag 
55672c33676SMaxim Ag const SSL_METHOD *
55772c33676SMaxim Ag SSLv23_method(void)
55872c33676SMaxim Ag {
55972c33676SMaxim Ag 	return (TLS_method());
56072c33676SMaxim Ag }
56172c33676SMaxim Ag 
56272c33676SMaxim Ag const SSL_METHOD *
56372c33676SMaxim Ag TLS_method(void)
56472c33676SMaxim Ag {
56572c33676SMaxim Ag 	return &TLS_method_data;
56672c33676SMaxim Ag }
56772c33676SMaxim Ag 
56872c33676SMaxim Ag const SSL_METHOD *
56972c33676SMaxim Ag TLSv1_method(void)
57072c33676SMaxim Ag {
57172c33676SMaxim Ag 	return (&TLSv1_method_data);
57272c33676SMaxim Ag }
57372c33676SMaxim Ag 
57472c33676SMaxim Ag const SSL_METHOD *
57572c33676SMaxim Ag TLSv1_1_method(void)
57672c33676SMaxim Ag {
57772c33676SMaxim Ag 	return (&TLSv1_1_method_data);
57872c33676SMaxim Ag }
57972c33676SMaxim Ag 
58072c33676SMaxim Ag const SSL_METHOD *
58172c33676SMaxim Ag TLSv1_2_method(void)
58272c33676SMaxim Ag {
58372c33676SMaxim Ag 	return (&TLSv1_2_method_data);
58472c33676SMaxim Ag }
58572c33676SMaxim Ag 
586*cca6fc52SDaniel Fojt #ifdef LIBRESSL_HAS_TLS1_3_SERVER
58772c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLS_server_method_internal_data = {
588*cca6fc52SDaniel Fojt 	.version = TLS1_3_VERSION,
58972c33676SMaxim Ag 	.min_version = TLS1_VERSION,
590*cca6fc52SDaniel Fojt 	.max_version = TLS1_3_VERSION,
59172c33676SMaxim Ag 	.ssl_new = tls1_new,
59272c33676SMaxim Ag 	.ssl_clear = tls1_clear,
59372c33676SMaxim Ag 	.ssl_free = tls1_free,
594*cca6fc52SDaniel Fojt 	.ssl_accept = tls13_legacy_accept,
59572c33676SMaxim Ag 	.ssl_connect = ssl_undefined_function,
596*cca6fc52SDaniel Fojt 	.ssl_shutdown = tls13_legacy_shutdown,
59772c33676SMaxim Ag 	.get_ssl_method = tls1_get_server_method,
59872c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
59972c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
60072c33676SMaxim Ag 	.ssl_renegotiate = ssl_undefined_function,
60172c33676SMaxim Ag 	.ssl_renegotiate_check = ssl_ok,
602*cca6fc52SDaniel Fojt 	.ssl_pending = tls13_legacy_pending,
603*cca6fc52SDaniel Fojt 	.ssl_read_bytes = tls13_legacy_read_bytes,
604*cca6fc52SDaniel Fojt 	.ssl_write_bytes = tls13_legacy_write_bytes,
605*cca6fc52SDaniel Fojt 	.ssl3_enc = &TLSv1_3_enc_data,
60672c33676SMaxim Ag };
60772c33676SMaxim Ag 
60872c33676SMaxim Ag static const SSL_METHOD TLS_server_method_data = {
60972c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
61072c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
61172c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
61272c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
61372c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
61472c33676SMaxim Ag 	.internal = &TLS_server_method_internal_data,
61572c33676SMaxim Ag };
616*cca6fc52SDaniel Fojt #endif
617*cca6fc52SDaniel Fojt 
618*cca6fc52SDaniel Fojt static const SSL_METHOD_INTERNAL TLS_legacy_server_method_internal_data = {
619*cca6fc52SDaniel Fojt 	.version = TLS1_2_VERSION,
620*cca6fc52SDaniel Fojt 	.min_version = TLS1_VERSION,
621*cca6fc52SDaniel Fojt 	.max_version = TLS1_2_VERSION,
622*cca6fc52SDaniel Fojt 	.ssl_new = tls1_new,
623*cca6fc52SDaniel Fojt 	.ssl_clear = tls1_clear,
624*cca6fc52SDaniel Fojt 	.ssl_free = tls1_free,
625*cca6fc52SDaniel Fojt 	.ssl_accept = ssl3_accept,
626*cca6fc52SDaniel Fojt 	.ssl_connect = ssl_undefined_function,
627*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
628*cca6fc52SDaniel Fojt 	.get_ssl_method = tls1_get_server_method,
629*cca6fc52SDaniel Fojt 	.get_timeout = tls1_default_timeout,
630*cca6fc52SDaniel Fojt 	.ssl_version = ssl_undefined_void_function,
631*cca6fc52SDaniel Fojt 	.ssl_renegotiate = ssl_undefined_function,
632*cca6fc52SDaniel Fojt 	.ssl_renegotiate_check = ssl_ok,
633*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
634*cca6fc52SDaniel Fojt 	.ssl_read_bytes = ssl3_read_bytes,
635*cca6fc52SDaniel Fojt 	.ssl_write_bytes = ssl3_write_bytes,
636*cca6fc52SDaniel Fojt 	.ssl3_enc = &TLSv1_2_enc_data,
637*cca6fc52SDaniel Fojt };
638*cca6fc52SDaniel Fojt 
639*cca6fc52SDaniel Fojt static const SSL_METHOD TLS_legacy_server_method_data = {
640*cca6fc52SDaniel Fojt 	.ssl_dispatch_alert = ssl3_dispatch_alert,
641*cca6fc52SDaniel Fojt 	.num_ciphers = ssl3_num_ciphers,
642*cca6fc52SDaniel Fojt 	.get_cipher = ssl3_get_cipher,
643*cca6fc52SDaniel Fojt 	.get_cipher_by_char = ssl3_get_cipher_by_char,
644*cca6fc52SDaniel Fojt 	.put_cipher_by_char = ssl3_put_cipher_by_char,
645*cca6fc52SDaniel Fojt 	.internal = &TLS_legacy_server_method_internal_data,
646*cca6fc52SDaniel Fojt };
64772c33676SMaxim Ag 
64872c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_server_method_internal_data = {
64972c33676SMaxim Ag 	.version = TLS1_VERSION,
65072c33676SMaxim Ag 	.min_version = TLS1_VERSION,
65172c33676SMaxim Ag 	.max_version = TLS1_VERSION,
65272c33676SMaxim Ag 	.ssl_new = tls1_new,
65372c33676SMaxim Ag 	.ssl_clear = tls1_clear,
65472c33676SMaxim Ag 	.ssl_free = tls1_free,
65572c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
65672c33676SMaxim Ag 	.ssl_connect = ssl_undefined_function,
657*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
65872c33676SMaxim Ag 	.get_ssl_method = tls1_get_server_method,
65972c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
66072c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
66172c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
66272c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
663*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
66472c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
66572c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
66672c33676SMaxim Ag 	.ssl3_enc = &TLSv1_enc_data,
66772c33676SMaxim Ag };
66872c33676SMaxim Ag 
66972c33676SMaxim Ag static const SSL_METHOD TLSv1_server_method_data = {
67072c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
67172c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
67272c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
67372c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
67472c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
67572c33676SMaxim Ag 	.internal = &TLSv1_server_method_internal_data,
67672c33676SMaxim Ag };
67772c33676SMaxim Ag 
67872c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_1_server_method_internal_data = {
67972c33676SMaxim Ag 	.version = TLS1_1_VERSION,
68072c33676SMaxim Ag 	.min_version = TLS1_1_VERSION,
68172c33676SMaxim Ag 	.max_version = TLS1_1_VERSION,
68272c33676SMaxim Ag 	.ssl_new = tls1_new,
68372c33676SMaxim Ag 	.ssl_clear = tls1_clear,
68472c33676SMaxim Ag 	.ssl_free = tls1_free,
68572c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
68672c33676SMaxim Ag 	.ssl_connect = ssl_undefined_function,
687*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
68872c33676SMaxim Ag 	.get_ssl_method = tls1_get_server_method,
68972c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
69072c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
69172c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
69272c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
693*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
69472c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
69572c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
69672c33676SMaxim Ag 	.ssl3_enc = &TLSv1_1_enc_data,
69772c33676SMaxim Ag };
69872c33676SMaxim Ag 
69972c33676SMaxim Ag static const SSL_METHOD TLSv1_1_server_method_data = {
70072c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
70172c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
70272c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
70372c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
70472c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
70572c33676SMaxim Ag 	.internal = &TLSv1_1_server_method_internal_data,
70672c33676SMaxim Ag };
70772c33676SMaxim Ag 
70872c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_2_server_method_internal_data = {
70972c33676SMaxim Ag 	.version = TLS1_2_VERSION,
71072c33676SMaxim Ag 	.min_version = TLS1_2_VERSION,
71172c33676SMaxim Ag 	.max_version = TLS1_2_VERSION,
71272c33676SMaxim Ag 	.ssl_new = tls1_new,
71372c33676SMaxim Ag 	.ssl_clear = tls1_clear,
71472c33676SMaxim Ag 	.ssl_free = tls1_free,
71572c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
71672c33676SMaxim Ag 	.ssl_connect = ssl_undefined_function,
717*cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
71872c33676SMaxim Ag 	.get_ssl_method = tls1_get_server_method,
71972c33676SMaxim Ag 	.get_timeout = tls1_default_timeout,
72072c33676SMaxim Ag 	.ssl_version = ssl_undefined_void_function,
72172c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
72272c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
723*cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
72472c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
72572c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
72672c33676SMaxim Ag 	.ssl3_enc = &TLSv1_2_enc_data,
72772c33676SMaxim Ag };
72872c33676SMaxim Ag 
72972c33676SMaxim Ag static const SSL_METHOD TLSv1_2_server_method_data = {
73072c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
73172c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
73272c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
73372c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
73472c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
73572c33676SMaxim Ag 	.internal = &TLSv1_2_server_method_internal_data,
73672c33676SMaxim Ag };
73772c33676SMaxim Ag 
73872c33676SMaxim Ag const SSL_METHOD *
73972c33676SMaxim Ag tls1_get_server_method(int ver)
74072c33676SMaxim Ag {
741*cca6fc52SDaniel Fojt #ifdef LIBRESSL_HAS_TLS1_3_SERVER
742*cca6fc52SDaniel Fojt 	if (ver == TLS1_3_VERSION)
743*cca6fc52SDaniel Fojt 		return (TLS_server_method());
744*cca6fc52SDaniel Fojt #endif
74572c33676SMaxim Ag 	if (ver == TLS1_2_VERSION)
74672c33676SMaxim Ag 		return (TLSv1_2_server_method());
74772c33676SMaxim Ag 	if (ver == TLS1_1_VERSION)
74872c33676SMaxim Ag 		return (TLSv1_1_server_method());
74972c33676SMaxim Ag 	if (ver == TLS1_VERSION)
75072c33676SMaxim Ag 		return (TLSv1_server_method());
75172c33676SMaxim Ag 	return (NULL);
75272c33676SMaxim Ag }
75372c33676SMaxim Ag 
75472c33676SMaxim Ag const SSL_METHOD *
75572c33676SMaxim Ag SSLv23_server_method(void)
75672c33676SMaxim Ag {
75772c33676SMaxim Ag 	return (TLS_server_method());
75872c33676SMaxim Ag }
75972c33676SMaxim Ag 
76072c33676SMaxim Ag const SSL_METHOD *
76172c33676SMaxim Ag TLS_server_method(void)
76272c33676SMaxim Ag {
763*cca6fc52SDaniel Fojt #ifdef LIBRESSL_HAS_TLS1_3_SERVER
76472c33676SMaxim Ag 	return (&TLS_server_method_data);
765*cca6fc52SDaniel Fojt #else
766*cca6fc52SDaniel Fojt 	return tls_legacy_server_method();
767*cca6fc52SDaniel Fojt #endif
768*cca6fc52SDaniel Fojt }
769*cca6fc52SDaniel Fojt 
770*cca6fc52SDaniel Fojt const SSL_METHOD *
771*cca6fc52SDaniel Fojt tls_legacy_server_method(void)
772*cca6fc52SDaniel Fojt {
773*cca6fc52SDaniel Fojt 	return (&TLS_legacy_server_method_data);
77472c33676SMaxim Ag }
77572c33676SMaxim Ag 
77672c33676SMaxim Ag const SSL_METHOD *
77772c33676SMaxim Ag TLSv1_server_method(void)
77872c33676SMaxim Ag {
77972c33676SMaxim Ag 	return (&TLSv1_server_method_data);
78072c33676SMaxim Ag }
78172c33676SMaxim Ag 
78272c33676SMaxim Ag const SSL_METHOD *
78372c33676SMaxim Ag TLSv1_1_server_method(void)
78472c33676SMaxim Ag {
78572c33676SMaxim Ag 	return (&TLSv1_1_server_method_data);
78672c33676SMaxim Ag }
78772c33676SMaxim Ag 
78872c33676SMaxim Ag const SSL_METHOD *
78972c33676SMaxim Ag TLSv1_2_server_method(void)
79072c33676SMaxim Ag {
79172c33676SMaxim Ag 	return (&TLSv1_2_server_method_data);
79272c33676SMaxim Ag }
793