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