xref: /openbsd-src/lib/libssl/s3_lib.c (revision ae0a25824ab36826911195649772780808244ba2)
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