Home | History | Annotate | Download | only in openssl
      1 /* ssl/ssl3.h */
      2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      3  * All rights reserved.
      4  *
      5  * This package is an SSL implementation written
      6  * by Eric Young (eay (at) cryptsoft.com).
      7  * The implementation was written so as to conform with Netscapes SSL.
      8  *
      9  * This library is free for commercial and non-commercial use as long as
     10  * the following conditions are aheared to.  The following conditions
     11  * apply to all code found in this distribution, be it the RC4, RSA,
     12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     13  * included with this distribution is covered by the same copyright terms
     14  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     15  *
     16  * Copyright remains Eric Young's, and as such any Copyright notices in
     17  * the code are not to be removed.
     18  * If this package is used in a product, Eric Young should be given attribution
     19  * as the author of the parts of the library used.
     20  * This can be in the form of a textual message at program startup or
     21  * in documentation (online or textual) provided with the package.
     22  *
     23  * Redistribution and use in source and binary forms, with or without
     24  * modification, are permitted provided that the following conditions
     25  * are met:
     26  * 1. Redistributions of source code must retain the copyright
     27  *    notice, this list of conditions and the following disclaimer.
     28  * 2. Redistributions in binary form must reproduce the above copyright
     29  *    notice, this list of conditions and the following disclaimer in the
     30  *    documentation and/or other materials provided with the distribution.
     31  * 3. All advertising materials mentioning features or use of this software
     32  *    must display the following acknowledgement:
     33  *    "This product includes cryptographic software written by
     34  *     Eric Young (eay (at) cryptsoft.com)"
     35  *    The word 'cryptographic' can be left out if the rouines from the library
     36  *    being used are not cryptographic related :-).
     37  * 4. If you include any Windows specific code (or a derivative thereof) from
     38  *    the apps directory (application code) you must include an acknowledgement:
     39  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     40  *
     41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     51  * SUCH DAMAGE.
     52  *
     53  * The licence and distribution terms for any publically available version or
     54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     55  * copied and put under another distribution licence
     56  * [including the GNU Public Licence.]
     57  */
     58 /* ====================================================================
     59  * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
     60  *
     61  * Redistribution and use in source and binary forms, with or without
     62  * modification, are permitted provided that the following conditions
     63  * are met:
     64  *
     65  * 1. Redistributions of source code must retain the above copyright
     66  *    notice, this list of conditions and the following disclaimer.
     67  *
     68  * 2. Redistributions in binary form must reproduce the above copyright
     69  *    notice, this list of conditions and the following disclaimer in
     70  *    the documentation and/or other materials provided with the
     71  *    distribution.
     72  *
     73  * 3. All advertising materials mentioning features or use of this
     74  *    software must display the following acknowledgment:
     75  *    "This product includes software developed by the OpenSSL Project
     76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
     77  *
     78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     79  *    endorse or promote products derived from this software without
     80  *    prior written permission. For written permission, please contact
     81  *    openssl-core (at) openssl.org.
     82  *
     83  * 5. Products derived from this software may not be called "OpenSSL"
     84  *    nor may "OpenSSL" appear in their names without prior written
     85  *    permission of the OpenSSL Project.
     86  *
     87  * 6. Redistributions of any form whatsoever must retain the following
     88  *    acknowledgment:
     89  *    "This product includes software developed by the OpenSSL Project
     90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
     91  *
     92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    103  * OF THE POSSIBILITY OF SUCH DAMAGE.
    104  * ====================================================================
    105  *
    106  * This product includes cryptographic software written by Eric Young
    107  * (eay (at) cryptsoft.com).  This product includes software written by Tim
    108  * Hudson (tjh (at) cryptsoft.com).
    109  *
    110  */
    111 /* ====================================================================
    112  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
    113  * ECC cipher suite support in OpenSSL originally developed by
    114  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
    115  */
    116 
    117 #ifndef HEADER_SSL3_H
    118 #define HEADER_SSL3_H
    119 
    120 #include <openssl/buf.h>
    121 #include <openssl/evp.h>
    122 #include <openssl/ssl.h>
    123 
    124 #ifdef  __cplusplus
    125 extern "C" {
    126 #endif
    127 
    128 /* Signalling cipher suite value: from draft-ietf-tls-renegotiation-03.txt */
    129 #define SSL3_CK_SCSV				0x030000FF
    130 /* Fallback signalling cipher suite value: not IANA assigned.
    131  * See https://tools.ietf.org/html/draft-bmoeller-tls-downgrade-scsv-01 */
    132 #define SSL3_CK_FALLBACK_SCSV			0x03005600
    133 
    134 #define SSL3_CK_RSA_NULL_MD5			0x03000001
    135 #define SSL3_CK_RSA_NULL_SHA			0x03000002
    136 #define SSL3_CK_RSA_RC4_40_MD5 			0x03000003
    137 #define SSL3_CK_RSA_RC4_128_MD5			0x03000004
    138 #define SSL3_CK_RSA_RC4_128_SHA			0x03000005
    139 #define SSL3_CK_RSA_RC2_40_MD5			0x03000006
    140 #define SSL3_CK_RSA_IDEA_128_SHA		0x03000007
    141 #define SSL3_CK_RSA_DES_40_CBC_SHA		0x03000008
    142 #define SSL3_CK_RSA_DES_64_CBC_SHA		0x03000009
    143 #define SSL3_CK_RSA_DES_192_CBC3_SHA		0x0300000A
    144 
    145 #define SSL3_CK_DH_DSS_DES_40_CBC_SHA		0x0300000B
    146 #define SSL3_CK_DH_DSS_DES_64_CBC_SHA		0x0300000C
    147 #define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 	0x0300000D
    148 #define SSL3_CK_DH_RSA_DES_40_CBC_SHA		0x0300000E
    149 #define SSL3_CK_DH_RSA_DES_64_CBC_SHA		0x0300000F
    150 #define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 	0x03000010
    151 
    152 #define SSL3_CK_EDH_DSS_DES_40_CBC_SHA		0x03000011
    153 #define SSL3_CK_EDH_DSS_DES_64_CBC_SHA		0x03000012
    154 #define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA	0x03000013
    155 #define SSL3_CK_EDH_RSA_DES_40_CBC_SHA		0x03000014
    156 #define SSL3_CK_EDH_RSA_DES_64_CBC_SHA		0x03000015
    157 #define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA	0x03000016
    158 
    159 #define SSL3_CK_ADH_RC4_40_MD5			0x03000017
    160 #define SSL3_CK_ADH_RC4_128_MD5			0x03000018
    161 #define SSL3_CK_ADH_DES_40_CBC_SHA		0x03000019
    162 #define SSL3_CK_ADH_DES_64_CBC_SHA		0x0300001A
    163 #define SSL3_CK_ADH_DES_192_CBC_SHA		0x0300001B
    164 
    165 #define SSL3_TXT_RSA_NULL_MD5			"NULL-MD5"
    166 #define SSL3_TXT_RSA_NULL_SHA			"NULL-SHA"
    167 #define SSL3_TXT_RSA_RC4_40_MD5 		"EXP-RC4-MD5"
    168 #define SSL3_TXT_RSA_RC4_128_MD5		"RC4-MD5"
    169 #define SSL3_TXT_RSA_RC4_128_SHA		"RC4-SHA"
    170 #define SSL3_TXT_RSA_RC2_40_MD5			"EXP-RC2-CBC-MD5"
    171 #define SSL3_TXT_RSA_IDEA_128_SHA		"IDEA-CBC-SHA"
    172 #define SSL3_TXT_RSA_DES_40_CBC_SHA		"EXP-DES-CBC-SHA"
    173 #define SSL3_TXT_RSA_DES_64_CBC_SHA		"DES-CBC-SHA"
    174 #define SSL3_TXT_RSA_DES_192_CBC3_SHA		"DES-CBC3-SHA"
    175 
    176 #define SSL3_TXT_DH_DSS_DES_40_CBC_SHA		"EXP-DH-DSS-DES-CBC-SHA"
    177 #define SSL3_TXT_DH_DSS_DES_64_CBC_SHA		"DH-DSS-DES-CBC-SHA"
    178 #define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA 	"DH-DSS-DES-CBC3-SHA"
    179 #define SSL3_TXT_DH_RSA_DES_40_CBC_SHA		"EXP-DH-RSA-DES-CBC-SHA"
    180 #define SSL3_TXT_DH_RSA_DES_64_CBC_SHA		"DH-RSA-DES-CBC-SHA"
    181 #define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA 	"DH-RSA-DES-CBC3-SHA"
    182 
    183 #define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA		"EXP-EDH-DSS-DES-CBC-SHA"
    184 #define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA		"EDH-DSS-DES-CBC-SHA"
    185 #define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA	"EDH-DSS-DES-CBC3-SHA"
    186 #define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA		"EXP-EDH-RSA-DES-CBC-SHA"
    187 #define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA		"EDH-RSA-DES-CBC-SHA"
    188 #define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA	"EDH-RSA-DES-CBC3-SHA"
    189 
    190 #define SSL3_TXT_ADH_RC4_40_MD5			"EXP-ADH-RC4-MD5"
    191 #define SSL3_TXT_ADH_RC4_128_MD5		"ADH-RC4-MD5"
    192 #define SSL3_TXT_ADH_DES_40_CBC_SHA		"EXP-ADH-DES-CBC-SHA"
    193 #define SSL3_TXT_ADH_DES_64_CBC_SHA		"ADH-DES-CBC-SHA"
    194 #define SSL3_TXT_ADH_DES_192_CBC_SHA		"ADH-DES-CBC3-SHA"
    195 
    196 #define SSL3_SSL_SESSION_ID_LENGTH		32
    197 #define SSL3_MAX_SSL_SESSION_ID_LENGTH		32
    198 
    199 #define SSL3_MASTER_SECRET_SIZE			48
    200 #define SSL3_RANDOM_SIZE			32
    201 #define SSL3_SESSION_ID_SIZE			32
    202 #define SSL3_RT_HEADER_LENGTH			5
    203 
    204 #define SSL3_HM_HEADER_LENGTH                  4
    205 
    206 #ifndef SSL3_ALIGN_PAYLOAD
    207  /* Some will argue that this increases memory footprint, but it's
    208   * not actually true. Point is that malloc has to return at least
    209   * 64-bit aligned pointers, meaning that allocating 5 bytes wastes
    210   * 3 bytes in either case. Suggested pre-gaping simply moves these
    211   * wasted bytes from the end of allocated region to its front,
    212   * but makes data payload aligned, which improves performance:-) */
    213 # define SSL3_ALIGN_PAYLOAD			8
    214 #else
    215 # if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0
    216 #  error "insane SSL3_ALIGN_PAYLOAD"
    217 #  undef SSL3_ALIGN_PAYLOAD
    218 # endif
    219 #endif
    220 
    221 /* This is the maximum MAC (digest) size used by the SSL library.
    222  * Currently maximum of 20 is used by SHA1, but we reserve for
    223  * future extension for 512-bit hashes.
    224  */
    225 
    226 #define SSL3_RT_MAX_MD_SIZE			64
    227 
    228 /* Maximum block size used in all ciphersuites. Currently 16 for AES.
    229  */
    230 
    231 #define	SSL_RT_MAX_CIPHER_BLOCK_SIZE		16
    232 
    233 #define SSL3_RT_MAX_EXTRA			(16384)
    234 
    235 /* Maximum plaintext length: defined by SSL/TLS standards */
    236 #define SSL3_RT_MAX_PLAIN_LENGTH		16384
    237 /* Maximum compression overhead: defined by SSL/TLS standards */
    238 #define SSL3_RT_MAX_COMPRESSED_OVERHEAD		1024
    239 
    240 /* The standards give a maximum encryption overhead of 1024 bytes.
    241  * In practice the value is lower than this. The overhead is the maximum
    242  * number of padding bytes (256) plus the mac size.
    243  */
    244 #define SSL3_RT_MAX_ENCRYPTED_OVERHEAD	(256 + SSL3_RT_MAX_MD_SIZE)
    245 
    246 /* OpenSSL currently only uses a padding length of at most one block so
    247  * the send overhead is smaller.
    248  */
    249 
    250 #define SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD \
    251 			(SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE)
    252 
    253 /* If compression isn't used don't include the compression overhead */
    254 
    255 #define SSL3_RT_MAX_COMPRESSED_LENGTH	\
    256 		(SSL3_RT_MAX_PLAIN_LENGTH+SSL3_RT_MAX_COMPRESSED_OVERHEAD)
    257 #define SSL3_RT_MAX_ENCRYPTED_LENGTH	\
    258 		(SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH)
    259 #define SSL3_RT_MAX_PACKET_SIZE		\
    260 		(SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH)
    261 
    262 #define SSL3_MD_CLIENT_FINISHED_CONST	"\x43\x4C\x4E\x54"
    263 #define SSL3_MD_SERVER_FINISHED_CONST	"\x53\x52\x56\x52"
    264 
    265 #define SSL3_VERSION			0x0300
    266 #define SSL3_VERSION_MAJOR		0x03
    267 #define SSL3_VERSION_MINOR		0x00
    268 
    269 #define SSL3_RT_CHANGE_CIPHER_SPEC	20
    270 #define SSL3_RT_ALERT			21
    271 #define SSL3_RT_HANDSHAKE		22
    272 #define SSL3_RT_APPLICATION_DATA	23
    273 
    274 /* Pseudo content types to indicate additional parameters */
    275 #define TLS1_RT_CRYPTO			0x1000
    276 #define TLS1_RT_CRYPTO_PREMASTER	(TLS1_RT_CRYPTO | 0x1)
    277 #define TLS1_RT_CRYPTO_CLIENT_RANDOM	(TLS1_RT_CRYPTO | 0x2)
    278 #define TLS1_RT_CRYPTO_SERVER_RANDOM	(TLS1_RT_CRYPTO | 0x3)
    279 #define TLS1_RT_CRYPTO_MASTER		(TLS1_RT_CRYPTO | 0x4)
    280 
    281 #define TLS1_RT_CRYPTO_READ		0x0000
    282 #define TLS1_RT_CRYPTO_WRITE		0x0100
    283 #define TLS1_RT_CRYPTO_MAC		(TLS1_RT_CRYPTO | 0x5)
    284 #define TLS1_RT_CRYPTO_KEY		(TLS1_RT_CRYPTO | 0x6)
    285 #define TLS1_RT_CRYPTO_IV		(TLS1_RT_CRYPTO | 0x7)
    286 #define TLS1_RT_CRYPTO_FIXED_IV		(TLS1_RT_CRYPTO | 0x8)
    287 
    288 /* Pseudo content type for SSL/TLS header info */
    289 #define SSL3_RT_HEADER			0x100
    290 
    291 #define SSL3_AL_WARNING			1
    292 #define SSL3_AL_FATAL			2
    293 
    294 #define SSL3_AD_CLOSE_NOTIFY		 0
    295 #define SSL3_AD_UNEXPECTED_MESSAGE	10	/* fatal */
    296 #define SSL3_AD_BAD_RECORD_MAC		20	/* fatal */
    297 #define SSL3_AD_DECOMPRESSION_FAILURE	30	/* fatal */
    298 #define SSL3_AD_HANDSHAKE_FAILURE	40	/* fatal */
    299 #define SSL3_AD_NO_CERTIFICATE		41
    300 #define SSL3_AD_BAD_CERTIFICATE		42
    301 #define SSL3_AD_UNSUPPORTED_CERTIFICATE	43
    302 #define SSL3_AD_CERTIFICATE_REVOKED	44
    303 #define SSL3_AD_CERTIFICATE_EXPIRED	45
    304 #define SSL3_AD_CERTIFICATE_UNKNOWN	46
    305 #define SSL3_AD_ILLEGAL_PARAMETER	47	/* fatal */
    306 #define SSL3_AD_INAPPROPRIATE_FALLBACK	86	/* fatal */
    307 
    308 #ifndef OPENSSL_NO_SSL_INTERN
    309 
    310 typedef struct ssl3_record_st
    311 	{
    312 /*r */	int type;               /* type of record */
    313 /*rw*/	unsigned int length;    /* How many bytes available */
    314 /*r */	unsigned int off;       /* read/write offset into 'buf' */
    315 /*rw*/	unsigned char *data;    /* pointer to the record data */
    316 /*rw*/	unsigned char *input;   /* where the decode bytes are */
    317 /*r */  unsigned long epoch;    /* epoch number, needed by DTLS1 */
    318 /*r */  unsigned char seq_num[8]; /* sequence number, needed by DTLS1 */
    319 	} SSL3_RECORD;
    320 
    321 typedef struct ssl3_buffer_st
    322 	{
    323 	unsigned char *buf;     /* at least SSL3_RT_MAX_PACKET_SIZE bytes,
    324 	                         * see ssl3_setup_buffers() */
    325 	size_t len;             /* buffer size */
    326 	int offset;             /* where to 'copy from' */
    327 	int left;               /* how many bytes left */
    328 	} SSL3_BUFFER;
    329 
    330 #endif
    331 
    332 #define SSL3_CT_RSA_SIGN			1
    333 #define SSL3_CT_DSS_SIGN			2
    334 #define SSL3_CT_RSA_FIXED_DH			3
    335 #define SSL3_CT_DSS_FIXED_DH			4
    336 #define SSL3_CT_RSA_EPHEMERAL_DH		5
    337 #define SSL3_CT_DSS_EPHEMERAL_DH		6
    338 #define SSL3_CT_FORTEZZA_DMS			20
    339 
    340 
    341 #define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS	0x0001
    342 #define SSL3_FLAGS_POP_BUFFER			0x0004
    343 /* TODO(davidben): This flag can probably be merged into s3->change_cipher_spec
    344  * to something tri-state. (Normal / Expect CCS / Between CCS and Finished). */
    345 #define SSL3_FLAGS_EXPECT_CCS			0x0080
    346 
    347 #ifndef OPENSSL_NO_SSL_INTERN
    348 
    349 typedef struct ssl3_state_st
    350 	{
    351 	long flags;
    352 	int delay_buf_pop_ret;
    353 
    354 	unsigned char read_sequence[8];
    355 	int read_mac_secret_size;
    356 	unsigned char read_mac_secret[EVP_MAX_MD_SIZE];
    357 	unsigned char write_sequence[8];
    358 	int write_mac_secret_size;
    359 	unsigned char write_mac_secret[EVP_MAX_MD_SIZE];
    360 
    361 	unsigned char server_random[SSL3_RANDOM_SIZE];
    362 	unsigned char client_random[SSL3_RANDOM_SIZE];
    363 
    364 	/* flags for countermeasure against known-IV weakness */
    365 	int need_record_splitting;
    366 	int record_split_done;
    367 
    368 	/* The value of 'extra' when the buffers were initialized */
    369 	int init_extra;
    370 
    371 	SSL3_BUFFER rbuf;	/* read IO goes into here */
    372 	SSL3_BUFFER wbuf;	/* write IO goes into here */
    373 
    374 	SSL3_RECORD rrec;	/* each decoded record goes in here */
    375 	SSL3_RECORD wrec;	/* goes out from here */
    376 
    377 	/* storage for Alert/Handshake protocol data received but not
    378 	 * yet processed by ssl3_read_bytes: */
    379 	unsigned char alert_fragment[2];
    380 	unsigned int alert_fragment_len;
    381 	unsigned char handshake_fragment[4];
    382 	unsigned int handshake_fragment_len;
    383 
    384 	/* partial write - check the numbers match */
    385 	unsigned int wnum;	/* number of bytes sent so far */
    386 	int wpend_tot;		/* number bytes written */
    387 	int wpend_type;
    388 	int wpend_ret;		/* number of bytes submitted */
    389 	const unsigned char *wpend_buf;
    390 
    391 	/* used during startup, digest all incoming/outgoing packets */
    392 	BIO *handshake_buffer;
    393 	/* When set of handshake digests is determined, buffer is hashed
    394 	 * and freed and MD_CTX-es for all required digests are stored in
    395 	 * this array */
    396 	EVP_MD_CTX **handshake_dgst;
    397 	/* this is set whenerver we see a change_cipher_spec message
    398 	 * come in when we are not looking for one */
    399 	int change_cipher_spec;
    400 
    401 	int warn_alert;
    402 	int fatal_alert;
    403 	/* we allow one fatal and one warning alert to be outstanding,
    404 	 * send close alert via the warning alert */
    405 	int alert_dispatch;
    406 	unsigned char send_alert[2];
    407 
    408 	/* This flag is set when we should renegotiate ASAP, basically when
    409 	 * there is no more data in the read or write buffers */
    410 	int renegotiate;
    411 	int total_renegotiations;
    412 	int num_renegotiations;
    413 
    414 	int in_read_app_data;
    415 
    416 	/* State pertaining to the pending handshake.
    417 	 *
    418 	 * TODO(davidben): State is current spread all over the place. Move
    419 	 * pending handshake state here so it can be managed separately from
    420 	 * established connection state in case of renegotiations.
    421 	 */
    422 	struct	{
    423 		/* actually only need to be 16+20 for SSLv3 and 12 for TLS */
    424 		unsigned char finish_md[EVP_MAX_MD_SIZE*2];
    425 		int finish_md_len;
    426 		unsigned char peer_finish_md[EVP_MAX_MD_SIZE*2];
    427 		int peer_finish_md_len;
    428 
    429 		unsigned long message_size;
    430 		int message_type;
    431 
    432 		/* used to hold the new cipher we are going to use */
    433 		const SSL_CIPHER *new_cipher;
    434 		DH *dh;
    435 
    436 		EC_KEY *ecdh; /* holds short lived ECDH key */
    437 
    438 		/* used when SSL_ST_FLUSH_DATA is entered */
    439 		int next_state;
    440 
    441 		int reuse_message;
    442 
    443 		/* Client-only: cert_req determines if a client certificate is
    444 		 * to be sent. This is 0 if no client Certificate message is to
    445 		 * be sent, 1 if there is a client certificate, and 2 to send an
    446 		 * empty client Certificate message. */
    447 		int cert_req;
    448 
    449 		/* Client-only: ca_names contains the list of CAs received in a
    450 		 * CertificateRequest message. */
    451 		STACK_OF(X509_NAME) *ca_names;
    452 
    453 		/* Client-only: certificate_types contains the set of
    454 		 * certificate types received in a CertificateRequest
    455 		 * message. */
    456 		unsigned char *certificate_types;
    457 		size_t num_certificate_types;
    458 
    459 		int key_block_length;
    460 		unsigned char *key_block;
    461 
    462 		const EVP_CIPHER *new_sym_enc;
    463 		const EVP_AEAD *new_aead;
    464 		const EVP_MD *new_hash;
    465 		int new_mac_pkey_type;
    466 		int new_mac_secret_size;
    467 
    468 		/* Server-only: cert_request is true if a client certificate was
    469 		 * requested. */
    470 		int cert_request;
    471 
    472 		/* certificate_status_expected is true if OCSP stapling was
    473 		 * negotiated and the server is expected to send a
    474 		 * CertificateStatus message. */
    475 		char certificate_status_expected;
    476 		} tmp;
    477 
    478         /* Connection binding to prevent renegotiation attacks */
    479         unsigned char previous_client_finished[EVP_MAX_MD_SIZE];
    480         unsigned char previous_client_finished_len;
    481         unsigned char previous_server_finished[EVP_MAX_MD_SIZE];
    482         unsigned char previous_server_finished_len;
    483         int send_connection_binding; /* TODOEKR */
    484 
    485 	/* Set if we saw the Next Protocol Negotiation extension from our peer. */
    486 	int next_proto_neg_seen;
    487 
    488 	/* ALPN information
    489 	 * (we are in the process of transitioning from NPN to ALPN.) */
    490 
    491 	/* In a server these point to the selected ALPN protocol after the
    492 	 * ClientHello has been processed. In a client these contain the
    493 	 * protocol that the server selected once the ServerHello has been
    494 	 * processed. */
    495 	uint8_t *alpn_selected;
    496 	size_t alpn_selected_len;
    497 
    498 	/* In a client, this means that the server supported Channel ID and that
    499 	 * a Channel ID was sent. In a server it means that we echoed support
    500 	 * for Channel IDs and that tlsext_channel_id will be valid after the
    501 	 * handshake. */
    502 	char tlsext_channel_id_valid;
    503 	/* tlsext_channel_id_new means that the updated Channel ID extension
    504 	 * was negotiated. This is a temporary hack in the code to support both
    505 	 * forms of Channel ID extension while we transition to the new format,
    506 	 * which fixed a security issue. */
    507 	char tlsext_channel_id_new;
    508 	/* For a server:
    509 	 *     If |tlsext_channel_id_valid| is true, then this contains the
    510 	 *     verified Channel ID from the client: a P256 point, (x,y), where
    511 	 *     each are big-endian values. */
    512 	unsigned char tlsext_channel_id[64];
    513 	} SSL3_STATE;
    514 
    515 #endif
    516 
    517 /* SSLv3 */
    518 /*client */
    519 /* extra state */
    520 #define SSL3_ST_CW_FLUSH		(0x100|SSL_ST_CONNECT)
    521 #define SSL3_ST_CUTTHROUGH_COMPLETE	(0x101|SSL_ST_CONNECT)
    522 /* write to server */
    523 #define SSL3_ST_CW_CLNT_HELLO_A		(0x110|SSL_ST_CONNECT)
    524 #define SSL3_ST_CW_CLNT_HELLO_B		(0x111|SSL_ST_CONNECT)
    525 /* read from server */
    526 #define SSL3_ST_CR_SRVR_HELLO_A		(0x120|SSL_ST_CONNECT)
    527 #define SSL3_ST_CR_SRVR_HELLO_B		(0x121|SSL_ST_CONNECT)
    528 #define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A (0x126|SSL_ST_CONNECT)
    529 #define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B (0x127|SSL_ST_CONNECT)
    530 #define SSL3_ST_CR_CERT_A		(0x130|SSL_ST_CONNECT)
    531 #define SSL3_ST_CR_CERT_B		(0x131|SSL_ST_CONNECT)
    532 #define SSL3_ST_CR_KEY_EXCH_A		(0x140|SSL_ST_CONNECT)
    533 #define SSL3_ST_CR_KEY_EXCH_B		(0x141|SSL_ST_CONNECT)
    534 #define SSL3_ST_CR_CERT_REQ_A		(0x150|SSL_ST_CONNECT)
    535 #define SSL3_ST_CR_CERT_REQ_B		(0x151|SSL_ST_CONNECT)
    536 #define SSL3_ST_CR_SRVR_DONE_A		(0x160|SSL_ST_CONNECT)
    537 #define SSL3_ST_CR_SRVR_DONE_B		(0x161|SSL_ST_CONNECT)
    538 /* write to server */
    539 #define SSL3_ST_CW_CERT_A		(0x170|SSL_ST_CONNECT)
    540 #define SSL3_ST_CW_CERT_B		(0x171|SSL_ST_CONNECT)
    541 #define SSL3_ST_CW_CERT_C		(0x172|SSL_ST_CONNECT)
    542 #define SSL3_ST_CW_CERT_D		(0x173|SSL_ST_CONNECT)
    543 #define SSL3_ST_CW_KEY_EXCH_A		(0x180|SSL_ST_CONNECT)
    544 #define SSL3_ST_CW_KEY_EXCH_B		(0x181|SSL_ST_CONNECT)
    545 #define SSL3_ST_CW_CERT_VRFY_A		(0x190|SSL_ST_CONNECT)
    546 #define SSL3_ST_CW_CERT_VRFY_B		(0x191|SSL_ST_CONNECT)
    547 #define SSL3_ST_CW_CHANGE_A		(0x1A0|SSL_ST_CONNECT)
    548 #define SSL3_ST_CW_CHANGE_B		(0x1A1|SSL_ST_CONNECT)
    549 #define SSL3_ST_CW_NEXT_PROTO_A		(0x200|SSL_ST_CONNECT)
    550 #define SSL3_ST_CW_NEXT_PROTO_B		(0x201|SSL_ST_CONNECT)
    551 #define SSL3_ST_CW_CHANNEL_ID_A		(0x220|SSL_ST_CONNECT)
    552 #define SSL3_ST_CW_CHANNEL_ID_B		(0x221|SSL_ST_CONNECT)
    553 #define SSL3_ST_CW_FINISHED_A		(0x1B0|SSL_ST_CONNECT)
    554 #define SSL3_ST_CW_FINISHED_B		(0x1B1|SSL_ST_CONNECT)
    555 /* read from server */
    556 #define SSL3_ST_CR_CHANGE		(0x1C0|SSL_ST_CONNECT)
    557 #define SSL3_ST_CR_FINISHED_A		(0x1D0|SSL_ST_CONNECT)
    558 #define SSL3_ST_CR_FINISHED_B		(0x1D1|SSL_ST_CONNECT)
    559 #define SSL3_ST_CR_SESSION_TICKET_A	(0x1E0|SSL_ST_CONNECT)
    560 #define SSL3_ST_CR_SESSION_TICKET_B	(0x1E1|SSL_ST_CONNECT)
    561 #define SSL3_ST_CR_CERT_STATUS_A	(0x1F0|SSL_ST_CONNECT)
    562 #define SSL3_ST_CR_CERT_STATUS_B	(0x1F1|SSL_ST_CONNECT)
    563 
    564 /* server */
    565 /* extra state */
    566 #define SSL3_ST_SW_FLUSH		(0x100|SSL_ST_ACCEPT)
    567 /* read from client */
    568 /* Do not change the number values, they do matter */
    569 #define SSL3_ST_SR_CLNT_HELLO_A		(0x110|SSL_ST_ACCEPT)
    570 #define SSL3_ST_SR_CLNT_HELLO_B		(0x111|SSL_ST_ACCEPT)
    571 #define SSL3_ST_SR_CLNT_HELLO_C		(0x112|SSL_ST_ACCEPT)
    572 #define SSL3_ST_SR_CLNT_HELLO_D		(0x115|SSL_ST_ACCEPT)
    573 /* write to client */
    574 #define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT)
    575 #define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT)
    576 #define SSL3_ST_SW_HELLO_REQ_A		(0x120|SSL_ST_ACCEPT)
    577 #define SSL3_ST_SW_HELLO_REQ_B		(0x121|SSL_ST_ACCEPT)
    578 #define SSL3_ST_SW_HELLO_REQ_C		(0x122|SSL_ST_ACCEPT)
    579 #define SSL3_ST_SW_SRVR_HELLO_A		(0x130|SSL_ST_ACCEPT)
    580 #define SSL3_ST_SW_SRVR_HELLO_B		(0x131|SSL_ST_ACCEPT)
    581 #define SSL3_ST_SW_CERT_A		(0x140|SSL_ST_ACCEPT)
    582 #define SSL3_ST_SW_CERT_B		(0x141|SSL_ST_ACCEPT)
    583 #define SSL3_ST_SW_KEY_EXCH_A		(0x150|SSL_ST_ACCEPT)
    584 #define SSL3_ST_SW_KEY_EXCH_B		(0x151|SSL_ST_ACCEPT)
    585 #define SSL3_ST_SW_CERT_REQ_A		(0x160|SSL_ST_ACCEPT)
    586 #define SSL3_ST_SW_CERT_REQ_B		(0x161|SSL_ST_ACCEPT)
    587 #define SSL3_ST_SW_SRVR_DONE_A		(0x170|SSL_ST_ACCEPT)
    588 #define SSL3_ST_SW_SRVR_DONE_B		(0x171|SSL_ST_ACCEPT)
    589 /* read from client */
    590 #define SSL3_ST_SR_CERT_A		(0x180|SSL_ST_ACCEPT)
    591 #define SSL3_ST_SR_CERT_B		(0x181|SSL_ST_ACCEPT)
    592 #define SSL3_ST_SR_KEY_EXCH_A		(0x190|SSL_ST_ACCEPT)
    593 #define SSL3_ST_SR_KEY_EXCH_B		(0x191|SSL_ST_ACCEPT)
    594 #define SSL3_ST_SR_CERT_VRFY_A		(0x1A0|SSL_ST_ACCEPT)
    595 #define SSL3_ST_SR_CERT_VRFY_B		(0x1A1|SSL_ST_ACCEPT)
    596 #define SSL3_ST_SR_CHANGE		(0x1B0|SSL_ST_ACCEPT)
    597 #define SSL3_ST_SR_NEXT_PROTO_A		(0x210|SSL_ST_ACCEPT)
    598 #define SSL3_ST_SR_NEXT_PROTO_B		(0x211|SSL_ST_ACCEPT)
    599 #define SSL3_ST_SR_CHANNEL_ID_A		(0x230|SSL_ST_ACCEPT)
    600 #define SSL3_ST_SR_CHANNEL_ID_B		(0x231|SSL_ST_ACCEPT)
    601 #define SSL3_ST_SR_FINISHED_A		(0x1C0|SSL_ST_ACCEPT)
    602 #define SSL3_ST_SR_FINISHED_B		(0x1C1|SSL_ST_ACCEPT)
    603 /* write to client */
    604 #define SSL3_ST_SW_CHANGE_A		(0x1D0|SSL_ST_ACCEPT)
    605 #define SSL3_ST_SW_CHANGE_B		(0x1D1|SSL_ST_ACCEPT)
    606 #define SSL3_ST_SW_FINISHED_A		(0x1E0|SSL_ST_ACCEPT)
    607 #define SSL3_ST_SW_FINISHED_B		(0x1E1|SSL_ST_ACCEPT)
    608 #define SSL3_ST_SW_SESSION_TICKET_A	(0x1F0|SSL_ST_ACCEPT)
    609 #define SSL3_ST_SW_SESSION_TICKET_B	(0x1F1|SSL_ST_ACCEPT)
    610 #define SSL3_ST_SW_CERT_STATUS_A	(0x200|SSL_ST_ACCEPT)
    611 #define SSL3_ST_SW_CERT_STATUS_B	(0x201|SSL_ST_ACCEPT)
    612 #define SSL3_ST_SW_SUPPLEMENTAL_DATA_A	(0x220|SSL_ST_ACCEPT)
    613 #define SSL3_ST_SW_SUPPLEMENTAL_DATA_B	(0x221|SSL_ST_ACCEPT)
    614 
    615 #define SSL3_MT_HELLO_REQUEST			0
    616 #define SSL3_MT_CLIENT_HELLO			1
    617 #define SSL3_MT_SERVER_HELLO			2
    618 #define	SSL3_MT_NEWSESSION_TICKET		4
    619 #define SSL3_MT_CERTIFICATE			11
    620 #define SSL3_MT_SERVER_KEY_EXCHANGE		12
    621 #define SSL3_MT_CERTIFICATE_REQUEST		13
    622 #define SSL3_MT_SERVER_DONE			14
    623 #define SSL3_MT_CERTIFICATE_VERIFY		15
    624 #define SSL3_MT_CLIENT_KEY_EXCHANGE		16
    625 #define SSL3_MT_FINISHED			20
    626 #define SSL3_MT_CERTIFICATE_STATUS		22
    627 #define SSL3_MT_SUPPLEMENTAL_DATA		23
    628 #define SSL3_MT_NEXT_PROTO			67
    629 #define SSL3_MT_ENCRYPTED_EXTENSIONS		203
    630 #define DTLS1_MT_HELLO_VERIFY_REQUEST    3
    631 
    632 
    633 #define SSL3_MT_CCS				1
    634 
    635 /* These are used when changing over to a new cipher */
    636 #define SSL3_CC_READ		0x01
    637 #define SSL3_CC_WRITE		0x02
    638 #define SSL3_CC_CLIENT		0x10
    639 #define SSL3_CC_SERVER		0x20
    640 #define SSL3_CHANGE_CIPHER_CLIENT_WRITE	(SSL3_CC_CLIENT|SSL3_CC_WRITE)
    641 #define SSL3_CHANGE_CIPHER_SERVER_READ	(SSL3_CC_SERVER|SSL3_CC_READ)
    642 #define SSL3_CHANGE_CIPHER_CLIENT_READ	(SSL3_CC_CLIENT|SSL3_CC_READ)
    643 #define SSL3_CHANGE_CIPHER_SERVER_WRITE	(SSL3_CC_SERVER|SSL3_CC_WRITE)
    644 
    645 #ifdef  __cplusplus
    646 }
    647 #endif
    648 #endif
    649