--- /dev/null
+/* ssl/ssl3.h */\r
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)\r
+ * All rights reserved.\r
+ *\r
+ * This package is an SSL implementation written\r
+ * by Eric Young (eay@cryptsoft.com).\r
+ * The implementation was written so as to conform with Netscapes SSL.\r
+ * \r
+ * This library is free for commercial and non-commercial use as long as\r
+ * the following conditions are aheared to. The following conditions\r
+ * apply to all code found in this distribution, be it the RC4, RSA,\r
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation\r
+ * included with this distribution is covered by the same copyright terms\r
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).\r
+ * \r
+ * Copyright remains Eric Young's, and as such any Copyright notices in\r
+ * the code are not to be removed.\r
+ * If this package is used in a product, Eric Young should be given attribution\r
+ * as the author of the parts of the library used.\r
+ * This can be in the form of a textual message at program startup or\r
+ * in documentation (online or textual) provided with the package.\r
+ * \r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ * 3. All advertising materials mentioning features or use of this software\r
+ * must display the following acknowledgement:\r
+ * "This product includes cryptographic software written by\r
+ * Eric Young (eay@cryptsoft.com)"\r
+ * The word 'cryptographic' can be left out if the rouines from the library\r
+ * being used are not cryptographic related :-).\r
+ * 4. If you include any Windows specific code (or a derivative thereof) from \r
+ * the apps directory (application code) you must include an acknowledgement:\r
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"\r
+ * \r
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ * \r
+ * The licence and distribution terms for any publically available version or\r
+ * derivative of this code cannot be changed. i.e. this code cannot simply be\r
+ * copied and put under another distribution licence\r
+ * [including the GNU Public Licence.]\r
+ */\r
+/* ====================================================================\r
+ * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ *\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer. \r
+ *\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in\r
+ * the documentation and/or other materials provided with the\r
+ * distribution.\r
+ *\r
+ * 3. All advertising materials mentioning features or use of this\r
+ * software must display the following acknowledgment:\r
+ * "This product includes software developed by the OpenSSL Project\r
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"\r
+ *\r
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to\r
+ * endorse or promote products derived from this software without\r
+ * prior written permission. For written permission, please contact\r
+ * openssl-core@openssl.org.\r
+ *\r
+ * 5. Products derived from this software may not be called "OpenSSL"\r
+ * nor may "OpenSSL" appear in their names without prior written\r
+ * permission of the OpenSSL Project.\r
+ *\r
+ * 6. Redistributions of any form whatsoever must retain the following\r
+ * acknowledgment:\r
+ * "This product includes software developed by the OpenSSL Project\r
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY\r
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR\r
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\r
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
+ * OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ * ====================================================================\r
+ *\r
+ * This product includes cryptographic software written by Eric Young\r
+ * (eay@cryptsoft.com). This product includes software written by Tim\r
+ * Hudson (tjh@cryptsoft.com).\r
+ *\r
+ */\r
+/* ====================================================================\r
+ * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.\r
+ * ECC cipher suite support in OpenSSL originally developed by \r
+ * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.\r
+ */\r
+\r
+#ifndef HEADER_SSL3_H \r
+#define HEADER_SSL3_H \r
+\r
+#ifndef OPENSSL_NO_COMP\r
+#include <openssl/comp.h>\r
+#endif\r
+#include <openssl/buffer.h>\r
+#include <openssl/evp.h>\r
+#include <openssl/ssl.h>\r
+#include <openssl/pq_compat.h>\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define SSL3_CK_RSA_NULL_MD5 0x03000001\r
+#define SSL3_CK_RSA_NULL_SHA 0x03000002\r
+#define SSL3_CK_RSA_RC4_40_MD5 0x03000003\r
+#define SSL3_CK_RSA_RC4_128_MD5 0x03000004\r
+#define SSL3_CK_RSA_RC4_128_SHA 0x03000005\r
+#define SSL3_CK_RSA_RC2_40_MD5 0x03000006\r
+#define SSL3_CK_RSA_IDEA_128_SHA 0x03000007\r
+#define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008\r
+#define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009\r
+#define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A\r
+\r
+#define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B\r
+#define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C\r
+#define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D\r
+#define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E\r
+#define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F\r
+#define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010\r
+\r
+#define SSL3_CK_EDH_DSS_DES_40_CBC_SHA 0x03000011\r
+#define SSL3_CK_EDH_DSS_DES_64_CBC_SHA 0x03000012\r
+#define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA 0x03000013\r
+#define SSL3_CK_EDH_RSA_DES_40_CBC_SHA 0x03000014\r
+#define SSL3_CK_EDH_RSA_DES_64_CBC_SHA 0x03000015\r
+#define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA 0x03000016\r
+\r
+#define SSL3_CK_ADH_RC4_40_MD5 0x03000017\r
+#define SSL3_CK_ADH_RC4_128_MD5 0x03000018\r
+#define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019\r
+#define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A\r
+#define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B\r
+\r
+#define SSL3_CK_FZA_DMS_NULL_SHA 0x0300001C\r
+#define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D\r
+#if 0 /* Because it clashes with KRB5, is never used any more, and is safe\r
+ to remove according to David Hopwood <david.hopwood@zetnet.co.uk>\r
+ of the ietf-tls list */\r
+#define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E\r
+#endif\r
+\r
+/* VRS Additional Kerberos5 entries\r
+ */\r
+#define SSL3_CK_KRB5_DES_64_CBC_SHA 0x0300001E\r
+#define SSL3_CK_KRB5_DES_192_CBC3_SHA 0x0300001F\r
+#define SSL3_CK_KRB5_RC4_128_SHA 0x03000020\r
+#define SSL3_CK_KRB5_IDEA_128_CBC_SHA 0x03000021\r
+#define SSL3_CK_KRB5_DES_64_CBC_MD5 0x03000022\r
+#define SSL3_CK_KRB5_DES_192_CBC3_MD5 0x03000023\r
+#define SSL3_CK_KRB5_RC4_128_MD5 0x03000024\r
+#define SSL3_CK_KRB5_IDEA_128_CBC_MD5 0x03000025\r
+\r
+#define SSL3_CK_KRB5_DES_40_CBC_SHA 0x03000026\r
+#define SSL3_CK_KRB5_RC2_40_CBC_SHA 0x03000027\r
+#define SSL3_CK_KRB5_RC4_40_SHA 0x03000028\r
+#define SSL3_CK_KRB5_DES_40_CBC_MD5 0x03000029\r
+#define SSL3_CK_KRB5_RC2_40_CBC_MD5 0x0300002A\r
+#define SSL3_CK_KRB5_RC4_40_MD5 0x0300002B\r
+\r
+#define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5"\r
+#define SSL3_TXT_RSA_NULL_SHA "NULL-SHA"\r
+#define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5"\r
+#define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5"\r
+#define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA"\r
+#define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5"\r
+#define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA"\r
+#define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA"\r
+#define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA"\r
+#define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA"\r
+\r
+#define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA"\r
+#define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA"\r
+#define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA"\r
+#define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA"\r
+#define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA"\r
+#define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA"\r
+\r
+#define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA"\r
+#define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA"\r
+#define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA"\r
+#define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA"\r
+#define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA"\r
+#define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA"\r
+\r
+#define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5"\r
+#define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5"\r
+#define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA"\r
+#define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA"\r
+#define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA"\r
+\r
+#define SSL3_TXT_FZA_DMS_NULL_SHA "FZA-NULL-SHA"\r
+#define SSL3_TXT_FZA_DMS_FZA_SHA "FZA-FZA-CBC-SHA"\r
+#define SSL3_TXT_FZA_DMS_RC4_SHA "FZA-RC4-SHA"\r
+\r
+#define SSL3_TXT_KRB5_DES_64_CBC_SHA "KRB5-DES-CBC-SHA"\r
+#define SSL3_TXT_KRB5_DES_192_CBC3_SHA "KRB5-DES-CBC3-SHA"\r
+#define SSL3_TXT_KRB5_RC4_128_SHA "KRB5-RC4-SHA"\r
+#define SSL3_TXT_KRB5_IDEA_128_CBC_SHA "KRB5-IDEA-CBC-SHA"\r
+#define SSL3_TXT_KRB5_DES_64_CBC_MD5 "KRB5-DES-CBC-MD5"\r
+#define SSL3_TXT_KRB5_DES_192_CBC3_MD5 "KRB5-DES-CBC3-MD5"\r
+#define SSL3_TXT_KRB5_RC4_128_MD5 "KRB5-RC4-MD5"\r
+#define SSL3_TXT_KRB5_IDEA_128_CBC_MD5 "KRB5-IDEA-CBC-MD5"\r
+\r
+#define SSL3_TXT_KRB5_DES_40_CBC_SHA "EXP-KRB5-DES-CBC-SHA"\r
+#define SSL3_TXT_KRB5_RC2_40_CBC_SHA "EXP-KRB5-RC2-CBC-SHA"\r
+#define SSL3_TXT_KRB5_RC4_40_SHA "EXP-KRB5-RC4-SHA"\r
+#define SSL3_TXT_KRB5_DES_40_CBC_MD5 "EXP-KRB5-DES-CBC-MD5"\r
+#define SSL3_TXT_KRB5_RC2_40_CBC_MD5 "EXP-KRB5-RC2-CBC-MD5"\r
+#define SSL3_TXT_KRB5_RC4_40_MD5 "EXP-KRB5-RC4-MD5"\r
+\r
+#define SSL3_SSL_SESSION_ID_LENGTH 32\r
+#define SSL3_MAX_SSL_SESSION_ID_LENGTH 32\r
+\r
+#define SSL3_MASTER_SECRET_SIZE 48\r
+#define SSL3_RANDOM_SIZE 32\r
+#define SSL3_SESSION_ID_SIZE 32\r
+#define SSL3_RT_HEADER_LENGTH 5\r
+\r
+/* Due to MS stuffing up, this can change.... */\r
+#if defined(OPENSSL_SYS_WIN16) || \\r
+ (defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32))\r
+#define SSL3_RT_MAX_EXTRA (14000)\r
+#else\r
+#define SSL3_RT_MAX_EXTRA (16384)\r
+#endif\r
+\r
+#define SSL3_RT_MAX_PLAIN_LENGTH 16384\r
+#define SSL3_RT_MAX_COMPRESSED_LENGTH (1024+SSL3_RT_MAX_PLAIN_LENGTH)\r
+#define SSL3_RT_MAX_ENCRYPTED_LENGTH (1024+SSL3_RT_MAX_COMPRESSED_LENGTH)\r
+#define SSL3_RT_MAX_PACKET_SIZE (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH)\r
+#define SSL3_RT_MAX_DATA_SIZE (1024*1024)\r
+\r
+#define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54"\r
+#define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52"\r
+\r
+#define SSL3_VERSION 0x0300\r
+#define SSL3_VERSION_MAJOR 0x03\r
+#define SSL3_VERSION_MINOR 0x00\r
+\r
+#define SSL3_RT_CHANGE_CIPHER_SPEC 20\r
+#define SSL3_RT_ALERT 21\r
+#define SSL3_RT_HANDSHAKE 22\r
+#define SSL3_RT_APPLICATION_DATA 23\r
+\r
+#define SSL3_AL_WARNING 1\r
+#define SSL3_AL_FATAL 2\r
+\r
+#define SSL3_AD_CLOSE_NOTIFY 0\r
+#define SSL3_AD_UNEXPECTED_MESSAGE 10 /* fatal */\r
+#define SSL3_AD_BAD_RECORD_MAC 20 /* fatal */\r
+#define SSL3_AD_DECOMPRESSION_FAILURE 30 /* fatal */\r
+#define SSL3_AD_HANDSHAKE_FAILURE 40 /* fatal */\r
+#define SSL3_AD_NO_CERTIFICATE 41\r
+#define SSL3_AD_BAD_CERTIFICATE 42\r
+#define SSL3_AD_UNSUPPORTED_CERTIFICATE 43\r
+#define SSL3_AD_CERTIFICATE_REVOKED 44\r
+#define SSL3_AD_CERTIFICATE_EXPIRED 45\r
+#define SSL3_AD_CERTIFICATE_UNKNOWN 46\r
+#define SSL3_AD_ILLEGAL_PARAMETER 47 /* fatal */\r
+\r
+typedef struct ssl3_record_st\r
+ {\r
+/*r */ int type; /* type of record */\r
+/*rw*/ unsigned int length; /* How many bytes available */\r
+/*r */ unsigned int off; /* read/write offset into 'buf' */\r
+/*rw*/ unsigned char *data; /* pointer to the record data */\r
+/*rw*/ unsigned char *input; /* where the decode bytes are */\r
+/*r */ unsigned char *comp; /* only used with decompression - malloc()ed */\r
+/*r */ unsigned long epoch; /* epoch number, needed by DTLS1 */\r
+/*r */ PQ_64BIT seq_num; /* sequence number, needed by DTLS1 */\r
+ } SSL3_RECORD;\r
+\r
+typedef struct ssl3_buffer_st\r
+ {\r
+ unsigned char *buf; /* at least SSL3_RT_MAX_PACKET_SIZE bytes,\r
+ * see ssl3_setup_buffers() */\r
+ size_t len; /* buffer size */\r
+ int offset; /* where to 'copy from' */\r
+ int left; /* how many bytes left */\r
+ } SSL3_BUFFER;\r
+\r
+#define SSL3_CT_RSA_SIGN 1\r
+#define SSL3_CT_DSS_SIGN 2\r
+#define SSL3_CT_RSA_FIXED_DH 3\r
+#define SSL3_CT_DSS_FIXED_DH 4\r
+#define SSL3_CT_RSA_EPHEMERAL_DH 5\r
+#define SSL3_CT_DSS_EPHEMERAL_DH 6\r
+#define SSL3_CT_FORTEZZA_DMS 20\r
+/* SSL3_CT_NUMBER is used to size arrays and it must be large\r
+ * enough to contain all of the cert types defined either for\r
+ * SSLv3 and TLSv1.\r
+ */\r
+#define SSL3_CT_NUMBER 7\r
+\r
+\r
+#define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001\r
+#define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002\r
+#define SSL3_FLAGS_POP_BUFFER 0x0004\r
+#define TLS1_FLAGS_TLS_PADDING_BUG 0x0008\r
+\r
+typedef struct ssl3_state_st\r
+ {\r
+ long flags;\r
+ int delay_buf_pop_ret;\r
+\r
+ unsigned char read_sequence[8];\r
+ unsigned char read_mac_secret[EVP_MAX_MD_SIZE];\r
+ unsigned char write_sequence[8];\r
+ unsigned char write_mac_secret[EVP_MAX_MD_SIZE];\r
+\r
+ unsigned char server_random[SSL3_RANDOM_SIZE];\r
+ unsigned char client_random[SSL3_RANDOM_SIZE];\r
+\r
+ /* flags for countermeasure against known-IV weakness */\r
+ int need_empty_fragments;\r
+ int empty_fragment_done;\r
+\r
+ SSL3_BUFFER rbuf; /* read IO goes into here */\r
+ SSL3_BUFFER wbuf; /* write IO goes into here */\r
+\r
+ SSL3_RECORD rrec; /* each decoded record goes in here */\r
+ SSL3_RECORD wrec; /* goes out from here */\r
+\r
+ /* storage for Alert/Handshake protocol data received but not\r
+ * yet processed by ssl3_read_bytes: */\r
+ unsigned char alert_fragment[2];\r
+ unsigned int alert_fragment_len;\r
+ unsigned char handshake_fragment[4];\r
+ unsigned int handshake_fragment_len;\r
+\r
+ /* partial write - check the numbers match */\r
+ unsigned int wnum; /* number of bytes sent so far */\r
+ int wpend_tot; /* number bytes written */\r
+ int wpend_type;\r
+ int wpend_ret; /* number of bytes submitted */\r
+ const unsigned char *wpend_buf;\r
+\r
+ /* used during startup, digest all incoming/outgoing packets */\r
+ EVP_MD_CTX finish_dgst1;\r
+ EVP_MD_CTX finish_dgst2;\r
+\r
+ /* this is set whenerver we see a change_cipher_spec message\r
+ * come in when we are not looking for one */\r
+ int change_cipher_spec;\r
+\r
+ int warn_alert;\r
+ int fatal_alert;\r
+ /* we allow one fatal and one warning alert to be outstanding,\r
+ * send close alert via the warning alert */\r
+ int alert_dispatch;\r
+ unsigned char send_alert[2];\r
+\r
+ /* This flag is set when we should renegotiate ASAP, basically when\r
+ * there is no more data in the read or write buffers */\r
+ int renegotiate;\r
+ int total_renegotiations;\r
+ int num_renegotiations;\r
+\r
+ int in_read_app_data;\r
+\r
+ struct {\r
+ /* actually only needs to be 16+20 */\r
+ unsigned char cert_verify_md[EVP_MAX_MD_SIZE*2];\r
+\r
+ /* actually only need to be 16+20 for SSLv3 and 12 for TLS */\r
+ unsigned char finish_md[EVP_MAX_MD_SIZE*2];\r
+ int finish_md_len;\r
+ unsigned char peer_finish_md[EVP_MAX_MD_SIZE*2];\r
+ int peer_finish_md_len;\r
+ \r
+ unsigned long message_size;\r
+ int message_type;\r
+\r
+ /* used to hold the new cipher we are going to use */\r
+ SSL_CIPHER *new_cipher;\r
+#ifndef OPENSSL_NO_DH\r
+ DH *dh;\r
+#endif\r
+\r
+#ifndef OPENSSL_NO_ECDH\r
+ EC_KEY *ecdh; /* holds short lived ECDH key */\r
+#endif\r
+\r
+ /* used when SSL_ST_FLUSH_DATA is entered */\r
+ int next_state; \r
+\r
+ int reuse_message;\r
+\r
+ /* used for certificate requests */\r
+ int cert_req;\r
+ int ctype_num;\r
+ char ctype[SSL3_CT_NUMBER];\r
+ STACK_OF(X509_NAME) *ca_names;\r
+\r
+ int use_rsa_tmp;\r
+\r
+ int key_block_length;\r
+ unsigned char *key_block;\r
+\r
+ const EVP_CIPHER *new_sym_enc;\r
+ const EVP_MD *new_hash;\r
+#ifndef OPENSSL_NO_COMP\r
+ const SSL_COMP *new_compression;\r
+#else\r
+ char *new_compression;\r
+#endif\r
+ int cert_request;\r
+ } tmp;\r
+\r
+ } SSL3_STATE;\r
+\r
+\r
+/* SSLv3 */\r
+/*client */\r
+/* extra state */\r
+#define SSL3_ST_CW_FLUSH (0x100|SSL_ST_CONNECT)\r
+/* write to server */\r
+#define SSL3_ST_CW_CLNT_HELLO_A (0x110|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_CLNT_HELLO_B (0x111|SSL_ST_CONNECT)\r
+/* read from server */\r
+#define SSL3_ST_CR_SRVR_HELLO_A (0x120|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_SRVR_HELLO_B (0x121|SSL_ST_CONNECT)\r
+#define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A (0x126|SSL_ST_CONNECT)\r
+#define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B (0x127|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_CERT_A (0x130|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_CERT_B (0x131|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_KEY_EXCH_A (0x140|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_KEY_EXCH_B (0x141|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_CERT_REQ_A (0x150|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_CERT_REQ_B (0x151|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_SRVR_DONE_A (0x160|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_SRVR_DONE_B (0x161|SSL_ST_CONNECT)\r
+/* write to server */\r
+#define SSL3_ST_CW_CERT_A (0x170|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_CERT_B (0x171|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_CERT_C (0x172|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_CERT_D (0x173|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_KEY_EXCH_A (0x180|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_KEY_EXCH_B (0x181|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_CERT_VRFY_A (0x190|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_CERT_VRFY_B (0x191|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_CHANGE_A (0x1A0|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_CHANGE_B (0x1A1|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_FINISHED_A (0x1B0|SSL_ST_CONNECT)\r
+#define SSL3_ST_CW_FINISHED_B (0x1B1|SSL_ST_CONNECT)\r
+/* read from server */\r
+#define SSL3_ST_CR_CHANGE_A (0x1C0|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_CHANGE_B (0x1C1|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_FINISHED_A (0x1D0|SSL_ST_CONNECT)\r
+#define SSL3_ST_CR_FINISHED_B (0x1D1|SSL_ST_CONNECT)\r
+\r
+/* server */\r
+/* extra state */\r
+#define SSL3_ST_SW_FLUSH (0x100|SSL_ST_ACCEPT)\r
+/* read from client */\r
+/* Do not change the number values, they do matter */\r
+#define SSL3_ST_SR_CLNT_HELLO_A (0x110|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_CLNT_HELLO_B (0x111|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_CLNT_HELLO_C (0x112|SSL_ST_ACCEPT)\r
+/* write to client */\r
+#define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT)\r
+#define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_HELLO_REQ_A (0x120|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_HELLO_REQ_B (0x121|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_HELLO_REQ_C (0x122|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_SRVR_HELLO_A (0x130|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_SRVR_HELLO_B (0x131|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_CERT_A (0x140|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_CERT_B (0x141|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_KEY_EXCH_A (0x150|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_KEY_EXCH_B (0x151|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_CERT_REQ_A (0x160|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_CERT_REQ_B (0x161|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_SRVR_DONE_A (0x170|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_SRVR_DONE_B (0x171|SSL_ST_ACCEPT)\r
+/* read from client */\r
+#define SSL3_ST_SR_CERT_A (0x180|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_CERT_B (0x181|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_KEY_EXCH_A (0x190|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_KEY_EXCH_B (0x191|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_CERT_VRFY_A (0x1A0|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_CERT_VRFY_B (0x1A1|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_CHANGE_A (0x1B0|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_CHANGE_B (0x1B1|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_FINISHED_A (0x1C0|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SR_FINISHED_B (0x1C1|SSL_ST_ACCEPT)\r
+/* write to client */\r
+#define SSL3_ST_SW_CHANGE_A (0x1D0|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_CHANGE_B (0x1D1|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_FINISHED_A (0x1E0|SSL_ST_ACCEPT)\r
+#define SSL3_ST_SW_FINISHED_B (0x1E1|SSL_ST_ACCEPT)\r
+\r
+#define SSL3_MT_HELLO_REQUEST 0\r
+#define SSL3_MT_CLIENT_HELLO 1\r
+#define SSL3_MT_SERVER_HELLO 2\r
+#define SSL3_MT_CERTIFICATE 11\r
+#define SSL3_MT_SERVER_KEY_EXCHANGE 12\r
+#define SSL3_MT_CERTIFICATE_REQUEST 13\r
+#define SSL3_MT_SERVER_DONE 14\r
+#define SSL3_MT_CERTIFICATE_VERIFY 15\r
+#define SSL3_MT_CLIENT_KEY_EXCHANGE 16\r
+#define SSL3_MT_FINISHED 20\r
+#define DTLS1_MT_HELLO_VERIFY_REQUEST 3\r
+\r
+\r
+#define SSL3_MT_CCS 1\r
+\r
+/* These are used when changing over to a new cipher */\r
+#define SSL3_CC_READ 0x01\r
+#define SSL3_CC_WRITE 0x02\r
+#define SSL3_CC_CLIENT 0x10\r
+#define SSL3_CC_SERVER 0x20\r
+#define SSL3_CHANGE_CIPHER_CLIENT_WRITE (SSL3_CC_CLIENT|SSL3_CC_WRITE) \r
+#define SSL3_CHANGE_CIPHER_SERVER_READ (SSL3_CC_SERVER|SSL3_CC_READ)\r
+#define SSL3_CHANGE_CIPHER_CLIENT_READ (SSL3_CC_CLIENT|SSL3_CC_READ)\r
+#define SSL3_CHANGE_CIPHER_SERVER_WRITE (SSL3_CC_SERVER|SSL3_CC_WRITE)\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif\r
+\r