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