epoc32/include/stdapis/openssl/ssl3.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
parent 0 061f57f2323e
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
     1 /* ssl/ssl3.h */
     2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
     3  * All rights reserved.
     4  *
     5  * This package is an SSL implementation written
     6  * by Eric Young (eay@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@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@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@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@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@cryptsoft.com).  This product includes software written by Tim
   108  * Hudson (tjh@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 #ifndef OPENSSL_NO_COMP
   121 #include <openssl/comp.h>
   122 #endif
   123 #include <openssl/buffer.h>
   124 #include <openssl/evp.h>
   125 #include <openssl/ssl.h>
   126 #include <openssl/pq_compat.h>
   127 
   128 #ifdef  __cplusplus
   129 extern "C" {
   130 #endif
   131 
   132 #define SSL3_CK_RSA_NULL_MD5			0x03000001
   133 #define SSL3_CK_RSA_NULL_SHA			0x03000002
   134 #define SSL3_CK_RSA_RC4_40_MD5 			0x03000003
   135 #define SSL3_CK_RSA_RC4_128_MD5			0x03000004
   136 #define SSL3_CK_RSA_RC4_128_SHA			0x03000005
   137 #define SSL3_CK_RSA_RC2_40_MD5			0x03000006
   138 #define SSL3_CK_RSA_IDEA_128_SHA		0x03000007
   139 #define SSL3_CK_RSA_DES_40_CBC_SHA		0x03000008
   140 #define SSL3_CK_RSA_DES_64_CBC_SHA		0x03000009
   141 #define SSL3_CK_RSA_DES_192_CBC3_SHA		0x0300000A
   142 
   143 #define SSL3_CK_DH_DSS_DES_40_CBC_SHA		0x0300000B
   144 #define SSL3_CK_DH_DSS_DES_64_CBC_SHA		0x0300000C
   145 #define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 	0x0300000D
   146 #define SSL3_CK_DH_RSA_DES_40_CBC_SHA		0x0300000E
   147 #define SSL3_CK_DH_RSA_DES_64_CBC_SHA		0x0300000F
   148 #define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 	0x03000010
   149 
   150 #define SSL3_CK_EDH_DSS_DES_40_CBC_SHA		0x03000011
   151 #define SSL3_CK_EDH_DSS_DES_64_CBC_SHA		0x03000012
   152 #define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA	0x03000013
   153 #define SSL3_CK_EDH_RSA_DES_40_CBC_SHA		0x03000014
   154 #define SSL3_CK_EDH_RSA_DES_64_CBC_SHA		0x03000015
   155 #define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA	0x03000016
   156 
   157 #define SSL3_CK_ADH_RC4_40_MD5			0x03000017
   158 #define SSL3_CK_ADH_RC4_128_MD5			0x03000018
   159 #define SSL3_CK_ADH_DES_40_CBC_SHA		0x03000019
   160 #define SSL3_CK_ADH_DES_64_CBC_SHA		0x0300001A
   161 #define SSL3_CK_ADH_DES_192_CBC_SHA		0x0300001B
   162 
   163 #define SSL3_CK_FZA_DMS_NULL_SHA		0x0300001C
   164 #define SSL3_CK_FZA_DMS_FZA_SHA			0x0300001D
   165 #if 0 /* Because it clashes with KRB5, is never used any more, and is safe
   166 	 to remove according to David Hopwood <david.hopwood@zetnet.co.uk>
   167 	 of the ietf-tls list */
   168 #define SSL3_CK_FZA_DMS_RC4_SHA			0x0300001E
   169 #endif
   170 
   171 /*    VRS Additional Kerberos5 entries
   172  */
   173 #define SSL3_CK_KRB5_DES_64_CBC_SHA		0x0300001E
   174 #define SSL3_CK_KRB5_DES_192_CBC3_SHA		0x0300001F
   175 #define SSL3_CK_KRB5_RC4_128_SHA		0x03000020
   176 #define SSL3_CK_KRB5_IDEA_128_CBC_SHA	       	0x03000021
   177 #define SSL3_CK_KRB5_DES_64_CBC_MD5       	0x03000022
   178 #define SSL3_CK_KRB5_DES_192_CBC3_MD5       	0x03000023
   179 #define SSL3_CK_KRB5_RC4_128_MD5	       	0x03000024
   180 #define SSL3_CK_KRB5_IDEA_128_CBC_MD5 		0x03000025
   181 
   182 #define SSL3_CK_KRB5_DES_40_CBC_SHA 		0x03000026
   183 #define SSL3_CK_KRB5_RC2_40_CBC_SHA 		0x03000027
   184 #define SSL3_CK_KRB5_RC4_40_SHA	 		0x03000028
   185 #define SSL3_CK_KRB5_DES_40_CBC_MD5 		0x03000029
   186 #define SSL3_CK_KRB5_RC2_40_CBC_MD5 		0x0300002A
   187 #define SSL3_CK_KRB5_RC4_40_MD5	 		0x0300002B
   188 
   189 #define SSL3_TXT_RSA_NULL_MD5			"NULL-MD5"
   190 #define SSL3_TXT_RSA_NULL_SHA			"NULL-SHA"
   191 #define SSL3_TXT_RSA_RC4_40_MD5 		"EXP-RC4-MD5"
   192 #define SSL3_TXT_RSA_RC4_128_MD5		"RC4-MD5"
   193 #define SSL3_TXT_RSA_RC4_128_SHA		"RC4-SHA"
   194 #define SSL3_TXT_RSA_RC2_40_MD5			"EXP-RC2-CBC-MD5"
   195 #define SSL3_TXT_RSA_IDEA_128_SHA		"IDEA-CBC-SHA"
   196 #define SSL3_TXT_RSA_DES_40_CBC_SHA		"EXP-DES-CBC-SHA"
   197 #define SSL3_TXT_RSA_DES_64_CBC_SHA		"DES-CBC-SHA"
   198 #define SSL3_TXT_RSA_DES_192_CBC3_SHA		"DES-CBC3-SHA"
   199 
   200 #define SSL3_TXT_DH_DSS_DES_40_CBC_SHA		"EXP-DH-DSS-DES-CBC-SHA"
   201 #define SSL3_TXT_DH_DSS_DES_64_CBC_SHA		"DH-DSS-DES-CBC-SHA"
   202 #define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA 	"DH-DSS-DES-CBC3-SHA"
   203 #define SSL3_TXT_DH_RSA_DES_40_CBC_SHA		"EXP-DH-RSA-DES-CBC-SHA"
   204 #define SSL3_TXT_DH_RSA_DES_64_CBC_SHA		"DH-RSA-DES-CBC-SHA"
   205 #define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA 	"DH-RSA-DES-CBC3-SHA"
   206 
   207 #define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA		"EXP-EDH-DSS-DES-CBC-SHA"
   208 #define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA		"EDH-DSS-DES-CBC-SHA"
   209 #define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA	"EDH-DSS-DES-CBC3-SHA"
   210 #define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA		"EXP-EDH-RSA-DES-CBC-SHA"
   211 #define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA		"EDH-RSA-DES-CBC-SHA"
   212 #define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA	"EDH-RSA-DES-CBC3-SHA"
   213 
   214 #define SSL3_TXT_ADH_RC4_40_MD5			"EXP-ADH-RC4-MD5"
   215 #define SSL3_TXT_ADH_RC4_128_MD5		"ADH-RC4-MD5"
   216 #define SSL3_TXT_ADH_DES_40_CBC_SHA		"EXP-ADH-DES-CBC-SHA"
   217 #define SSL3_TXT_ADH_DES_64_CBC_SHA		"ADH-DES-CBC-SHA"
   218 #define SSL3_TXT_ADH_DES_192_CBC_SHA		"ADH-DES-CBC3-SHA"
   219 
   220 #define SSL3_TXT_FZA_DMS_NULL_SHA		"FZA-NULL-SHA"
   221 #define SSL3_TXT_FZA_DMS_FZA_SHA		"FZA-FZA-CBC-SHA"
   222 #define SSL3_TXT_FZA_DMS_RC4_SHA		"FZA-RC4-SHA"
   223 
   224 #define SSL3_TXT_KRB5_DES_64_CBC_SHA		"KRB5-DES-CBC-SHA"
   225 #define SSL3_TXT_KRB5_DES_192_CBC3_SHA		"KRB5-DES-CBC3-SHA"
   226 #define SSL3_TXT_KRB5_RC4_128_SHA		"KRB5-RC4-SHA"
   227 #define SSL3_TXT_KRB5_IDEA_128_CBC_SHA	       	"KRB5-IDEA-CBC-SHA"
   228 #define SSL3_TXT_KRB5_DES_64_CBC_MD5       	"KRB5-DES-CBC-MD5"
   229 #define SSL3_TXT_KRB5_DES_192_CBC3_MD5       	"KRB5-DES-CBC3-MD5"
   230 #define SSL3_TXT_KRB5_RC4_128_MD5		"KRB5-RC4-MD5"
   231 #define SSL3_TXT_KRB5_IDEA_128_CBC_MD5 		"KRB5-IDEA-CBC-MD5"
   232 
   233 #define SSL3_TXT_KRB5_DES_40_CBC_SHA 		"EXP-KRB5-DES-CBC-SHA"
   234 #define SSL3_TXT_KRB5_RC2_40_CBC_SHA 		"EXP-KRB5-RC2-CBC-SHA"
   235 #define SSL3_TXT_KRB5_RC4_40_SHA	 	"EXP-KRB5-RC4-SHA"
   236 #define SSL3_TXT_KRB5_DES_40_CBC_MD5 		"EXP-KRB5-DES-CBC-MD5"
   237 #define SSL3_TXT_KRB5_RC2_40_CBC_MD5 		"EXP-KRB5-RC2-CBC-MD5"
   238 #define SSL3_TXT_KRB5_RC4_40_MD5	 	"EXP-KRB5-RC4-MD5"
   239 
   240 #define SSL3_SSL_SESSION_ID_LENGTH		32
   241 #define SSL3_MAX_SSL_SESSION_ID_LENGTH		32
   242 
   243 #define SSL3_MASTER_SECRET_SIZE			48
   244 #define SSL3_RANDOM_SIZE			32
   245 #define SSL3_SESSION_ID_SIZE			32
   246 #define SSL3_RT_HEADER_LENGTH			5
   247 
   248 /* Due to MS stuffing up, this can change.... */
   249 #if defined(OPENSSL_SYS_WIN16) || \
   250 	(defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32))
   251 #define SSL3_RT_MAX_EXTRA			(14000)
   252 #else
   253 #define SSL3_RT_MAX_EXTRA			(16384)
   254 #endif
   255 
   256 #define SSL3_RT_MAX_PLAIN_LENGTH		16384
   257 #ifdef OPENSSL_NO_COMP
   258 #define SSL3_RT_MAX_COMPRESSED_LENGTH	SSL3_RT_MAX_PLAIN_LENGTH
   259 #else
   260 #define SSL3_RT_MAX_COMPRESSED_LENGTH	(1024+SSL3_RT_MAX_PLAIN_LENGTH)
   261 #endif
   262 #define SSL3_RT_MAX_ENCRYPTED_LENGTH	(1024+SSL3_RT_MAX_COMPRESSED_LENGTH)
   263 #define SSL3_RT_MAX_PACKET_SIZE		(SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH)
   264 #define SSL3_RT_MAX_DATA_SIZE			(1024*1024)
   265 
   266 #define SSL3_MD_CLIENT_FINISHED_CONST	"\x43\x4C\x4E\x54"
   267 #define SSL3_MD_SERVER_FINISHED_CONST	"\x53\x52\x56\x52"
   268 
   269 #define SSL3_VERSION			0x0300
   270 #define SSL3_VERSION_MAJOR		0x03
   271 #define SSL3_VERSION_MINOR		0x00
   272 
   273 #define SSL3_RT_CHANGE_CIPHER_SPEC	20
   274 #define SSL3_RT_ALERT			21
   275 #define SSL3_RT_HANDSHAKE		22
   276 #define SSL3_RT_APPLICATION_DATA	23
   277 
   278 #define SSL3_AL_WARNING			1
   279 #define SSL3_AL_FATAL			2
   280 
   281 #define SSL3_AD_CLOSE_NOTIFY		 0
   282 #define SSL3_AD_UNEXPECTED_MESSAGE	10	/* fatal */
   283 #define SSL3_AD_BAD_RECORD_MAC		20	/* fatal */
   284 #define SSL3_AD_DECOMPRESSION_FAILURE	30	/* fatal */
   285 #define SSL3_AD_HANDSHAKE_FAILURE	40	/* fatal */
   286 #define SSL3_AD_NO_CERTIFICATE		41
   287 #define SSL3_AD_BAD_CERTIFICATE		42
   288 #define SSL3_AD_UNSUPPORTED_CERTIFICATE	43
   289 #define SSL3_AD_CERTIFICATE_REVOKED	44
   290 #define SSL3_AD_CERTIFICATE_EXPIRED	45
   291 #define SSL3_AD_CERTIFICATE_UNKNOWN	46
   292 #define SSL3_AD_ILLEGAL_PARAMETER	47	/* fatal */
   293 
   294 typedef struct ssl3_record_st
   295 	{
   296 /*r */	int type;               /* type of record */
   297 /*rw*/	unsigned int length;    /* How many bytes available */
   298 /*r */	unsigned int off;       /* read/write offset into 'buf' */
   299 /*rw*/	unsigned char *data;    /* pointer to the record data */
   300 /*rw*/	unsigned char *input;   /* where the decode bytes are */
   301 /*r */	unsigned char *comp;    /* only used with decompression - malloc()ed */
   302 /*r */  unsigned long epoch;    /* epoch number, needed by DTLS1 */
   303 /*r */  PQ_64BIT seq_num;       /* sequence number, needed by DTLS1 */
   304 	} SSL3_RECORD;
   305 
   306 typedef struct ssl3_buffer_st
   307 	{
   308 	unsigned char *buf;     /* at least SSL3_RT_MAX_PACKET_SIZE bytes,
   309 	                         * see ssl3_setup_buffers() */
   310 	size_t len;             /* buffer size */
   311 	int offset;             /* where to 'copy from' */
   312 	int left;               /* how many bytes left */
   313 	} SSL3_BUFFER;
   314 
   315 #define SSL3_CT_RSA_SIGN			1
   316 #define SSL3_CT_DSS_SIGN			2
   317 #define SSL3_CT_RSA_FIXED_DH			3
   318 #define SSL3_CT_DSS_FIXED_DH			4
   319 #define SSL3_CT_RSA_EPHEMERAL_DH		5
   320 #define SSL3_CT_DSS_EPHEMERAL_DH		6
   321 #define SSL3_CT_FORTEZZA_DMS			20
   322 /* SSL3_CT_NUMBER is used to size arrays and it must be large
   323  * enough to contain all of the cert types defined either for
   324  * SSLv3 and TLSv1.
   325  */
   326 #define SSL3_CT_NUMBER			7
   327 
   328 
   329 #define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS	0x0001
   330 #define SSL3_FLAGS_DELAY_CLIENT_FINISHED	0x0002
   331 #define SSL3_FLAGS_POP_BUFFER			0x0004
   332 #define TLS1_FLAGS_TLS_PADDING_BUG		0x0008
   333 
   334 typedef struct ssl3_state_st
   335 	{
   336 	long flags;
   337 	int delay_buf_pop_ret;
   338 
   339 	unsigned char read_sequence[8];
   340 	unsigned char read_mac_secret[EVP_MAX_MD_SIZE];
   341 	unsigned char write_sequence[8];
   342 	unsigned char write_mac_secret[EVP_MAX_MD_SIZE];
   343 
   344 	unsigned char server_random[SSL3_RANDOM_SIZE];
   345 	unsigned char client_random[SSL3_RANDOM_SIZE];
   346 
   347 	/* flags for countermeasure against known-IV weakness */
   348 	int need_empty_fragments;
   349 	int empty_fragment_done;
   350 
   351 	SSL3_BUFFER rbuf;	/* read IO goes into here */
   352 	SSL3_BUFFER wbuf;	/* write IO goes into here */
   353 
   354 	SSL3_RECORD rrec;	/* each decoded record goes in here */
   355 	SSL3_RECORD wrec;	/* goes out from here */
   356 
   357 	/* storage for Alert/Handshake protocol data received but not
   358 	 * yet processed by ssl3_read_bytes: */
   359 	unsigned char alert_fragment[2];
   360 	unsigned int alert_fragment_len;
   361 	unsigned char handshake_fragment[4];
   362 	unsigned int handshake_fragment_len;
   363 
   364 	/* partial write - check the numbers match */
   365 	unsigned int wnum;	/* number of bytes sent so far */
   366 	int wpend_tot;		/* number bytes written */
   367 	int wpend_type;
   368 	int wpend_ret;		/* number of bytes submitted */
   369 	const unsigned char *wpend_buf;
   370 
   371 	/* used during startup, digest all incoming/outgoing packets */
   372 	EVP_MD_CTX finish_dgst1;
   373 	EVP_MD_CTX finish_dgst2;
   374 
   375 	/* this is set whenerver we see a change_cipher_spec message
   376 	 * come in when we are not looking for one */
   377 	int change_cipher_spec;
   378 
   379 	int warn_alert;
   380 	int fatal_alert;
   381 	/* we allow one fatal and one warning alert to be outstanding,
   382 	 * send close alert via the warning alert */
   383 	int alert_dispatch;
   384 	unsigned char send_alert[2];
   385 
   386 	/* This flag is set when we should renegotiate ASAP, basically when
   387 	 * there is no more data in the read or write buffers */
   388 	int renegotiate;
   389 	int total_renegotiations;
   390 	int num_renegotiations;
   391 
   392 	int in_read_app_data;
   393 
   394 	struct	{
   395 		/* actually only needs to be 16+20 */
   396 		unsigned char cert_verify_md[EVP_MAX_MD_SIZE*2];
   397 
   398 		/* actually only need to be 16+20 for SSLv3 and 12 for TLS */
   399 		unsigned char finish_md[EVP_MAX_MD_SIZE*2];
   400 		int finish_md_len;
   401 		unsigned char peer_finish_md[EVP_MAX_MD_SIZE*2];
   402 		int peer_finish_md_len;
   403 		
   404 		unsigned long message_size;
   405 		int message_type;
   406 
   407 		/* used to hold the new cipher we are going to use */
   408 		SSL_CIPHER *new_cipher;
   409 #ifndef OPENSSL_NO_DH
   410 		DH *dh;
   411 #endif
   412 
   413 #ifndef OPENSSL_NO_ECDH
   414 		EC_KEY *ecdh; /* holds short lived ECDH key */
   415 #endif
   416 
   417 		/* used when SSL_ST_FLUSH_DATA is entered */
   418 		int next_state;			
   419 
   420 		int reuse_message;
   421 
   422 		/* used for certificate requests */
   423 		int cert_req;
   424 		int ctype_num;
   425 		char ctype[SSL3_CT_NUMBER];
   426 		STACK_OF(X509_NAME) *ca_names;
   427 
   428 		int use_rsa_tmp;
   429 
   430 		int key_block_length;
   431 		unsigned char *key_block;
   432 
   433 		const EVP_CIPHER *new_sym_enc;
   434 		const EVP_MD *new_hash;
   435 #ifndef OPENSSL_NO_COMP
   436 		const SSL_COMP *new_compression;
   437 #else
   438 		char *new_compression;
   439 #endif
   440 		int cert_request;
   441 		} tmp;
   442 
   443 	} SSL3_STATE;
   444 
   445 
   446 /* SSLv3 */
   447 /*client */
   448 /* extra state */
   449 #define SSL3_ST_CW_FLUSH		(0x100|SSL_ST_CONNECT)
   450 /* write to server */
   451 #define SSL3_ST_CW_CLNT_HELLO_A		(0x110|SSL_ST_CONNECT)
   452 #define SSL3_ST_CW_CLNT_HELLO_B		(0x111|SSL_ST_CONNECT)
   453 /* read from server */
   454 #define SSL3_ST_CR_SRVR_HELLO_A		(0x120|SSL_ST_CONNECT)
   455 #define SSL3_ST_CR_SRVR_HELLO_B		(0x121|SSL_ST_CONNECT)
   456 #define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A (0x126|SSL_ST_CONNECT)
   457 #define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B (0x127|SSL_ST_CONNECT)
   458 #define SSL3_ST_CR_CERT_A		(0x130|SSL_ST_CONNECT)
   459 #define SSL3_ST_CR_CERT_B		(0x131|SSL_ST_CONNECT)
   460 #define SSL3_ST_CR_KEY_EXCH_A		(0x140|SSL_ST_CONNECT)
   461 #define SSL3_ST_CR_KEY_EXCH_B		(0x141|SSL_ST_CONNECT)
   462 #define SSL3_ST_CR_CERT_REQ_A		(0x150|SSL_ST_CONNECT)
   463 #define SSL3_ST_CR_CERT_REQ_B		(0x151|SSL_ST_CONNECT)
   464 #define SSL3_ST_CR_SRVR_DONE_A		(0x160|SSL_ST_CONNECT)
   465 #define SSL3_ST_CR_SRVR_DONE_B		(0x161|SSL_ST_CONNECT)
   466 /* write to server */
   467 #define SSL3_ST_CW_CERT_A		(0x170|SSL_ST_CONNECT)
   468 #define SSL3_ST_CW_CERT_B		(0x171|SSL_ST_CONNECT)
   469 #define SSL3_ST_CW_CERT_C		(0x172|SSL_ST_CONNECT)
   470 #define SSL3_ST_CW_CERT_D		(0x173|SSL_ST_CONNECT)
   471 #define SSL3_ST_CW_KEY_EXCH_A		(0x180|SSL_ST_CONNECT)
   472 #define SSL3_ST_CW_KEY_EXCH_B		(0x181|SSL_ST_CONNECT)
   473 #define SSL3_ST_CW_CERT_VRFY_A		(0x190|SSL_ST_CONNECT)
   474 #define SSL3_ST_CW_CERT_VRFY_B		(0x191|SSL_ST_CONNECT)
   475 #define SSL3_ST_CW_CHANGE_A		(0x1A0|SSL_ST_CONNECT)
   476 #define SSL3_ST_CW_CHANGE_B		(0x1A1|SSL_ST_CONNECT)
   477 #define SSL3_ST_CW_FINISHED_A		(0x1B0|SSL_ST_CONNECT)
   478 #define SSL3_ST_CW_FINISHED_B		(0x1B1|SSL_ST_CONNECT)
   479 /* read from server */
   480 #define SSL3_ST_CR_CHANGE_A		(0x1C0|SSL_ST_CONNECT)
   481 #define SSL3_ST_CR_CHANGE_B		(0x1C1|SSL_ST_CONNECT)
   482 #define SSL3_ST_CR_FINISHED_A		(0x1D0|SSL_ST_CONNECT)
   483 #define SSL3_ST_CR_FINISHED_B		(0x1D1|SSL_ST_CONNECT)
   484 #define SSL3_ST_CR_SESSION_TICKET_A	(0x1E0|SSL_ST_CONNECT)
   485 #define SSL3_ST_CR_SESSION_TICKET_B	(0x1E1|SSL_ST_CONNECT)
   486 
   487 /* server */
   488 /* extra state */
   489 #define SSL3_ST_SW_FLUSH		(0x100|SSL_ST_ACCEPT)
   490 /* read from client */
   491 /* Do not change the number values, they do matter */
   492 #define SSL3_ST_SR_CLNT_HELLO_A		(0x110|SSL_ST_ACCEPT)
   493 #define SSL3_ST_SR_CLNT_HELLO_B		(0x111|SSL_ST_ACCEPT)
   494 #define SSL3_ST_SR_CLNT_HELLO_C		(0x112|SSL_ST_ACCEPT)
   495 /* write to client */
   496 #define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT)
   497 #define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT)
   498 #define SSL3_ST_SW_HELLO_REQ_A		(0x120|SSL_ST_ACCEPT)
   499 #define SSL3_ST_SW_HELLO_REQ_B		(0x121|SSL_ST_ACCEPT)
   500 #define SSL3_ST_SW_HELLO_REQ_C		(0x122|SSL_ST_ACCEPT)
   501 #define SSL3_ST_SW_SRVR_HELLO_A		(0x130|SSL_ST_ACCEPT)
   502 #define SSL3_ST_SW_SRVR_HELLO_B		(0x131|SSL_ST_ACCEPT)
   503 #define SSL3_ST_SW_CERT_A		(0x140|SSL_ST_ACCEPT)
   504 #define SSL3_ST_SW_CERT_B		(0x141|SSL_ST_ACCEPT)
   505 #define SSL3_ST_SW_KEY_EXCH_A		(0x150|SSL_ST_ACCEPT)
   506 #define SSL3_ST_SW_KEY_EXCH_B		(0x151|SSL_ST_ACCEPT)
   507 #define SSL3_ST_SW_CERT_REQ_A		(0x160|SSL_ST_ACCEPT)
   508 #define SSL3_ST_SW_CERT_REQ_B		(0x161|SSL_ST_ACCEPT)
   509 #define SSL3_ST_SW_SRVR_DONE_A		(0x170|SSL_ST_ACCEPT)
   510 #define SSL3_ST_SW_SRVR_DONE_B		(0x171|SSL_ST_ACCEPT)
   511 /* read from client */
   512 #define SSL3_ST_SR_CERT_A		(0x180|SSL_ST_ACCEPT)
   513 #define SSL3_ST_SR_CERT_B		(0x181|SSL_ST_ACCEPT)
   514 #define SSL3_ST_SR_KEY_EXCH_A		(0x190|SSL_ST_ACCEPT)
   515 #define SSL3_ST_SR_KEY_EXCH_B		(0x191|SSL_ST_ACCEPT)
   516 #define SSL3_ST_SR_CERT_VRFY_A		(0x1A0|SSL_ST_ACCEPT)
   517 #define SSL3_ST_SR_CERT_VRFY_B		(0x1A1|SSL_ST_ACCEPT)
   518 #define SSL3_ST_SR_CHANGE_A		(0x1B0|SSL_ST_ACCEPT)
   519 #define SSL3_ST_SR_CHANGE_B		(0x1B1|SSL_ST_ACCEPT)
   520 #define SSL3_ST_SR_FINISHED_A		(0x1C0|SSL_ST_ACCEPT)
   521 #define SSL3_ST_SR_FINISHED_B		(0x1C1|SSL_ST_ACCEPT)
   522 /* write to client */
   523 #define SSL3_ST_SW_CHANGE_A		(0x1D0|SSL_ST_ACCEPT)
   524 #define SSL3_ST_SW_CHANGE_B		(0x1D1|SSL_ST_ACCEPT)
   525 #define SSL3_ST_SW_FINISHED_A		(0x1E0|SSL_ST_ACCEPT)
   526 #define SSL3_ST_SW_FINISHED_B		(0x1E1|SSL_ST_ACCEPT)
   527 #define SSL3_ST_SW_SESSION_TICKET_A	(0x1F0|SSL_ST_ACCEPT)
   528 #define SSL3_ST_SW_SESSION_TICKET_B	(0x1F1|SSL_ST_ACCEPT)
   529 
   530 #define SSL3_MT_HELLO_REQUEST			0
   531 #define SSL3_MT_CLIENT_HELLO			1
   532 #define SSL3_MT_SERVER_HELLO			2
   533 #define	SSL3_MT_NEWSESSION_TICKET		4
   534 #define SSL3_MT_CERTIFICATE			11
   535 #define SSL3_MT_SERVER_KEY_EXCHANGE		12
   536 #define SSL3_MT_CERTIFICATE_REQUEST		13
   537 #define SSL3_MT_SERVER_DONE			14
   538 #define SSL3_MT_CERTIFICATE_VERIFY		15
   539 #define SSL3_MT_CLIENT_KEY_EXCHANGE		16
   540 #define SSL3_MT_FINISHED			20
   541 #define DTLS1_MT_HELLO_VERIFY_REQUEST    3
   542 
   543 
   544 #define SSL3_MT_CCS				1
   545 
   546 /* These are used when changing over to a new cipher */
   547 #define SSL3_CC_READ		0x01
   548 #define SSL3_CC_WRITE		0x02
   549 #define SSL3_CC_CLIENT		0x10
   550 #define SSL3_CC_SERVER		0x20
   551 #define SSL3_CHANGE_CIPHER_CLIENT_WRITE	(SSL3_CC_CLIENT|SSL3_CC_WRITE)	
   552 #define SSL3_CHANGE_CIPHER_SERVER_READ	(SSL3_CC_SERVER|SSL3_CC_READ)
   553 #define SSL3_CHANGE_CIPHER_CLIENT_READ	(SSL3_CC_CLIENT|SSL3_CC_READ)
   554 #define SSL3_CHANGE_CIPHER_SERVER_WRITE	(SSL3_CC_SERVER|SSL3_CC_WRITE)
   555 
   556 #ifdef  __cplusplus
   557 }
   558 #endif
   559 #endif
   560