195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * All rights reserved.
395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * This package is an SSL implementation written
595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * by Eric Young (eay@cryptsoft.com).
695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The implementation was written so as to conform with Netscapes SSL.
795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * This library is free for commercial and non-commercial use as long as
995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * the following conditions are aheared to.  The following conditions
1095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * apply to all code found in this distribution, be it the RC4, RSA,
1195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * included with this distribution is covered by the same copyright terms
1395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * except that the holder is Tim Hudson (tjh@cryptsoft.com).
1495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
1595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Copyright remains Eric Young's, and as such any Copyright notices in
1695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * the code are not to be removed.
1795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * If this package is used in a product, Eric Young should be given attribution
1895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * as the author of the parts of the library used.
1995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * This can be in the form of a textual message at program startup or
2095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * in documentation (online or textual) provided with the package.
2195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
2295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Redistribution and use in source and binary forms, with or without
2395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * modification, are permitted provided that the following conditions
2495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * are met:
2595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 1. Redistributions of source code must retain the copyright
2695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    notice, this list of conditions and the following disclaimer.
2795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 2. Redistributions in binary form must reproduce the above copyright
2895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    notice, this list of conditions and the following disclaimer in the
2995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    documentation and/or other materials provided with the distribution.
3095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 3. All advertising materials mentioning features or use of this software
3195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    must display the following acknowledgement:
3295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    "This product includes cryptographic software written by
3395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *     Eric Young (eay@cryptsoft.com)"
3495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    The word 'cryptographic' can be left out if the rouines from the library
3595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    being used are not cryptographic related :-).
3695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 4. If you include any Windows specific code (or a derivative thereof) from
3795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    the apps directory (application code) you must include an acknowledgement:
3895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
3995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
4095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * SUCH DAMAGE.
5195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
5295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The licence and distribution terms for any publically available version or
5395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * derivative of this code cannot be changed.  i.e. this code cannot simply be
5495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * copied and put under another distribution licence
5595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * [including the GNU Public Licence.]
5695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley */
5795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* ====================================================================
5895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
5995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
6095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Redistribution and use in source and binary forms, with or without
6195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * modification, are permitted provided that the following conditions
6295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * are met:
6395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
6495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 1. Redistributions of source code must retain the above copyright
6595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    notice, this list of conditions and the following disclaimer.
6695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
6795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 2. Redistributions in binary form must reproduce the above copyright
6895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    notice, this list of conditions and the following disclaimer in
6995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    the documentation and/or other materials provided with the
7095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    distribution.
7195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
7295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 3. All advertising materials mentioning features or use of this
7395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    software must display the following acknowledgment:
7495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    "This product includes software developed by the OpenSSL Project
7595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
7695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
7795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
7895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    endorse or promote products derived from this software without
7995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    prior written permission. For written permission, please contact
8095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    openssl-core@openssl.org.
8195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
8295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 5. Products derived from this software may not be called "OpenSSL"
8395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    nor may "OpenSSL" appear in their names without prior written
8495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    permission of the OpenSSL Project.
8595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
8695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 6. Redistributions of any form whatsoever must retain the following
8795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    acknowledgment:
8895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    "This product includes software developed by the OpenSSL Project
8995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
9095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
9195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
9295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
9395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
9495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
9595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
9795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
9895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
9995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
10095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
10195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
10295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * OF THE POSSIBILITY OF SUCH DAMAGE.
10395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ====================================================================
10495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
10595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * This product includes cryptographic software written by Eric Young
10695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * (eay@cryptsoft.com).  This product includes software written by Tim
10795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Hudson (tjh@cryptsoft.com).
10895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
10995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley */
11095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* ====================================================================
11195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
11295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
11395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Portions of the attached software ("Contribution") are developed by
11495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
11595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
11695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The Contribution is licensed pursuant to the OpenSSL open source
11795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * license provided above.
11895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
11995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ECC cipher suite support in OpenSSL originally written by
12095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories.
12195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
12295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley */
12395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* ====================================================================
12495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Copyright 2005 Nokia. All rights reserved.
12595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
12695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The portions of the attached software ("Contribution") is developed by
12795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Nokia Corporation and is licensed pursuant to the OpenSSL open source
12895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * license.
12995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
13095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The Contribution, originally written by Mika Kousa and Pasi Eronen of
13195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
13295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * support (see RFC 4279) to OpenSSL.
13395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
13495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * No patent licenses or other rights except those expressly stated in
13595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * the OpenSSL open source license shall be deemed granted or received
13695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * expressly, by implication, estoppel, or otherwise.
13795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
13895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * No assurances are provided by Nokia that the Contribution does not
13995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * infringe the patent or other intellectual property rights of any third
14095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * party or that the license provides you with all the necessary rights
14195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * to make use of the Contribution.
14295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *
14395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
14495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
14595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
14695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
14795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * OTHERWISE. */
14895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
14939482a13aca033b72118807fadd152207e0fad8aDavid Benjamin#include <assert.h>
15095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <stdio.h>
15195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
152676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin#include <openssl/buf.h>
15395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/dh.h>
15495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/md5.h>
15595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/mem.h>
15695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/obj.h>
15795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
15895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include "ssl_locl.h"
15995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
16095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#define SSL3_NUM_CIPHERS	(sizeof(ssl3_ciphers)/sizeof(SSL_CIPHER))
16195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
162d8983ce0f2b083a45416195e05a11f3a2a1d5aedAdam Langley/* FIXED_NONCE_LEN is a macro that results in the correct value to set the
163d8983ce0f2b083a45416195e05a11f3a2a1d5aedAdam Langley * fixed nonce length in SSL_CIPHER.algorithms2. It's the inverse of
164d8983ce0f2b083a45416195e05a11f3a2a1d5aedAdam Langley * SSL_CIPHER_AEAD_FIXED_NONCE_LEN. */
165d8983ce0f2b083a45416195e05a11f3a2a1d5aedAdam Langley#define FIXED_NONCE_LEN(x) ((x/2)<<24)
166d8983ce0f2b083a45416195e05a11f3a2a1d5aedAdam Langley
16795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* list of available SSLv3 ciphers (sorted by id) */
1686f2600199c82330240de9a7f65a801b6f606b7b3David Benjaminconst SSL_CIPHER ssl3_ciphers[]={
16995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
17095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* The RSA ciphers */
17195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Cipher 04 */
17295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
17395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
17495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_TXT_RSA_RC4_128_MD5,
17595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_CK_RSA_RC4_128_MD5,
17695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kRSA,
17795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
17895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_RC4,
17995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_MD5,
18095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SSLV3,
181594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_MEDIUM,
1829447dff5a25980032883975c7d981d9606395938Adam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF|SSL_CIPHER_ALGORITHM2_STATEFUL_AEAD,
18395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
18495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
18595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
18695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
18795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Cipher 05 */
18895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
18995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
19095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_TXT_RSA_RC4_128_SHA,
19195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_CK_RSA_RC4_128_SHA,
19295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kRSA,
19395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
19495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_RC4,
19595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
19695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SSLV3,
197594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_MEDIUM,
19895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
19995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
20095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
20195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
20295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
20395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Cipher 0A */
20495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
20595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
20695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_TXT_RSA_DES_192_CBC3_SHA,
20795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_CK_RSA_DES_192_CBC3_SHA,
20895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kRSA,
20995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
21095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_3DES,
21195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
21295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SSLV3,
213594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
21495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
2158314351bcca46f175e305ba18a5e0040ce06034fAdam Langley	112,
21695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	168,
21795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
21895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
21995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* The Ephemeral DH ciphers */
22095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
22195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Cipher 18 */
22295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
22395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
22495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_TXT_ADH_RC4_128_MD5,
22595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_CK_ADH_RC4_128_MD5,
22695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
22795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aNULL,
22895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_RC4,
22995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_MD5,
23095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SSLV3,
231594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_MEDIUM,
23295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
23395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
23495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
23595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
23695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
23795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* New AES ciphersuites */
23895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Cipher 2F */
23995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
24095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
24195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_RSA_WITH_AES_128_SHA,
24295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_RSA_WITH_AES_128_SHA,
24395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kRSA,
24495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
24595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
24695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
24795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
248594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
24995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
25095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
25195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
25295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
25395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Cipher 33 */
25495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
25595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
25695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_DHE_RSA_WITH_AES_128_SHA,
25795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_DHE_RSA_WITH_AES_128_SHA,
25895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
25995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
26095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
26195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
26295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
263594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
26495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
26595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
26695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
26795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
26895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Cipher 34 */
26995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
27095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
27195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ADH_WITH_AES_128_SHA,
27295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ADH_WITH_AES_128_SHA,
27395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
27495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aNULL,
27595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
27695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
27795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
278594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
27995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
28095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
28195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
28295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
28395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
28495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Cipher 35 */
28595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
28695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
28795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_RSA_WITH_AES_256_SHA,
28895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_RSA_WITH_AES_256_SHA,
28995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kRSA,
29095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
29195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
29295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
29395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
294594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
29595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
29695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
29795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
29895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
29995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
30095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Cipher 39 */
30195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
30295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
30395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_DHE_RSA_WITH_AES_256_SHA,
30495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_DHE_RSA_WITH_AES_256_SHA,
30595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
30695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
30795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
30895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
30995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
310594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
31195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
31295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
31395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
31495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
31595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
31695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 3A */
31795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
31895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
31995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ADH_WITH_AES_256_SHA,
32095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ADH_WITH_AES_256_SHA,
32195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
32295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aNULL,
32395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
32495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
32595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
326594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
32795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
32895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
32995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
33095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
33195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
33295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* TLS v1.2 ciphersuites */
33395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 3C */
33495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
33595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
33695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_RSA_WITH_AES_128_SHA256,
33795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_RSA_WITH_AES_128_SHA256,
33895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kRSA,
33995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
34095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
34195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA256,
34295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
343594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
34495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
34595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
34695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
34795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
34895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
34995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 3D */
35095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
35195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
35295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_RSA_WITH_AES_256_SHA256,
35395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_RSA_WITH_AES_256_SHA256,
35495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kRSA,
35595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
35695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
35795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA256,
35895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
359594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
36095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
36195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
36295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
36395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
36495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
36595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
36695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* TLS v1.2 ciphersuites */
36795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 67 */
36895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
36995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
37095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256,
37195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_DHE_RSA_WITH_AES_128_SHA256,
37295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
37395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
37495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
37595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA256,
37695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
377594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
37895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
37995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
38095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
38195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
38295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
38395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 6B */
38495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
38595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
38695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256,
38795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_DHE_RSA_WITH_AES_256_SHA256,
38895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
38995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
39095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
39195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA256,
39295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
393594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
39495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
39595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
39695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
39795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
39895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
39995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 6C */
40095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
40195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
40295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ADH_WITH_AES_128_SHA256,
40395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ADH_WITH_AES_128_SHA256,
40495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
40595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aNULL,
40695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
40795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA256,
40895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
409594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
41095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
41195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
41295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
41395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
41495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
41595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 6D */
41695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
41795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
41895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ADH_WITH_AES_256_SHA256,
41995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ADH_WITH_AES_256_SHA256,
42095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
42195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aNULL,
42295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
42395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA256,
42495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
425594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
42695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
42795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
42895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
42995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
43095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
43195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
43295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 8A */
43395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
43495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
43595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_PSK_WITH_RC4_128_SHA,
43695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_PSK_WITH_RC4_128_SHA,
43795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kPSK,
43895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aPSK,
43995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_RC4,
44095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
44195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
442594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_MEDIUM,
44395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
44495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
44595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
44695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
44795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
44895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 8C */
44995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
45095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
45195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_PSK_WITH_AES_128_CBC_SHA,
45295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_PSK_WITH_AES_128_CBC_SHA,
45395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kPSK,
45495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aPSK,
45595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
45695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
45795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
458594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
45995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
46095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
46195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
46295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
46395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
46495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 8D */
46595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
46695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
46795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_PSK_WITH_AES_256_CBC_SHA,
46895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_PSK_WITH_AES_256_CBC_SHA,
46995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kPSK,
47095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aPSK,
47195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
47295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
47395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
474594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
47595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
47695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
47795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
47895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
47995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
48095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* GCM ciphersuites from RFC5288 */
48195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
48295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 9C */
48395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
48495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
48595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256,
48695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_RSA_WITH_AES_128_GCM_SHA256,
48795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kRSA,
48895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
48995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128GCM,
49095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AEAD,
49195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
492594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
493de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
49495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
49595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
49695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
49795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
49895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 9D */
49995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
50095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
50195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384,
50295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_RSA_WITH_AES_256_GCM_SHA384,
50395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kRSA,
50495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
50595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256GCM,
50695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AEAD,
50795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
508594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
5095c270c590d2f8b3599132385b04d95cb88578f89Adam Langley	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
5105c270c590d2f8b3599132385b04d95cb88578f89Adam Langley		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
51195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
51295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
51395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
51495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
51595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 9E */
51695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
51795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
51895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256,
51995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256,
52095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
52195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
52295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128GCM,
52395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AEAD,
52495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
525594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
526de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
52795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
52895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
52995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
53095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
53195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher 9F */
53295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
53395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
53495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384,
53595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384,
53695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
53795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
53895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256GCM,
53995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AEAD,
54095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
541594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
5425c270c590d2f8b3599132385b04d95cb88578f89Adam Langley	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
5435c270c590d2f8b3599132385b04d95cb88578f89Adam Langley		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
54495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
54595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
54695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
54795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
54895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher A6 */
54995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
55095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
55195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256,
55295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ADH_WITH_AES_128_GCM_SHA256,
55395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
55495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aNULL,
55595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128GCM,
55695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AEAD,
55795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
558594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
559de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
56095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
56195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
56295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
56395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
56495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher A7 */
56595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
56695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
56795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384,
56895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ADH_WITH_AES_256_GCM_SHA384,
56995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEDH,
57095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aNULL,
57195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256GCM,
57295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AEAD,
57395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
574594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
5755c270c590d2f8b3599132385b04d95cb88578f89Adam Langley	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
5765c270c590d2f8b3599132385b04d95cb88578f89Adam Langley		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
57795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
57895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
57995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
58095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
58195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C007 */
58295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
58395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
58495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA,
58595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA,
58695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
58795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aECDSA,
58895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_RC4,
58995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
59095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
591594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_MEDIUM,
59295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
59395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
59495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
59595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
59695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
59795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C009 */
59895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
59995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
60095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
60195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
60295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
60395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aECDSA,
60495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
60595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
60695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
607594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
60895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
60995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
61095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
61195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
61295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
61395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C00A */
61495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
61595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
61695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
61795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
61895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
61995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aECDSA,
62095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
62195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
62295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
623594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
62495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
62595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
62695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
62795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
62895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
62995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C011 */
63095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
63195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
63295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA,
63395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA,
63495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
63595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
63695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_RC4,
63795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
63895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
639594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_MEDIUM,
64095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
64195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
64295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
64395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
64495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
64595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C013 */
64695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
64795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
64895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA,
64995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA,
65095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
65195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
65295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
65395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
65495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
655594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
65695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
65795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
65895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
65995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
66095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
66195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C014 */
66295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
66395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
66495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA,
66595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA,
66695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
66795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
66895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
66995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
67095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
671594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
67295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
67395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
67495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
67595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
67695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
67795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C016 */
67895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
67995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
68095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA,
68195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDH_anon_WITH_RC4_128_SHA,
68295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
68395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aNULL,
68495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_RC4,
68595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
68695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
687594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_MEDIUM,
68895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
68995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
69095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
69195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
69295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
69395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C018 */
69495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
69595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
69695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA,
69795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA,
69895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
69995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aNULL,
70095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
70195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
70295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
703594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
70495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
70595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
70695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
70795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
70895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
70995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C019 */
71095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
71195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
71295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA,
71395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA,
71495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
71595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aNULL,
71695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
71795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA1,
71895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1,
719594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
72095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
72195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
72295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
72395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
72495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
72595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
72695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* HMAC based TLS v1.2 ciphersuites from RFC5289 */
72795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
72895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C023 */
72995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
73095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
73195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256,
73295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256,
73395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
73495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aECDSA,
73595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
73695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA256,
73795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
738594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
73995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
74095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
74195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
74295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
74395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
74495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C024 */
74595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
74695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
74795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384,
74895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384,
74995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
75095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aECDSA,
75195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
75295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA384,
75395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
754594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
75595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
75695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
75795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
75895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
75995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
76095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C027 */
76195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
76295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
76395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256,
76495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256,
76595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
76695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
76795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128,
76895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA256,
76995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
770594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
77195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
77295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
77395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
77495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
77595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
77695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C028 */
77795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
77895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
77995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384,
78095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384,
78195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
78295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
78395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256,
78495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_SHA384,
78595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
786594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
78795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
78895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
78995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
79095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
79195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
79295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* GCM based TLS v1.2 ciphersuites from RFC5289 */
79395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
79495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C02B */
79595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
79695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
79795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
79895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
79995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
80095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aECDSA,
80195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128GCM,
80295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AEAD,
80395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
804594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
805de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
80695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
80795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
80895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
80995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
81095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C02C */
81195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
81295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
81395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
81495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
81595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
81695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aECDSA,
81795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256GCM,
81895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AEAD,
81995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
820594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
8215c270c590d2f8b3599132385b04d95cb88578f89Adam Langley	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
8225c270c590d2f8b3599132385b04d95cb88578f89Adam Langley		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
82395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
82495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
82595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
82695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
82795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C02F */
82895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
82995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
83095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
83195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
83295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
83395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
83495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES128GCM,
83595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AEAD,
83695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
837594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
838de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
83995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
84095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	128,
84195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
84295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
84395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Cipher C030 */
84495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
84595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	1,
84695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
84795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
84895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_kEECDH,
84995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_aRSA,
85095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AES256GCM,
85195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_AEAD,
85295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_TLSV1_2,
853594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH|SSL_FIPS,
8545c270c590d2f8b3599132385b04d95cb88578f89Adam Langley	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
8555c270c590d2f8b3599132385b04d95cb88578f89Adam Langley		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
85695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
85795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	256,
85895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	},
85995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
860c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley    /* ECDH PSK ciphersuites */
861c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	/* Cipher CAFE */
862c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	{
863c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	1,
864c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	TLS1_TXT_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
865c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	TLS1_CK_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
866c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	SSL_kEECDH,
867c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	SSL_aPSK,
868c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	SSL_AES128GCM,
869c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	SSL_AEAD,
870c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	SSL_TLSV1_2,
871594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH,
872c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
873c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
874c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	128,
875c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	128,
876c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley	},
877c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley
87895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
879de0b2026841c34193cacf5c97646b38439e13200Adam Langley	{
880de0b2026841c34193cacf5c97646b38439e13200Adam Langley	1,
881de0b2026841c34193cacf5c97646b38439e13200Adam Langley	TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305,
882de0b2026841c34193cacf5c97646b38439e13200Adam Langley	TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305,
883de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_kEECDH,
884de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_aRSA,
885de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_CHACHA20POLY1305,
886de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_AEAD,
887de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_TLSV1_2,
888594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH,
889de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(0),
890de0b2026841c34193cacf5c97646b38439e13200Adam Langley	256,
891de0b2026841c34193cacf5c97646b38439e13200Adam Langley	0,
892de0b2026841c34193cacf5c97646b38439e13200Adam Langley	},
893de0b2026841c34193cacf5c97646b38439e13200Adam Langley
894de0b2026841c34193cacf5c97646b38439e13200Adam Langley	{
895de0b2026841c34193cacf5c97646b38439e13200Adam Langley	1,
896de0b2026841c34193cacf5c97646b38439e13200Adam Langley	TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
897de0b2026841c34193cacf5c97646b38439e13200Adam Langley	TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305,
898de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_kEECDH,
899de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_aECDSA,
900de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_CHACHA20POLY1305,
901de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_AEAD,
902de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_TLSV1_2,
903594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH,
904de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(0),
905de0b2026841c34193cacf5c97646b38439e13200Adam Langley	256,
906de0b2026841c34193cacf5c97646b38439e13200Adam Langley	0,
907de0b2026841c34193cacf5c97646b38439e13200Adam Langley	},
908de0b2026841c34193cacf5c97646b38439e13200Adam Langley
909de0b2026841c34193cacf5c97646b38439e13200Adam Langley	{
910de0b2026841c34193cacf5c97646b38439e13200Adam Langley	1,
911de0b2026841c34193cacf5c97646b38439e13200Adam Langley	TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305,
912de0b2026841c34193cacf5c97646b38439e13200Adam Langley	TLS1_CK_DHE_RSA_CHACHA20_POLY1305,
913de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_kEDH,
914de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_aRSA,
915de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_CHACHA20POLY1305,
916de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_AEAD,
917de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_TLSV1_2,
918594a58e0781e06597eafc7599e9f88d5ceaeb566David Benjamin	SSL_HIGH,
919de0b2026841c34193cacf5c97646b38439e13200Adam Langley	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(0),
920de0b2026841c34193cacf5c97646b38439e13200Adam Langley	256,
921de0b2026841c34193cacf5c97646b38439e13200Adam Langley	0,
922de0b2026841c34193cacf5c97646b38439e13200Adam Langley	},
923de0b2026841c34193cacf5c97646b38439e13200Adam Langley
92495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* end of list */
92595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	};
92695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
92795c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleySSL3_ENC_METHOD SSLv3_enc_data={
92895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_enc,
92995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	n_ssl3_mac,
93095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_setup_key_block,
93195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_generate_master_secret,
93295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_change_cipher_state,
93395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_final_finish_mac,
93495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
93595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_cert_verify_mac,
93695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_MD_CLIENT_FINISHED_CONST,4,
93795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_MD_SERVER_FINISHED_CONST,4,
93895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_alert_code,
93995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	(int (*)(SSL *, unsigned char *, size_t, const char *,
94095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		 size_t, const unsigned char *, size_t,
94195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		 int use_context))ssl_undefined_function,
94295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	0,
94395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_HM_HEADER_LENGTH,
94495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_set_handshake_header,
94595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_handshake_write
94695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	};
94795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
94895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_num_ciphers(void)
94995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
95095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(SSL3_NUM_CIPHERS);
95195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
95295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
95395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyconst SSL_CIPHER *ssl3_get_cipher(unsigned int u)
95495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
95595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (u < SSL3_NUM_CIPHERS)
95695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(&(ssl3_ciphers[SSL3_NUM_CIPHERS-1-u]));
95795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else
95895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(NULL);
95995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
96095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
96195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_pending(const SSL *s)
96295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
96395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->rstate == SSL_ST_READ_BODY)
96495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return 0;
96595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
96695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? s->s3->rrec.length : 0;
96795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
96895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
96995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyvoid ssl3_set_handshake_header(SSL *s, int htype, unsigned long len)
97095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
97195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	unsigned char *p = (unsigned char *)s->init_buf->data;
97295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	*(p++) = htype;
97395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	l2n3(len, p);
97495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->init_num = (int)len + SSL3_HM_HEADER_LENGTH;
97595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->init_off = 0;
97695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
97795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
97895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_handshake_write(SSL *s)
97995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
98095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return ssl3_do_write(s, SSL3_RT_HANDSHAKE);
98195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
98295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
98395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_new(SSL *s)
98495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
98595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL3_STATE *s3;
98695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
98795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if ((s3=OPENSSL_malloc(sizeof *s3)) == NULL) goto err;
98895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	memset(s3,0,sizeof *s3);
98995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	memset(s3->rrec.seq_num,0,sizeof(s3->rrec.seq_num));
99095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	memset(s3->wrec.seq_num,0,sizeof(s3->wrec.seq_num));
99195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
99295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3=s3;
99395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
9941258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley	s->tlsext_channel_id_enabled = s->ctx->tlsext_channel_id_enabled;
9951258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley	if (s->ctx->tlsext_channel_id_private)
9961258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		s->tlsext_channel_id_private = EVP_PKEY_dup(s->ctx->tlsext_channel_id_private);
99795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->method->ssl_clear(s);
99895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(1);
99995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyerr:
100095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(0);
100195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
100295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
100395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyvoid ssl3_free(SSL *s)
100495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
100595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if(s == NULL)
100695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	    return;
100795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
100895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_cleanup_key_block(s);
100995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->rbuf.buf != NULL)
101095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ssl3_release_read_buffer(s);
101195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->wbuf.buf != NULL)
101295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ssl3_release_write_buffer(s);
101395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->tmp.dh != NULL)
101495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		DH_free(s->s3->tmp.dh);
101595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->tmp.ecdh != NULL)
101695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		EC_KEY_free(s->s3->tmp.ecdh);
101795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
101895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->tmp.ca_names != NULL)
101995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
1020676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin	if (s->s3->tmp.certificate_types != NULL)
1021676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin		OPENSSL_free(s->s3->tmp.certificate_types);
102295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->handshake_buffer) {
102395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		BIO_free(s->s3->handshake_buffer);
102495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
102595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->handshake_dgst) ssl3_free_digest_list(s);
102695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->alpn_selected)
102795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		OPENSSL_free(s->s3->alpn_selected);
102895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
102995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	OPENSSL_cleanse(s->s3,sizeof *s->s3);
103095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	OPENSSL_free(s->s3);
103195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3=NULL;
103295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
103395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
103495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyvoid ssl3_clear(SSL *s)
103595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
103695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	unsigned char *rp,*wp;
103795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	size_t rlen, wlen;
103895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int init_extra;
103995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
104095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl3_cleanup_key_block(s);
104195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->tmp.ca_names != NULL)
104295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
1043676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin	if (s->s3->tmp.certificate_types != NULL)
1044676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin		OPENSSL_free(s->s3->tmp.certificate_types);
1045676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin	s->s3->tmp.num_certificate_types = 0;
104695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
104795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->tmp.dh != NULL)
104895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
104995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		DH_free(s->s3->tmp.dh);
105095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->s3->tmp.dh = NULL;
105195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
105295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->tmp.ecdh != NULL)
105395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
105495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		EC_KEY_free(s->s3->tmp.ecdh);
105595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->s3->tmp.ecdh = NULL;
105695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
105795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rp = s->s3->rbuf.buf;
105895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	wp = s->s3->wbuf.buf;
105995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	rlen = s->s3->rbuf.len;
106095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 	wlen = s->s3->wbuf.len;
106195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	init_extra = s->s3->init_extra;
106295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->handshake_buffer) {
106395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		BIO_free(s->s3->handshake_buffer);
106495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->s3->handshake_buffer = NULL;
106595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
106695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->handshake_dgst) {
106795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ssl3_free_digest_list(s);
106895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
106995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
107095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->alpn_selected)
107195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
1072584d28cad691d8fd7b6cd4766f26513b63434b52HÃ¥vard Molland		OPENSSL_free(s->s3->alpn_selected);
107395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->s3->alpn_selected = NULL;
107495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
107595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	memset(s->s3,0,sizeof *s->s3);
107695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3->rbuf.buf = rp;
107795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3->wbuf.buf = wp;
107895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3->rbuf.len = rlen;
107995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 	s->s3->wbuf.len = wlen;
108095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3->init_extra = init_extra;
108195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
108295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ssl_free_wbio_buffer(s);
108395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
108495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->packet_length=0;
108595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3->renegotiate=0;
108695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3->total_renegotiations=0;
108795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3->num_renegotiations=0;
108895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3->in_read_app_data=0;
10891b96526c6f3a3ba492fd0c7d75ddd4e2414a690cDavid Benjamin	s->version = s->method->version;
109095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
109195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->next_proto_negotiated)
109295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
109395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		OPENSSL_free(s->next_proto_negotiated);
109495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->next_proto_negotiated = NULL;
109595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->next_proto_negotiated_len = 0;
109695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
10971258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley
10981258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley	s->s3->tlsext_channel_id_valid = 0;
109995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
110095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
110195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic int ssl3_set_req_cert_type(CERT *c, const unsigned char *p, size_t len);
110295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
110395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleylong ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
110495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
110595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int ret=0;
110695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
1107457112e1973251a721ae419128d7108844d3c1a3David Benjamin	if (cmd == SSL_CTRL_SET_TMP_RSA ||
110895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	    cmd == SSL_CTRL_SET_TMP_RSA_CB ||
110995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	    cmd == SSL_CTRL_SET_TMP_DH ||
1110457112e1973251a721ae419128d7108844d3c1a3David Benjamin	    cmd == SSL_CTRL_SET_TMP_DH_CB)
111195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
111295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (!ssl_cert_inst(&s->cert))
111395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		    	{
111495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_MALLOC_FAILURE);
111595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return(0);
111695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
111795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
111895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
111995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	switch (cmd)
112095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
112195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_SESSION_REUSED:
112295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret=s->hit;
112395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
112495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_CLIENT_CERT_REQUEST:
112595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
112695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_NUM_RENEGOTIATIONS:
112795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret=s->s3->num_renegotiations;
112895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
112995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS:
113095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret=s->s3->num_renegotiations;
113195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->s3->num_renegotiations=0;
113295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
113395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS:
113495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret=s->s3->total_renegotiations;
113595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
113695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_FLAGS:
113795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret=(int)(s->s3->flags);
113895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
113995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_NEED_TMP_RSA:
114077a942b7fedb58ae1afee042255b4b9267abebcaDavid Benjamin		/* Temporary RSA keys are never used. */
114177a942b7fedb58ae1afee042255b4b9267abebcaDavid Benjamin		ret = 0;
114295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
114395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_RSA:
114477a942b7fedb58ae1afee042255b4b9267abebcaDavid Benjamin		/* Temporary RSA keys are never used. */
114577a942b7fedb58ae1afee042255b4b9267abebcaDavid Benjamin		OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
114695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
114795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_RSA_CB:
114895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
114995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
115095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(ret);
115195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
115295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
115395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_DH:
115495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
115595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			DH *dh = (DH *)parg;
115695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (dh == NULL)
115795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
115895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_PASSED_NULL_PARAMETER);
115995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return(ret);
116095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
116195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if ((dh = DHparams_dup(dh)) == NULL)
116295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
116395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_DH_LIB);
116495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return(ret);
116595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
116695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (!(s->options & SSL_OP_SINGLE_DH_USE))
116795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
116895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				if (!DH_generate_key(dh))
116995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					{
117095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					DH_free(dh);
117195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_DH_LIB);
117295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					return(ret);
117395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					}
117495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
117595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (s->cert->dh_tmp != NULL)
117695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				DH_free(s->cert->dh_tmp);
117795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			s->cert->dh_tmp = dh;
117895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			ret = 1;
117995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
118095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
118195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_DH_CB:
118295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
118395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
118495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(ret);
118595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
118695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
118795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_ECDH:
118895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
118995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		EC_KEY *ecdh = NULL;
119095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
119195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (parg == NULL)
119295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
119395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_PASSED_NULL_PARAMETER);
119495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return(ret);
119595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
119695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (!EC_KEY_up_ref((EC_KEY *)parg))
119795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
119895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_ECDH_LIB);
119995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return(ret);
120095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
120195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ecdh = (EC_KEY *)parg;
120295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (!(s->options & SSL_OP_SINGLE_ECDH_USE))
120395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
120495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (!EC_KEY_generate_key(ecdh))
120595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
120695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				EC_KEY_free(ecdh);
120795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_ECDH_LIB);
120895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return(ret);
120995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
121095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
121195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (s->cert->ecdh_tmp != NULL)
121295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			EC_KEY_free(s->cert->ecdh_tmp);
121395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->cert->ecdh_tmp = ecdh;
121495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret = 1;
121595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
121695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
121795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_ECDH_CB:
121895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
121995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
122095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(ret);
122195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
122295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
122395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TLSEXT_HOSTNAME:
122495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 		if (larg == TLSEXT_NAMETYPE_host_name)
122595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
122695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (s->tlsext_hostname != NULL)
122795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				OPENSSL_free(s->tlsext_hostname);
122895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			s->tlsext_hostname = NULL;
122995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
123095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			ret = 1;
123195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (parg == NULL)
123295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				break;
123395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (strlen((char *)parg) > TLSEXT_MAXLEN_host_name)
123495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
123595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, SSL_R_SSL3_EXT_INVALID_SERVERNAME);
123695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return 0;
123795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
123895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if ((s->tlsext_hostname = BUF_strdup((char *)parg)) == NULL)
123995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
124095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_INTERNAL_ERROR);
124195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return 0;
124295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
124395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
124495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		else
124595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
124695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE);
124795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
124895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
124995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 		break;
125095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TLSEXT_DEBUG_ARG:
125195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->tlsext_debug_arg=parg;
125295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret = 1;
125395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
125495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
125595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_CHAIN:
125695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (larg)
125795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return ssl_cert_set1_chain(s->cert,
125895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley						(STACK_OF (X509) *)parg);
125995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		else
126095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return ssl_cert_set0_chain(s->cert,
126195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley						(STACK_OF (X509) *)parg);
126295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
126395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_CHAIN_CERT:
126495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (larg)
126595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return ssl_cert_add1_chain_cert(s->cert, (X509 *)parg);
126695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		else
126795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return ssl_cert_add0_chain_cert(s->cert, (X509 *)parg);
126895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
126995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_CHAIN_CERTS:
127095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		*(STACK_OF(X509) **)parg = s->cert->key->chain;
127195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
127295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
127395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SELECT_CURRENT_CERT:
127495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return ssl_cert_select_current(s->cert, (X509 *)parg);
127595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
127695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_CURVES:
127795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
1278072334d943ef81d45f75d97cd722b46f1293f773David Benjamin		const uint16_t *clist;
127995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		size_t clistlen;
128095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (!s->session)
128195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
128295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		clist = s->session->tlsext_ellipticcurvelist;
1283072334d943ef81d45f75d97cd722b46f1293f773David Benjamin		clistlen = s->session->tlsext_ellipticcurvelist_length;
128495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (parg)
128595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
128695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			size_t i;
128795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			int *cptr = parg;
1288072334d943ef81d45f75d97cd722b46f1293f773David Benjamin			int nid;
128995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			for (i = 0; i < clistlen; i++)
129095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
1291072334d943ef81d45f75d97cd722b46f1293f773David Benjamin				nid = tls1_ec_curve_id2nid(clist[i]);
1292072334d943ef81d45f75d97cd722b46f1293f773David Benjamin				if (nid != OBJ_undef)
129395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					cptr[i] = nid;
129495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				else
1295072334d943ef81d45f75d97cd722b46f1293f773David Benjamin					cptr[i] = TLSEXT_nid_unknown | clist[i];
129695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
129795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
129895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return (int)clistlen;
129995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
130095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
130195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_CURVES:
130295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return tls1_set_curves(&s->tlsext_ellipticcurvelist,
130395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					&s->tlsext_ellipticcurvelist_length,
130495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley								parg, larg);
130595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
130695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_ECDH_AUTO:
130795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->cert->ecdh_tmp_auto = larg;
130895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return 1;
130995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_SIGALGS:
131095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return tls1_set_sigalgs(s->cert, parg, larg, 0);
131195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
131295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_CLIENT_SIGALGS:
131395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return tls1_set_sigalgs(s->cert, parg, larg, 1);
131495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
131595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_CLIENT_CERT_TYPES:
131695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
131795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		const unsigned char **pctype = parg;
131895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (s->server || !s->s3->tmp.cert_req)
131995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
132095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (pctype)
1321676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin			*pctype = s->s3->tmp.certificate_types;
1322676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin		return (int)s->s3->tmp.num_certificate_types;
132395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
132495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
132595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_CLIENT_CERT_TYPES:
132695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (!s->server)
132795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
132895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return ssl3_set_req_cert_type(s->cert, parg, larg);
132995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
133095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_BUILD_CERT_CHAIN:
133195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return ssl_build_cert_chain(s->cert, s->ctx->cert_store, larg);
133295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
133395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_VERIFY_CERT_STORE:
133495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return ssl_cert_set_cert_store(s->cert, parg, 0, larg);
133595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
133695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_CHAIN_CERT_STORE:
133795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return ssl_cert_set_cert_store(s->cert, parg, 1, larg);
133895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
133995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_PEER_SIGNATURE_NID:
134095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (SSL_USE_SIGALGS(s))
134195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
134295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (s->session && s->session->sess_cert)
134395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
134495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				const EVP_MD *sig;
134595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				sig = s->session->sess_cert->peer_key->digest;
134695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				if (sig)
134795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					{
134895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					*(int *)parg = EVP_MD_type(sig);
134995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					return 1;
135095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					}
135195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
135295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
135395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
135495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* Might want to do something here for other versions */
135595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		else
135695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
135795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
135895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_SERVER_TMP_KEY:
135995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (s->server || !s->session || !s->session->sess_cert)
136095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
136195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		else
136295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
136395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			SESS_CERT *sc;
136495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			EVP_PKEY *ptmp;
136595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			int rv = 0;
136695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			sc = s->session->sess_cert;
1367457112e1973251a721ae419128d7108844d3c1a3David Benjamin			if (!sc->peer_rsa_tmp && !sc->peer_dh_tmp && !sc->peer_ecdh_tmp)
136895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return 0;
136995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			ptmp = EVP_PKEY_new();
137095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (!ptmp)
137195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return 0;
1372457112e1973251a721ae419128d7108844d3c1a3David Benjamin			if (sc->peer_rsa_tmp)
137395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				rv = EVP_PKEY_set1_RSA(ptmp, sc->peer_rsa_tmp);
137495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			else if (sc->peer_dh_tmp)
137595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				rv = EVP_PKEY_set1_DH(ptmp, sc->peer_dh_tmp);
137695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			else if (sc->peer_ecdh_tmp)
137795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				rv = EVP_PKEY_set1_EC_KEY(ptmp, sc->peer_ecdh_tmp);
137895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (rv)
137995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
138095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				*(EVP_PKEY **)parg = ptmp;
138195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return 1;
138295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
138395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			EVP_PKEY_free(ptmp);
138495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
138595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
138695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_EC_POINT_FORMATS:
138795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
138895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		SSL_SESSION *sess = s->session;
138995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		const unsigned char **pformat = parg;
139095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (!sess || !sess->tlsext_ecpointformatlist)
139195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
139295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		*pformat = sess->tlsext_ecpointformatlist;
139395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return (int)sess->tlsext_ecpointformatlist_length;
139495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
13951258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley
13961258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley	case SSL_CTRL_CHANNEL_ID:
13971258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		s->tlsext_channel_id_enabled = 1;
13981258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		ret = 1;
13991258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		break;
14001258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley
14011258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley	case SSL_CTRL_SET_CHANNEL_ID:
14021258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		if (s->server)
14031258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			break;
14041258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		s->tlsext_channel_id_enabled = 1;
14051258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		if (EVP_PKEY_bits(parg) != 256)
14061258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			{
14071258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, SSL_R_CHANNEL_ID_NOT_P256);
14081258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			break;
14091258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			}
14101258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		if (s->tlsext_channel_id_private)
14111258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			EVP_PKEY_free(s->tlsext_channel_id_private);
14121258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		s->tlsext_channel_id_private = EVP_PKEY_dup((EVP_PKEY*) parg);
14131258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		ret = 1;
14141258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		break;
14151258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley
14161258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley	case SSL_CTRL_GET_CHANNEL_ID:
14171258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		if (!s->server)
14181258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			break;
14191258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		if (!s->s3->tlsext_channel_id_valid)
14201258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			break;
14211258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		memcpy(parg, s->s3->tlsext_channel_id, larg < 64 ? larg : 64);
14221258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		return 64;
14231258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley
1424ac61fa379fde449f52f7804aa5e7e39554a37b74Adam Langley	case SSL_CTRL_FALLBACK_SCSV:
1425ac61fa379fde449f52f7804aa5e7e39554a37b74Adam Langley		if (s->server)
1426ac61fa379fde449f52f7804aa5e7e39554a37b74Adam Langley			break;
1427ac61fa379fde449f52f7804aa5e7e39554a37b74Adam Langley		s->fallback_scsv = 1;
1428ac61fa379fde449f52f7804aa5e7e39554a37b74Adam Langley		ret = 1;
1429ac61fa379fde449f52f7804aa5e7e39554a37b74Adam Langley		break;
1430ac61fa379fde449f52f7804aa5e7e39554a37b74Adam Langley
143195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	default:
143295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
143395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
143495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ret);
143595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
143695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
143795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleylong ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void))
143895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
143995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int ret=0;
144095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
1441457112e1973251a721ae419128d7108844d3c1a3David Benjamin	if (cmd == SSL_CTRL_SET_TMP_RSA_CB || cmd == SSL_CTRL_SET_TMP_DH_CB)
144295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
144395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (!ssl_cert_inst(&s->cert))
144495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
144595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_callback_ctrl, ERR_R_MALLOC_FAILURE);
144695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return(0);
144795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
144895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
144995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
145095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	switch (cmd)
145195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
145295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_RSA_CB:
145377a942b7fedb58ae1afee042255b4b9267abebcaDavid Benjamin		/* Ignore the callback; temporary RSA keys are never used. */
145495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
145595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_DH_CB:
145695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
145795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
145895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
145995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
146095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_ECDH_CB:
146195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
146295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->cert->ecdh_tmp_cb = (EC_KEY *(*)(SSL *, int, int))fp;
146395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
146495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
146595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TLSEXT_DEBUG_CB:
146695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->tlsext_debug_cb=(void (*)(SSL *,int ,int,
146795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					unsigned char *, int, void *))fp;
146895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
146995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	default:
147095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
147195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
147295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ret);
147395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
147495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
147595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleylong ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
147695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
147795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	CERT *cert;
147895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
147995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	cert=ctx->cert;
148095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
148195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	switch (cmd)
148295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
148395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_NEED_TMP_RSA:
148477a942b7fedb58ae1afee042255b4b9267abebcaDavid Benjamin		/* Temporary RSA keys are never used. */
148577a942b7fedb58ae1afee042255b4b9267abebcaDavid Benjamin		return 0;
148695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_RSA:
148777a942b7fedb58ae1afee042255b4b9267abebcaDavid Benjamin		OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
148877a942b7fedb58ae1afee042255b4b9267abebcaDavid Benjamin		return 0;
148995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_RSA_CB:
149095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
149195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
149295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(0);
149395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
149495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
149595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_DH:
149695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
149795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		DH *new=NULL,*dh;
149895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
149995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		dh=(DH *)parg;
150095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if ((new=DHparams_dup(dh)) == NULL)
150195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
150295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_DH_LIB);
150395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
150495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
150595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (!(ctx->options & SSL_OP_SINGLE_DH_USE))
150695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
150795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (!DH_generate_key(new))
150895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
150995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_DH_LIB);
151095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				DH_free(new);
151195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return 0;
151295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
151395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
151495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (cert->dh_tmp != NULL)
151595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			DH_free(cert->dh_tmp);
151695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		cert->dh_tmp=new;
151795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return 1;
151895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
151995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/*break; */
152095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_DH_CB:
152195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
152295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
152395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(0);
152495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
152595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
152695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_ECDH:
152795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
152895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		EC_KEY *ecdh = NULL;
152995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
153095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (parg == NULL)
153195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
153295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_ECDH_LIB);
153395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
153495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
153595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ecdh = EC_KEY_dup((EC_KEY *)parg);
153695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (ecdh == NULL)
153795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
153895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_EC_LIB);
153995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
154095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
154195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (!(ctx->options & SSL_OP_SINGLE_ECDH_USE))
154295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
154395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (!EC_KEY_generate_key(ecdh))
154495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
154595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				EC_KEY_free(ecdh);
154695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_ECDH_LIB);
154795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return 0;
154895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
154995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
155095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
155195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (cert->ecdh_tmp != NULL)
155295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
155395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			EC_KEY_free(cert->ecdh_tmp);
155495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
155595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		cert->ecdh_tmp = ecdh;
155695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return 1;
155795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
155895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* break; */
155995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_ECDH_CB:
156095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
156195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
156295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(0);
156395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
156495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
156595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG:
156695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ctx->tlsext_servername_arg=parg;
156795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
156895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TLSEXT_TICKET_KEYS:
156995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_TLSEXT_TICKET_KEYS:
157095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
157195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		unsigned char *keys = parg;
157295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (!keys)
157395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 48;
157495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (larg != 48)
157595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
157695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, SSL_R_INVALID_TICKET_KEYS_LENGTH);
157795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return 0;
157895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
157995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS)
158095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
158195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			memcpy(ctx->tlsext_tick_key_name, keys, 16);
158295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			memcpy(ctx->tlsext_tick_hmac_key, keys + 16, 16);
158395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16);
158495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
158595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		else
158695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
158795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			memcpy(keys, ctx->tlsext_tick_key_name, 16);
158895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			memcpy(keys + 16, ctx->tlsext_tick_hmac_key, 16);
158995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			memcpy(keys + 32, ctx->tlsext_tick_aes_key, 16);
159095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
159195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return 1;
159295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
159395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
159495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG:
159595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ctx->tlsext_status_arg=parg;
159695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return 1;
159795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
159895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
159995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_CURVES:
160095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return tls1_set_curves(&ctx->tlsext_ellipticcurvelist,
160195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					&ctx->tlsext_ellipticcurvelist_length,
160295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley								parg, larg);
160395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
160495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_ECDH_AUTO:
160595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ctx->cert->ecdh_tmp_auto = larg;
160695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return 1;
160795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_SIGALGS:
160895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return tls1_set_sigalgs(ctx->cert, parg, larg, 0);
160995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
161095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_CLIENT_SIGALGS:
161195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return tls1_set_sigalgs(ctx->cert, parg, larg, 1);
161295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
161395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_CLIENT_CERT_TYPES:
161495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return ssl3_set_req_cert_type(ctx->cert, parg, larg);
161595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
161695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_BUILD_CERT_CHAIN:
161795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return ssl_build_cert_chain(ctx->cert, ctx->cert_store, larg);
161895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
161995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_VERIFY_CERT_STORE:
162095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return ssl_cert_set_cert_store(ctx->cert, parg, 0, larg);
162195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
162295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_CHAIN_CERT_STORE:
162395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return ssl_cert_set_cert_store(ctx->cert, parg, 1, larg);
162495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
162595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
162695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* A Thawte special :-) */
162795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_EXTRA_CHAIN_CERT:
162895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (ctx->extra_certs == NULL)
162995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
163095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if ((ctx->extra_certs=sk_X509_new_null()) == NULL)
163195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				return(0);
163295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
163395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		sk_X509_push(ctx->extra_certs,(X509 *)parg);
163495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
163595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
163695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_EXTRA_CHAIN_CERTS:
1637b6333d600e0f54707cba962093ef3eca0312d6bcAdam Langley		if (ctx->extra_certs == NULL && larg == 0)
1638b6333d600e0f54707cba962093ef3eca0312d6bcAdam Langley			*(STACK_OF(X509) **)parg =  ctx->cert->key->chain;
1639b6333d600e0f54707cba962093ef3eca0312d6bcAdam Langley		else
1640b6333d600e0f54707cba962093ef3eca0312d6bcAdam Langley			*(STACK_OF(X509) **)parg =  ctx->extra_certs;
164195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
164295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
164395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS:
164495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (ctx->extra_certs)
164595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
164695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			sk_X509_pop_free(ctx->extra_certs, X509_free);
164795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			ctx->extra_certs = NULL;
164895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
164995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
165095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
165195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_CHAIN:
165295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (larg)
165395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return ssl_cert_set1_chain(ctx->cert,
165495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley						(STACK_OF (X509) *)parg);
165595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		else
165695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return ssl_cert_set0_chain(ctx->cert,
165795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley						(STACK_OF (X509) *)parg);
165895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
165995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_CHAIN_CERT:
166095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (larg)
166195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return ssl_cert_add1_chain_cert(ctx->cert, (X509 *)parg);
166295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		else
166395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return ssl_cert_add0_chain_cert(ctx->cert, (X509 *)parg);
166495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
166595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_GET_CHAIN_CERTS:
166695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		*(STACK_OF(X509) **)parg = ctx->cert->key->chain;
166795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
166895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
166995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SELECT_CURRENT_CERT:
167095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return ssl_cert_select_current(ctx->cert, (X509 *)parg);
167195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
16721258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley	case SSL_CTRL_CHANNEL_ID:
16731258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		/* must be called on a server */
16741258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		if (ctx->method->ssl_accept == ssl_undefined_function)
16751258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			return 0;
16761258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		ctx->tlsext_channel_id_enabled=1;
16771258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		return 1;
16781258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley
16791258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley	case SSL_CTRL_SET_CHANNEL_ID:
16801258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		ctx->tlsext_channel_id_enabled = 1;
16811258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		if (EVP_PKEY_bits(parg) != 256)
16821258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			{
16831258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, SSL_R_CHANNEL_ID_NOT_P256);
16841258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			break;
16851258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			}
16861258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		if (ctx->tlsext_channel_id_private)
16871258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley			EVP_PKEY_free(ctx->tlsext_channel_id_private);
16881258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		ctx->tlsext_channel_id_private = EVP_PKEY_dup((EVP_PKEY*) parg);
16891258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley		break;
16901258b6a756674d63f172602d8041ccc0dffd03d1Adam Langley
169195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	default:
169295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(0);
169395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
169495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(1);
169595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
169695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
169795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleylong ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void))
169895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
169995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	CERT *cert;
170095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
170195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	cert=ctx->cert;
170295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
170395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	switch (cmd)
170495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
170595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_RSA_CB:
170677a942b7fedb58ae1afee042255b4b9267abebcaDavid Benjamin		/* Ignore the callback; temporary RSA keys are never used. */
170795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
170895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_DH_CB:
170995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
171095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
171195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
171295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
171395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TMP_ECDH_CB:
171495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
171595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		cert->ecdh_tmp_cb = (EC_KEY *(*)(SSL *, int, int))fp;
171695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
171795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
171895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB:
171995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ctx->tlsext_servername_callback=(int (*)(SSL *,int *,void *))fp;
172095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
172195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
172295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB:
172395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ctx->tlsext_status_cb=(int (*)(SSL *,void *))fp;
172495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
172595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
172695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	case SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB:
172795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ctx->tlsext_ticket_key_cb=(int (*)(SSL *,unsigned char  *,
172895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley						unsigned char *,
172995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley						EVP_CIPHER_CTX *,
173095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley						HMAC_CTX *, int))fp;
173195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		break;
173295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
173395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	default:
173495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(0);
173595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
173695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(1);
173795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
173895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
173939482a13aca033b72118807fadd152207e0fad8aDavid Benjamin/* ssl3_get_cipher_by_value returns the SSL_CIPHER with value |value| or NULL if
174039482a13aca033b72118807fadd152207e0fad8aDavid Benjamin * none exists.
174139482a13aca033b72118807fadd152207e0fad8aDavid Benjamin *
174239482a13aca033b72118807fadd152207e0fad8aDavid Benjamin * This function needs to check if the ciphers required are actually
174339482a13aca033b72118807fadd152207e0fad8aDavid Benjamin * available. */
174439482a13aca033b72118807fadd152207e0fad8aDavid Benjaminconst SSL_CIPHER *ssl3_get_cipher_by_value(uint16_t value)
174595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
174695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	SSL_CIPHER c;
174739482a13aca033b72118807fadd152207e0fad8aDavid Benjamin
174839482a13aca033b72118807fadd152207e0fad8aDavid Benjamin	c.id = 0x03000000L|value;
174939482a13aca033b72118807fadd152207e0fad8aDavid Benjamin	return bsearch(&c, ssl3_ciphers, SSL3_NUM_CIPHERS, sizeof(SSL_CIPHER), ssl_cipher_id_cmp);
175095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
175195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
175239482a13aca033b72118807fadd152207e0fad8aDavid Benjamin/* ssl3_get_cipher_by_value returns the cipher value of |c|. */
175339482a13aca033b72118807fadd152207e0fad8aDavid Benjaminuint16_t ssl3_get_cipher_value(const SSL_CIPHER *c)
175495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
175539482a13aca033b72118807fadd152207e0fad8aDavid Benjamin	unsigned long id = c->id;
175639482a13aca033b72118807fadd152207e0fad8aDavid Benjamin	/* All ciphers are SSLv3 now. */
175739482a13aca033b72118807fadd152207e0fad8aDavid Benjamin	assert((id & 0xff000000) == 0x03000000);
175839482a13aca033b72118807fadd152207e0fad8aDavid Benjamin	return id & 0xffff;
175995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
176095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
1761858a88daf27975f67d9f63e18f95645be2886bfbAdam Langleystruct ssl_cipher_preference_list_st* ssl_get_cipher_preferences(SSL *s)
1762858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	{
1763858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	if (s->cipher_list != NULL)
1764858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		return(s->cipher_list);
1765858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley
1766858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	if (s->version >= TLS1_1_VERSION)
1767858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		{
1768858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		if (s->ctx != NULL && s->ctx->cipher_list_tls11 != NULL)
1769858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley			return s->ctx->cipher_list_tls11;
1770858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		}
1771858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley
1772858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	if ((s->ctx != NULL) && (s->ctx->cipher_list != NULL))
1773858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		return(s->ctx->cipher_list);
1774858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley
1775858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	return NULL;
1776858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	}
1777858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley
17786f2600199c82330240de9a7f65a801b6f606b7b3David Benjaminconst SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
1779858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	     struct ssl_cipher_preference_list_st *server_pref)
178095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
17816f2600199c82330240de9a7f65a801b6f606b7b3David Benjamin	const SSL_CIPHER *c,*ret=NULL;
1782858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	STACK_OF(SSL_CIPHER) *srvr = server_pref->ciphers, *prio, *allow;
178395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int i,ok;
178495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	size_t cipher_index;
178595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	CERT *cert;
1786060d9d2c563b3fbe00eff93e5033591504516e6cDavid Benjamin	unsigned long alg_k,alg_a,mask_k,mask_a;
1787858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	/* in_group_flags will either be NULL, or will point to an array of
1788858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	 * bytes which indicate equal-preference groups in the |prio| stack.
1789858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	 * See the comment about |in_group_flags| in the
1790858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	 * |ssl_cipher_preference_list_st| struct. */
1791858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	const unsigned char *in_group_flags;
1792858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	/* group_min contains the minimal index so far found in a group, or -1
1793858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	 * if no such value exists yet. */
1794858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley	int group_min = -1;
179595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
179695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Let's see which ciphers we can support */
179795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	cert=s->cert;
179895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
179995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if 0
180095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Do not set the compare functions, because this may lead to a
180195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 * reordering by "id". We want to keep the original ordering.
180295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 * We may pay a price in performance during sk_SSL_CIPHER_find(),
180395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 * but would have to pay with the price of sk_SSL_CIPHER_dup().
180495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 */
180595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sk_SSL_CIPHER_set_cmp_func(srvr, ssl_cipher_ptr_id_cmp);
180695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	sk_SSL_CIPHER_set_cmp_func(clnt, ssl_cipher_ptr_id_cmp);
180795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
180895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
180995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifdef CIPHER_DEBUG
181095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	printf("Server has %d from %p:\n", sk_SSL_CIPHER_num(srvr), (void *)srvr);
181195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	for(i=0 ; i < sk_SSL_CIPHER_num(srvr) ; ++i)
181295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
181395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		c=sk_SSL_CIPHER_value(srvr,i);
181495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		printf("%p:%s\n",(void *)c,c->name);
181595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
181695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	printf("Client sent %d from %p:\n", sk_SSL_CIPHER_num(clnt), (void *)clnt);
181795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	for(i=0 ; i < sk_SSL_CIPHER_num(clnt) ; ++i)
181895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	    {
181995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	    c=sk_SSL_CIPHER_value(clnt,i);
182095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	    printf("%p:%s\n",(void *)c,c->name);
182195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	    }
182295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
182395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
1824335d10d201a22598c2b2c379148c9a095b8ab175David Benjamin	if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE)
182595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
182695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		prio = srvr;
1827858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		in_group_flags = server_pref->in_group_flags;
182895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		allow = clnt;
182995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
183095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else
183195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
183295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		prio = clnt;
1833858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		in_group_flags = NULL;
183495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		allow = srvr;
183595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
183695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
183795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	tls1_set_cert_validity(s);
183895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
183995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	for (i=0; i<sk_SSL_CIPHER_num(prio); i++)
184095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
184195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		c=sk_SSL_CIPHER_value(prio,i);
184295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
1843858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		ok = 1;
1844858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley
184595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* Skip TLS v1.2 only ciphersuites if not supported */
1846858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		if ((c->algorithm_ssl & SSL_TLSV1_2) &&
184795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			!SSL_USE_TLS1_2_CIPHERS(s))
1848858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley			ok = 0;
184995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
185095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ssl_set_cert_masks(cert,c);
185195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		mask_k = cert->mask_k;
185295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		mask_a = cert->mask_a;
185395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
185495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifdef KSSL_DEBUG
185595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/*		printf("ssl3_choose_cipher %d alg= %lx\n", i,c->algorithms);*/
185695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif    /* KSSL_DEBUG */
185795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
185895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		alg_k=c->algorithm_mkey;
185995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		alg_a=c->algorithm_auth;
186095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
186195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* with PSK there must be server callback set */
1862c26c802a8912a813181ea677b7da38d1d3aedcf8Adam Langley		if ((alg_a & SSL_aPSK) && s->psk_server_callback == NULL)
1863858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley			ok = 0;
186495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
1865060d9d2c563b3fbe00eff93e5033591504516e6cDavid Benjamin		ok = ok && (alg_k & mask_k) && (alg_a & mask_a);
186695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#ifdef CIPHER_DEBUG
1867060d9d2c563b3fbe00eff93e5033591504516e6cDavid Benjamin		printf("%d:[%08lX:%08lX:%08lX:%08lX]%p:%s\n",ok,alg_k,alg_a,mask_k,mask_a,(void *)c,
1868060d9d2c563b3fbe00eff93e5033591504516e6cDavid Benjamin		       c->name);
186995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
187095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
187195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* if we are considering an ECC cipher suite that uses
187295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		 * an ephemeral EC key check it */
187395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (alg_k & SSL_kEECDH)
187495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			ok = ok && tls1_check_ec_tmp_key(s, c->id);
187595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
1876858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		if (ok && sk_SSL_CIPHER_find(allow, &cipher_index, c))
187795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
1878858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley			if (in_group_flags != NULL && in_group_flags[i] == 1)
187995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				{
1880858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley				/* This element of |prio| is in a group. Update
1881858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley				 * the minimum index found so far and continue
1882858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley				 * looking. */
1883858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley				if (group_min == -1 || group_min > cipher_index)
1884858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley					group_min = cipher_index;
188595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley				}
1886858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley			else
1887858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley				{
1888858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley				if (group_min != -1 && group_min < cipher_index)
1889858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley					cipher_index = group_min;
1890858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley				ret=sk_SSL_CIPHER_value(allow,cipher_index);
1891858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley				break;
1892858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley				}
1893858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley			}
1894858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley
1895858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		if (in_group_flags != NULL &&
1896858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		    in_group_flags[i] == 0 &&
1897858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley		    group_min != -1)
1898858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley			{
1899858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley			/* We are about to leave a group, but we found a match
1900858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley			 * in it, so that's our answer. */
1901858a88daf27975f67d9f63e18f95645be2886bfbAdam Langley			ret=sk_SSL_CIPHER_value(allow,group_min);
190295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			break;
190395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
190495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
190595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ret);
190695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
190795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
190895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_get_req_cert_type(SSL *s, unsigned char *p)
190995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
191095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int ret=0;
191195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	const unsigned char *sig;
191295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	size_t i, siglen;
1913ef2116d33c3c1b38005eb59caa2aaa6300a9b450David Benjamin	int have_rsa_sign = 0;
191495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int have_ecdsa_sign = 0;
191595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
191695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* If we have custom certificate types set, use them */
1917676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin	if (s->cert->client_certificate_types)
191895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
1919676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin		memcpy(p, s->cert->client_certificate_types,
1920676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin			s->cert->num_client_certificate_types);
1921676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin		return (int)s->cert->num_client_certificate_types;
192295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
192395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* get configured sigalgs */
192495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	siglen = tls12_get_psigalgs(s, &sig);
192595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	for (i = 0; i < siglen; i+=2, sig+=2)
192695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
192795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		switch(sig[1])
192895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
192995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		case TLSEXT_signature_rsa:
193095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			have_rsa_sign = 1;
193195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			break;
193295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
193395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		case TLSEXT_signature_ecdsa:
193495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			have_ecdsa_sign = 1;
193595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			break;
193695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
193795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
193895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
193995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (have_rsa_sign)
194095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		p[ret++]=SSL3_CT_RSA_SIGN;
194195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
194295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* ECDSA certs can be used with RSA cipher suites as well
194395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 * so we don't need to check for SSL_kECDH or SSL_kEECDH
194495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 */
194595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->version >= TLS1_VERSION)
194695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
194795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (have_ecdsa_sign)
194895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			p[ret++]=TLS_CT_ECDSA_SIGN;
194995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
195095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ret);
195195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
195295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
195395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic int ssl3_set_req_cert_type(CERT *c, const unsigned char *p, size_t len)
195495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
1955676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin	if (c->client_certificate_types)
195695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
1957676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin		OPENSSL_free(c->client_certificate_types);
1958676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin		c->client_certificate_types = NULL;
195995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
1960676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin	c->num_client_certificate_types = 0;
196195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (!p || !len)
196295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return 1;
196395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (len > 0xff)
196495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return 0;
1965676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin	c->client_certificate_types = BUF_memdup(p, len);
1966676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin	if (!c->client_certificate_types)
196795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return 0;
1968676d1e780e96b201113958e8a6f2e787438f200bDavid Benjamin	c->num_client_certificate_types = len;
196995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return 1;
197095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
197195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
197295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_shutdown(SSL *s)
197395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
197495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int ret;
197595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
197695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* Don't do anything much if we have not done the handshake or
197795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 * we don't want to send messages :-) */
197895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if ((s->quiet_shutdown) || (s->state == SSL_ST_BEFORE))
197995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
198095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->shutdown=(SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
198195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(1);
198295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
198395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
198495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (!(s->shutdown & SSL_SENT_SHUTDOWN))
198595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
198695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->shutdown|=SSL_SENT_SHUTDOWN;
198795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if 1
198895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_CLOSE_NOTIFY);
198995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
199095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* our shutdown alert has been sent now, and if it still needs
199195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 	 * to be written, s->s3->alert_dispatch will be true */
199295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 	if (s->s3->alert_dispatch)
199395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 		return(-1);	/* return WANT_WRITE */
199495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
199595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else if (s->s3->alert_dispatch)
199695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
199795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* resend it if not sent */
199895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if 1
199995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret=s->method->ssl_dispatch_alert(s);
200095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if(ret == -1)
200195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
200295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			/* we only get to return -1 here the 2nd/Nth
200395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			 * invocation, we must  have already signalled
200495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			 * return 0 upon a previous invoation,
200595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			 * return WANT_WRITE */
200695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return(ret);
200795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
200895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
200995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
201095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN))
201195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
201295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* If we are waiting for a close from our peer, we are closed */
201395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->method->ssl_read_bytes(s,0,NULL,0,0);
201495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if(!(s->shutdown & SSL_RECEIVED_SHUTDOWN))
201595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
201695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return(-1);	/* return WANT_READ */
201795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
201895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
201995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
202095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if ((s->shutdown == (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN)) &&
202195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		!s->s3->alert_dispatch)
202295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(1);
202395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else
202495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(0);
202595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
202695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
202795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_write(SSL *s, const void *buf, int len)
202895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
202995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int ret,n;
203095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
203195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if 0
203295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->shutdown & SSL_SEND_SHUTDOWN)
203395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
203495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->rwstate=SSL_NOTHING;
203595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(0);
203695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
203795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif
203895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ERR_clear_system_error();
203995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->renegotiate) ssl3_renegotiate_check(s);
204095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
204195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* This is an experimental flag that sends the
204295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 * last handshake message in the same packet as the first
204395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 * use data - used to see if it helps the TCP protocol during
204495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	 * session-id reuse */
204595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	/* The second test is because the buffer may have been removed */
204695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio))
204795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
204895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* First time through, we write into the buffer */
204995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (s->s3->delay_buf_pop_ret == 0)
205095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
205195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			ret=ssl3_write_bytes(s,SSL3_RT_APPLICATION_DATA,
205295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					     buf,len);
205395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			if (ret <= 0) return(ret);
205495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
205595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			s->s3->delay_buf_pop_ret=ret;
205695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
205795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
205895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->rwstate=SSL_WRITING;
205995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		n=BIO_flush(s->wbio);
206095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (n <= 0) return(n);
206195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->rwstate=SSL_NOTHING;
206295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
206395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* We have flushed the buffer, so remove it */
206495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ssl_free_wbio_buffer(s);
206595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
206695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
206795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret=s->s3->delay_buf_pop_ret;
206895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->s3->delay_buf_pop_ret=0;
206995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
207095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else
207195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
207295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret=s->method->ssl_write_bytes(s,SSL3_RT_APPLICATION_DATA,
207395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			buf,len);
207495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (ret <= 0) return(ret);
207595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
207695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
207795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ret);
207895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
207995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
208095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic int ssl3_read_internal(SSL *s, void *buf, int len, int peek)
208195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
2082adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley	int n,ret;
208395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
208495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ERR_clear_system_error();
2085adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley	if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio))
2086adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley		{
2087adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley		/* Deal with an application that calls SSL_read() when handshake data
2088adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley		 * is yet to be written.
2089adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley		 */
2090adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley		if (BIO_wpending(s->wbio) > 0)
2091adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley			{
2092adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley			s->rwstate=SSL_WRITING;
2093adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley			n=BIO_flush(s->wbio);
2094adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley			if (n <= 0) return(n);
2095adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley			s->rwstate=SSL_NOTHING;
2096adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley			}
2097adb739e1e59a48a421a080e64ad16f23e6b18cfdAdam Langley		}
209895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->renegotiate) ssl3_renegotiate_check(s);
209995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3->in_read_app_data=1;
210095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ret=s->method->ssl_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek);
210195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if ((ret == -1) && (s->s3->in_read_app_data == 2))
210295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
210395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		/* ssl3_read_bytes decided to call s->handshake_func, which
210495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		 * called ssl3_read_bytes to read handshake data.
210595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		 * However, ssl3_read_bytes actually found application data
210695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		 * and thinks that application data makes sense here; so disable
210795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		 * handshake processing and try to read application data again. */
210895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->in_handshake++;
210995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret=s->method->ssl_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek);
211095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->in_handshake--;
211195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
211295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else
211395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		s->s3->in_read_app_data=0;
211495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
211595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ret);
211695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
211795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
211895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_read(SSL *s, void *buf, int len)
211995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
212095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return ssl3_read_internal(s, buf, len, 0);
212195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
212295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
212395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_peek(SSL *s, void *buf, int len)
212495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
212595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return ssl3_read_internal(s, buf, len, 1);
212695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
212795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
212895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_renegotiate(SSL *s)
212995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
213095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->handshake_func == NULL)
213195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(1);
213295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
213395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)
213495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(0);
213595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
213695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	s->s3->renegotiate=1;
213795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(1);
213895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
213995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
214095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ssl3_renegotiate_check(SSL *s)
214195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
214295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int ret=0;
214395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
214495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->s3->renegotiate)
214595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
214695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (	(s->s3->rbuf.left == 0) &&
214795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			(s->s3->wbuf.left == 0) &&
214895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			!SSL_in_init(s))
214995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
215095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/*
215195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyif we are the server, and we have sent a 'RENEGOTIATE' message, we
215295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyneed to go to SSL_ST_ACCEPT.
215395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley*/
215495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			/* SSL_ST_ACCEPT */
215595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			s->state=SSL_ST_RENEGOTIATE;
215695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			s->s3->renegotiate=0;
215795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			s->s3->num_renegotiations++;
215895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			s->s3->total_renegotiations++;
215995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			ret=1;
216095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
216195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
216295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ret);
216395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
216495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* If we are using default SHA1+MD5 algorithms switch to new SHA256 PRF
216595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * and handshake macs if required.
216695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley */
216795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleylong ssl_get_algorithm2(SSL *s)
216895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
21699447dff5a25980032883975c7d981d9606395938Adam Langley	static const unsigned long kMask = SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF;
217095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	long alg2 = s->s3->tmp.new_cipher->algorithm2;
217195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (s->method->ssl3_enc->enc_flags & SSL_ENC_FLAG_SHA256_PRF
21729447dff5a25980032883975c7d981d9606395938Adam Langley	    && (alg2 & kMask) == kMask)
217395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256;
217495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return alg2;
217595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
217695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
2177