1*ae0a2582Sjsing /* $OpenBSD: s3_lib.c,v 1.257 2024/07/23 14:40:53 jsing Exp $ */ 25b37fcf3Sryker /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 35b37fcf3Sryker * All rights reserved. 45b37fcf3Sryker * 55b37fcf3Sryker * This package is an SSL implementation written 65b37fcf3Sryker * by Eric Young (eay@cryptsoft.com). 75b37fcf3Sryker * The implementation was written so as to conform with Netscapes SSL. 85b37fcf3Sryker * 95b37fcf3Sryker * This library is free for commercial and non-commercial use as long as 105b37fcf3Sryker * the following conditions are aheared to. The following conditions 115b37fcf3Sryker * apply to all code found in this distribution, be it the RC4, RSA, 125b37fcf3Sryker * lhash, DES, etc., code; not just the SSL code. The SSL documentation 135b37fcf3Sryker * included with this distribution is covered by the same copyright terms 145b37fcf3Sryker * except that the holder is Tim Hudson (tjh@cryptsoft.com). 155b37fcf3Sryker * 165b37fcf3Sryker * Copyright remains Eric Young's, and as such any Copyright notices in 175b37fcf3Sryker * the code are not to be removed. 185b37fcf3Sryker * If this package is used in a product, Eric Young should be given attribution 195b37fcf3Sryker * as the author of the parts of the library used. 205b37fcf3Sryker * This can be in the form of a textual message at program startup or 215b37fcf3Sryker * in documentation (online or textual) provided with the package. 225b37fcf3Sryker * 235b37fcf3Sryker * Redistribution and use in source and binary forms, with or without 245b37fcf3Sryker * modification, are permitted provided that the following conditions 255b37fcf3Sryker * are met: 265b37fcf3Sryker * 1. Redistributions of source code must retain the copyright 275b37fcf3Sryker * notice, this list of conditions and the following disclaimer. 285b37fcf3Sryker * 2. Redistributions in binary form must reproduce the above copyright 295b37fcf3Sryker * notice, this list of conditions and the following disclaimer in the 305b37fcf3Sryker * documentation and/or other materials provided with the distribution. 315b37fcf3Sryker * 3. All advertising materials mentioning features or use of this software 325b37fcf3Sryker * must display the following acknowledgement: 335b37fcf3Sryker * "This product includes cryptographic software written by 345b37fcf3Sryker * Eric Young (eay@cryptsoft.com)" 355b37fcf3Sryker * The word 'cryptographic' can be left out if the rouines from the library 365b37fcf3Sryker * being used are not cryptographic related :-). 375b37fcf3Sryker * 4. If you include any Windows specific code (or a derivative thereof) from 385b37fcf3Sryker * the apps directory (application code) you must include an acknowledgement: 395b37fcf3Sryker * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 405b37fcf3Sryker * 415b37fcf3Sryker * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 425b37fcf3Sryker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 435b37fcf3Sryker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 445b37fcf3Sryker * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 455b37fcf3Sryker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 465b37fcf3Sryker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 475b37fcf3Sryker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 485b37fcf3Sryker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 495b37fcf3Sryker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 505b37fcf3Sryker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 515b37fcf3Sryker * SUCH DAMAGE. 525b37fcf3Sryker * 535b37fcf3Sryker * The licence and distribution terms for any publically available version or 545b37fcf3Sryker * derivative of this code cannot be changed. i.e. this code cannot simply be 555b37fcf3Sryker * copied and put under another distribution licence 565b37fcf3Sryker * [including the GNU Public Licence.] 575b37fcf3Sryker */ 58ce6fc090Sbeck /* ==================================================================== 590a5d6edeSdjm * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. 60ce6fc090Sbeck * 61ce6fc090Sbeck * Redistribution and use in source and binary forms, with or without 62ce6fc090Sbeck * modification, are permitted provided that the following conditions 63ce6fc090Sbeck * are met: 64ce6fc090Sbeck * 65ce6fc090Sbeck * 1. Redistributions of source code must retain the above copyright 66ce6fc090Sbeck * notice, this list of conditions and the following disclaimer. 67ce6fc090Sbeck * 68ce6fc090Sbeck * 2. Redistributions in binary form must reproduce the above copyright 69ce6fc090Sbeck * notice, this list of conditions and the following disclaimer in 70ce6fc090Sbeck * the documentation and/or other materials provided with the 71ce6fc090Sbeck * distribution. 72ce6fc090Sbeck * 73ce6fc090Sbeck * 3. All advertising materials mentioning features or use of this 74ce6fc090Sbeck * software must display the following acknowledgment: 75ce6fc090Sbeck * "This product includes software developed by the OpenSSL Project 76ce6fc090Sbeck * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 77ce6fc090Sbeck * 78ce6fc090Sbeck * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 79ce6fc090Sbeck * endorse or promote products derived from this software without 80ce6fc090Sbeck * prior written permission. For written permission, please contact 81ce6fc090Sbeck * openssl-core@openssl.org. 82ce6fc090Sbeck * 83ce6fc090Sbeck * 5. Products derived from this software may not be called "OpenSSL" 84ce6fc090Sbeck * nor may "OpenSSL" appear in their names without prior written 85ce6fc090Sbeck * permission of the OpenSSL Project. 86ce6fc090Sbeck * 87ce6fc090Sbeck * 6. Redistributions of any form whatsoever must retain the following 88ce6fc090Sbeck * acknowledgment: 89ce6fc090Sbeck * "This product includes software developed by the OpenSSL Project 90ce6fc090Sbeck * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 91ce6fc090Sbeck * 92ce6fc090Sbeck * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 93ce6fc090Sbeck * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 94ce6fc090Sbeck * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 95ce6fc090Sbeck * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 96ce6fc090Sbeck * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 97ce6fc090Sbeck * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 98ce6fc090Sbeck * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 99ce6fc090Sbeck * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 100ce6fc090Sbeck * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 101ce6fc090Sbeck * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 102ce6fc090Sbeck * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 103ce6fc090Sbeck * OF THE POSSIBILITY OF SUCH DAMAGE. 104ce6fc090Sbeck * ==================================================================== 105ce6fc090Sbeck * 106ce6fc090Sbeck * This product includes cryptographic software written by Eric Young 107ce6fc090Sbeck * (eay@cryptsoft.com). This product includes software written by Tim 108ce6fc090Sbeck * Hudson (tjh@cryptsoft.com). 109ce6fc090Sbeck * 110ce6fc090Sbeck */ 1114fcf65c5Sdjm /* ==================================================================== 1124fcf65c5Sdjm * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 1134fcf65c5Sdjm * 1144fcf65c5Sdjm * Portions of the attached software ("Contribution") are developed by 1154fcf65c5Sdjm * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. 1164fcf65c5Sdjm * 1174fcf65c5Sdjm * The Contribution is licensed pursuant to the OpenSSL open source 1184fcf65c5Sdjm * license provided above. 1194fcf65c5Sdjm * 1204fcf65c5Sdjm * ECC cipher suite support in OpenSSL originally written by 1214fcf65c5Sdjm * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories. 1224fcf65c5Sdjm * 1234fcf65c5Sdjm */ 1240a5d6edeSdjm /* ==================================================================== 1250a5d6edeSdjm * Copyright 2005 Nokia. All rights reserved. 1260a5d6edeSdjm * 1270a5d6edeSdjm * The portions of the attached software ("Contribution") is developed by 1280a5d6edeSdjm * Nokia Corporation and is licensed pursuant to the OpenSSL open source 1290a5d6edeSdjm * license. 1300a5d6edeSdjm * 1310a5d6edeSdjm * The Contribution, originally written by Mika Kousa and Pasi Eronen of 1320a5d6edeSdjm * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites 1330a5d6edeSdjm * support (see RFC 4279) to OpenSSL. 1340a5d6edeSdjm * 1350a5d6edeSdjm * No patent licenses or other rights except those expressly stated in 1360a5d6edeSdjm * the OpenSSL open source license shall be deemed granted or received 1370a5d6edeSdjm * expressly, by implication, estoppel, or otherwise. 1380a5d6edeSdjm * 1390a5d6edeSdjm * No assurances are provided by Nokia that the Contribution does not 1400a5d6edeSdjm * infringe the patent or other intellectual property rights of any third 1410a5d6edeSdjm * party or that the license provides you with all the necessary rights 1420a5d6edeSdjm * to make use of the Contribution. 1430a5d6edeSdjm * 1440a5d6edeSdjm * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN 1450a5d6edeSdjm * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA 1460a5d6edeSdjm * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY 1470a5d6edeSdjm * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR 1480a5d6edeSdjm * OTHERWISE. 1490a5d6edeSdjm */ 1505b37fcf3Sryker 15116cbd6eeSjsing #include <limits.h> 1525b37fcf3Sryker #include <stdio.h> 153e0c6c588Stb #include <stdlib.h> 154be381206Sjsing 155c640b633Sjsing #include <openssl/bn.h> 1560ad90c3eSjsing #include <openssl/curve25519.h> 1574fcf65c5Sdjm #include <openssl/dh.h> 158be381206Sjsing #include <openssl/md5.h> 159be381206Sjsing #include <openssl/objects.h> 160f4dd87b5Sjsing #include <openssl/opensslconf.h> 161be381206Sjsing 162d240be9bSdoug #include "bytestring.h" 163c9675a23Stb #include "dtls_local.h" 164c9675a23Stb #include "ssl_local.h" 1650b5e30a3Sjsing #include "ssl_sigalgs.h" 1666af37010Sjsing #include "ssl_tlsext.h" 167ee4250f6Sjsing #include "tls_content.h" 1685b37fcf3Sryker 1695b37fcf3Sryker #define SSL3_NUM_CIPHERS (sizeof(ssl3_ciphers) / sizeof(SSL_CIPHER)) 1705b37fcf3Sryker 1714fcf65c5Sdjm /* list of available SSLv3 ciphers (sorted by id) */ 1725b35b8bbSguenther const SSL_CIPHER ssl3_ciphers[] = { 1730a5d6edeSdjm 174f4fe6251Sjsing /* 175f4fe6251Sjsing * SSLv3 RSA cipher suites (RFC 6101, appendix A.6). 176f4fe6251Sjsing */ 1775b37fcf3Sryker { 178f4fe6251Sjsing .value = 0x0001, 17930c4fd80Sjsing .name = SSL3_TXT_RSA_NULL_MD5, 18030c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 18130c4fd80Sjsing .algorithm_auth = SSL_aRSA, 18230c4fd80Sjsing .algorithm_enc = SSL_eNULL, 18330c4fd80Sjsing .algorithm_mac = SSL_MD5, 18430c4fd80Sjsing .algorithm_ssl = SSL_SSLV3, 185b7aaf58cSjsing .algo_strength = SSL_STRONG_NONE, 186eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 18730c4fd80Sjsing .strength_bits = 0, 18830c4fd80Sjsing .alg_bits = 0, 1895b37fcf3Sryker }, 1905b37fcf3Sryker { 191f4fe6251Sjsing .value = 0x0002, 19230c4fd80Sjsing .name = SSL3_TXT_RSA_NULL_SHA, 19330c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 19430c4fd80Sjsing .algorithm_auth = SSL_aRSA, 19530c4fd80Sjsing .algorithm_enc = SSL_eNULL, 19630c4fd80Sjsing .algorithm_mac = SSL_SHA1, 19730c4fd80Sjsing .algorithm_ssl = SSL_SSLV3, 1980ca99bc1Sjsing .algo_strength = SSL_STRONG_NONE, 199eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 20030c4fd80Sjsing .strength_bits = 0, 20130c4fd80Sjsing .alg_bits = 0, 2025b37fcf3Sryker }, 2035b37fcf3Sryker { 204f4fe6251Sjsing .value = 0x0004, 20530c4fd80Sjsing .name = SSL3_TXT_RSA_RC4_128_MD5, 20630c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 20730c4fd80Sjsing .algorithm_auth = SSL_aRSA, 20830c4fd80Sjsing .algorithm_enc = SSL_RC4, 20930c4fd80Sjsing .algorithm_mac = SSL_MD5, 21030c4fd80Sjsing .algorithm_ssl = SSL_SSLV3, 2116688c81eSjsing .algo_strength = SSL_LOW, 212eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 21330c4fd80Sjsing .strength_bits = 128, 21430c4fd80Sjsing .alg_bits = 128, 2155b37fcf3Sryker }, 2165b37fcf3Sryker { 217f4fe6251Sjsing .value = 0x0005, 21830c4fd80Sjsing .name = SSL3_TXT_RSA_RC4_128_SHA, 21930c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 22030c4fd80Sjsing .algorithm_auth = SSL_aRSA, 22130c4fd80Sjsing .algorithm_enc = SSL_RC4, 22230c4fd80Sjsing .algorithm_mac = SSL_SHA1, 22330c4fd80Sjsing .algorithm_ssl = SSL_SSLV3, 2246688c81eSjsing .algo_strength = SSL_LOW, 225eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 22630c4fd80Sjsing .strength_bits = 128, 22730c4fd80Sjsing .alg_bits = 128, 2285b37fcf3Sryker }, 2295b37fcf3Sryker { 230f4fe6251Sjsing .value = 0x000a, 23130c4fd80Sjsing .name = SSL3_TXT_RSA_DES_192_CBC3_SHA, 23230c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 23330c4fd80Sjsing .algorithm_auth = SSL_aRSA, 23430c4fd80Sjsing .algorithm_enc = SSL_3DES, 23530c4fd80Sjsing .algorithm_mac = SSL_SHA1, 23630c4fd80Sjsing .algorithm_ssl = SSL_SSLV3, 2376688c81eSjsing .algo_strength = SSL_MEDIUM, 238eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 23932c39e3dSjsing .strength_bits = 112, 24030c4fd80Sjsing .alg_bits = 168, 2415b37fcf3Sryker }, 2420a5d6edeSdjm 243d0994416Sjsing /* 244f4fe6251Sjsing * SSLv3 DHE cipher suites (RFC 6101, appendix A.6). 245d0994416Sjsing */ 2465b37fcf3Sryker { 247f4fe6251Sjsing .value = 0x0016, 24830c4fd80Sjsing .name = SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA, 249daecd611Sjsing .algorithm_mkey = SSL_kDHE, 25030c4fd80Sjsing .algorithm_auth = SSL_aRSA, 25130c4fd80Sjsing .algorithm_enc = SSL_3DES, 25230c4fd80Sjsing .algorithm_mac = SSL_SHA1, 25330c4fd80Sjsing .algorithm_ssl = SSL_SSLV3, 2546688c81eSjsing .algo_strength = SSL_MEDIUM, 255eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 25632c39e3dSjsing .strength_bits = 112, 25730c4fd80Sjsing .alg_bits = 168, 2584fcf65c5Sdjm }, 2594fcf65c5Sdjm { 260f4fe6251Sjsing .value = 0x0018, 26130c4fd80Sjsing .name = SSL3_TXT_ADH_RC4_128_MD5, 262daecd611Sjsing .algorithm_mkey = SSL_kDHE, 26330c4fd80Sjsing .algorithm_auth = SSL_aNULL, 26430c4fd80Sjsing .algorithm_enc = SSL_RC4, 26530c4fd80Sjsing .algorithm_mac = SSL_MD5, 26630c4fd80Sjsing .algorithm_ssl = SSL_SSLV3, 2676688c81eSjsing .algo_strength = SSL_LOW, 268eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 26930c4fd80Sjsing .strength_bits = 128, 27030c4fd80Sjsing .alg_bits = 128, 2714fcf65c5Sdjm }, 2724fcf65c5Sdjm { 273f4fe6251Sjsing .value = 0x001b, 27430c4fd80Sjsing .name = SSL3_TXT_ADH_DES_192_CBC_SHA, 275daecd611Sjsing .algorithm_mkey = SSL_kDHE, 27630c4fd80Sjsing .algorithm_auth = SSL_aNULL, 27730c4fd80Sjsing .algorithm_enc = SSL_3DES, 27830c4fd80Sjsing .algorithm_mac = SSL_SHA1, 27930c4fd80Sjsing .algorithm_ssl = SSL_SSLV3, 2806688c81eSjsing .algo_strength = SSL_MEDIUM, 281eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 28232c39e3dSjsing .strength_bits = 112, 28330c4fd80Sjsing .alg_bits = 168, 2845b37fcf3Sryker }, 285da347917Sbeck 286d0994416Sjsing /* 287f4fe6251Sjsing * TLSv1.0 AES cipher suites (RFC 3268). 288d0994416Sjsing */ 2894fcf65c5Sdjm { 290f4fe6251Sjsing .value = 0x002f, 29130c4fd80Sjsing .name = TLS1_TXT_RSA_WITH_AES_128_SHA, 29230c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 29330c4fd80Sjsing .algorithm_auth = SSL_aRSA, 29430c4fd80Sjsing .algorithm_enc = SSL_AES128, 29530c4fd80Sjsing .algorithm_mac = SSL_SHA1, 29630c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 2970ca99bc1Sjsing .algo_strength = SSL_HIGH, 298eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 29930c4fd80Sjsing .strength_bits = 128, 30030c4fd80Sjsing .alg_bits = 128, 3014fcf65c5Sdjm }, 3024fcf65c5Sdjm { 303f4fe6251Sjsing .value = 0x0033, 30430c4fd80Sjsing .name = TLS1_TXT_DHE_RSA_WITH_AES_128_SHA, 305daecd611Sjsing .algorithm_mkey = SSL_kDHE, 30630c4fd80Sjsing .algorithm_auth = SSL_aRSA, 30730c4fd80Sjsing .algorithm_enc = SSL_AES128, 30830c4fd80Sjsing .algorithm_mac = SSL_SHA1, 30930c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 3100ca99bc1Sjsing .algo_strength = SSL_HIGH, 311eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 31230c4fd80Sjsing .strength_bits = 128, 31330c4fd80Sjsing .alg_bits = 128, 3144fcf65c5Sdjm }, 3154fcf65c5Sdjm { 316f4fe6251Sjsing .value = 0x0034, 31730c4fd80Sjsing .name = TLS1_TXT_ADH_WITH_AES_128_SHA, 318daecd611Sjsing .algorithm_mkey = SSL_kDHE, 31930c4fd80Sjsing .algorithm_auth = SSL_aNULL, 32030c4fd80Sjsing .algorithm_enc = SSL_AES128, 32130c4fd80Sjsing .algorithm_mac = SSL_SHA1, 32230c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 3230ca99bc1Sjsing .algo_strength = SSL_HIGH, 324eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 32530c4fd80Sjsing .strength_bits = 128, 32630c4fd80Sjsing .alg_bits = 128, 3274fcf65c5Sdjm }, 3284fcf65c5Sdjm { 329f4fe6251Sjsing .value = 0x0035, 33030c4fd80Sjsing .name = TLS1_TXT_RSA_WITH_AES_256_SHA, 33130c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 33230c4fd80Sjsing .algorithm_auth = SSL_aRSA, 33330c4fd80Sjsing .algorithm_enc = SSL_AES256, 33430c4fd80Sjsing .algorithm_mac = SSL_SHA1, 33530c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 3360ca99bc1Sjsing .algo_strength = SSL_HIGH, 337eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 33830c4fd80Sjsing .strength_bits = 256, 33930c4fd80Sjsing .alg_bits = 256, 3404fcf65c5Sdjm }, 3414fcf65c5Sdjm { 342f4fe6251Sjsing .value = 0x0039, 34330c4fd80Sjsing .name = TLS1_TXT_DHE_RSA_WITH_AES_256_SHA, 344daecd611Sjsing .algorithm_mkey = SSL_kDHE, 34530c4fd80Sjsing .algorithm_auth = SSL_aRSA, 34630c4fd80Sjsing .algorithm_enc = SSL_AES256, 34730c4fd80Sjsing .algorithm_mac = SSL_SHA1, 34830c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 3490ca99bc1Sjsing .algo_strength = SSL_HIGH, 350eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 35130c4fd80Sjsing .strength_bits = 256, 35230c4fd80Sjsing .alg_bits = 256, 3534fcf65c5Sdjm }, 3544fcf65c5Sdjm { 355f4fe6251Sjsing .value = 0x003a, 35630c4fd80Sjsing .name = TLS1_TXT_ADH_WITH_AES_256_SHA, 357daecd611Sjsing .algorithm_mkey = SSL_kDHE, 35830c4fd80Sjsing .algorithm_auth = SSL_aNULL, 35930c4fd80Sjsing .algorithm_enc = SSL_AES256, 36030c4fd80Sjsing .algorithm_mac = SSL_SHA1, 36130c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 3620ca99bc1Sjsing .algo_strength = SSL_HIGH, 363eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 36430c4fd80Sjsing .strength_bits = 256, 36530c4fd80Sjsing .alg_bits = 256, 3664fcf65c5Sdjm }, 3674fcf65c5Sdjm 368f4fe6251Sjsing /* 369f4fe6251Sjsing * TLSv1.2 RSA cipher suites (RFC 5246, appendix A.5). 370f4fe6251Sjsing */ 3715cdd308eSdjm { 372f4fe6251Sjsing .value = 0x003b, 37330c4fd80Sjsing .name = TLS1_TXT_RSA_WITH_NULL_SHA256, 37430c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 37530c4fd80Sjsing .algorithm_auth = SSL_aRSA, 37630c4fd80Sjsing .algorithm_enc = SSL_eNULL, 37730c4fd80Sjsing .algorithm_mac = SSL_SHA256, 37830c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 3790ca99bc1Sjsing .algo_strength = SSL_STRONG_NONE, 3802bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 38130c4fd80Sjsing .strength_bits = 0, 38230c4fd80Sjsing .alg_bits = 0, 3835cdd308eSdjm }, 3845cdd308eSdjm { 385f4fe6251Sjsing .value = 0x003c, 38630c4fd80Sjsing .name = TLS1_TXT_RSA_WITH_AES_128_SHA256, 38730c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 38830c4fd80Sjsing .algorithm_auth = SSL_aRSA, 38930c4fd80Sjsing .algorithm_enc = SSL_AES128, 39030c4fd80Sjsing .algorithm_mac = SSL_SHA256, 39130c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 3920ca99bc1Sjsing .algo_strength = SSL_HIGH, 3932bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 39430c4fd80Sjsing .strength_bits = 128, 39530c4fd80Sjsing .alg_bits = 128, 3965cdd308eSdjm }, 3975cdd308eSdjm { 398f4fe6251Sjsing .value = 0x003d, 39930c4fd80Sjsing .name = TLS1_TXT_RSA_WITH_AES_256_SHA256, 40030c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 40130c4fd80Sjsing .algorithm_auth = SSL_aRSA, 40230c4fd80Sjsing .algorithm_enc = SSL_AES256, 40330c4fd80Sjsing .algorithm_mac = SSL_SHA256, 40430c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 4050ca99bc1Sjsing .algo_strength = SSL_HIGH, 4062bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 40730c4fd80Sjsing .strength_bits = 256, 40830c4fd80Sjsing .alg_bits = 256, 4095cdd308eSdjm }, 4105cdd308eSdjm 4114fcf65c5Sdjm #ifndef OPENSSL_NO_CAMELLIA 412f4fe6251Sjsing /* 413f4fe6251Sjsing * TLSv1.0 Camellia 128 bit cipher suites (RFC 4132). 414f4fe6251Sjsing */ 4154fcf65c5Sdjm { 416f4fe6251Sjsing .value = 0x0041, 41730c4fd80Sjsing .name = TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA, 41830c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 41930c4fd80Sjsing .algorithm_auth = SSL_aRSA, 42030c4fd80Sjsing .algorithm_enc = SSL_CAMELLIA128, 42130c4fd80Sjsing .algorithm_mac = SSL_SHA1, 42230c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 423b7aaf58cSjsing .algo_strength = SSL_HIGH, 424eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 42530c4fd80Sjsing .strength_bits = 128, 42630c4fd80Sjsing .alg_bits = 128, 4274fcf65c5Sdjm }, 4284fcf65c5Sdjm { 429f4fe6251Sjsing .value = 0x0045, 43030c4fd80Sjsing .name = TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, 431daecd611Sjsing .algorithm_mkey = SSL_kDHE, 43230c4fd80Sjsing .algorithm_auth = SSL_aRSA, 43330c4fd80Sjsing .algorithm_enc = SSL_CAMELLIA128, 43430c4fd80Sjsing .algorithm_mac = SSL_SHA1, 43530c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 436b7aaf58cSjsing .algo_strength = SSL_HIGH, 437eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 43830c4fd80Sjsing .strength_bits = 128, 43930c4fd80Sjsing .alg_bits = 128, 4404fcf65c5Sdjm }, 4414fcf65c5Sdjm { 442f4fe6251Sjsing .value = 0x0046, 44330c4fd80Sjsing .name = TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA, 444daecd611Sjsing .algorithm_mkey = SSL_kDHE, 44530c4fd80Sjsing .algorithm_auth = SSL_aNULL, 44630c4fd80Sjsing .algorithm_enc = SSL_CAMELLIA128, 44730c4fd80Sjsing .algorithm_mac = SSL_SHA1, 44830c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 449b7aaf58cSjsing .algo_strength = SSL_HIGH, 450eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 45130c4fd80Sjsing .strength_bits = 128, 45230c4fd80Sjsing .alg_bits = 128, 4534fcf65c5Sdjm }, 4544fcf65c5Sdjm #endif /* OPENSSL_NO_CAMELLIA */ 455da347917Sbeck 456f4fe6251Sjsing /* 457f4fe6251Sjsing * TLSv1.2 DHE cipher suites (RFC 5246, appendix A.5). 458f4fe6251Sjsing */ 4595cdd308eSdjm { 460f4fe6251Sjsing .value = 0x0067, 46130c4fd80Sjsing .name = TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256, 462daecd611Sjsing .algorithm_mkey = SSL_kDHE, 46330c4fd80Sjsing .algorithm_auth = SSL_aRSA, 46430c4fd80Sjsing .algorithm_enc = SSL_AES128, 46530c4fd80Sjsing .algorithm_mac = SSL_SHA256, 46630c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 4670ca99bc1Sjsing .algo_strength = SSL_HIGH, 4682bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 46930c4fd80Sjsing .strength_bits = 128, 47030c4fd80Sjsing .alg_bits = 128, 4715cdd308eSdjm }, 4725cdd308eSdjm { 473f4fe6251Sjsing .value = 0x006b, 47430c4fd80Sjsing .name = TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256, 475daecd611Sjsing .algorithm_mkey = SSL_kDHE, 47630c4fd80Sjsing .algorithm_auth = SSL_aRSA, 47730c4fd80Sjsing .algorithm_enc = SSL_AES256, 47830c4fd80Sjsing .algorithm_mac = SSL_SHA256, 47930c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 4800ca99bc1Sjsing .algo_strength = SSL_HIGH, 4812bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 48230c4fd80Sjsing .strength_bits = 256, 48330c4fd80Sjsing .alg_bits = 256, 4845cdd308eSdjm }, 4855cdd308eSdjm { 486f4fe6251Sjsing .value = 0x006c, 48730c4fd80Sjsing .name = TLS1_TXT_ADH_WITH_AES_128_SHA256, 488daecd611Sjsing .algorithm_mkey = SSL_kDHE, 48930c4fd80Sjsing .algorithm_auth = SSL_aNULL, 49030c4fd80Sjsing .algorithm_enc = SSL_AES128, 49130c4fd80Sjsing .algorithm_mac = SSL_SHA256, 49230c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 4930ca99bc1Sjsing .algo_strength = SSL_HIGH, 4942bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 49530c4fd80Sjsing .strength_bits = 128, 49630c4fd80Sjsing .alg_bits = 128, 4975cdd308eSdjm }, 4985cdd308eSdjm { 499f4fe6251Sjsing .value = 0x006d, 50030c4fd80Sjsing .name = TLS1_TXT_ADH_WITH_AES_256_SHA256, 501daecd611Sjsing .algorithm_mkey = SSL_kDHE, 50230c4fd80Sjsing .algorithm_auth = SSL_aNULL, 50330c4fd80Sjsing .algorithm_enc = SSL_AES256, 50430c4fd80Sjsing .algorithm_mac = SSL_SHA256, 50530c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 5060ca99bc1Sjsing .algo_strength = SSL_HIGH, 5072bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 50830c4fd80Sjsing .strength_bits = 256, 50930c4fd80Sjsing .alg_bits = 256, 5105cdd308eSdjm }, 5115cdd308eSdjm 5124fcf65c5Sdjm #ifndef OPENSSL_NO_CAMELLIA 513f4fe6251Sjsing /* 514f4fe6251Sjsing * TLSv1.0 Camellia 256 bit cipher suites (RFC 4132). 515f4fe6251Sjsing */ 516da347917Sbeck { 517f4fe6251Sjsing .value = 0x0084, 51830c4fd80Sjsing .name = TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA, 51930c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 52030c4fd80Sjsing .algorithm_auth = SSL_aRSA, 52130c4fd80Sjsing .algorithm_enc = SSL_CAMELLIA256, 52230c4fd80Sjsing .algorithm_mac = SSL_SHA1, 52330c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 524b7aaf58cSjsing .algo_strength = SSL_HIGH, 525eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 52630c4fd80Sjsing .strength_bits = 256, 52730c4fd80Sjsing .alg_bits = 256, 528da347917Sbeck }, 529da347917Sbeck { 530f4fe6251Sjsing .value = 0x0088, 53130c4fd80Sjsing .name = TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, 532daecd611Sjsing .algorithm_mkey = SSL_kDHE, 53330c4fd80Sjsing .algorithm_auth = SSL_aRSA, 53430c4fd80Sjsing .algorithm_enc = SSL_CAMELLIA256, 53530c4fd80Sjsing .algorithm_mac = SSL_SHA1, 53630c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 537b7aaf58cSjsing .algo_strength = SSL_HIGH, 538eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 53930c4fd80Sjsing .strength_bits = 256, 54030c4fd80Sjsing .alg_bits = 256, 541da347917Sbeck }, 542da347917Sbeck { 543f4fe6251Sjsing .value = 0x0089, 54430c4fd80Sjsing .name = TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA, 545daecd611Sjsing .algorithm_mkey = SSL_kDHE, 54630c4fd80Sjsing .algorithm_auth = SSL_aNULL, 54730c4fd80Sjsing .algorithm_enc = SSL_CAMELLIA256, 54830c4fd80Sjsing .algorithm_mac = SSL_SHA1, 54930c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 550b7aaf58cSjsing .algo_strength = SSL_HIGH, 551eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 55230c4fd80Sjsing .strength_bits = 256, 55330c4fd80Sjsing .alg_bits = 256, 5544fcf65c5Sdjm }, 5554fcf65c5Sdjm #endif /* OPENSSL_NO_CAMELLIA */ 5564fcf65c5Sdjm 557d0994416Sjsing /* 558f4fe6251Sjsing * TLSv1.2 AES GCM cipher suites (RFC 5288). 559d0994416Sjsing */ 5605cdd308eSdjm { 561f4fe6251Sjsing .value = 0x009c, 56230c4fd80Sjsing .name = TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256, 56330c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 56430c4fd80Sjsing .algorithm_auth = SSL_aRSA, 56530c4fd80Sjsing .algorithm_enc = SSL_AES128GCM, 56630c4fd80Sjsing .algorithm_mac = SSL_AEAD, 56730c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 5680ca99bc1Sjsing .algo_strength = SSL_HIGH, 5692bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 57030c4fd80Sjsing .strength_bits = 128, 57130c4fd80Sjsing .alg_bits = 128, 5725cdd308eSdjm }, 5735cdd308eSdjm { 574f4fe6251Sjsing .value = 0x009d, 57530c4fd80Sjsing .name = TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384, 57630c4fd80Sjsing .algorithm_mkey = SSL_kRSA, 57730c4fd80Sjsing .algorithm_auth = SSL_aRSA, 57830c4fd80Sjsing .algorithm_enc = SSL_AES256GCM, 57930c4fd80Sjsing .algorithm_mac = SSL_AEAD, 58030c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 5810ca99bc1Sjsing .algo_strength = SSL_HIGH, 5822bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA384, 58330c4fd80Sjsing .strength_bits = 256, 58430c4fd80Sjsing .alg_bits = 256, 5855cdd308eSdjm }, 5865cdd308eSdjm { 587f4fe6251Sjsing .value = 0x009e, 58830c4fd80Sjsing .name = TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256, 589daecd611Sjsing .algorithm_mkey = SSL_kDHE, 59030c4fd80Sjsing .algorithm_auth = SSL_aRSA, 59130c4fd80Sjsing .algorithm_enc = SSL_AES128GCM, 59230c4fd80Sjsing .algorithm_mac = SSL_AEAD, 59330c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 5940ca99bc1Sjsing .algo_strength = SSL_HIGH, 5952bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 59630c4fd80Sjsing .strength_bits = 128, 59730c4fd80Sjsing .alg_bits = 128, 5985cdd308eSdjm }, 5995cdd308eSdjm { 600f4fe6251Sjsing .value = 0x009f, 60130c4fd80Sjsing .name = TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384, 602daecd611Sjsing .algorithm_mkey = SSL_kDHE, 60330c4fd80Sjsing .algorithm_auth = SSL_aRSA, 60430c4fd80Sjsing .algorithm_enc = SSL_AES256GCM, 60530c4fd80Sjsing .algorithm_mac = SSL_AEAD, 60630c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 6070ca99bc1Sjsing .algo_strength = SSL_HIGH, 6082bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA384, 60930c4fd80Sjsing .strength_bits = 256, 61030c4fd80Sjsing .alg_bits = 256, 6115cdd308eSdjm }, 6125cdd308eSdjm { 613f4fe6251Sjsing .value = 0x00a6, 61430c4fd80Sjsing .name = TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256, 615daecd611Sjsing .algorithm_mkey = SSL_kDHE, 61630c4fd80Sjsing .algorithm_auth = SSL_aNULL, 61730c4fd80Sjsing .algorithm_enc = SSL_AES128GCM, 61830c4fd80Sjsing .algorithm_mac = SSL_AEAD, 61930c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 6200ca99bc1Sjsing .algo_strength = SSL_HIGH, 6212bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 62230c4fd80Sjsing .strength_bits = 128, 62330c4fd80Sjsing .alg_bits = 128, 6245cdd308eSdjm }, 6255cdd308eSdjm { 626f4fe6251Sjsing .value = 0x00a7, 62730c4fd80Sjsing .name = TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384, 628daecd611Sjsing .algorithm_mkey = SSL_kDHE, 62930c4fd80Sjsing .algorithm_auth = SSL_aNULL, 63030c4fd80Sjsing .algorithm_enc = SSL_AES256GCM, 63130c4fd80Sjsing .algorithm_mac = SSL_AEAD, 63230c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 6330ca99bc1Sjsing .algo_strength = SSL_HIGH, 6342bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA384, 63530c4fd80Sjsing .strength_bits = 256, 63630c4fd80Sjsing .alg_bits = 256, 6375cdd308eSdjm }, 6385cdd308eSdjm 6397dcbb28cSmiod #ifndef OPENSSL_NO_CAMELLIA 640f4fe6251Sjsing /* 641f4fe6251Sjsing * TLSv1.2 Camellia SHA-256 cipher suites (RFC 5932). 642f4fe6251Sjsing */ 6437dcbb28cSmiod { 644f4fe6251Sjsing .value = 0x00ba, 6457dcbb28cSmiod .name = TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA256, 6467dcbb28cSmiod .algorithm_mkey = SSL_kRSA, 6477dcbb28cSmiod .algorithm_auth = SSL_aRSA, 6487dcbb28cSmiod .algorithm_enc = SSL_CAMELLIA128, 6497dcbb28cSmiod .algorithm_mac = SSL_SHA256, 6507dcbb28cSmiod .algorithm_ssl = SSL_TLSV1_2, 6517dcbb28cSmiod .algo_strength = SSL_HIGH, 6522bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 6537dcbb28cSmiod .strength_bits = 128, 6547dcbb28cSmiod .alg_bits = 128, 6557dcbb28cSmiod }, 6567dcbb28cSmiod { 657f4fe6251Sjsing .value = 0x000be, 6587dcbb28cSmiod .name = TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, 6597dcbb28cSmiod .algorithm_mkey = SSL_kDHE, 6607dcbb28cSmiod .algorithm_auth = SSL_aRSA, 6617dcbb28cSmiod .algorithm_enc = SSL_CAMELLIA128, 6627dcbb28cSmiod .algorithm_mac = SSL_SHA256, 6637dcbb28cSmiod .algorithm_ssl = SSL_TLSV1_2, 6647dcbb28cSmiod .algo_strength = SSL_HIGH, 6652bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 6667dcbb28cSmiod .strength_bits = 128, 6677dcbb28cSmiod .alg_bits = 128, 6687dcbb28cSmiod }, 6697dcbb28cSmiod { 670f4fe6251Sjsing .value = 0x00bf, 6717dcbb28cSmiod .name = TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA256, 6727dcbb28cSmiod .algorithm_mkey = SSL_kDHE, 6737dcbb28cSmiod .algorithm_auth = SSL_aNULL, 6747dcbb28cSmiod .algorithm_enc = SSL_CAMELLIA128, 6757dcbb28cSmiod .algorithm_mac = SSL_SHA256, 6767dcbb28cSmiod .algorithm_ssl = SSL_TLSV1_2, 6777dcbb28cSmiod .algo_strength = SSL_HIGH, 6782bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 6797dcbb28cSmiod .strength_bits = 128, 6807dcbb28cSmiod .alg_bits = 128, 6817dcbb28cSmiod }, 6827dcbb28cSmiod { 683f4fe6251Sjsing .value = 0x00c0, 6847dcbb28cSmiod .name = TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA256, 6857dcbb28cSmiod .algorithm_mkey = SSL_kRSA, 6867dcbb28cSmiod .algorithm_auth = SSL_aRSA, 6877dcbb28cSmiod .algorithm_enc = SSL_CAMELLIA256, 6887dcbb28cSmiod .algorithm_mac = SSL_SHA256, 6897dcbb28cSmiod .algorithm_ssl = SSL_TLSV1_2, 6907dcbb28cSmiod .algo_strength = SSL_HIGH, 6912bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 6927dcbb28cSmiod .strength_bits = 256, 6937dcbb28cSmiod .alg_bits = 256, 6947dcbb28cSmiod }, 6957dcbb28cSmiod { 696f4fe6251Sjsing .value = 0x00c4, 6977dcbb28cSmiod .name = TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, 6987dcbb28cSmiod .algorithm_mkey = SSL_kDHE, 6997dcbb28cSmiod .algorithm_auth = SSL_aRSA, 7007dcbb28cSmiod .algorithm_enc = SSL_CAMELLIA256, 7017dcbb28cSmiod .algorithm_mac = SSL_SHA256, 7027dcbb28cSmiod .algorithm_ssl = SSL_TLSV1_2, 7037dcbb28cSmiod .algo_strength = SSL_HIGH, 7042bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 7057dcbb28cSmiod .strength_bits = 256, 7067dcbb28cSmiod .alg_bits = 256, 7077dcbb28cSmiod }, 7087dcbb28cSmiod { 709f4fe6251Sjsing .value = 0x00c5, 7107dcbb28cSmiod .name = TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA256, 7117dcbb28cSmiod .algorithm_mkey = SSL_kDHE, 7127dcbb28cSmiod .algorithm_auth = SSL_aNULL, 7137dcbb28cSmiod .algorithm_enc = SSL_CAMELLIA256, 7147dcbb28cSmiod .algorithm_mac = SSL_SHA256, 7157dcbb28cSmiod .algorithm_ssl = SSL_TLSV1_2, 7167dcbb28cSmiod .algo_strength = SSL_HIGH, 7172bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 7187dcbb28cSmiod .strength_bits = 256, 7197dcbb28cSmiod .alg_bits = 256, 7207dcbb28cSmiod }, 7217dcbb28cSmiod #endif /* OPENSSL_NO_CAMELLIA */ 7227dcbb28cSmiod 723d3b2bb0dSjsing #ifdef LIBRESSL_HAS_TLS1_3 724f4fe6251Sjsing /* 725f4fe6251Sjsing * TLSv1.3 cipher suites (RFC 8446). 726f4fe6251Sjsing */ 727d3b2bb0dSjsing { 728f4fe6251Sjsing .value = 0x1301, 72993fa6e49Stb .name = TLS1_3_RFC_AES_128_GCM_SHA256, 730d3b2bb0dSjsing .algorithm_mkey = SSL_kTLS1_3, 731d3b2bb0dSjsing .algorithm_auth = SSL_aTLS1_3, 732d3b2bb0dSjsing .algorithm_enc = SSL_AES128GCM, 733d3b2bb0dSjsing .algorithm_mac = SSL_AEAD, 734d3b2bb0dSjsing .algorithm_ssl = SSL_TLSV1_3, 735d3b2bb0dSjsing .algo_strength = SSL_HIGH, 736d3b2bb0dSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, /* XXX */ 737d3b2bb0dSjsing .strength_bits = 128, 738d3b2bb0dSjsing .alg_bits = 128, 739d3b2bb0dSjsing }, 740d3b2bb0dSjsing { 741f4fe6251Sjsing .value = 0x1302, 74293fa6e49Stb .name = TLS1_3_RFC_AES_256_GCM_SHA384, 743d3b2bb0dSjsing .algorithm_mkey = SSL_kTLS1_3, 744d3b2bb0dSjsing .algorithm_auth = SSL_aTLS1_3, 745d3b2bb0dSjsing .algorithm_enc = SSL_AES256GCM, 746d3b2bb0dSjsing .algorithm_mac = SSL_AEAD, 747d3b2bb0dSjsing .algorithm_ssl = SSL_TLSV1_3, 748d3b2bb0dSjsing .algo_strength = SSL_HIGH, 749d3b2bb0dSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA384, /* XXX */ 750d3b2bb0dSjsing .strength_bits = 256, 751d3b2bb0dSjsing .alg_bits = 256, 752d3b2bb0dSjsing }, 753d3b2bb0dSjsing { 754f4fe6251Sjsing .value = 0x1303, 75593fa6e49Stb .name = TLS1_3_RFC_CHACHA20_POLY1305_SHA256, 756d3b2bb0dSjsing .algorithm_mkey = SSL_kTLS1_3, 757d3b2bb0dSjsing .algorithm_auth = SSL_aTLS1_3, 758d3b2bb0dSjsing .algorithm_enc = SSL_CHACHA20POLY1305, 759d3b2bb0dSjsing .algorithm_mac = SSL_AEAD, 760d3b2bb0dSjsing .algorithm_ssl = SSL_TLSV1_3, 761d3b2bb0dSjsing .algo_strength = SSL_HIGH, 762d3b2bb0dSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, /* XXX */ 763d3b2bb0dSjsing .strength_bits = 256, 764d3b2bb0dSjsing .alg_bits = 256, 765d3b2bb0dSjsing }, 766d3b2bb0dSjsing #endif 767d3b2bb0dSjsing 768f4fe6251Sjsing /* 769f4fe6251Sjsing * TLSv1.0 Elliptic Curve cipher suites (RFC 4492, section 6). 770f4fe6251Sjsing */ 7714fcf65c5Sdjm { 772f4fe6251Sjsing .value = 0xc006, 77330c4fd80Sjsing .name = TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA, 774daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 77530c4fd80Sjsing .algorithm_auth = SSL_aECDSA, 77630c4fd80Sjsing .algorithm_enc = SSL_eNULL, 77730c4fd80Sjsing .algorithm_mac = SSL_SHA1, 77830c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 7790ca99bc1Sjsing .algo_strength = SSL_STRONG_NONE, 780eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 78130c4fd80Sjsing .strength_bits = 0, 78230c4fd80Sjsing .alg_bits = 0, 7834fcf65c5Sdjm }, 7844fcf65c5Sdjm { 785f4fe6251Sjsing .value = 0xc007, 78630c4fd80Sjsing .name = TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA, 787daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 78830c4fd80Sjsing .algorithm_auth = SSL_aECDSA, 78930c4fd80Sjsing .algorithm_enc = SSL_RC4, 79030c4fd80Sjsing .algorithm_mac = SSL_SHA1, 79130c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 7926688c81eSjsing .algo_strength = SSL_LOW, 793eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 79430c4fd80Sjsing .strength_bits = 128, 79530c4fd80Sjsing .alg_bits = 128, 7964fcf65c5Sdjm }, 7974fcf65c5Sdjm { 798f4fe6251Sjsing .value = 0xc008, 79930c4fd80Sjsing .name = TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA, 800daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 80130c4fd80Sjsing .algorithm_auth = SSL_aECDSA, 80230c4fd80Sjsing .algorithm_enc = SSL_3DES, 80330c4fd80Sjsing .algorithm_mac = SSL_SHA1, 80430c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 8056688c81eSjsing .algo_strength = SSL_MEDIUM, 806eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 80732c39e3dSjsing .strength_bits = 112, 80830c4fd80Sjsing .alg_bits = 168, 8094fcf65c5Sdjm }, 8104fcf65c5Sdjm { 811f4fe6251Sjsing .value = 0xc009, 81230c4fd80Sjsing .name = TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 813daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 81430c4fd80Sjsing .algorithm_auth = SSL_aECDSA, 81530c4fd80Sjsing .algorithm_enc = SSL_AES128, 81630c4fd80Sjsing .algorithm_mac = SSL_SHA1, 81730c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 8180ca99bc1Sjsing .algo_strength = SSL_HIGH, 819eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 82030c4fd80Sjsing .strength_bits = 128, 82130c4fd80Sjsing .alg_bits = 128, 8224fcf65c5Sdjm }, 8234fcf65c5Sdjm { 824f4fe6251Sjsing .value = 0xc00a, 82530c4fd80Sjsing .name = TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 826daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 82730c4fd80Sjsing .algorithm_auth = SSL_aECDSA, 82830c4fd80Sjsing .algorithm_enc = SSL_AES256, 82930c4fd80Sjsing .algorithm_mac = SSL_SHA1, 83030c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 8310ca99bc1Sjsing .algo_strength = SSL_HIGH, 832eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 83330c4fd80Sjsing .strength_bits = 256, 83430c4fd80Sjsing .alg_bits = 256, 8354fcf65c5Sdjm }, 8364fcf65c5Sdjm { 837f4fe6251Sjsing .value = 0xc010, 83830c4fd80Sjsing .name = TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA, 839daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 84030c4fd80Sjsing .algorithm_auth = SSL_aRSA, 84130c4fd80Sjsing .algorithm_enc = SSL_eNULL, 84230c4fd80Sjsing .algorithm_mac = SSL_SHA1, 84330c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 8440ca99bc1Sjsing .algo_strength = SSL_STRONG_NONE, 845eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 84630c4fd80Sjsing .strength_bits = 0, 84730c4fd80Sjsing .alg_bits = 0, 8484fcf65c5Sdjm }, 8494fcf65c5Sdjm { 850f4fe6251Sjsing .value = 0xc011, 85130c4fd80Sjsing .name = TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA, 852daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 85330c4fd80Sjsing .algorithm_auth = SSL_aRSA, 85430c4fd80Sjsing .algorithm_enc = SSL_RC4, 85530c4fd80Sjsing .algorithm_mac = SSL_SHA1, 85630c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 8576688c81eSjsing .algo_strength = SSL_LOW, 858eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 85930c4fd80Sjsing .strength_bits = 128, 86030c4fd80Sjsing .alg_bits = 128, 8614fcf65c5Sdjm }, 8624fcf65c5Sdjm { 863f4fe6251Sjsing .value = 0xc012, 86430c4fd80Sjsing .name = TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA, 865daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 86630c4fd80Sjsing .algorithm_auth = SSL_aRSA, 86730c4fd80Sjsing .algorithm_enc = SSL_3DES, 86830c4fd80Sjsing .algorithm_mac = SSL_SHA1, 86930c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 870faa0c91cSjsing .algo_strength = SSL_MEDIUM, 871eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 87232c39e3dSjsing .strength_bits = 112, 87330c4fd80Sjsing .alg_bits = 168, 8744fcf65c5Sdjm }, 8754fcf65c5Sdjm { 876f4fe6251Sjsing .value = 0xc013, 87730c4fd80Sjsing .name = TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA, 878daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 87930c4fd80Sjsing .algorithm_auth = SSL_aRSA, 88030c4fd80Sjsing .algorithm_enc = SSL_AES128, 88130c4fd80Sjsing .algorithm_mac = SSL_SHA1, 88230c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 8830ca99bc1Sjsing .algo_strength = SSL_HIGH, 884eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 88530c4fd80Sjsing .strength_bits = 128, 88630c4fd80Sjsing .alg_bits = 128, 8874fcf65c5Sdjm }, 8884fcf65c5Sdjm { 889f4fe6251Sjsing .value = 0xc014, 89030c4fd80Sjsing .name = TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA, 891daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 89230c4fd80Sjsing .algorithm_auth = SSL_aRSA, 89330c4fd80Sjsing .algorithm_enc = SSL_AES256, 89430c4fd80Sjsing .algorithm_mac = SSL_SHA1, 89530c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 8960ca99bc1Sjsing .algo_strength = SSL_HIGH, 897eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 89830c4fd80Sjsing .strength_bits = 256, 89930c4fd80Sjsing .alg_bits = 256, 9004fcf65c5Sdjm }, 9014fcf65c5Sdjm { 902f4fe6251Sjsing .value = 0xc015, 90330c4fd80Sjsing .name = TLS1_TXT_ECDH_anon_WITH_NULL_SHA, 904daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 90530c4fd80Sjsing .algorithm_auth = SSL_aNULL, 90630c4fd80Sjsing .algorithm_enc = SSL_eNULL, 90730c4fd80Sjsing .algorithm_mac = SSL_SHA1, 90830c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 9090ca99bc1Sjsing .algo_strength = SSL_STRONG_NONE, 910eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 91130c4fd80Sjsing .strength_bits = 0, 91230c4fd80Sjsing .alg_bits = 0, 9134fcf65c5Sdjm }, 9144fcf65c5Sdjm { 915f4fe6251Sjsing .value = 0xc016, 91630c4fd80Sjsing .name = TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA, 917daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 91830c4fd80Sjsing .algorithm_auth = SSL_aNULL, 91930c4fd80Sjsing .algorithm_enc = SSL_RC4, 92030c4fd80Sjsing .algorithm_mac = SSL_SHA1, 92130c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 9226688c81eSjsing .algo_strength = SSL_LOW, 923eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 92430c4fd80Sjsing .strength_bits = 128, 92530c4fd80Sjsing .alg_bits = 128, 9264fcf65c5Sdjm }, 9274fcf65c5Sdjm { 928f4fe6251Sjsing .value = 0xc017, 92930c4fd80Sjsing .name = TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA, 930daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 93130c4fd80Sjsing .algorithm_auth = SSL_aNULL, 93230c4fd80Sjsing .algorithm_enc = SSL_3DES, 93330c4fd80Sjsing .algorithm_mac = SSL_SHA1, 93430c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 9356688c81eSjsing .algo_strength = SSL_MEDIUM, 936eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 93732c39e3dSjsing .strength_bits = 112, 93830c4fd80Sjsing .alg_bits = 168, 9394fcf65c5Sdjm }, 9404fcf65c5Sdjm { 941f4fe6251Sjsing .value = 0xc018, 94230c4fd80Sjsing .name = TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA, 943daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 94430c4fd80Sjsing .algorithm_auth = SSL_aNULL, 94530c4fd80Sjsing .algorithm_enc = SSL_AES128, 94630c4fd80Sjsing .algorithm_mac = SSL_SHA1, 94730c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 9480ca99bc1Sjsing .algo_strength = SSL_HIGH, 949eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 95030c4fd80Sjsing .strength_bits = 128, 95130c4fd80Sjsing .alg_bits = 128, 9524fcf65c5Sdjm }, 9534fcf65c5Sdjm { 954f4fe6251Sjsing .value = 0xc019, 95530c4fd80Sjsing .name = TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA, 956daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 95730c4fd80Sjsing .algorithm_auth = SSL_aNULL, 95830c4fd80Sjsing .algorithm_enc = SSL_AES256, 95930c4fd80Sjsing .algorithm_mac = SSL_SHA1, 96030c4fd80Sjsing .algorithm_ssl = SSL_TLSV1, 9610ca99bc1Sjsing .algo_strength = SSL_HIGH, 962eb67a850Sjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 96330c4fd80Sjsing .strength_bits = 256, 96430c4fd80Sjsing .alg_bits = 256, 9654fcf65c5Sdjm }, 9664fcf65c5Sdjm 967f4fe6251Sjsing /* 968f4fe6251Sjsing * TLSv1.2 Elliptic Curve HMAC cipher suites (RFC 5289, section 3.1). 969f4fe6251Sjsing */ 9705cdd308eSdjm { 971f4fe6251Sjsing .value = 0xc023, 97230c4fd80Sjsing .name = TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256, 973daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 97430c4fd80Sjsing .algorithm_auth = SSL_aECDSA, 97530c4fd80Sjsing .algorithm_enc = SSL_AES128, 97630c4fd80Sjsing .algorithm_mac = SSL_SHA256, 97730c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 9780ca99bc1Sjsing .algo_strength = SSL_HIGH, 9792bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 98030c4fd80Sjsing .strength_bits = 128, 98130c4fd80Sjsing .alg_bits = 128, 9825cdd308eSdjm }, 9835cdd308eSdjm { 984f4fe6251Sjsing .value = 0xc024, 98530c4fd80Sjsing .name = TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384, 986daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 98730c4fd80Sjsing .algorithm_auth = SSL_aECDSA, 98830c4fd80Sjsing .algorithm_enc = SSL_AES256, 98930c4fd80Sjsing .algorithm_mac = SSL_SHA384, 99030c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 9910ca99bc1Sjsing .algo_strength = SSL_HIGH, 9922bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA384, 99330c4fd80Sjsing .strength_bits = 256, 99430c4fd80Sjsing .alg_bits = 256, 9955cdd308eSdjm }, 9965cdd308eSdjm { 997f4fe6251Sjsing .value = 0xc027, 99830c4fd80Sjsing .name = TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256, 999daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 100030c4fd80Sjsing .algorithm_auth = SSL_aRSA, 100130c4fd80Sjsing .algorithm_enc = SSL_AES128, 100230c4fd80Sjsing .algorithm_mac = SSL_SHA256, 100330c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 10040ca99bc1Sjsing .algo_strength = SSL_HIGH, 10052bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 100630c4fd80Sjsing .strength_bits = 128, 100730c4fd80Sjsing .alg_bits = 128, 10085cdd308eSdjm }, 10095cdd308eSdjm { 1010f4fe6251Sjsing .value = 0xc028, 101130c4fd80Sjsing .name = TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384, 1012daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 101330c4fd80Sjsing .algorithm_auth = SSL_aRSA, 101430c4fd80Sjsing .algorithm_enc = SSL_AES256, 101530c4fd80Sjsing .algorithm_mac = SSL_SHA384, 101630c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 10170ca99bc1Sjsing .algo_strength = SSL_HIGH, 10182bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA384, 101930c4fd80Sjsing .strength_bits = 256, 102030c4fd80Sjsing .alg_bits = 256, 10215cdd308eSdjm }, 10225cdd308eSdjm 1023f4fe6251Sjsing /* 1024f4fe6251Sjsing * TLSv1.2 Elliptic Curve GCM cipher suites (RFC 5289, section 3.2). 1025f4fe6251Sjsing */ 10265cdd308eSdjm { 1027f4fe6251Sjsing .value = 0xc02b, 102830c4fd80Sjsing .name = TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 1029daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 103030c4fd80Sjsing .algorithm_auth = SSL_aECDSA, 103130c4fd80Sjsing .algorithm_enc = SSL_AES128GCM, 103230c4fd80Sjsing .algorithm_mac = SSL_AEAD, 103330c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 10340ca99bc1Sjsing .algo_strength = SSL_HIGH, 10352bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 103630c4fd80Sjsing .strength_bits = 128, 103730c4fd80Sjsing .alg_bits = 128, 10385cdd308eSdjm }, 10395cdd308eSdjm { 1040f4fe6251Sjsing .value = 0xc02c, 104130c4fd80Sjsing .name = TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 1042daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 104330c4fd80Sjsing .algorithm_auth = SSL_aECDSA, 104430c4fd80Sjsing .algorithm_enc = SSL_AES256GCM, 104530c4fd80Sjsing .algorithm_mac = SSL_AEAD, 104630c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 10470ca99bc1Sjsing .algo_strength = SSL_HIGH, 10482bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA384, 104930c4fd80Sjsing .strength_bits = 256, 105030c4fd80Sjsing .alg_bits = 256, 10515cdd308eSdjm }, 10525cdd308eSdjm { 1053f4fe6251Sjsing .value = 0xc02f, 105430c4fd80Sjsing .name = TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 1055daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 105630c4fd80Sjsing .algorithm_auth = SSL_aRSA, 105730c4fd80Sjsing .algorithm_enc = SSL_AES128GCM, 105830c4fd80Sjsing .algorithm_mac = SSL_AEAD, 105930c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 10600ca99bc1Sjsing .algo_strength = SSL_HIGH, 10612bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 106230c4fd80Sjsing .strength_bits = 128, 106330c4fd80Sjsing .alg_bits = 128, 10645cdd308eSdjm }, 10655cdd308eSdjm { 1066f4fe6251Sjsing .value = 0xc030, 106730c4fd80Sjsing .name = TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 1068daecd611Sjsing .algorithm_mkey = SSL_kECDHE, 106930c4fd80Sjsing .algorithm_auth = SSL_aRSA, 107030c4fd80Sjsing .algorithm_enc = SSL_AES256GCM, 107130c4fd80Sjsing .algorithm_mac = SSL_AEAD, 107230c4fd80Sjsing .algorithm_ssl = SSL_TLSV1_2, 10730ca99bc1Sjsing .algo_strength = SSL_HIGH, 10742bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA384, 107530c4fd80Sjsing .strength_bits = 256, 107630c4fd80Sjsing .alg_bits = 256, 10775cdd308eSdjm }, 10785cdd308eSdjm 1079f4fe6251Sjsing /* 1080f4fe6251Sjsing * TLSv1.2 ChaCha20-Poly1305 cipher suites (RFC 7905). 1081f4fe6251Sjsing */ 1082f43d4a20Sjsing { 1083f4fe6251Sjsing .value = 0xcca8, 1084f43d4a20Sjsing .name = TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305, 1085f43d4a20Sjsing .algorithm_mkey = SSL_kECDHE, 1086f43d4a20Sjsing .algorithm_auth = SSL_aRSA, 1087f43d4a20Sjsing .algorithm_enc = SSL_CHACHA20POLY1305, 1088f43d4a20Sjsing .algorithm_mac = SSL_AEAD, 1089f43d4a20Sjsing .algorithm_ssl = SSL_TLSV1_2, 1090f43d4a20Sjsing .algo_strength = SSL_HIGH, 10912bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 1092f43d4a20Sjsing .strength_bits = 256, 1093f43d4a20Sjsing .alg_bits = 256, 1094f43d4a20Sjsing }, 1095f43d4a20Sjsing { 1096f4fe6251Sjsing .value = 0xcca9, 1097f43d4a20Sjsing .name = TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, 1098f43d4a20Sjsing .algorithm_mkey = SSL_kECDHE, 1099f43d4a20Sjsing .algorithm_auth = SSL_aECDSA, 1100f43d4a20Sjsing .algorithm_enc = SSL_CHACHA20POLY1305, 1101f43d4a20Sjsing .algorithm_mac = SSL_AEAD, 1102f43d4a20Sjsing .algorithm_ssl = SSL_TLSV1_2, 1103f43d4a20Sjsing .algo_strength = SSL_HIGH, 11042bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 1105f43d4a20Sjsing .strength_bits = 256, 1106f43d4a20Sjsing .alg_bits = 256, 1107f43d4a20Sjsing }, 1108f43d4a20Sjsing { 1109f4fe6251Sjsing .value = 0xccaa, 111012fc33deSjsing .name = TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305, 1111daecd611Sjsing .algorithm_mkey = SSL_kDHE, 111212fc33deSjsing .algorithm_auth = SSL_aRSA, 111312fc33deSjsing .algorithm_enc = SSL_CHACHA20POLY1305, 111412fc33deSjsing .algorithm_mac = SSL_AEAD, 111512fc33deSjsing .algorithm_ssl = SSL_TLSV1_2, 1116b7aaf58cSjsing .algo_strength = SSL_HIGH, 11172bfbbd8bSjsing .algorithm2 = SSL_HANDSHAKE_MAC_SHA256, 111812fc33deSjsing .strength_bits = 256, 11197d8ef580Sguenther .alg_bits = 256, 112012fc33deSjsing }, 11215b37fcf3Sryker }; 11225b37fcf3Sryker 11234e3cd986Sjsing int 11244e3cd986Sjsing ssl3_num_ciphers(void) 11255b37fcf3Sryker { 11265b37fcf3Sryker return (SSL3_NUM_CIPHERS); 11275b37fcf3Sryker } 11285b37fcf3Sryker 1129dbea66cdSguenther const SSL_CIPHER * 1130*ae0a2582Sjsing ssl3_get_cipher_by_index(int idx) 11315b37fcf3Sryker { 1132*ae0a2582Sjsing if (idx < 0 || idx >= SSL3_NUM_CIPHERS) 1133*ae0a2582Sjsing return NULL; 1134*ae0a2582Sjsing 1135*ae0a2582Sjsing return &ssl3_ciphers[idx]; 11365b37fcf3Sryker } 11375b37fcf3Sryker 1138e0c6c588Stb static int 1139f4fe6251Sjsing ssl3_cipher_value_cmp(const void *value, const void *cipher) 1140e0c6c588Stb { 1141f4fe6251Sjsing uint16_t a = *(const uint16_t *)value; 1142f4fe6251Sjsing uint16_t b = ((const SSL_CIPHER *)cipher)->value; 1143e0c6c588Stb 1144e0c6c588Stb return a < b ? -1 : a > b; 1145e0c6c588Stb } 1146e0c6c588Stb 1147ba83acf6Sjsing const SSL_CIPHER * 1148907dbca0Sjsing ssl3_get_cipher_by_value(uint16_t value) 1149907dbca0Sjsing { 1150f4fe6251Sjsing return bsearch(&value, ssl3_ciphers, SSL3_NUM_CIPHERS, 1151f4fe6251Sjsing sizeof(ssl3_ciphers[0]), ssl3_cipher_value_cmp); 1152ef88cf8eSjsing } 1153ef88cf8eSjsing 11544e3cd986Sjsing int 11554e3cd986Sjsing ssl3_pending(const SSL *s) 11565b37fcf3Sryker { 1157ee4250f6Sjsing if (s->s3->rcontent == NULL) 1158ee4250f6Sjsing return 0; 1159ee4250f6Sjsing if (tls_content_type(s->s3->rcontent) != SSL3_RT_APPLICATION_DATA) 1160da347917Sbeck return 0; 1161da347917Sbeck 1162ee4250f6Sjsing return tls_content_remaining(s->s3->rcontent); 11635b37fcf3Sryker } 11645b37fcf3Sryker 116564d8ff80Sjsing int 116664d8ff80Sjsing ssl3_handshake_msg_hdr_len(SSL *s) 116764d8ff80Sjsing { 11689e659261Sjsing return (SSL_is_dtls(s) ? DTLS1_HM_HEADER_LENGTH : 116964d8ff80Sjsing SSL3_HM_HEADER_LENGTH); 117064d8ff80Sjsing } 117164d8ff80Sjsing 11720d55d512Sjsing int 1173312b4b14Sjsing ssl3_handshake_msg_start(SSL *s, CBB *handshake, CBB *body, uint8_t msg_type) 117416cbd6eeSjsing { 117516cbd6eeSjsing int ret = 0; 117616cbd6eeSjsing 117716cbd6eeSjsing if (!CBB_init(handshake, SSL3_RT_MAX_PLAIN_LENGTH)) 117816cbd6eeSjsing goto err; 117916cbd6eeSjsing if (!CBB_add_u8(handshake, msg_type)) 118016cbd6eeSjsing goto err; 11819e659261Sjsing if (SSL_is_dtls(s)) { 118216cbd6eeSjsing unsigned char *data; 118316cbd6eeSjsing 118416cbd6eeSjsing if (!CBB_add_space(handshake, &data, DTLS1_HM_HEADER_LENGTH - 118516cbd6eeSjsing SSL3_HM_HEADER_LENGTH)) 118616cbd6eeSjsing goto err; 118716cbd6eeSjsing } 118816cbd6eeSjsing if (!CBB_add_u24_length_prefixed(handshake, body)) 118916cbd6eeSjsing goto err; 119016cbd6eeSjsing 119116cbd6eeSjsing ret = 1; 119216cbd6eeSjsing 119316cbd6eeSjsing err: 119416cbd6eeSjsing return (ret); 119516cbd6eeSjsing } 119616cbd6eeSjsing 119716cbd6eeSjsing int 1198312b4b14Sjsing ssl3_handshake_msg_finish(SSL *s, CBB *handshake) 119916cbd6eeSjsing { 120016cbd6eeSjsing unsigned char *data = NULL; 120116cbd6eeSjsing size_t outlen; 120216cbd6eeSjsing int ret = 0; 120316cbd6eeSjsing 120416cbd6eeSjsing if (!CBB_finish(handshake, &data, &outlen)) 120516cbd6eeSjsing goto err; 120616cbd6eeSjsing 120716cbd6eeSjsing if (outlen > INT_MAX) 120816cbd6eeSjsing goto err; 120916cbd6eeSjsing 12106f7f653bSjsing if (!BUF_MEM_grow_clean(s->init_buf, outlen)) 121116cbd6eeSjsing goto err; 121216cbd6eeSjsing 12136f7f653bSjsing memcpy(s->init_buf->data, data, outlen); 121416cbd6eeSjsing 12156f7f653bSjsing s->init_num = (int)outlen; 12166f7f653bSjsing s->init_off = 0; 121716cbd6eeSjsing 12189e659261Sjsing if (SSL_is_dtls(s)) { 121916cbd6eeSjsing unsigned long len; 122016cbd6eeSjsing uint8_t msg_type; 122116cbd6eeSjsing CBS cbs; 122216cbd6eeSjsing 122316cbd6eeSjsing CBS_init(&cbs, data, outlen); 122416cbd6eeSjsing if (!CBS_get_u8(&cbs, &msg_type)) 122516cbd6eeSjsing goto err; 122616cbd6eeSjsing 122716cbd6eeSjsing len = outlen - ssl3_handshake_msg_hdr_len(s); 122816cbd6eeSjsing 1229d08ef415Sjsing dtls1_set_message_header(s, msg_type, len, 0, len); 123016cbd6eeSjsing dtls1_buffer_message(s, 0); 123116cbd6eeSjsing } 123216cbd6eeSjsing 123316cbd6eeSjsing ret = 1; 123416cbd6eeSjsing 123516cbd6eeSjsing err: 123616cbd6eeSjsing free(data); 123716cbd6eeSjsing 123816cbd6eeSjsing return (ret); 123916cbd6eeSjsing } 124016cbd6eeSjsing 124116cbd6eeSjsing int 12420d55d512Sjsing ssl3_handshake_write(SSL *s) 12430d55d512Sjsing { 1244ab211f3dSjsing return ssl3_record_write(s, SSL3_RT_HANDSHAKE); 1245ab211f3dSjsing } 12460d55d512Sjsing 1247ab211f3dSjsing int 1248ab211f3dSjsing ssl3_record_write(SSL *s, int type) 1249ab211f3dSjsing { 12509e659261Sjsing if (SSL_is_dtls(s)) 1251ab211f3dSjsing return dtls1_do_write(s, type); 1252ab211f3dSjsing 1253ab211f3dSjsing return ssl3_do_write(s, type); 12540d55d512Sjsing } 12550d55d512Sjsing 12564e3cd986Sjsing int 12574e3cd986Sjsing ssl3_new(SSL *s) 12585b37fcf3Sryker { 125994ebe6f4Sjsing if ((s->s3 = calloc(1, sizeof(*s->s3))) == NULL) 126094ebe6f4Sjsing return (0); 12615b37fcf3Sryker 12626ba40c14Sjsing s->method->ssl_clear(s); 126394ebe6f4Sjsing 12645b37fcf3Sryker return (1); 12655b37fcf3Sryker } 12665b37fcf3Sryker 12674e3cd986Sjsing void 12684e3cd986Sjsing ssl3_free(SSL *s) 12695b37fcf3Sryker { 1270913ec974Sbeck if (s == NULL) 1271913ec974Sbeck return; 1272913ec974Sbeck 127373a156d5Sjsing tls1_cleanup_key_block(s); 12740a5d6edeSdjm ssl3_release_read_buffer(s); 12750a5d6edeSdjm ssl3_release_write_buffer(s); 1276cdd436d4Sjsing 1277ee4250f6Sjsing tls_content_free(s->s3->rcontent); 1278ee4250f6Sjsing 1279b1a5c5c8Sjsing tls_buffer_free(s->s3->alert_fragment); 1280b1a5c5c8Sjsing tls_buffer_free(s->s3->handshake_fragment); 1281b1a5c5c8Sjsing 1282ad618767Sjsing freezero(s->s3->hs.sigalgs, s->s3->hs.sigalgs_len); 12831a5be6e3Sjsing 12841a5be6e3Sjsing sk_SSL_CIPHER_free(s->s3->hs.client_ciphers); 1285ad618767Sjsing sk_X509_pop_free(s->s3->hs.peer_certs, X509_free); 1286ad618767Sjsing sk_X509_pop_free(s->s3->hs.peer_certs_no_leaf, X509_free); 128757f93a0cStb sk_X509_pop_free(s->s3->hs.verified_chain, X509_free); 128802876cc3Sjsing tls_key_share_free(s->s3->hs.key_share); 1289b8e3503dSjsing 129002876cc3Sjsing tls13_secrets_destroy(s->s3->hs.tls13.secrets); 129102876cc3Sjsing freezero(s->s3->hs.tls13.cookie, s->s3->hs.tls13.cookie_len); 129202876cc3Sjsing tls13_clienthello_hash_clear(&s->s3->hs.tls13); 1293c41cde27Sjsing 129435351aa0Sjsing tls_buffer_free(s->s3->hs.tls13.quic_read_buffer); 129535351aa0Sjsing 129602876cc3Sjsing sk_X509_NAME_pop_free(s->s3->hs.tls12.ca_names, X509_NAME_free); 1297366dc2a2Sjsing 1298cef855dcSjsing tls1_transcript_free(s); 1299df40b63bSjsing tls1_transcript_hash_free(s); 1300366dc2a2Sjsing 130102876cc3Sjsing free(s->s3->alpn_selected); 1302d436807cSjsing 13038385bbf8Sbeck freezero(s->s3->peer_quic_transport_params, 13048385bbf8Sbeck s->s3->peer_quic_transport_params_len); 13058385bbf8Sbeck 13068f2be08bSjsing freezero(s->s3, sizeof(*s->s3)); 13078462f404Sjsing 13085b37fcf3Sryker s->s3 = NULL; 13095b37fcf3Sryker } 13105b37fcf3Sryker 13114e3cd986Sjsing void 13124e3cd986Sjsing ssl3_clear(SSL *s) 13135b37fcf3Sryker { 13145b37fcf3Sryker unsigned char *rp, *wp; 1315da347917Sbeck size_t rlen, wlen; 13165b37fcf3Sryker 131773a156d5Sjsing tls1_cleanup_key_block(s); 131802876cc3Sjsing sk_X509_NAME_pop_free(s->s3->hs.tls12.ca_names, X509_NAME_free); 1319913ec974Sbeck 1320b1a5c5c8Sjsing tls_buffer_free(s->s3->alert_fragment); 1321b1a5c5c8Sjsing s->s3->alert_fragment = NULL; 1322b1a5c5c8Sjsing tls_buffer_free(s->s3->handshake_fragment); 1323b1a5c5c8Sjsing s->s3->handshake_fragment = NULL; 1324b1a5c5c8Sjsing 132502876cc3Sjsing freezero(s->s3->hs.sigalgs, s->s3->hs.sigalgs_len); 132602876cc3Sjsing s->s3->hs.sigalgs = NULL; 132702876cc3Sjsing s->s3->hs.sigalgs_len = 0; 13284fb7e9cfSjsing 13291a5be6e3Sjsing sk_SSL_CIPHER_free(s->s3->hs.client_ciphers); 13301a5be6e3Sjsing s->s3->hs.client_ciphers = NULL; 1331ad618767Sjsing sk_X509_pop_free(s->s3->hs.peer_certs, X509_free); 1332ad618767Sjsing s->s3->hs.peer_certs = NULL; 1333ad618767Sjsing sk_X509_pop_free(s->s3->hs.peer_certs_no_leaf, X509_free); 1334ad618767Sjsing s->s3->hs.peer_certs_no_leaf = NULL; 133557f93a0cStb sk_X509_pop_free(s->s3->hs.verified_chain, X509_free); 133657f93a0cStb s->s3->hs.verified_chain = NULL; 1337ad618767Sjsing 133802876cc3Sjsing tls_key_share_free(s->s3->hs.key_share); 133902876cc3Sjsing s->s3->hs.key_share = NULL; 13400ad90c3eSjsing 134102876cc3Sjsing tls13_secrets_destroy(s->s3->hs.tls13.secrets); 134202876cc3Sjsing s->s3->hs.tls13.secrets = NULL; 134302876cc3Sjsing freezero(s->s3->hs.tls13.cookie, s->s3->hs.tls13.cookie_len); 134402876cc3Sjsing s->s3->hs.tls13.cookie = NULL; 134502876cc3Sjsing s->s3->hs.tls13.cookie_len = 0; 134602876cc3Sjsing tls13_clienthello_hash_clear(&s->s3->hs.tls13); 1347c41cde27Sjsing 134835351aa0Sjsing tls_buffer_free(s->s3->hs.tls13.quic_read_buffer); 134935351aa0Sjsing s->s3->hs.tls13.quic_read_buffer = NULL; 135035351aa0Sjsing s->s3->hs.tls13.quic_read_level = ssl_encryption_initial; 135135351aa0Sjsing s->s3->hs.tls13.quic_write_level = ssl_encryption_initial; 135235351aa0Sjsing 135302876cc3Sjsing s->s3->hs.extensions_seen = 0; 13544c111e00Sbeck 135502876cc3Sjsing rp = s->s3->rbuf.buf; 135602876cc3Sjsing wp = s->s3->wbuf.buf; 135702876cc3Sjsing rlen = s->s3->rbuf.len; 135802876cc3Sjsing wlen = s->s3->wbuf.len; 1359148aef07Sjsing 1360ee4250f6Sjsing tls_content_free(s->s3->rcontent); 1361ee4250f6Sjsing s->s3->rcontent = NULL; 1362ee4250f6Sjsing 1363cef855dcSjsing tls1_transcript_free(s); 1364df40b63bSjsing tls1_transcript_hash_free(s); 1365e51a8815Sjsing 136602876cc3Sjsing free(s->s3->alpn_selected); 136702876cc3Sjsing s->s3->alpn_selected = NULL; 136802876cc3Sjsing s->s3->alpn_selected_len = 0; 1369d436807cSjsing 13708385bbf8Sbeck freezero(s->s3->peer_quic_transport_params, 13718385bbf8Sbeck s->s3->peer_quic_transport_params_len); 13728385bbf8Sbeck s->s3->peer_quic_transport_params = NULL; 13738385bbf8Sbeck s->s3->peer_quic_transport_params_len = 0; 13748385bbf8Sbeck 13758462f404Sjsing memset(s->s3, 0, sizeof(*s->s3)); 1376f9656925Sjsing 137702876cc3Sjsing s->s3->rbuf.buf = rp; 137802876cc3Sjsing s->s3->wbuf.buf = wp; 137902876cc3Sjsing s->s3->rbuf.len = rlen; 138002876cc3Sjsing s->s3->wbuf.len = wlen; 1381913ec974Sbeck 1382913ec974Sbeck ssl_free_wbio_buffer(s); 1383913ec974Sbeck 1384719c9263Sjsing /* Not needed... */ 138502876cc3Sjsing s->s3->renegotiate = 0; 138602876cc3Sjsing s->s3->total_renegotiations = 0; 138702876cc3Sjsing s->s3->num_renegotiations = 0; 138802876cc3Sjsing s->s3->in_read_app_data = 0; 1389719c9263Sjsing 13906f7f653bSjsing s->packet_length = 0; 1391521ba2f2Sbeck s->version = TLS1_2_VERSION; 139279bec84bSjsing 139302876cc3Sjsing s->s3->hs.state = SSL_ST_BEFORE|((s->server) ? SSL_ST_ACCEPT : SSL_ST_CONNECT); 13945cdd308eSdjm } 13955cdd308eSdjm 139699675379Sjsing long 1397e1a22fe8Stb _SSL_get_shared_group(SSL *s, long n) 1398e1a22fe8Stb { 1399e1a22fe8Stb size_t count; 1400e1a22fe8Stb int nid; 1401e1a22fe8Stb 1402e1a22fe8Stb /* OpenSSL document that they return -1 for clients. They return 0. */ 1403e1a22fe8Stb if (!s->server) 1404e1a22fe8Stb return 0; 1405e1a22fe8Stb 1406e1a22fe8Stb if (n == -1) { 1407e1a22fe8Stb if (!tls1_count_shared_groups(s, &count)) 1408e1a22fe8Stb return 0; 1409e1a22fe8Stb 1410e1a22fe8Stb if (count > LONG_MAX) 1411e1a22fe8Stb count = LONG_MAX; 1412e1a22fe8Stb 1413e1a22fe8Stb return count; 1414e1a22fe8Stb } 1415e1a22fe8Stb 1416e1a22fe8Stb /* Undocumented special case added for Suite B profile support. */ 1417e1a22fe8Stb if (n == -2) 1418e1a22fe8Stb n = 0; 1419e1a22fe8Stb 1420e1a22fe8Stb if (n < 0) 1421e1a22fe8Stb return 0; 1422e1a22fe8Stb 1423e1a22fe8Stb if (!tls1_get_shared_group_by_index(s, n, &nid)) 1424e1a22fe8Stb return NID_undef; 1425e1a22fe8Stb 1426e1a22fe8Stb return nid; 1427e1a22fe8Stb } 1428e1a22fe8Stb 1429e1a22fe8Stb long 143099675379Sjsing _SSL_get_peer_tmp_key(SSL *s, EVP_PKEY **key) 1431c640b633Sjsing { 1432c640b633Sjsing EVP_PKEY *pkey = NULL; 1433c640b633Sjsing int ret = 0; 1434c640b633Sjsing 143599675379Sjsing *key = NULL; 1436c640b633Sjsing 143702876cc3Sjsing if (s->s3->hs.key_share == NULL) 1438892af70eSjsing goto err; 1439c640b633Sjsing 1440c640b633Sjsing if ((pkey = EVP_PKEY_new()) == NULL) 1441501dd9a5Sjsing goto err; 144202876cc3Sjsing if (!tls_key_share_peer_pkey(s->s3->hs.key_share, pkey)) 1443501dd9a5Sjsing goto err; 1444c640b633Sjsing 144599675379Sjsing *key = pkey; 1446c640b633Sjsing pkey = NULL; 1447501dd9a5Sjsing 1448501dd9a5Sjsing ret = 1; 1449c640b633Sjsing 1450c640b633Sjsing err: 1451c640b633Sjsing EVP_PKEY_free(pkey); 1452c640b633Sjsing 1453c640b633Sjsing return (ret); 1454c640b633Sjsing } 14555b37fcf3Sryker 1456fb6b53e4Sjsing static int 1457fb6b53e4Sjsing _SSL_session_reused(SSL *s) 1458fb6b53e4Sjsing { 14596f7f653bSjsing return s->hit; 1460fb6b53e4Sjsing } 1461fb6b53e4Sjsing 1462fb6b53e4Sjsing static int 1463fb6b53e4Sjsing _SSL_num_renegotiations(SSL *s) 1464fb6b53e4Sjsing { 146502876cc3Sjsing return s->s3->num_renegotiations; 1466fb6b53e4Sjsing } 1467fb6b53e4Sjsing 1468fb6b53e4Sjsing static int 1469fb6b53e4Sjsing _SSL_clear_num_renegotiations(SSL *s) 1470fb6b53e4Sjsing { 1471fb6b53e4Sjsing int renegs; 1472fb6b53e4Sjsing 147302876cc3Sjsing renegs = s->s3->num_renegotiations; 147402876cc3Sjsing s->s3->num_renegotiations = 0; 1475fb6b53e4Sjsing 1476fb6b53e4Sjsing return renegs; 1477fb6b53e4Sjsing } 1478fb6b53e4Sjsing 1479fb6b53e4Sjsing static int 1480fb6b53e4Sjsing _SSL_total_renegotiations(SSL *s) 1481fb6b53e4Sjsing { 148202876cc3Sjsing return s->s3->total_renegotiations; 1483fb6b53e4Sjsing } 1484fb6b53e4Sjsing 1485a721245fSjsing static int 1486a721245fSjsing _SSL_set_tmp_dh(SSL *s, DH *dh) 1487a721245fSjsing { 1488c0b85757Sjsing DH *dhe_params; 1489a721245fSjsing 1490a721245fSjsing if (dh == NULL) { 1491a721245fSjsing SSLerror(s, ERR_R_PASSED_NULL_PARAMETER); 1492a721245fSjsing return 0; 1493a721245fSjsing } 1494a721245fSjsing 14951bc539a7Stb if (!ssl_security_dh(s, dh)) { 14961bc539a7Stb SSLerror(s, SSL_R_DH_KEY_TOO_SMALL); 14971bc539a7Stb return 0; 14981bc539a7Stb } 14991bc539a7Stb 1500c0b85757Sjsing if ((dhe_params = DHparams_dup(dh)) == NULL) { 1501a721245fSjsing SSLerror(s, ERR_R_DH_LIB); 1502a721245fSjsing return 0; 1503a721245fSjsing } 1504a721245fSjsing 1505c0b85757Sjsing DH_free(s->cert->dhe_params); 1506c0b85757Sjsing s->cert->dhe_params = dhe_params; 1507a721245fSjsing 1508a721245fSjsing return 1; 1509a721245fSjsing } 1510a721245fSjsing 1511a721245fSjsing static int 1512a721245fSjsing _SSL_set_dh_auto(SSL *s, int state) 1513a721245fSjsing { 1514c0b85757Sjsing s->cert->dhe_params_auto = state; 1515a721245fSjsing return 1; 1516a721245fSjsing } 1517a721245fSjsing 1518a721245fSjsing static int 1519a721245fSjsing _SSL_set_tmp_ecdh(SSL *s, EC_KEY *ecdh) 1520a721245fSjsing { 1521203d15d2Sjsing const EC_GROUP *group; 1522203d15d2Sjsing int nid; 1523203d15d2Sjsing 1524203d15d2Sjsing if (ecdh == NULL) 1525a721245fSjsing return 0; 1526203d15d2Sjsing if ((group = EC_KEY_get0_group(ecdh)) == NULL) 1527a721245fSjsing return 0; 1528a721245fSjsing 1529203d15d2Sjsing nid = EC_GROUP_get_curve_name(group); 1530203d15d2Sjsing return SSL_set1_groups(s, &nid, 1); 1531a721245fSjsing } 1532a721245fSjsing 1533a721245fSjsing static int 1534a721245fSjsing _SSL_set_ecdh_auto(SSL *s, int state) 1535a721245fSjsing { 1536a721245fSjsing return 1; 1537a721245fSjsing } 1538a721245fSjsing 15399e479edcSjsing static int 15409e479edcSjsing _SSL_set_tlsext_host_name(SSL *s, const char *name) 15419e479edcSjsing { 15426af37010Sjsing int is_ip; 15436af37010Sjsing CBS cbs; 15446af37010Sjsing 15459e479edcSjsing free(s->tlsext_hostname); 15469e479edcSjsing s->tlsext_hostname = NULL; 15479e479edcSjsing 15489e479edcSjsing if (name == NULL) 15499e479edcSjsing return 1; 15509e479edcSjsing 15510db19753Stb CBS_init(&cbs, name, strlen(name)); 15520db19753Stb 15536af37010Sjsing if (!tlsext_sni_is_valid_hostname(&cbs, &is_ip)) { 15549e479edcSjsing SSLerror(s, SSL_R_SSL3_EXT_INVALID_SERVERNAME); 15559e479edcSjsing return 0; 15569e479edcSjsing } 15579e479edcSjsing if ((s->tlsext_hostname = strdup(name)) == NULL) { 15589e479edcSjsing SSLerror(s, ERR_R_INTERNAL_ERROR); 15599e479edcSjsing return 0; 15609e479edcSjsing } 15619e479edcSjsing 15629e479edcSjsing return 1; 15639e479edcSjsing } 15649e479edcSjsing 15659e479edcSjsing static int 15669e479edcSjsing _SSL_set_tlsext_debug_arg(SSL *s, void *arg) 15679e479edcSjsing { 15686f7f653bSjsing s->tlsext_debug_arg = arg; 15699e479edcSjsing return 1; 15709e479edcSjsing } 15719e479edcSjsing 15729e479edcSjsing static int 1573a6ff6cd4Stb _SSL_get_tlsext_status_type(SSL *s) 1574a6ff6cd4Stb { 1575a6ff6cd4Stb return s->tlsext_status_type; 1576a6ff6cd4Stb } 1577a6ff6cd4Stb 1578a6ff6cd4Stb static int 15799e479edcSjsing _SSL_set_tlsext_status_type(SSL *s, int type) 15809e479edcSjsing { 15819e479edcSjsing s->tlsext_status_type = type; 15829e479edcSjsing return 1; 15839e479edcSjsing } 15849e479edcSjsing 15859e479edcSjsing static int 15869e479edcSjsing _SSL_get_tlsext_status_exts(SSL *s, STACK_OF(X509_EXTENSION) **exts) 15879e479edcSjsing { 15886f7f653bSjsing *exts = s->tlsext_ocsp_exts; 15899e479edcSjsing return 1; 15909e479edcSjsing } 15919e479edcSjsing 15929e479edcSjsing static int 15939e479edcSjsing _SSL_set_tlsext_status_exts(SSL *s, STACK_OF(X509_EXTENSION) *exts) 15949e479edcSjsing { 159540260da0Sjsing /* XXX - leak... */ 15966f7f653bSjsing s->tlsext_ocsp_exts = exts; 15979e479edcSjsing return 1; 15989e479edcSjsing } 15999e479edcSjsing 16009e479edcSjsing static int 16019e479edcSjsing _SSL_get_tlsext_status_ids(SSL *s, STACK_OF(OCSP_RESPID) **ids) 16029e479edcSjsing { 16036f7f653bSjsing *ids = s->tlsext_ocsp_ids; 16049e479edcSjsing return 1; 16059e479edcSjsing } 16069e479edcSjsing 16079e479edcSjsing static int 16089e479edcSjsing _SSL_set_tlsext_status_ids(SSL *s, STACK_OF(OCSP_RESPID) *ids) 16099e479edcSjsing { 161040260da0Sjsing /* XXX - leak... */ 16116f7f653bSjsing s->tlsext_ocsp_ids = ids; 16129e479edcSjsing return 1; 16139e479edcSjsing } 16149e479edcSjsing 16159e479edcSjsing static int 16169e479edcSjsing _SSL_get_tlsext_status_ocsp_resp(SSL *s, unsigned char **resp) 16179e479edcSjsing { 16186f7f653bSjsing if (s->tlsext_ocsp_resp != NULL && 16196f7f653bSjsing s->tlsext_ocsp_resp_len < INT_MAX) { 16206f7f653bSjsing *resp = s->tlsext_ocsp_resp; 16216f7f653bSjsing return (int)s->tlsext_ocsp_resp_len; 1622d875fefdSjsing } 1623d875fefdSjsing 1624d875fefdSjsing *resp = NULL; 1625d875fefdSjsing 1626d875fefdSjsing return -1; 16279e479edcSjsing } 16289e479edcSjsing 16299e479edcSjsing static int 16309e479edcSjsing _SSL_set_tlsext_status_ocsp_resp(SSL *s, unsigned char *resp, int resp_len) 16319e479edcSjsing { 16326f7f653bSjsing free(s->tlsext_ocsp_resp); 16336f7f653bSjsing s->tlsext_ocsp_resp = NULL; 16346f7f653bSjsing s->tlsext_ocsp_resp_len = 0; 1635d875fefdSjsing 1636d875fefdSjsing if (resp_len < 0) 1637d875fefdSjsing return 0; 1638d875fefdSjsing 16396f7f653bSjsing s->tlsext_ocsp_resp = resp; 16406f7f653bSjsing s->tlsext_ocsp_resp_len = (size_t)resp_len; 1641d875fefdSjsing 16429e479edcSjsing return 1; 16439e479edcSjsing } 16449e479edcSjsing 1645fb6b53e4Sjsing int 16463ce15fffSjsing SSL_set0_chain(SSL *ssl, STACK_OF(X509) *chain) 16473ce15fffSjsing { 16485dbcc7f0Stb return ssl_cert_set0_chain(NULL, ssl, chain); 16493ce15fffSjsing } 165071e04849Sbeck LSSL_ALIAS(SSL_set0_chain); 16513ce15fffSjsing 16523ce15fffSjsing int 16533ce15fffSjsing SSL_set1_chain(SSL *ssl, STACK_OF(X509) *chain) 16543ce15fffSjsing { 16555dbcc7f0Stb return ssl_cert_set1_chain(NULL, ssl, chain); 16563ce15fffSjsing } 165771e04849Sbeck LSSL_ALIAS(SSL_set1_chain); 16583ce15fffSjsing 16593ce15fffSjsing int 16603ce15fffSjsing SSL_add0_chain_cert(SSL *ssl, X509 *x509) 16613ce15fffSjsing { 1662dc2a950bStb return ssl_cert_add0_chain_cert(NULL, ssl, x509); 16633ce15fffSjsing } 166471e04849Sbeck LSSL_ALIAS(SSL_add0_chain_cert); 16653ce15fffSjsing 16663ce15fffSjsing int 16673ce15fffSjsing SSL_add1_chain_cert(SSL *ssl, X509 *x509) 16683ce15fffSjsing { 1669dc2a950bStb return ssl_cert_add1_chain_cert(NULL, ssl, x509); 16703ce15fffSjsing } 167171e04849Sbeck LSSL_ALIAS(SSL_add1_chain_cert); 16723ce15fffSjsing 16733ce15fffSjsing int 16743ce15fffSjsing SSL_get0_chain_certs(const SSL *ssl, STACK_OF(X509) **out_chain) 16753ce15fffSjsing { 16763ce15fffSjsing *out_chain = NULL; 16773ce15fffSjsing 16783ce15fffSjsing if (ssl->cert->key != NULL) 16793ce15fffSjsing *out_chain = ssl->cert->key->chain; 16803ce15fffSjsing 16813ce15fffSjsing return 1; 16823ce15fffSjsing } 168371e04849Sbeck LSSL_ALIAS(SSL_get0_chain_certs); 16843ce15fffSjsing 16853ce15fffSjsing int 16863ce15fffSjsing SSL_clear_chain_certs(SSL *ssl) 16873ce15fffSjsing { 16885dbcc7f0Stb return ssl_cert_set0_chain(NULL, ssl, NULL); 16893ce15fffSjsing } 169071e04849Sbeck LSSL_ALIAS(SSL_clear_chain_certs); 16913ce15fffSjsing 16923ce15fffSjsing int 1693fb6b53e4Sjsing SSL_set1_groups(SSL *s, const int *groups, size_t groups_len) 1694fb6b53e4Sjsing { 16956f7f653bSjsing return tls1_set_groups(&s->tlsext_supportedgroups, 16966f7f653bSjsing &s->tlsext_supportedgroups_length, groups, groups_len); 1697fb6b53e4Sjsing } 169871e04849Sbeck LSSL_ALIAS(SSL_set1_groups); 1699fb6b53e4Sjsing 1700fb6b53e4Sjsing int 1701fb6b53e4Sjsing SSL_set1_groups_list(SSL *s, const char *groups) 1702fb6b53e4Sjsing { 17036f7f653bSjsing return tls1_set_group_list(&s->tlsext_supportedgroups, 17046f7f653bSjsing &s->tlsext_supportedgroups_length, groups); 1705fb6b53e4Sjsing } 170671e04849Sbeck LSSL_ALIAS(SSL_set1_groups_list); 1707fb6b53e4Sjsing 17080b5e30a3Sjsing static int 17090b5e30a3Sjsing _SSL_get_signature_nid(SSL *s, int *nid) 17100b5e30a3Sjsing { 17110b5e30a3Sjsing const struct ssl_sigalg *sigalg; 17120b5e30a3Sjsing 171302876cc3Sjsing if ((sigalg = s->s3->hs.our_sigalg) == NULL) 17140b5e30a3Sjsing return 0; 17150b5e30a3Sjsing 17160b5e30a3Sjsing *nid = EVP_MD_type(sigalg->md()); 17170b5e30a3Sjsing 17180b5e30a3Sjsing return 1; 17190b5e30a3Sjsing } 17200b5e30a3Sjsing 17210b5e30a3Sjsing static int 17220b5e30a3Sjsing _SSL_get_peer_signature_nid(SSL *s, int *nid) 17230b5e30a3Sjsing { 17240b5e30a3Sjsing const struct ssl_sigalg *sigalg; 17250b5e30a3Sjsing 172602876cc3Sjsing if ((sigalg = s->s3->hs.peer_sigalg) == NULL) 17270b5e30a3Sjsing return 0; 17280b5e30a3Sjsing 17290b5e30a3Sjsing *nid = EVP_MD_type(sigalg->md()); 17300b5e30a3Sjsing 17310b5e30a3Sjsing return 1; 17320b5e30a3Sjsing } 17330b5e30a3Sjsing 17340b5e30a3Sjsing int 17350b5e30a3Sjsing SSL_get_signature_type_nid(const SSL *s, int *nid) 17360b5e30a3Sjsing { 17370b5e30a3Sjsing const struct ssl_sigalg *sigalg; 17380b5e30a3Sjsing 173902876cc3Sjsing if ((sigalg = s->s3->hs.our_sigalg) == NULL) 17400b5e30a3Sjsing return 0; 17410b5e30a3Sjsing 17420b5e30a3Sjsing *nid = sigalg->key_type; 17430b5e30a3Sjsing if (sigalg->key_type == EVP_PKEY_RSA && 17440b5e30a3Sjsing (sigalg->flags & SIGALG_FLAG_RSA_PSS)) 17450b5e30a3Sjsing *nid = EVP_PKEY_RSA_PSS; 17460b5e30a3Sjsing 17470b5e30a3Sjsing return 1; 17480b5e30a3Sjsing } 174920a14f12Stb LSSL_ALIAS(SSL_get_signature_type_nid); 17500b5e30a3Sjsing 17510b5e30a3Sjsing int 17520b5e30a3Sjsing SSL_get_peer_signature_type_nid(const SSL *s, int *nid) 17530b5e30a3Sjsing { 17540b5e30a3Sjsing const struct ssl_sigalg *sigalg; 17550b5e30a3Sjsing 175602876cc3Sjsing if ((sigalg = s->s3->hs.peer_sigalg) == NULL) 17570b5e30a3Sjsing return 0; 17580b5e30a3Sjsing 17590b5e30a3Sjsing *nid = sigalg->key_type; 17600b5e30a3Sjsing if (sigalg->key_type == EVP_PKEY_RSA && 17610b5e30a3Sjsing (sigalg->flags & SIGALG_FLAG_RSA_PSS)) 17620b5e30a3Sjsing *nid = EVP_PKEY_RSA_PSS; 17630b5e30a3Sjsing 17640b5e30a3Sjsing return 1; 17650b5e30a3Sjsing } 176620a14f12Stb LSSL_ALIAS(SSL_get_peer_signature_type_nid); 17670b5e30a3Sjsing 17684e3cd986Sjsing long 17694e3cd986Sjsing ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) 17705b37fcf3Sryker { 17714e3cd986Sjsing switch (cmd) { 17725b37fcf3Sryker case SSL_CTRL_GET_SESSION_REUSED: 1773fb6b53e4Sjsing return _SSL_session_reused(s); 1774fb6b53e4Sjsing 17755b37fcf3Sryker case SSL_CTRL_GET_NUM_RENEGOTIATIONS: 1776fb6b53e4Sjsing return _SSL_num_renegotiations(s); 1777fb6b53e4Sjsing 17785b37fcf3Sryker case SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS: 1779fb6b53e4Sjsing return _SSL_clear_num_renegotiations(s); 1780fb6b53e4Sjsing 17815b37fcf3Sryker case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS: 1782fb6b53e4Sjsing return _SSL_total_renegotiations(s); 1783fb6b53e4Sjsing 1784913ec974Sbeck case SSL_CTRL_SET_TMP_DH: 17859e479edcSjsing return _SSL_set_tmp_dh(s, parg); 178695986511Sjsing 1787913ec974Sbeck case SSL_CTRL_SET_TMP_DH_CB: 1788c9d7abb7Sbeck SSLerror(s, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 1789a721245fSjsing return 0; 179095986511Sjsing 179195986511Sjsing case SSL_CTRL_SET_DH_AUTO: 1792a721245fSjsing return _SSL_set_dh_auto(s, larg); 179395986511Sjsing 17944fcf65c5Sdjm case SSL_CTRL_SET_TMP_ECDH: 17959e479edcSjsing return _SSL_set_tmp_ecdh(s, parg); 17963dd4fa14Sjsing 17974fcf65c5Sdjm case SSL_CTRL_SET_TMP_ECDH_CB: 1798c9d7abb7Sbeck SSLerror(s, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 179998f792b1Sjsing return 0; 18003dd4fa14Sjsing 1801a721245fSjsing case SSL_CTRL_SET_ECDH_AUTO: 1802a721245fSjsing return _SSL_set_ecdh_auto(s, larg); 1803a721245fSjsing 18044fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_HOSTNAME: 18059e479edcSjsing if (larg != TLSEXT_NAMETYPE_host_name) { 1806c9d7abb7Sbeck SSLerror(s, SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE); 18074fcf65c5Sdjm return 0; 18084fcf65c5Sdjm } 18099e479edcSjsing return _SSL_set_tlsext_host_name(s, parg); 1810a721245fSjsing 18114fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_DEBUG_ARG: 18129e479edcSjsing return _SSL_set_tlsext_debug_arg(s, parg); 18134fcf65c5Sdjm 1814a6ff6cd4Stb case SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE: 1815a6ff6cd4Stb return _SSL_get_tlsext_status_type(s); 1816a6ff6cd4Stb 18174fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE: 18189e479edcSjsing return _SSL_set_tlsext_status_type(s, larg); 18194fcf65c5Sdjm 18204fcf65c5Sdjm case SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS: 18219e479edcSjsing return _SSL_get_tlsext_status_exts(s, parg); 18224fcf65c5Sdjm 18234fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS: 18249e479edcSjsing return _SSL_set_tlsext_status_exts(s, parg); 18254fcf65c5Sdjm 18264fcf65c5Sdjm case SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS: 18279e479edcSjsing return _SSL_get_tlsext_status_ids(s, parg); 18284fcf65c5Sdjm 18294fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS: 18309e479edcSjsing return _SSL_set_tlsext_status_ids(s, parg); 18314fcf65c5Sdjm 18324fcf65c5Sdjm case SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP: 18339e479edcSjsing return _SSL_get_tlsext_status_ocsp_resp(s, parg); 18344fcf65c5Sdjm 18354fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP: 18369e479edcSjsing return _SSL_set_tlsext_status_ocsp_resp(s, parg, larg); 18374fcf65c5Sdjm 18383ce15fffSjsing case SSL_CTRL_CHAIN: 18393ce15fffSjsing if (larg == 0) 18403ce15fffSjsing return SSL_set0_chain(s, (STACK_OF(X509) *)parg); 18413ce15fffSjsing else 18423ce15fffSjsing return SSL_set1_chain(s, (STACK_OF(X509) *)parg); 18433ce15fffSjsing 18443ce15fffSjsing case SSL_CTRL_CHAIN_CERT: 18453ce15fffSjsing if (larg == 0) 18463ce15fffSjsing return SSL_add0_chain_cert(s, (X509 *)parg); 18473ce15fffSjsing else 18483ce15fffSjsing return SSL_add1_chain_cert(s, (X509 *)parg); 18493ce15fffSjsing 18503ce15fffSjsing case SSL_CTRL_GET_CHAIN_CERTS: 18513ce15fffSjsing return SSL_get0_chain_certs(s, (STACK_OF(X509) **)parg); 18523ce15fffSjsing 1853468e1c08Sjsing case SSL_CTRL_SET_GROUPS: 1854468e1c08Sjsing return SSL_set1_groups(s, parg, larg); 1855468e1c08Sjsing 1856468e1c08Sjsing case SSL_CTRL_SET_GROUPS_LIST: 1857468e1c08Sjsing return SSL_set1_groups_list(s, parg); 1858468e1c08Sjsing 1859e1a22fe8Stb case SSL_CTRL_GET_SHARED_GROUP: 1860e1a22fe8Stb return _SSL_get_shared_group(s, larg); 1861e1a22fe8Stb 186299675379Sjsing /* XXX - rename to SSL_CTRL_GET_PEER_TMP_KEY and remove server check. */ 1863c640b633Sjsing case SSL_CTRL_GET_SERVER_TMP_KEY: 186499675379Sjsing if (s->server != 0) 186599675379Sjsing return 0; 186699675379Sjsing return _SSL_get_peer_tmp_key(s, parg); 1867c640b633Sjsing 1868870628e8Sjca case SSL_CTRL_GET_MIN_PROTO_VERSION: 1869870628e8Sjca return SSL_get_min_proto_version(s); 1870870628e8Sjca 1871870628e8Sjca case SSL_CTRL_GET_MAX_PROTO_VERSION: 1872870628e8Sjca return SSL_get_max_proto_version(s); 1873870628e8Sjca 187443a30d3dSjsing case SSL_CTRL_SET_MIN_PROTO_VERSION: 187543a30d3dSjsing if (larg < 0 || larg > UINT16_MAX) 187698f792b1Sjsing return 0; 187743a30d3dSjsing return SSL_set_min_proto_version(s, larg); 187843a30d3dSjsing 187943a30d3dSjsing case SSL_CTRL_SET_MAX_PROTO_VERSION: 188043a30d3dSjsing if (larg < 0 || larg > UINT16_MAX) 188198f792b1Sjsing return 0; 188243a30d3dSjsing return SSL_set_max_proto_version(s, larg); 188343a30d3dSjsing 18840b5e30a3Sjsing case SSL_CTRL_GET_SIGNATURE_NID: 18850b5e30a3Sjsing return _SSL_get_signature_nid(s, parg); 18860b5e30a3Sjsing 18870b5e30a3Sjsing case SSL_CTRL_GET_PEER_SIGNATURE_NID: 18880b5e30a3Sjsing return _SSL_get_peer_signature_nid(s, parg); 18890b5e30a3Sjsing 1890fb6b53e4Sjsing /* 1891a721245fSjsing * Legacy controls that should eventually be removed. 1892fb6b53e4Sjsing */ 1893fb6b53e4Sjsing case SSL_CTRL_GET_CLIENT_CERT_REQUEST: 189498f792b1Sjsing return 0; 1895fb6b53e4Sjsing 1896fb6b53e4Sjsing case SSL_CTRL_GET_FLAGS: 189798f792b1Sjsing return (int)(s->s3->flags); 1898fb6b53e4Sjsing 1899a721245fSjsing case SSL_CTRL_NEED_TMP_RSA: 190098f792b1Sjsing return 0; 1901a721245fSjsing 1902a721245fSjsing case SSL_CTRL_SET_TMP_RSA: 1903a721245fSjsing case SSL_CTRL_SET_TMP_RSA_CB: 1904a721245fSjsing SSLerror(s, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 190598f792b1Sjsing return 0; 1906ba5406e9Sbeck } 190767f294b8Sjsing 190898f792b1Sjsing return 0; 1909ba5406e9Sbeck } 1910ba5406e9Sbeck 19114e3cd986Sjsing long 19124e3cd986Sjsing ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) 1913ba5406e9Sbeck { 19144e3cd986Sjsing switch (cmd) { 1915ba5406e9Sbeck case SSL_CTRL_SET_TMP_RSA_CB: 1916c9d7abb7Sbeck SSLerror(s, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 1917ea1182e4Sjsing return 0; 1918ea1182e4Sjsing 1919ba5406e9Sbeck case SSL_CTRL_SET_TMP_DH_CB: 1920c0b85757Sjsing s->cert->dhe_params_cb = (DH *(*)(SSL *, int, int))fp; 1921ea1182e4Sjsing return 1; 1922ea1182e4Sjsing 19234fcf65c5Sdjm case SSL_CTRL_SET_TMP_ECDH_CB: 1924ea1182e4Sjsing return 1; 1925ea1182e4Sjsing 19264fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_DEBUG_CB: 19276f7f653bSjsing s->tlsext_debug_cb = (void (*)(SSL *, int , int, 19284fcf65c5Sdjm unsigned char *, int, void *))fp; 1929ea1182e4Sjsing return 1; 19305b37fcf3Sryker } 1931ea1182e4Sjsing 1932ea1182e4Sjsing return 0; 19335b37fcf3Sryker } 19345b37fcf3Sryker 1935289e37d5Sjsing static int 1936289e37d5Sjsing _SSL_CTX_set_tmp_dh(SSL_CTX *ctx, DH *dh) 19375b37fcf3Sryker { 1938c0b85757Sjsing DH *dhe_params; 19395b37fcf3Sryker 1940c0b85757Sjsing if (dh == NULL) { 1941c0b85757Sjsing SSLerrorx(ERR_R_PASSED_NULL_PARAMETER); 1942c0b85757Sjsing return 0; 1943c0b85757Sjsing } 1944c0b85757Sjsing 19451bc539a7Stb if (!ssl_ctx_security_dh(ctx, dh)) { 19461bc539a7Stb SSLerrorx(SSL_R_DH_KEY_TOO_SMALL); 19471bc539a7Stb return 0; 19481bc539a7Stb } 19491bc539a7Stb 1950c0b85757Sjsing if ((dhe_params = DHparams_dup(dh)) == NULL) { 1951c9d7abb7Sbeck SSLerrorx(ERR_R_DH_LIB); 1952f6e3f262Sbeck return 0; 19535b37fcf3Sryker } 1954289e37d5Sjsing 19556f7f653bSjsing DH_free(ctx->cert->dhe_params); 19566f7f653bSjsing ctx->cert->dhe_params = dhe_params; 1957289e37d5Sjsing 1958f6e3f262Sbeck return 1; 19595b37fcf3Sryker } 196095986511Sjsing 1961289e37d5Sjsing static int 1962289e37d5Sjsing _SSL_CTX_set_dh_auto(SSL_CTX *ctx, int state) 19634fcf65c5Sdjm { 19646f7f653bSjsing ctx->cert->dhe_params_auto = state; 1965289e37d5Sjsing return 1; 1966289e37d5Sjsing } 19674fcf65c5Sdjm 1968289e37d5Sjsing static int 1969289e37d5Sjsing _SSL_CTX_set_tmp_ecdh(SSL_CTX *ctx, EC_KEY *ecdh) 1970289e37d5Sjsing { 1971203d15d2Sjsing const EC_GROUP *group; 1972203d15d2Sjsing int nid; 1973289e37d5Sjsing 1974203d15d2Sjsing if (ecdh == NULL) 19754fcf65c5Sdjm return 0; 1976203d15d2Sjsing if ((group = EC_KEY_get0_group(ecdh)) == NULL) 19774fcf65c5Sdjm return 0; 19784fcf65c5Sdjm 1979203d15d2Sjsing nid = EC_GROUP_get_curve_name(group); 1980203d15d2Sjsing return SSL_CTX_set1_groups(ctx, &nid, 1); 19814fcf65c5Sdjm } 1982289e37d5Sjsing 1983289e37d5Sjsing static int 1984289e37d5Sjsing _SSL_CTX_set_ecdh_auto(SSL_CTX *ctx, int state) 1985289e37d5Sjsing { 1986289e37d5Sjsing return 1; 1987289e37d5Sjsing } 1988289e37d5Sjsing 198977f00fa0Sjsing static int 199077f00fa0Sjsing _SSL_CTX_set_tlsext_servername_arg(SSL_CTX *ctx, void *arg) 199177f00fa0Sjsing { 19926f7f653bSjsing ctx->tlsext_servername_arg = arg; 199377f00fa0Sjsing return 1; 199477f00fa0Sjsing } 199577f00fa0Sjsing 199677f00fa0Sjsing static int 199777f00fa0Sjsing _SSL_CTX_get_tlsext_ticket_keys(SSL_CTX *ctx, unsigned char *keys, int keys_len) 199877f00fa0Sjsing { 199977f00fa0Sjsing if (keys == NULL) 200077f00fa0Sjsing return 48; 200177f00fa0Sjsing 200277f00fa0Sjsing if (keys_len != 48) { 200377f00fa0Sjsing SSLerrorx(SSL_R_INVALID_TICKET_KEYS_LENGTH); 200477f00fa0Sjsing return 0; 200577f00fa0Sjsing } 200677f00fa0Sjsing 20076f7f653bSjsing memcpy(keys, ctx->tlsext_tick_key_name, 16); 20086f7f653bSjsing memcpy(keys + 16, ctx->tlsext_tick_hmac_key, 16); 20096f7f653bSjsing memcpy(keys + 32, ctx->tlsext_tick_aes_key, 16); 201077f00fa0Sjsing 201177f00fa0Sjsing return 1; 201277f00fa0Sjsing } 201377f00fa0Sjsing 201477f00fa0Sjsing static int 201577f00fa0Sjsing _SSL_CTX_set_tlsext_ticket_keys(SSL_CTX *ctx, unsigned char *keys, int keys_len) 201677f00fa0Sjsing { 201777f00fa0Sjsing if (keys == NULL) 201877f00fa0Sjsing return 48; 201977f00fa0Sjsing 202077f00fa0Sjsing if (keys_len != 48) { 202177f00fa0Sjsing SSLerrorx(SSL_R_INVALID_TICKET_KEYS_LENGTH); 202277f00fa0Sjsing return 0; 202377f00fa0Sjsing } 202477f00fa0Sjsing 20256f7f653bSjsing memcpy(ctx->tlsext_tick_key_name, keys, 16); 20266f7f653bSjsing memcpy(ctx->tlsext_tick_hmac_key, keys + 16, 16); 20276f7f653bSjsing memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16); 202877f00fa0Sjsing 202977f00fa0Sjsing return 1; 203077f00fa0Sjsing } 203177f00fa0Sjsing 203277f00fa0Sjsing static int 20337617119aSjsing _SSL_CTX_get_tlsext_status_arg(SSL_CTX *ctx, void **arg) 20347617119aSjsing { 20356f7f653bSjsing *arg = ctx->tlsext_status_arg; 20367617119aSjsing return 1; 20377617119aSjsing } 20387617119aSjsing 20397617119aSjsing static int 204077f00fa0Sjsing _SSL_CTX_set_tlsext_status_arg(SSL_CTX *ctx, void *arg) 204177f00fa0Sjsing { 20426f7f653bSjsing ctx->tlsext_status_arg = arg; 204377f00fa0Sjsing return 1; 204477f00fa0Sjsing } 204577f00fa0Sjsing 20463ce15fffSjsing int 20473ce15fffSjsing SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) 20483ce15fffSjsing { 20495dbcc7f0Stb return ssl_cert_set0_chain(ctx, NULL, chain); 20503ce15fffSjsing } 205171e04849Sbeck LSSL_ALIAS(SSL_CTX_set0_chain); 20523ce15fffSjsing 20533ce15fffSjsing int 20543ce15fffSjsing SSL_CTX_set1_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) 20553ce15fffSjsing { 20565dbcc7f0Stb return ssl_cert_set1_chain(ctx, NULL, chain); 20573ce15fffSjsing } 205871e04849Sbeck LSSL_ALIAS(SSL_CTX_set1_chain); 20593ce15fffSjsing 20603ce15fffSjsing int 20613ce15fffSjsing SSL_CTX_add0_chain_cert(SSL_CTX *ctx, X509 *x509) 20623ce15fffSjsing { 2063dc2a950bStb return ssl_cert_add0_chain_cert(ctx, NULL, x509); 20643ce15fffSjsing } 206571e04849Sbeck LSSL_ALIAS(SSL_CTX_add0_chain_cert); 20663ce15fffSjsing 20673ce15fffSjsing int 20683ce15fffSjsing SSL_CTX_add1_chain_cert(SSL_CTX *ctx, X509 *x509) 20693ce15fffSjsing { 2070dc2a950bStb return ssl_cert_add1_chain_cert(ctx, NULL, x509); 20713ce15fffSjsing } 207271e04849Sbeck LSSL_ALIAS(SSL_CTX_add1_chain_cert); 20733ce15fffSjsing 20743ce15fffSjsing int 20753ce15fffSjsing SSL_CTX_get0_chain_certs(const SSL_CTX *ctx, STACK_OF(X509) **out_chain) 20763ce15fffSjsing { 20773ce15fffSjsing *out_chain = NULL; 20783ce15fffSjsing 20796f7f653bSjsing if (ctx->cert->key != NULL) 20806f7f653bSjsing *out_chain = ctx->cert->key->chain; 20813ce15fffSjsing 20823ce15fffSjsing return 1; 20833ce15fffSjsing } 208471e04849Sbeck LSSL_ALIAS(SSL_CTX_get0_chain_certs); 20853ce15fffSjsing 20863ce15fffSjsing int 20873ce15fffSjsing SSL_CTX_clear_chain_certs(SSL_CTX *ctx) 20883ce15fffSjsing { 20895dbcc7f0Stb return ssl_cert_set0_chain(ctx, NULL, NULL); 20903ce15fffSjsing } 209171e04849Sbeck LSSL_ALIAS(SSL_CTX_clear_chain_certs); 20923ce15fffSjsing 209377f00fa0Sjsing static int 209477f00fa0Sjsing _SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *cert) 209577f00fa0Sjsing { 209677f00fa0Sjsing if (ctx->extra_certs == NULL) { 209777f00fa0Sjsing if ((ctx->extra_certs = sk_X509_new_null()) == NULL) 209877f00fa0Sjsing return 0; 209977f00fa0Sjsing } 210077f00fa0Sjsing if (sk_X509_push(ctx->extra_certs, cert) == 0) 210177f00fa0Sjsing return 0; 210277f00fa0Sjsing 210377f00fa0Sjsing return 1; 210477f00fa0Sjsing } 210577f00fa0Sjsing 21062ddd511dSjsing static int 210777f00fa0Sjsing _SSL_CTX_get_extra_chain_certs(SSL_CTX *ctx, STACK_OF(X509) **certs) 210877f00fa0Sjsing { 210977f00fa0Sjsing *certs = ctx->extra_certs; 21108c9e35fdSjsing if (*certs == NULL) 21116f7f653bSjsing *certs = ctx->cert->key->chain; 21128c9e35fdSjsing 21138c9e35fdSjsing return 1; 21148c9e35fdSjsing } 21158c9e35fdSjsing 21168c9e35fdSjsing static int 21178c9e35fdSjsing _SSL_CTX_get_extra_chain_certs_only(SSL_CTX *ctx, STACK_OF(X509) **certs) 21188c9e35fdSjsing { 21198c9e35fdSjsing *certs = ctx->extra_certs; 212077f00fa0Sjsing return 1; 212177f00fa0Sjsing } 212277f00fa0Sjsing 21232ddd511dSjsing static int 212477f00fa0Sjsing _SSL_CTX_clear_extra_chain_certs(SSL_CTX *ctx) 212577f00fa0Sjsing { 212677f00fa0Sjsing sk_X509_pop_free(ctx->extra_certs, X509_free); 212777f00fa0Sjsing ctx->extra_certs = NULL; 212877f00fa0Sjsing return 1; 212977f00fa0Sjsing } 213077f00fa0Sjsing 2131289e37d5Sjsing int 2132289e37d5Sjsing SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups, size_t groups_len) 2133289e37d5Sjsing { 21346f7f653bSjsing return tls1_set_groups(&ctx->tlsext_supportedgroups, 21356f7f653bSjsing &ctx->tlsext_supportedgroups_length, groups, groups_len); 2136289e37d5Sjsing } 213771e04849Sbeck LSSL_ALIAS(SSL_CTX_set1_groups); 2138289e37d5Sjsing 2139289e37d5Sjsing int 2140289e37d5Sjsing SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups) 2141289e37d5Sjsing { 21426f7f653bSjsing return tls1_set_group_list(&ctx->tlsext_supportedgroups, 21436f7f653bSjsing &ctx->tlsext_supportedgroups_length, groups); 2144289e37d5Sjsing } 214571e04849Sbeck LSSL_ALIAS(SSL_CTX_set1_groups_list); 2146289e37d5Sjsing 2147289e37d5Sjsing long 2148289e37d5Sjsing ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) 2149289e37d5Sjsing { 2150289e37d5Sjsing switch (cmd) { 2151289e37d5Sjsing case SSL_CTRL_SET_TMP_DH: 2152289e37d5Sjsing return _SSL_CTX_set_tmp_dh(ctx, parg); 2153289e37d5Sjsing 2154289e37d5Sjsing case SSL_CTRL_SET_TMP_DH_CB: 2155289e37d5Sjsing SSLerrorx(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 2156289e37d5Sjsing return 0; 2157289e37d5Sjsing 2158289e37d5Sjsing case SSL_CTRL_SET_DH_AUTO: 2159289e37d5Sjsing return _SSL_CTX_set_dh_auto(ctx, larg); 2160289e37d5Sjsing 2161289e37d5Sjsing case SSL_CTRL_SET_TMP_ECDH: 2162289e37d5Sjsing return _SSL_CTX_set_tmp_ecdh(ctx, parg); 21633dd4fa14Sjsing 21644fcf65c5Sdjm case SSL_CTRL_SET_TMP_ECDH_CB: 2165c9d7abb7Sbeck SSLerrorx(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 2166289e37d5Sjsing return 0; 2167289e37d5Sjsing 2168289e37d5Sjsing case SSL_CTRL_SET_ECDH_AUTO: 2169289e37d5Sjsing return _SSL_CTX_set_ecdh_auto(ctx, larg); 21703dd4fa14Sjsing 21714fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG: 217277f00fa0Sjsing return _SSL_CTX_set_tlsext_servername_arg(ctx, parg); 217377f00fa0Sjsing 217477f00fa0Sjsing case SSL_CTRL_GET_TLSEXT_TICKET_KEYS: 217577f00fa0Sjsing return _SSL_CTX_get_tlsext_ticket_keys(ctx, parg, larg); 21763dd4fa14Sjsing 21774fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_TICKET_KEYS: 217877f00fa0Sjsing return _SSL_CTX_set_tlsext_ticket_keys(ctx, parg, larg); 21794fcf65c5Sdjm 21807617119aSjsing case SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG: 21817617119aSjsing return _SSL_CTX_get_tlsext_status_arg(ctx, parg); 21827617119aSjsing 21834fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG: 218477f00fa0Sjsing return _SSL_CTX_set_tlsext_status_arg(ctx, parg); 21854fcf65c5Sdjm 21863ce15fffSjsing case SSL_CTRL_CHAIN: 21873ce15fffSjsing if (larg == 0) 21883ce15fffSjsing return SSL_CTX_set0_chain(ctx, (STACK_OF(X509) *)parg); 21893ce15fffSjsing else 21903ce15fffSjsing return SSL_CTX_set1_chain(ctx, (STACK_OF(X509) *)parg); 21913ce15fffSjsing 21923ce15fffSjsing case SSL_CTRL_CHAIN_CERT: 21933ce15fffSjsing if (larg == 0) 21943ce15fffSjsing return SSL_CTX_add0_chain_cert(ctx, (X509 *)parg); 21953ce15fffSjsing else 21963ce15fffSjsing return SSL_CTX_add1_chain_cert(ctx, (X509 *)parg); 21973ce15fffSjsing 21983ce15fffSjsing case SSL_CTRL_GET_CHAIN_CERTS: 21993ce15fffSjsing return SSL_CTX_get0_chain_certs(ctx, (STACK_OF(X509) **)parg); 22003ce15fffSjsing 2201913ec974Sbeck case SSL_CTRL_EXTRA_CHAIN_CERT: 220277f00fa0Sjsing return _SSL_CTX_add_extra_chain_cert(ctx, parg); 2203913ec974Sbeck 22045cdd308eSdjm case SSL_CTRL_GET_EXTRA_CHAIN_CERTS: 22058c9e35fdSjsing if (larg == 0) 220677f00fa0Sjsing return _SSL_CTX_get_extra_chain_certs(ctx, parg); 22078c9e35fdSjsing else 22088c9e35fdSjsing return _SSL_CTX_get_extra_chain_certs_only(ctx, parg); 22095cdd308eSdjm 22105cdd308eSdjm case SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS: 221177f00fa0Sjsing return _SSL_CTX_clear_extra_chain_certs(ctx); 22125cdd308eSdjm 2213468e1c08Sjsing case SSL_CTRL_SET_GROUPS: 2214468e1c08Sjsing return SSL_CTX_set1_groups(ctx, parg, larg); 2215468e1c08Sjsing 2216468e1c08Sjsing case SSL_CTRL_SET_GROUPS_LIST: 2217468e1c08Sjsing return SSL_CTX_set1_groups_list(ctx, parg); 2218468e1c08Sjsing 2219870628e8Sjca case SSL_CTRL_GET_MIN_PROTO_VERSION: 2220870628e8Sjca return SSL_CTX_get_min_proto_version(ctx); 2221870628e8Sjca 2222870628e8Sjca case SSL_CTRL_GET_MAX_PROTO_VERSION: 2223870628e8Sjca return SSL_CTX_get_max_proto_version(ctx); 2224870628e8Sjca 222543a30d3dSjsing case SSL_CTRL_SET_MIN_PROTO_VERSION: 222643a30d3dSjsing if (larg < 0 || larg > UINT16_MAX) 2227ea1182e4Sjsing return 0; 222843a30d3dSjsing return SSL_CTX_set_min_proto_version(ctx, larg); 222943a30d3dSjsing 223043a30d3dSjsing case SSL_CTRL_SET_MAX_PROTO_VERSION: 223143a30d3dSjsing if (larg < 0 || larg > UINT16_MAX) 2232ea1182e4Sjsing return 0; 223343a30d3dSjsing return SSL_CTX_set_max_proto_version(ctx, larg); 223443a30d3dSjsing 2235289e37d5Sjsing /* 2236289e37d5Sjsing * Legacy controls that should eventually be removed. 2237289e37d5Sjsing */ 2238289e37d5Sjsing case SSL_CTRL_NEED_TMP_RSA: 2239289e37d5Sjsing return 0; 2240289e37d5Sjsing 2241289e37d5Sjsing case SSL_CTRL_SET_TMP_RSA: 2242289e37d5Sjsing case SSL_CTRL_SET_TMP_RSA_CB: 2243289e37d5Sjsing SSLerrorx(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 2244289e37d5Sjsing return 0; 22455b37fcf3Sryker } 2246ea1182e4Sjsing 2247ea1182e4Sjsing return 0; 22485b37fcf3Sryker } 22495b37fcf3Sryker 22504e3cd986Sjsing long 22514e3cd986Sjsing ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) 2252ba5406e9Sbeck { 22534e3cd986Sjsing switch (cmd) { 2254ba5406e9Sbeck case SSL_CTRL_SET_TMP_RSA_CB: 2255c9d7abb7Sbeck SSLerrorx(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 2256ea1182e4Sjsing return 0; 22573dd4fa14Sjsing 2258ba5406e9Sbeck case SSL_CTRL_SET_TMP_DH_CB: 22596f7f653bSjsing ctx->cert->dhe_params_cb = 2260ea1182e4Sjsing (DH *(*)(SSL *, int, int))fp; 2261ea1182e4Sjsing return 1; 22623dd4fa14Sjsing 22634fcf65c5Sdjm case SSL_CTRL_SET_TMP_ECDH_CB: 2264ea1182e4Sjsing return 1; 22653dd4fa14Sjsing 22664fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB: 22676f7f653bSjsing ctx->tlsext_servername_callback = 226864b912a0Smcbride (int (*)(SSL *, int *, void *))fp; 2269ea1182e4Sjsing return 1; 22704fcf65c5Sdjm 22717617119aSjsing case SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB: 22726f7f653bSjsing *(int (**)(SSL *, void *))fp = ctx->tlsext_status_cb; 22737617119aSjsing return 1; 22747617119aSjsing 22754fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB: 22766f7f653bSjsing ctx->tlsext_status_cb = (int (*)(SSL *, void *))fp; 2277ea1182e4Sjsing return 1; 22784fcf65c5Sdjm 22794fcf65c5Sdjm case SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB: 22806f7f653bSjsing ctx->tlsext_ticket_key_cb = (int (*)(SSL *, unsigned char *, 22814e3cd986Sjsing unsigned char *, EVP_CIPHER_CTX *, HMAC_CTX *, int))fp; 2282ea1182e4Sjsing return 1; 2283ba5406e9Sbeck } 2284ea1182e4Sjsing 2285ea1182e4Sjsing return 0; 2286ba5406e9Sbeck } 2287ba5406e9Sbeck 2288bdb32033Sjsing SSL_CIPHER * 2289bdb32033Sjsing ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, 2290da347917Sbeck STACK_OF(SSL_CIPHER) *srvr) 22915b37fcf3Sryker { 22929737895dSjsing unsigned long alg_k, alg_a, mask_k, mask_a; 2293be381206Sjsing STACK_OF(SSL_CIPHER) *prio, *allow; 2294be381206Sjsing SSL_CIPHER *c, *ret = NULL; 22956806c1e8Sjsing int can_use_ecc; 2296c5270c5dStb int i, ii, nid, ok; 2297ef36d1f9Sjsing SSL_CERT *cert; 22985b37fcf3Sryker 2299913ec974Sbeck /* Let's see which ciphers we can support */ 23005b37fcf3Sryker cert = s->cert; 23015b37fcf3Sryker 2302c5270c5dStb can_use_ecc = tls1_get_supported_group(s, &nid); 23036806c1e8Sjsing 230464b912a0Smcbride /* 230564b912a0Smcbride * Do not set the compare functions, because this may lead to a 2306da347917Sbeck * reordering by "id". We want to keep the original ordering. 2307da347917Sbeck * We may pay a price in performance during sk_SSL_CIPHER_find(), 2308da347917Sbeck * but would have to pay with the price of sk_SSL_CIPHER_dup(). 2309da347917Sbeck */ 2310913ec974Sbeck 23116f7f653bSjsing if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) { 2312da347917Sbeck prio = srvr; 2313da347917Sbeck allow = clnt; 23144e3cd986Sjsing } else { 2315da347917Sbeck prio = clnt; 2316da347917Sbeck allow = srvr; 2317da347917Sbeck } 2318da347917Sbeck 23194e3cd986Sjsing for (i = 0; i < sk_SSL_CIPHER_num(prio); i++) { 2320da347917Sbeck c = sk_SSL_CIPHER_value(prio, i); 2321913ec974Sbeck 2322e27a4fbcSjsing /* Skip TLS v1.2 only ciphersuites if not supported. */ 23235cdd308eSdjm if ((c->algorithm_ssl & SSL_TLSV1_2) && 2324e27a4fbcSjsing !SSL_USE_TLS1_2_CIPHERS(s)) 23255cdd308eSdjm continue; 23265cdd308eSdjm 2327d86fea23Sjsing /* Skip TLS v1.3 only ciphersuites if not supported. */ 2328d86fea23Sjsing if ((c->algorithm_ssl & SSL_TLSV1_3) && 2329d86fea23Sjsing !SSL_USE_TLS1_3_CIPHERS(s)) 2330d86fea23Sjsing continue; 2331d86fea23Sjsing 2332d86fea23Sjsing /* If TLS v1.3, only allow TLS v1.3 ciphersuites. */ 2333d86fea23Sjsing if (SSL_USE_TLS1_3_CIPHERS(s) && 2334d86fea23Sjsing !(c->algorithm_ssl & SSL_TLSV1_3)) 2335d86fea23Sjsing continue; 2336d86fea23Sjsing 23371fd41f50Stb if (!ssl_security_shared_cipher(s, c)) 23388ca59033Stb continue; 23398ca59033Stb 2340913ec974Sbeck ssl_set_cert_masks(cert, c); 23410a5d6edeSdjm mask_k = cert->mask_k; 23420a5d6edeSdjm mask_a = cert->mask_a; 23435b37fcf3Sryker 23440a5d6edeSdjm alg_k = c->algorithm_mkey; 23450a5d6edeSdjm alg_a = c->algorithm_auth; 23460a5d6edeSdjm 23470a5d6edeSdjm ok = (alg_k & mask_k) && (alg_a & mask_a); 23485b37fcf3Sryker 234964b912a0Smcbride /* 235064b912a0Smcbride * If we are considering an ECC cipher suite that uses our 2351be381206Sjsing * certificate check it. 235264b912a0Smcbride */ 2353335114c3Sjsing if (alg_a & SSL_aECDSA) 2354be381206Sjsing ok = ok && tls1_check_ec_server_key(s); 235564b912a0Smcbride /* 2356be381206Sjsing * If we are considering an ECC cipher suite that uses 2357be381206Sjsing * an ephemeral EC key check it. 235864b912a0Smcbride */ 2359be381206Sjsing if (alg_k & SSL_kECDHE) 23606806c1e8Sjsing ok = ok && can_use_ecc; 23610a5d6edeSdjm 23624e3cd986Sjsing if (!ok) 23634e3cd986Sjsing continue; 23640a5d6edeSdjm ii = sk_SSL_CIPHER_find(allow, c); 23654e3cd986Sjsing if (ii >= 0) { 23660a5d6edeSdjm ret = sk_SSL_CIPHER_value(allow, ii); 23675b37fcf3Sryker break; 23685b37fcf3Sryker } 23695b37fcf3Sryker } 23705b37fcf3Sryker return (ret); 23715b37fcf3Sryker } 23725b37fcf3Sryker 2373170946b3Stb #define SSL3_CT_RSA_SIGN 1 2374170946b3Stb #define SSL3_CT_RSA_FIXED_DH 3 2375170946b3Stb #define SSL3_CT_ECDSA_SIGN 64 2376170946b3Stb 23774e3cd986Sjsing int 237827f1767cSjsing ssl3_get_req_cert_types(SSL *s, CBB *cbb) 23795b37fcf3Sryker { 23800a5d6edeSdjm unsigned long alg_k; 23815b37fcf3Sryker 238202876cc3Sjsing alg_k = s->s3->hs.cipher->algorithm_mkey; 23830a5d6edeSdjm 238427f1767cSjsing if ((alg_k & SSL_kDHE) != 0) { 238527f1767cSjsing if (!CBB_add_u8(cbb, SSL3_CT_RSA_FIXED_DH)) 238627f1767cSjsing return 0; 23875b37fcf3Sryker } 238827f1767cSjsing 238927f1767cSjsing if (!CBB_add_u8(cbb, SSL3_CT_RSA_SIGN)) 239027f1767cSjsing return 0; 23914fcf65c5Sdjm 239264b912a0Smcbride /* 239364b912a0Smcbride * ECDSA certs can be used with RSA cipher suites as well 2394335114c3Sjsing * so we don't need to check for SSL_kECDH or SSL_kECDHE. 23954fcf65c5Sdjm */ 2396170946b3Stb if (!CBB_add_u8(cbb, SSL3_CT_ECDSA_SIGN)) 239727f1767cSjsing return 0; 239880564b92Sdoug 239927f1767cSjsing return 1; 24005b37fcf3Sryker } 24015b37fcf3Sryker 24024e3cd986Sjsing int 24034e3cd986Sjsing ssl3_shutdown(SSL *s) 24045b37fcf3Sryker { 24050a5d6edeSdjm int ret; 24065b37fcf3Sryker 240764b912a0Smcbride /* 240864b912a0Smcbride * Don't do anything much if we have not done the handshake or 240964b912a0Smcbride * we don't want to send messages :-) 241064b912a0Smcbride */ 24116f7f653bSjsing if ((s->quiet_shutdown) || (s->s3->hs.state == SSL_ST_BEFORE)) { 24126f7f653bSjsing s->shutdown = (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); 24135b37fcf3Sryker return (1); 24145b37fcf3Sryker } 24155b37fcf3Sryker 24166f7f653bSjsing if (!(s->shutdown & SSL_SENT_SHUTDOWN)) { 24176f7f653bSjsing s->shutdown|=SSL_SENT_SHUTDOWN; 24185b37fcf3Sryker ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_CLOSE_NOTIFY); 241964b912a0Smcbride /* 242064b912a0Smcbride * Our shutdown alert has been sent now, and if it still needs 242102876cc3Sjsing * to be written, s->s3->alert_dispatch will be true 242264b912a0Smcbride */ 242302876cc3Sjsing if (s->s3->alert_dispatch) 24240a5d6edeSdjm return (-1); /* return WANT_WRITE */ 242502876cc3Sjsing } else if (s->s3->alert_dispatch) { 24265b37fcf3Sryker /* resend it if not sent */ 2427e3dbb073Sjsing ret = ssl3_dispatch_alert(s); 24284e3cd986Sjsing if (ret == -1) { 242964b912a0Smcbride /* 243064b912a0Smcbride * We only get to return -1 here the 2nd/Nth 24310a5d6edeSdjm * invocation, we must have already signalled 24320a5d6edeSdjm * return 0 upon a previous invoation, 243364b912a0Smcbride * return WANT_WRITE 243464b912a0Smcbride */ 24350a5d6edeSdjm return (ret); 24360a5d6edeSdjm } 24376f7f653bSjsing } else if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN)) { 24385b37fcf3Sryker /* If we are waiting for a close from our peer, we are closed */ 24396ba40c14Sjsing s->method->ssl_read_bytes(s, 0, NULL, 0, 0); 24406f7f653bSjsing if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN)) { 24410a5d6edeSdjm return (-1); /* return WANT_READ */ 24420a5d6edeSdjm } 24435b37fcf3Sryker } 24445b37fcf3Sryker 24456f7f653bSjsing if ((s->shutdown == (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN)) && 244602876cc3Sjsing !s->s3->alert_dispatch) 24475b37fcf3Sryker return (1); 24485b37fcf3Sryker else 24495b37fcf3Sryker return (0); 24505b37fcf3Sryker } 24515b37fcf3Sryker 24524e3cd986Sjsing int 24534e3cd986Sjsing ssl3_write(SSL *s, const void *buf, int len) 24545b37fcf3Sryker { 24552fa0eb27Smpi errno = 0; 245691265d58Sjsing 245702876cc3Sjsing if (s->s3->renegotiate) 24584e3cd986Sjsing ssl3_renegotiate_check(s); 24595b37fcf3Sryker 24606ba40c14Sjsing return s->method->ssl_write_bytes(s, SSL3_RT_APPLICATION_DATA, 24616ba40c14Sjsing buf, len); 24625b37fcf3Sryker } 24635b37fcf3Sryker 24644e3cd986Sjsing static int 24654e3cd986Sjsing ssl3_read_internal(SSL *s, void *buf, int len, int peek) 24665b37fcf3Sryker { 24675b37fcf3Sryker int ret; 24685b37fcf3Sryker 24692fa0eb27Smpi errno = 0; 247002876cc3Sjsing if (s->s3->renegotiate) 24714e3cd986Sjsing ssl3_renegotiate_check(s); 247202876cc3Sjsing s->s3->in_read_app_data = 1; 24736ba40c14Sjsing 24746ba40c14Sjsing ret = s->method->ssl_read_bytes(s, SSL3_RT_APPLICATION_DATA, buf, len, 24756ba40c14Sjsing peek); 247602876cc3Sjsing if ((ret == -1) && (s->s3->in_read_app_data == 2)) { 247764b912a0Smcbride /* 24786f7f653bSjsing * ssl3_read_bytes decided to call s->handshake_func, 24797289498eStb * which called ssl3_read_bytes to read handshake data. 2480ba5406e9Sbeck * However, ssl3_read_bytes actually found application data 2481da347917Sbeck * and thinks that application data makes sense here; so disable 248264b912a0Smcbride * handshake processing and try to read application data again. 248364b912a0Smcbride */ 24846f7f653bSjsing s->in_handshake++; 24856ba40c14Sjsing ret = s->method->ssl_read_bytes(s, SSL3_RT_APPLICATION_DATA, 24866ba40c14Sjsing buf, len, peek); 24876f7f653bSjsing s->in_handshake--; 24884e3cd986Sjsing } else 248902876cc3Sjsing s->s3->in_read_app_data = 0; 24905b37fcf3Sryker 24915b37fcf3Sryker return (ret); 24925b37fcf3Sryker } 24935b37fcf3Sryker 24944e3cd986Sjsing int 24954e3cd986Sjsing ssl3_read(SSL *s, void *buf, int len) 24965b37fcf3Sryker { 2497ce6fc090Sbeck return ssl3_read_internal(s, buf, len, 0); 24985b37fcf3Sryker } 24995b37fcf3Sryker 25004e3cd986Sjsing int 25014e3cd986Sjsing ssl3_peek(SSL *s, void *buf, int len) 2502ce6fc090Sbeck { 2503ce6fc090Sbeck return ssl3_read_internal(s, buf, len, 1); 25045b37fcf3Sryker } 25055b37fcf3Sryker 25064e3cd986Sjsing int 25074e3cd986Sjsing ssl3_renegotiate(SSL *s) 25085b37fcf3Sryker { 25096f7f653bSjsing if (s->handshake_func == NULL) 251030f82612Sjsing return 1; 25115b37fcf3Sryker 25125b37fcf3Sryker if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) 251330f82612Sjsing return 0; 25145b37fcf3Sryker 251502876cc3Sjsing s->s3->renegotiate = 1; 251630f82612Sjsing 251730f82612Sjsing return 1; 25185b37fcf3Sryker } 25195b37fcf3Sryker 25204e3cd986Sjsing int 25214e3cd986Sjsing ssl3_renegotiate_check(SSL *s) 25225b37fcf3Sryker { 252330f82612Sjsing if (!s->s3->renegotiate) 252430f82612Sjsing return 0; 252530f82612Sjsing if (SSL_in_init(s) || s->s3->rbuf.left != 0 || s->s3->wbuf.left != 0) 252630f82612Sjsing return 0; 25275b37fcf3Sryker 252802876cc3Sjsing s->s3->hs.state = SSL_ST_RENEGOTIATE; 252902876cc3Sjsing s->s3->renegotiate = 0; 253002876cc3Sjsing s->s3->num_renegotiations++; 253102876cc3Sjsing s->s3->total_renegotiations++; 253230f82612Sjsing 253330f82612Sjsing return 1; 25345b37fcf3Sryker } 2535