xref: /dflybsd-src/crypto/libressl/ssl/ssl_methods.c (revision 8edacedfc4a3bc9ac4f463b53f61cb4a6eb8d031)
1*8edacedfSDaniel Fojt /* $OpenBSD: ssl_methods.c,v 1.16 2020/09/17 15:23:29 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,
71cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
7272c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
7372c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
74cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
7572c33676SMaxim Ag 	.ssl_read_bytes = dtls1_read_bytes,
7672c33676SMaxim Ag 	.ssl_write_bytes = dtls1_write_app_data_bytes,
7772c33676SMaxim Ag 	.ssl3_enc = &DTLSv1_enc_data,
7872c33676SMaxim Ag };
7972c33676SMaxim Ag 
8072c33676SMaxim Ag static const SSL_METHOD DTLSv1_client_method_data = {
8172c33676SMaxim Ag 	.ssl_dispatch_alert = dtls1_dispatch_alert,
8272c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
8372c33676SMaxim Ag 	.get_cipher = dtls1_get_cipher,
8472c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
8572c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
8672c33676SMaxim Ag 	.internal = &DTLSv1_client_method_internal_data,
8772c33676SMaxim Ag };
8872c33676SMaxim Ag 
8972c33676SMaxim Ag const SSL_METHOD *
9072c33676SMaxim Ag DTLSv1_client_method(void)
9172c33676SMaxim Ag {
9272c33676SMaxim Ag 	return &DTLSv1_client_method_data;
9372c33676SMaxim Ag }
9472c33676SMaxim Ag 
9572c33676SMaxim Ag const SSL_METHOD *
9672c33676SMaxim Ag DTLS_client_method(void)
9772c33676SMaxim Ag {
9872c33676SMaxim Ag 	return DTLSv1_client_method();
9972c33676SMaxim Ag }
10072c33676SMaxim Ag 
10172c33676SMaxim Ag static const SSL_METHOD_INTERNAL DTLSv1_method_internal_data = {
10272c33676SMaxim Ag 	.version = DTLS1_VERSION,
10372c33676SMaxim Ag 	.min_version = DTLS1_VERSION,
10472c33676SMaxim Ag 	.max_version = DTLS1_VERSION,
10572c33676SMaxim Ag 	.ssl_new = dtls1_new,
10672c33676SMaxim Ag 	.ssl_clear = dtls1_clear,
10772c33676SMaxim Ag 	.ssl_free = dtls1_free,
10872c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
10972c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
110cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
11172c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
11272c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
113cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
11472c33676SMaxim Ag 	.ssl_read_bytes = dtls1_read_bytes,
11572c33676SMaxim Ag 	.ssl_write_bytes = dtls1_write_app_data_bytes,
11672c33676SMaxim Ag 	.ssl3_enc = &DTLSv1_enc_data,
11772c33676SMaxim Ag };
11872c33676SMaxim Ag 
11972c33676SMaxim Ag static const SSL_METHOD DTLSv1_method_data = {
12072c33676SMaxim Ag 	.ssl_dispatch_alert = dtls1_dispatch_alert,
12172c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
12272c33676SMaxim Ag 	.get_cipher = dtls1_get_cipher,
12372c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
12472c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
12572c33676SMaxim Ag 	.internal = &DTLSv1_method_internal_data,
12672c33676SMaxim Ag };
12772c33676SMaxim Ag 
12872c33676SMaxim Ag const SSL_METHOD *
12972c33676SMaxim Ag DTLSv1_method(void)
13072c33676SMaxim Ag {
13172c33676SMaxim Ag 	return &DTLSv1_method_data;
13272c33676SMaxim Ag }
13372c33676SMaxim Ag 
13472c33676SMaxim Ag const SSL_METHOD *
13572c33676SMaxim Ag DTLS_method(void)
13672c33676SMaxim Ag {
13772c33676SMaxim Ag 	return DTLSv1_method();
13872c33676SMaxim Ag }
13972c33676SMaxim Ag 
14072c33676SMaxim Ag static const SSL_METHOD_INTERNAL DTLSv1_server_method_internal_data = {
14172c33676SMaxim Ag 	.version = DTLS1_VERSION,
14272c33676SMaxim Ag 	.min_version = DTLS1_VERSION,
14372c33676SMaxim Ag 	.max_version = DTLS1_VERSION,
14472c33676SMaxim Ag 	.ssl_new = dtls1_new,
14572c33676SMaxim Ag 	.ssl_clear = dtls1_clear,
14672c33676SMaxim Ag 	.ssl_free = dtls1_free,
14772c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
14872c33676SMaxim Ag 	.ssl_connect = ssl_undefined_function,
149cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
15072c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
15172c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
152cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
15372c33676SMaxim Ag 	.ssl_read_bytes = dtls1_read_bytes,
15472c33676SMaxim Ag 	.ssl_write_bytes = dtls1_write_app_data_bytes,
15572c33676SMaxim Ag 	.ssl3_enc = &DTLSv1_enc_data,
15672c33676SMaxim Ag };
15772c33676SMaxim Ag 
15872c33676SMaxim Ag static const SSL_METHOD DTLSv1_server_method_data = {
15972c33676SMaxim Ag 	.ssl_dispatch_alert = dtls1_dispatch_alert,
16072c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
16172c33676SMaxim Ag 	.get_cipher = dtls1_get_cipher,
16272c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
16372c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
16472c33676SMaxim Ag 	.internal = &DTLSv1_server_method_internal_data,
16572c33676SMaxim Ag };
16672c33676SMaxim Ag 
16772c33676SMaxim Ag const SSL_METHOD *
16872c33676SMaxim Ag DTLSv1_server_method(void)
16972c33676SMaxim Ag {
17072c33676SMaxim Ag 	return &DTLSv1_server_method_data;
17172c33676SMaxim Ag }
17272c33676SMaxim Ag 
17372c33676SMaxim Ag const SSL_METHOD *
17472c33676SMaxim Ag DTLS_server_method(void)
17572c33676SMaxim Ag {
17672c33676SMaxim Ag 	return DTLSv1_server_method();
17772c33676SMaxim Ag }
17872c33676SMaxim Ag 
179cca6fc52SDaniel Fojt #ifdef LIBRESSL_HAS_TLS1_3_CLIENT
18072c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLS_client_method_internal_data = {
18172c33676SMaxim Ag 	.version = TLS1_3_VERSION,
18272c33676SMaxim Ag 	.min_version = TLS1_VERSION,
18372c33676SMaxim Ag 	.max_version = TLS1_3_VERSION,
18472c33676SMaxim Ag 	.ssl_new = tls1_new,
18572c33676SMaxim Ag 	.ssl_clear = tls1_clear,
18672c33676SMaxim Ag 	.ssl_free = tls1_free,
18772c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
18872c33676SMaxim Ag 	.ssl_connect = tls13_legacy_connect,
189cca6fc52SDaniel Fojt 	.ssl_shutdown = tls13_legacy_shutdown,
19072c33676SMaxim Ag 	.ssl_renegotiate = ssl_undefined_function,
19172c33676SMaxim Ag 	.ssl_renegotiate_check = ssl_ok,
192cca6fc52SDaniel Fojt 	.ssl_pending = tls13_legacy_pending,
19372c33676SMaxim Ag 	.ssl_read_bytes = tls13_legacy_read_bytes,
19472c33676SMaxim Ag 	.ssl_write_bytes = tls13_legacy_write_bytes,
195cca6fc52SDaniel Fojt 	.ssl3_enc = &TLSv1_3_enc_data,
19672c33676SMaxim Ag };
19772c33676SMaxim Ag 
19872c33676SMaxim Ag static const SSL_METHOD TLS_client_method_data = {
19972c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
20072c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
20172c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
20272c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
20372c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
20472c33676SMaxim Ag 	.internal = &TLS_client_method_internal_data,
20572c33676SMaxim Ag };
20672c33676SMaxim Ag #endif
20772c33676SMaxim Ag 
20872c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLS_legacy_client_method_internal_data = {
20972c33676SMaxim Ag 	.version = TLS1_2_VERSION,
21072c33676SMaxim Ag 	.min_version = TLS1_VERSION,
21172c33676SMaxim Ag 	.max_version = TLS1_2_VERSION,
21272c33676SMaxim Ag 	.ssl_new = tls1_new,
21372c33676SMaxim Ag 	.ssl_clear = tls1_clear,
21472c33676SMaxim Ag 	.ssl_free = tls1_free,
21572c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
21672c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
217cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
21872c33676SMaxim Ag 	.ssl_renegotiate = ssl_undefined_function,
21972c33676SMaxim Ag 	.ssl_renegotiate_check = ssl_ok,
220cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
22172c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
22272c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
22372c33676SMaxim Ag 	.ssl3_enc = &TLSv1_2_enc_data,
22472c33676SMaxim Ag };
22572c33676SMaxim Ag 
22672c33676SMaxim Ag static const SSL_METHOD TLS_legacy_client_method_data = {
22772c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
22872c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
22972c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
23072c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
23172c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
23272c33676SMaxim Ag 	.internal = &TLS_legacy_client_method_internal_data,
23372c33676SMaxim Ag };
23472c33676SMaxim Ag 
23572c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_client_method_internal_data = {
23672c33676SMaxim Ag 	.version = TLS1_VERSION,
23772c33676SMaxim Ag 	.min_version = TLS1_VERSION,
23872c33676SMaxim Ag 	.max_version = TLS1_VERSION,
23972c33676SMaxim Ag 	.ssl_new = tls1_new,
24072c33676SMaxim Ag 	.ssl_clear = tls1_clear,
24172c33676SMaxim Ag 	.ssl_free = tls1_free,
24272c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
24372c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
244cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
24572c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
24672c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
247cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
24872c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
24972c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
25072c33676SMaxim Ag 	.ssl3_enc = &TLSv1_enc_data,
25172c33676SMaxim Ag };
25272c33676SMaxim Ag 
25372c33676SMaxim Ag static const SSL_METHOD TLSv1_client_method_data = {
25472c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
25572c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
25672c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
25772c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
25872c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
25972c33676SMaxim Ag 	.internal = &TLSv1_client_method_internal_data,
26072c33676SMaxim Ag };
26172c33676SMaxim Ag 
26272c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_1_client_method_internal_data = {
26372c33676SMaxim Ag 	.version = TLS1_1_VERSION,
26472c33676SMaxim Ag 	.min_version = TLS1_1_VERSION,
26572c33676SMaxim Ag 	.max_version = TLS1_1_VERSION,
26672c33676SMaxim Ag 	.ssl_new = tls1_new,
26772c33676SMaxim Ag 	.ssl_clear = tls1_clear,
26872c33676SMaxim Ag 	.ssl_free = tls1_free,
26972c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
27072c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
271cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
27272c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
27372c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
274cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
27572c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
27672c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
27772c33676SMaxim Ag 	.ssl3_enc = &TLSv1_1_enc_data,
27872c33676SMaxim Ag };
27972c33676SMaxim Ag 
28072c33676SMaxim Ag static const SSL_METHOD TLSv1_1_client_method_data = {
28172c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
28272c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
28372c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
28472c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
28572c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
28672c33676SMaxim Ag 	.internal = &TLSv1_1_client_method_internal_data,
28772c33676SMaxim Ag };
28872c33676SMaxim Ag 
28972c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_2_client_method_internal_data = {
29072c33676SMaxim Ag 	.version = TLS1_2_VERSION,
29172c33676SMaxim Ag 	.min_version = TLS1_2_VERSION,
29272c33676SMaxim Ag 	.max_version = TLS1_2_VERSION,
29372c33676SMaxim Ag 	.ssl_new = tls1_new,
29472c33676SMaxim Ag 	.ssl_clear = tls1_clear,
29572c33676SMaxim Ag 	.ssl_free = tls1_free,
29672c33676SMaxim Ag 	.ssl_accept = ssl_undefined_function,
29772c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
298cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
29972c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
30072c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
301cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
30272c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
30372c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
30472c33676SMaxim Ag 	.ssl3_enc = &TLSv1_2_enc_data,
30572c33676SMaxim Ag };
30672c33676SMaxim Ag 
30772c33676SMaxim Ag static const SSL_METHOD TLSv1_2_client_method_data = {
30872c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
30972c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
31072c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
31172c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
31272c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
31372c33676SMaxim Ag 	.internal = &TLSv1_2_client_method_internal_data,
31472c33676SMaxim Ag };
31572c33676SMaxim Ag 
31672c33676SMaxim Ag const SSL_METHOD *
31772c33676SMaxim Ag SSLv23_client_method(void)
31872c33676SMaxim Ag {
31972c33676SMaxim Ag 	return (TLS_client_method());
32072c33676SMaxim Ag }
32172c33676SMaxim Ag 
32272c33676SMaxim Ag const SSL_METHOD *
32372c33676SMaxim Ag TLS_client_method(void)
32472c33676SMaxim Ag {
325cca6fc52SDaniel Fojt #ifdef LIBRESSL_HAS_TLS1_3_CLIENT
32672c33676SMaxim Ag 	return (&TLS_client_method_data);
32772c33676SMaxim Ag #else
32872c33676SMaxim Ag 	return tls_legacy_client_method();
32972c33676SMaxim Ag #endif
33072c33676SMaxim Ag }
33172c33676SMaxim Ag 
33272c33676SMaxim Ag const SSL_METHOD *
33372c33676SMaxim Ag tls_legacy_client_method(void)
33472c33676SMaxim Ag {
33572c33676SMaxim Ag 	return (&TLS_legacy_client_method_data);
33672c33676SMaxim Ag }
33772c33676SMaxim Ag 
33872c33676SMaxim Ag const SSL_METHOD *
33972c33676SMaxim Ag TLSv1_client_method(void)
34072c33676SMaxim Ag {
34172c33676SMaxim Ag 	return (&TLSv1_client_method_data);
34272c33676SMaxim Ag }
34372c33676SMaxim Ag 
34472c33676SMaxim Ag const SSL_METHOD *
34572c33676SMaxim Ag TLSv1_1_client_method(void)
34672c33676SMaxim Ag {
34772c33676SMaxim Ag 	return (&TLSv1_1_client_method_data);
34872c33676SMaxim Ag }
34972c33676SMaxim Ag 
35072c33676SMaxim Ag const SSL_METHOD *
35172c33676SMaxim Ag TLSv1_2_client_method(void)
35272c33676SMaxim Ag {
35372c33676SMaxim Ag 	return (&TLSv1_2_client_method_data);
35472c33676SMaxim Ag }
35572c33676SMaxim Ag 
356*8edacedfSDaniel Fojt #if defined(LIBRESSL_HAS_TLS1_3_CLIENT) && defined(LIBRESSL_HAS_TLS1_3_SERVER)
35772c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLS_method_internal_data = {
358*8edacedfSDaniel Fojt 	.version = TLS1_3_VERSION,
35972c33676SMaxim Ag 	.min_version = TLS1_VERSION,
360*8edacedfSDaniel Fojt 	.max_version = TLS1_3_VERSION,
36172c33676SMaxim Ag 	.ssl_new = tls1_new,
36272c33676SMaxim Ag 	.ssl_clear = tls1_clear,
36372c33676SMaxim Ag 	.ssl_free = tls1_free,
364*8edacedfSDaniel Fojt 	.ssl_accept = tls13_legacy_accept,
365*8edacedfSDaniel Fojt 	.ssl_connect = tls13_legacy_connect,
366*8edacedfSDaniel Fojt 	.ssl_shutdown = tls13_legacy_shutdown,
36772c33676SMaxim Ag 	.ssl_renegotiate = ssl_undefined_function,
36872c33676SMaxim Ag 	.ssl_renegotiate_check = ssl_ok,
369*8edacedfSDaniel Fojt 	.ssl_pending = tls13_legacy_pending,
370*8edacedfSDaniel Fojt 	.ssl_read_bytes = tls13_legacy_read_bytes,
371*8edacedfSDaniel Fojt 	.ssl_write_bytes = tls13_legacy_write_bytes,
372*8edacedfSDaniel Fojt 	.ssl3_enc = &TLSv1_3_enc_data,
37372c33676SMaxim Ag };
37472c33676SMaxim Ag 
37572c33676SMaxim Ag static const SSL_METHOD TLS_method_data = {
37672c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
37772c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
37872c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
37972c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
38072c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
38172c33676SMaxim Ag 	.internal = &TLS_method_internal_data,
38272c33676SMaxim Ag };
383*8edacedfSDaniel Fojt #endif
384*8edacedfSDaniel Fojt 
385*8edacedfSDaniel Fojt static const SSL_METHOD_INTERNAL TLS_legacy_method_internal_data = {
386*8edacedfSDaniel Fojt 	.version = TLS1_2_VERSION,
387*8edacedfSDaniel Fojt 	.min_version = TLS1_VERSION,
388*8edacedfSDaniel Fojt 	.max_version = TLS1_2_VERSION,
389*8edacedfSDaniel Fojt 	.ssl_new = tls1_new,
390*8edacedfSDaniel Fojt 	.ssl_clear = tls1_clear,
391*8edacedfSDaniel Fojt 	.ssl_free = tls1_free,
392*8edacedfSDaniel Fojt 	.ssl_accept = ssl3_accept,
393*8edacedfSDaniel Fojt 	.ssl_connect = ssl3_connect,
394*8edacedfSDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
395*8edacedfSDaniel Fojt 	.ssl_renegotiate = ssl_undefined_function,
396*8edacedfSDaniel Fojt 	.ssl_renegotiate_check = ssl_ok,
397*8edacedfSDaniel Fojt 	.ssl_pending = ssl3_pending,
398*8edacedfSDaniel Fojt 	.ssl_read_bytes = ssl3_read_bytes,
399*8edacedfSDaniel Fojt 	.ssl_write_bytes = ssl3_write_bytes,
400*8edacedfSDaniel Fojt 	.ssl3_enc = &TLSv1_2_enc_data,
401*8edacedfSDaniel Fojt };
402*8edacedfSDaniel Fojt 
403*8edacedfSDaniel Fojt static const SSL_METHOD TLS_legacy_method_data = {
404*8edacedfSDaniel Fojt 	.ssl_dispatch_alert = ssl3_dispatch_alert,
405*8edacedfSDaniel Fojt 	.num_ciphers = ssl3_num_ciphers,
406*8edacedfSDaniel Fojt 	.get_cipher = ssl3_get_cipher,
407*8edacedfSDaniel Fojt 	.get_cipher_by_char = ssl3_get_cipher_by_char,
408*8edacedfSDaniel Fojt 	.put_cipher_by_char = ssl3_put_cipher_by_char,
409*8edacedfSDaniel Fojt 	.internal = &TLS_legacy_method_internal_data,
410*8edacedfSDaniel Fojt };
41172c33676SMaxim Ag 
41272c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_method_internal_data = {
41372c33676SMaxim Ag 	.version = TLS1_VERSION,
41472c33676SMaxim Ag 	.min_version = TLS1_VERSION,
41572c33676SMaxim Ag 	.max_version = TLS1_VERSION,
41672c33676SMaxim Ag 	.ssl_new = tls1_new,
41772c33676SMaxim Ag 	.ssl_clear = tls1_clear,
41872c33676SMaxim Ag 	.ssl_free = tls1_free,
41972c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
42072c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
421cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
42272c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
42372c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
424cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
42572c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
42672c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
42772c33676SMaxim Ag 	.ssl3_enc = &TLSv1_enc_data,
42872c33676SMaxim Ag };
42972c33676SMaxim Ag 
43072c33676SMaxim Ag static const SSL_METHOD TLSv1_method_data = {
43172c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
43272c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
43372c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
43472c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
43572c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
43672c33676SMaxim Ag 	.internal = &TLSv1_method_internal_data,
43772c33676SMaxim Ag };
43872c33676SMaxim Ag 
43972c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_1_method_internal_data = {
44072c33676SMaxim Ag 	.version = TLS1_1_VERSION,
44172c33676SMaxim Ag 	.min_version = TLS1_1_VERSION,
44272c33676SMaxim Ag 	.max_version = TLS1_1_VERSION,
44372c33676SMaxim Ag 	.ssl_new = tls1_new,
44472c33676SMaxim Ag 	.ssl_clear = tls1_clear,
44572c33676SMaxim Ag 	.ssl_free = tls1_free,
44672c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
44772c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
448cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
44972c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
45072c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
451cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
45272c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
45372c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
45472c33676SMaxim Ag 	.ssl3_enc = &TLSv1_1_enc_data,
45572c33676SMaxim Ag };
45672c33676SMaxim Ag 
45772c33676SMaxim Ag static const SSL_METHOD TLSv1_1_method_data = {
45872c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
45972c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
46072c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
46172c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
46272c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
46372c33676SMaxim Ag 	.internal = &TLSv1_1_method_internal_data,
46472c33676SMaxim Ag };
46572c33676SMaxim Ag 
46672c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_2_method_internal_data = {
46772c33676SMaxim Ag 	.version = TLS1_2_VERSION,
46872c33676SMaxim Ag 	.min_version = TLS1_2_VERSION,
46972c33676SMaxim Ag 	.max_version = TLS1_2_VERSION,
47072c33676SMaxim Ag 	.ssl_new = tls1_new,
47172c33676SMaxim Ag 	.ssl_clear = tls1_clear,
47272c33676SMaxim Ag 	.ssl_free = tls1_free,
47372c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
47472c33676SMaxim Ag 	.ssl_connect = ssl3_connect,
475cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
47672c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
47772c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
478cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
47972c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
48072c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
48172c33676SMaxim Ag 	.ssl3_enc = &TLSv1_2_enc_data,
48272c33676SMaxim Ag };
48372c33676SMaxim Ag 
48472c33676SMaxim Ag static const SSL_METHOD TLSv1_2_method_data = {
48572c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
48672c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
48772c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
48872c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
48972c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
49072c33676SMaxim Ag 	.internal = &TLSv1_2_method_internal_data,
49172c33676SMaxim Ag };
49272c33676SMaxim Ag 
49372c33676SMaxim Ag const SSL_METHOD *
49472c33676SMaxim Ag SSLv23_method(void)
49572c33676SMaxim Ag {
49672c33676SMaxim Ag 	return (TLS_method());
49772c33676SMaxim Ag }
49872c33676SMaxim Ag 
49972c33676SMaxim Ag const SSL_METHOD *
50072c33676SMaxim Ag TLS_method(void)
50172c33676SMaxim Ag {
502*8edacedfSDaniel Fojt #if defined(LIBRESSL_HAS_TLS1_3_CLIENT) && defined(LIBRESSL_HAS_TLS1_3_SERVER)
503*8edacedfSDaniel Fojt 	return (&TLS_method_data);
504*8edacedfSDaniel Fojt #else
505*8edacedfSDaniel Fojt 	return tls_legacy_method();
506*8edacedfSDaniel Fojt #endif
507*8edacedfSDaniel Fojt }
508*8edacedfSDaniel Fojt 
509*8edacedfSDaniel Fojt const SSL_METHOD *
510*8edacedfSDaniel Fojt tls_legacy_method(void)
511*8edacedfSDaniel Fojt {
512*8edacedfSDaniel Fojt 	return (&TLS_legacy_method_data);
51372c33676SMaxim Ag }
51472c33676SMaxim Ag 
51572c33676SMaxim Ag const SSL_METHOD *
51672c33676SMaxim Ag TLSv1_method(void)
51772c33676SMaxim Ag {
51872c33676SMaxim Ag 	return (&TLSv1_method_data);
51972c33676SMaxim Ag }
52072c33676SMaxim Ag 
52172c33676SMaxim Ag const SSL_METHOD *
52272c33676SMaxim Ag TLSv1_1_method(void)
52372c33676SMaxim Ag {
52472c33676SMaxim Ag 	return (&TLSv1_1_method_data);
52572c33676SMaxim Ag }
52672c33676SMaxim Ag 
52772c33676SMaxim Ag const SSL_METHOD *
52872c33676SMaxim Ag TLSv1_2_method(void)
52972c33676SMaxim Ag {
53072c33676SMaxim Ag 	return (&TLSv1_2_method_data);
53172c33676SMaxim Ag }
53272c33676SMaxim Ag 
533cca6fc52SDaniel Fojt #ifdef LIBRESSL_HAS_TLS1_3_SERVER
53472c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLS_server_method_internal_data = {
535cca6fc52SDaniel Fojt 	.version = TLS1_3_VERSION,
53672c33676SMaxim Ag 	.min_version = TLS1_VERSION,
537cca6fc52SDaniel Fojt 	.max_version = TLS1_3_VERSION,
53872c33676SMaxim Ag 	.ssl_new = tls1_new,
53972c33676SMaxim Ag 	.ssl_clear = tls1_clear,
54072c33676SMaxim Ag 	.ssl_free = tls1_free,
541cca6fc52SDaniel Fojt 	.ssl_accept = tls13_legacy_accept,
54272c33676SMaxim Ag 	.ssl_connect = ssl_undefined_function,
543cca6fc52SDaniel Fojt 	.ssl_shutdown = tls13_legacy_shutdown,
54472c33676SMaxim Ag 	.ssl_renegotiate = ssl_undefined_function,
54572c33676SMaxim Ag 	.ssl_renegotiate_check = ssl_ok,
546cca6fc52SDaniel Fojt 	.ssl_pending = tls13_legacy_pending,
547cca6fc52SDaniel Fojt 	.ssl_read_bytes = tls13_legacy_read_bytes,
548cca6fc52SDaniel Fojt 	.ssl_write_bytes = tls13_legacy_write_bytes,
549cca6fc52SDaniel Fojt 	.ssl3_enc = &TLSv1_3_enc_data,
55072c33676SMaxim Ag };
55172c33676SMaxim Ag 
55272c33676SMaxim Ag static const SSL_METHOD TLS_server_method_data = {
55372c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
55472c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
55572c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
55672c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
55772c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
55872c33676SMaxim Ag 	.internal = &TLS_server_method_internal_data,
55972c33676SMaxim Ag };
560cca6fc52SDaniel Fojt #endif
561cca6fc52SDaniel Fojt 
562cca6fc52SDaniel Fojt static const SSL_METHOD_INTERNAL TLS_legacy_server_method_internal_data = {
563cca6fc52SDaniel Fojt 	.version = TLS1_2_VERSION,
564cca6fc52SDaniel Fojt 	.min_version = TLS1_VERSION,
565cca6fc52SDaniel Fojt 	.max_version = TLS1_2_VERSION,
566cca6fc52SDaniel Fojt 	.ssl_new = tls1_new,
567cca6fc52SDaniel Fojt 	.ssl_clear = tls1_clear,
568cca6fc52SDaniel Fojt 	.ssl_free = tls1_free,
569cca6fc52SDaniel Fojt 	.ssl_accept = ssl3_accept,
570cca6fc52SDaniel Fojt 	.ssl_connect = ssl_undefined_function,
571cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
572cca6fc52SDaniel Fojt 	.ssl_renegotiate = ssl_undefined_function,
573cca6fc52SDaniel Fojt 	.ssl_renegotiate_check = ssl_ok,
574cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
575cca6fc52SDaniel Fojt 	.ssl_read_bytes = ssl3_read_bytes,
576cca6fc52SDaniel Fojt 	.ssl_write_bytes = ssl3_write_bytes,
577cca6fc52SDaniel Fojt 	.ssl3_enc = &TLSv1_2_enc_data,
578cca6fc52SDaniel Fojt };
579cca6fc52SDaniel Fojt 
580cca6fc52SDaniel Fojt static const SSL_METHOD TLS_legacy_server_method_data = {
581cca6fc52SDaniel Fojt 	.ssl_dispatch_alert = ssl3_dispatch_alert,
582cca6fc52SDaniel Fojt 	.num_ciphers = ssl3_num_ciphers,
583cca6fc52SDaniel Fojt 	.get_cipher = ssl3_get_cipher,
584cca6fc52SDaniel Fojt 	.get_cipher_by_char = ssl3_get_cipher_by_char,
585cca6fc52SDaniel Fojt 	.put_cipher_by_char = ssl3_put_cipher_by_char,
586cca6fc52SDaniel Fojt 	.internal = &TLS_legacy_server_method_internal_data,
587cca6fc52SDaniel Fojt };
58872c33676SMaxim Ag 
58972c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_server_method_internal_data = {
59072c33676SMaxim Ag 	.version = TLS1_VERSION,
59172c33676SMaxim Ag 	.min_version = TLS1_VERSION,
59272c33676SMaxim Ag 	.max_version = TLS1_VERSION,
59372c33676SMaxim Ag 	.ssl_new = tls1_new,
59472c33676SMaxim Ag 	.ssl_clear = tls1_clear,
59572c33676SMaxim Ag 	.ssl_free = tls1_free,
59672c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
59772c33676SMaxim Ag 	.ssl_connect = ssl_undefined_function,
598cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
59972c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
60072c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
601cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
60272c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
60372c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
60472c33676SMaxim Ag 	.ssl3_enc = &TLSv1_enc_data,
60572c33676SMaxim Ag };
60672c33676SMaxim Ag 
60772c33676SMaxim Ag static const SSL_METHOD TLSv1_server_method_data = {
60872c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
60972c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
61072c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
61172c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
61272c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
61372c33676SMaxim Ag 	.internal = &TLSv1_server_method_internal_data,
61472c33676SMaxim Ag };
61572c33676SMaxim Ag 
61672c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_1_server_method_internal_data = {
61772c33676SMaxim Ag 	.version = TLS1_1_VERSION,
61872c33676SMaxim Ag 	.min_version = TLS1_1_VERSION,
61972c33676SMaxim Ag 	.max_version = TLS1_1_VERSION,
62072c33676SMaxim Ag 	.ssl_new = tls1_new,
62172c33676SMaxim Ag 	.ssl_clear = tls1_clear,
62272c33676SMaxim Ag 	.ssl_free = tls1_free,
62372c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
62472c33676SMaxim Ag 	.ssl_connect = ssl_undefined_function,
625cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
62672c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
62772c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
628cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
62972c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
63072c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
63172c33676SMaxim Ag 	.ssl3_enc = &TLSv1_1_enc_data,
63272c33676SMaxim Ag };
63372c33676SMaxim Ag 
63472c33676SMaxim Ag static const SSL_METHOD TLSv1_1_server_method_data = {
63572c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
63672c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
63772c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
63872c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
63972c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
64072c33676SMaxim Ag 	.internal = &TLSv1_1_server_method_internal_data,
64172c33676SMaxim Ag };
64272c33676SMaxim Ag 
64372c33676SMaxim Ag static const SSL_METHOD_INTERNAL TLSv1_2_server_method_internal_data = {
64472c33676SMaxim Ag 	.version = TLS1_2_VERSION,
64572c33676SMaxim Ag 	.min_version = TLS1_2_VERSION,
64672c33676SMaxim Ag 	.max_version = TLS1_2_VERSION,
64772c33676SMaxim Ag 	.ssl_new = tls1_new,
64872c33676SMaxim Ag 	.ssl_clear = tls1_clear,
64972c33676SMaxim Ag 	.ssl_free = tls1_free,
65072c33676SMaxim Ag 	.ssl_accept = ssl3_accept,
65172c33676SMaxim Ag 	.ssl_connect = ssl_undefined_function,
652cca6fc52SDaniel Fojt 	.ssl_shutdown = ssl3_shutdown,
65372c33676SMaxim Ag 	.ssl_renegotiate = ssl3_renegotiate,
65472c33676SMaxim Ag 	.ssl_renegotiate_check = ssl3_renegotiate_check,
655cca6fc52SDaniel Fojt 	.ssl_pending = ssl3_pending,
65672c33676SMaxim Ag 	.ssl_read_bytes = ssl3_read_bytes,
65772c33676SMaxim Ag 	.ssl_write_bytes = ssl3_write_bytes,
65872c33676SMaxim Ag 	.ssl3_enc = &TLSv1_2_enc_data,
65972c33676SMaxim Ag };
66072c33676SMaxim Ag 
66172c33676SMaxim Ag static const SSL_METHOD TLSv1_2_server_method_data = {
66272c33676SMaxim Ag 	.ssl_dispatch_alert = ssl3_dispatch_alert,
66372c33676SMaxim Ag 	.num_ciphers = ssl3_num_ciphers,
66472c33676SMaxim Ag 	.get_cipher = ssl3_get_cipher,
66572c33676SMaxim Ag 	.get_cipher_by_char = ssl3_get_cipher_by_char,
66672c33676SMaxim Ag 	.put_cipher_by_char = ssl3_put_cipher_by_char,
66772c33676SMaxim Ag 	.internal = &TLSv1_2_server_method_internal_data,
66872c33676SMaxim Ag };
66972c33676SMaxim Ag 
67072c33676SMaxim Ag const SSL_METHOD *
67172c33676SMaxim Ag SSLv23_server_method(void)
67272c33676SMaxim Ag {
67372c33676SMaxim Ag 	return (TLS_server_method());
67472c33676SMaxim Ag }
67572c33676SMaxim Ag 
67672c33676SMaxim Ag const SSL_METHOD *
67772c33676SMaxim Ag TLS_server_method(void)
67872c33676SMaxim Ag {
679cca6fc52SDaniel Fojt #ifdef LIBRESSL_HAS_TLS1_3_SERVER
68072c33676SMaxim Ag 	return (&TLS_server_method_data);
681cca6fc52SDaniel Fojt #else
682cca6fc52SDaniel Fojt 	return tls_legacy_server_method();
683cca6fc52SDaniel Fojt #endif
684cca6fc52SDaniel Fojt }
685cca6fc52SDaniel Fojt 
686cca6fc52SDaniel Fojt const SSL_METHOD *
687cca6fc52SDaniel Fojt tls_legacy_server_method(void)
688cca6fc52SDaniel Fojt {
689cca6fc52SDaniel Fojt 	return (&TLS_legacy_server_method_data);
69072c33676SMaxim Ag }
69172c33676SMaxim Ag 
69272c33676SMaxim Ag const SSL_METHOD *
69372c33676SMaxim Ag TLSv1_server_method(void)
69472c33676SMaxim Ag {
69572c33676SMaxim Ag 	return (&TLSv1_server_method_data);
69672c33676SMaxim Ag }
69772c33676SMaxim Ag 
69872c33676SMaxim Ag const SSL_METHOD *
69972c33676SMaxim Ag TLSv1_1_server_method(void)
70072c33676SMaxim Ag {
70172c33676SMaxim Ag 	return (&TLSv1_1_server_method_data);
70272c33676SMaxim Ag }
70372c33676SMaxim Ag 
70472c33676SMaxim Ag const SSL_METHOD *
70572c33676SMaxim Ag TLSv1_2_server_method(void)
70672c33676SMaxim Ag {
70772c33676SMaxim Ag 	return (&TLSv1_2_server_method_data);
70872c33676SMaxim Ag }
709*8edacedfSDaniel Fojt 
710*8edacedfSDaniel Fojt const SSL_METHOD *
711*8edacedfSDaniel Fojt ssl_get_client_method(uint16_t version)
712*8edacedfSDaniel Fojt {
713*8edacedfSDaniel Fojt 	if (version == TLS1_3_VERSION)
714*8edacedfSDaniel Fojt 		return (TLS_client_method());
715*8edacedfSDaniel Fojt 	if (version == TLS1_2_VERSION)
716*8edacedfSDaniel Fojt 		return (TLSv1_2_client_method());
717*8edacedfSDaniel Fojt 	if (version == TLS1_1_VERSION)
718*8edacedfSDaniel Fojt 		return (TLSv1_1_client_method());
719*8edacedfSDaniel Fojt 	if (version == TLS1_VERSION)
720*8edacedfSDaniel Fojt 		return (TLSv1_client_method());
721*8edacedfSDaniel Fojt 	if (version == DTLS1_VERSION)
722*8edacedfSDaniel Fojt 		return (DTLSv1_client_method());
723*8edacedfSDaniel Fojt 
724*8edacedfSDaniel Fojt 	return (NULL);
725*8edacedfSDaniel Fojt }
726*8edacedfSDaniel Fojt 
727*8edacedfSDaniel Fojt const SSL_METHOD *
728*8edacedfSDaniel Fojt ssl_get_server_method(uint16_t version)
729*8edacedfSDaniel Fojt {
730*8edacedfSDaniel Fojt 	if (version == TLS1_3_VERSION)
731*8edacedfSDaniel Fojt 		return (TLS_server_method());
732*8edacedfSDaniel Fojt 	if (version == TLS1_2_VERSION)
733*8edacedfSDaniel Fojt 		return (TLSv1_2_server_method());
734*8edacedfSDaniel Fojt 	if (version == TLS1_1_VERSION)
735*8edacedfSDaniel Fojt 		return (TLSv1_1_server_method());
736*8edacedfSDaniel Fojt 	if (version == TLS1_VERSION)
737*8edacedfSDaniel Fojt 		return (TLSv1_server_method());
738*8edacedfSDaniel Fojt 	if (version == DTLS1_VERSION)
739*8edacedfSDaniel Fojt 		return (DTLSv1_server_method());
740*8edacedfSDaniel Fojt 
741*8edacedfSDaniel Fojt 	return (NULL);
742*8edacedfSDaniel Fojt }
743