Index: openssl/ssl/ssl3.h |
=================================================================== |
--- openssl/ssl/ssl3.h (revision 105093) |
+++ openssl/ssl/ssl3.h (working copy) |
@@ -123,7 +123,6 @@ |
#include <openssl/buffer.h> |
#include <openssl/evp.h> |
#include <openssl/ssl.h> |
-#include <openssl/pq_compat.h> |
#ifdef __cplusplus |
extern "C" { |
@@ -163,12 +162,14 @@ |
#define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A |
#define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B |
-#define SSL3_CK_FZA_DMS_NULL_SHA 0x0300001C |
-#define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D |
-#if 0 /* Because it clashes with KRB5, is never used any more, and is safe |
- to remove according to David Hopwood <david.hopwood@zetnet.co.uk> |
- of the ietf-tls list */ |
-#define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E |
+#if 0 |
+ #define SSL3_CK_FZA_DMS_NULL_SHA 0x0300001C |
+ #define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D |
+ #if 0 /* Because it clashes with KRB5, is never used any more, and is safe |
+ to remove according to David Hopwood <david.hopwood@zetnet.co.uk> |
+ of the ietf-tls list */ |
+ #define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E |
+ #endif |
#endif |
/* VRS Additional Kerberos5 entries |
@@ -220,9 +221,11 @@ |
#define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" |
#define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" |
-#define SSL3_TXT_FZA_DMS_NULL_SHA "FZA-NULL-SHA" |
-#define SSL3_TXT_FZA_DMS_FZA_SHA "FZA-FZA-CBC-SHA" |
-#define SSL3_TXT_FZA_DMS_RC4_SHA "FZA-RC4-SHA" |
+#if 0 |
+ #define SSL3_TXT_FZA_DMS_NULL_SHA "FZA-NULL-SHA" |
+ #define SSL3_TXT_FZA_DMS_FZA_SHA "FZA-FZA-CBC-SHA" |
+ #define SSL3_TXT_FZA_DMS_RC4_SHA "FZA-RC4-SHA" |
+#endif |
#define SSL3_TXT_KRB5_DES_64_CBC_SHA "KRB5-DES-CBC-SHA" |
#define SSL3_TXT_KRB5_DES_192_CBC3_SHA "KRB5-DES-CBC3-SHA" |
@@ -248,24 +251,76 @@ |
#define SSL3_SESSION_ID_SIZE 32 |
#define SSL3_RT_HEADER_LENGTH 5 |
-/* Due to MS stuffing up, this can change.... */ |
-#if defined(OPENSSL_SYS_WIN16) || \ |
- (defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32)) |
-#define SSL3_RT_MAX_EXTRA (14000) |
+#ifndef SSL3_ALIGN_PAYLOAD |
+ /* Some will argue that this increases memory footprint, but it's |
+ * not actually true. Point is that malloc has to return at least |
+ * 64-bit aligned pointers, meaning that allocating 5 bytes wastes |
+ * 3 bytes in either case. Suggested pre-gaping simply moves these |
+ * wasted bytes from the end of allocated region to its front, |
+ * but makes data payload aligned, which improves performance:-) */ |
+# define SSL3_ALIGN_PAYLOAD 8 |
#else |
-#define SSL3_RT_MAX_EXTRA (16384) |
+# if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0 |
+# error "insane SSL3_ALIGN_PAYLOAD" |
+# undef SSL3_ALIGN_PAYLOAD |
+# endif |
#endif |
+/* This is the maximum MAC (digest) size used by the SSL library. |
+ * Currently maximum of 20 is used by SHA1, but we reserve for |
+ * future extension for 512-bit hashes. |
+ */ |
+ |
+#define SSL3_RT_MAX_MD_SIZE 64 |
+ |
+/* Maximum block size used in all ciphersuites. Currently 16 for AES. |
+ */ |
+ |
+#define SSL_RT_MAX_CIPHER_BLOCK_SIZE 16 |
+ |
+#define SSL3_RT_MAX_EXTRA (16384) |
+ |
+/* Default buffer length used for writen records. Thus a generated record |
+ * will contain plaintext no larger than this value. */ |
+#define SSL3_RT_DEFAULT_PLAIN_LENGTH 2048 |
+/* Maximum plaintext length: defined by SSL/TLS standards */ |
#define SSL3_RT_MAX_PLAIN_LENGTH 16384 |
+/* Maximum compression overhead: defined by SSL/TLS standards */ |
+#define SSL3_RT_MAX_COMPRESSED_OVERHEAD 1024 |
+ |
+/* The standards give a maximum encryption overhead of 1024 bytes. |
+ * In practice the value is lower than this. The overhead is the maximum |
+ * number of padding bytes (256) plus the mac size. |
+ */ |
+#define SSL3_RT_MAX_ENCRYPTED_OVERHEAD (256 + SSL3_RT_MAX_MD_SIZE) |
+ |
+/* OpenSSL currently only uses a padding length of at most one block so |
+ * the send overhead is smaller. |
+ */ |
+ |
+#define SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD \ |
+ (SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE) |
+ |
+/* If compression isn't used don't include the compression overhead */ |
+ |
#ifdef OPENSSL_NO_COMP |
-#define SSL3_RT_MAX_COMPRESSED_LENGTH SSL3_RT_MAX_PLAIN_LENGTH |
+#define SSL3_RT_MAX_COMPRESSED_LENGTH SSL3_RT_MAX_PLAIN_LENGTH |
#else |
-#define SSL3_RT_MAX_COMPRESSED_LENGTH (1024+SSL3_RT_MAX_PLAIN_LENGTH) |
+#define SSL3_RT_MAX_COMPRESSED_LENGTH \ |
+ (SSL3_RT_MAX_PLAIN_LENGTH+SSL3_RT_MAX_COMPRESSED_OVERHEAD) |
#endif |
-#define SSL3_RT_MAX_ENCRYPTED_LENGTH (1024+SSL3_RT_MAX_COMPRESSED_LENGTH) |
-#define SSL3_RT_MAX_PACKET_SIZE (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) |
-#define SSL3_RT_MAX_DATA_SIZE (1024*1024) |
+#define SSL3_RT_MAX_ENCRYPTED_LENGTH \ |
+ (SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH) |
+#define SSL3_RT_MAX_PACKET_SIZE \ |
+ (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) |
+/* Extra space for empty fragment, headers, MAC, and padding. */ |
+#define SSL3_RT_DEFAULT_WRITE_OVERHEAD 256 |
+#define SSL3_RT_DEFAULT_PACKET_SIZE 4096 - SSL3_RT_DEFAULT_WRITE_OVERHEAD |
+#if SSL3_RT_DEFAULT_PLAIN_LENGTH + SSL3_RT_DEFAULT_WRITE_OVERHEAD > SSL3_RT_DEFAULT_PACKET_SIZE |
+#error "Insufficient space allocated for write buffers." |
+#endif |
+ |
#define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54" |
#define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52" |
@@ -303,7 +358,7 @@ |
/*rw*/ unsigned char *input; /* where the decode bytes are */ |
/*r */ unsigned char *comp; /* only used with decompression - malloc()ed */ |
/*r */ unsigned long epoch; /* epoch number, needed by DTLS1 */ |
-/*r */ PQ_64BIT seq_num; /* sequence number, needed by DTLS1 */ |
+/*r */ unsigned char seq_num[8]; /* sequence number, needed by DTLS1 */ |
} SSL3_RECORD; |
typedef struct ssl3_buffer_st |
@@ -326,13 +381,25 @@ |
* enough to contain all of the cert types defined either for |
* SSLv3 and TLSv1. |
*/ |
-#define SSL3_CT_NUMBER 7 |
+#define SSL3_CT_NUMBER 9 |
#define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 |
#define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 |
#define SSL3_FLAGS_POP_BUFFER 0x0004 |
#define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 |
+#define TLS1_FLAGS_SKIP_CERT_VERIFY 0x0010 |
+ |
+/* SSL3_FLAGS_SGC_RESTART_DONE is set when we |
+ * restart a handshake because of MS SGC and so prevents us |
+ * from restarting the handshake in a loop. It's reset on a |
+ * renegotiation, so effectively limits the client to one restart |
+ * per negotiation. This limits the possibility of a DDoS |
+ * attack where the client handshakes in a loop using SGC to |
+ * restart. Servers which permit renegotiation can still be |
+ * effected, but we can't prevent that. |
+ */ |
+#define SSL3_FLAGS_SGC_RESTART_DONE 0x0040 |
typedef struct ssl3_state_st |
{ |
@@ -340,8 +407,10 @@ |
int delay_buf_pop_ret; |
unsigned char read_sequence[8]; |
+ int read_mac_secret_size; |
unsigned char read_mac_secret[EVP_MAX_MD_SIZE]; |
unsigned char write_sequence[8]; |
+ int write_mac_secret_size; |
unsigned char write_mac_secret[EVP_MAX_MD_SIZE]; |
unsigned char server_random[SSL3_RANDOM_SIZE]; |
@@ -351,6 +420,9 @@ |
int need_empty_fragments; |
int empty_fragment_done; |
+ /* The value of 'extra' when the buffers were initialized */ |
+ int init_extra; |
+ |
SSL3_BUFFER rbuf; /* read IO goes into here */ |
SSL3_BUFFER wbuf; /* write IO goes into here */ |
@@ -372,9 +444,11 @@ |
const unsigned char *wpend_buf; |
/* used during startup, digest all incoming/outgoing packets */ |
- EVP_MD_CTX finish_dgst1; |
- EVP_MD_CTX finish_dgst2; |
- |
+ BIO *handshake_buffer; |
+ /* When set of handshake digests is determined, buffer is hashed |
+ * and freed and MD_CTX-es for all required digests are stored in |
+ * this array */ |
+ EVP_MD_CTX **handshake_dgst; |
/* this is set whenerver we see a change_cipher_spec message |
* come in when we are not looking for one */ |
int change_cipher_spec; |
@@ -394,8 +468,19 @@ |
int in_read_app_data; |
- /* Set if we saw the Next Protocol Negotiation extension from our peer. */ |
+ /* Opaque PRF input as used for the current handshake. |
+ * These fields are used only if TLSEXT_TYPE_opaque_prf_input is defined |
+ * (otherwise, they are merely present to improve binary compatibility) */ |
+ void *client_opaque_prf_input; |
+ size_t client_opaque_prf_input_len; |
+ void *server_opaque_prf_input; |
+ size_t server_opaque_prf_input_len; |
+ |
+#ifndef OPENSSL_NO_NEXTPROTONEG |
+ /* Set if we saw the Next Protocol Negotiation extension from |
+ our peer. */ |
int next_proto_neg_seen; |
+#endif |
struct { |
/* actually only needs to be 16+20 */ |
@@ -411,7 +496,7 @@ |
int message_type; |
/* used to hold the new cipher we are going to use */ |
- SSL_CIPHER *new_cipher; |
+ const SSL_CIPHER *new_cipher; |
#ifndef OPENSSL_NO_DH |
DH *dh; |
#endif |
@@ -438,6 +523,8 @@ |
const EVP_CIPHER *new_sym_enc; |
const EVP_MD *new_hash; |
+ int new_mac_pkey_type; |
+ int new_mac_secret_size; |
#ifndef OPENSSL_NO_COMP |
const SSL_COMP *new_compression; |
#else |
@@ -452,48 +539,6 @@ |
unsigned char previous_server_finished[EVP_MAX_MD_SIZE]; |
unsigned char previous_server_finished_len; |
int send_connection_binding; /* TODOEKR */ |
- |
- /* Snap Start support (server-side only): |
- * |
- * Snap Start allows the client to 'suggest' the value of our random |
- * nonce. Assuming that we accept this suggestion, then the client can |
- * predict our exact reply and calculate a complete handshake based on |
- * that. These opportunistic handshake messages are embedded in the |
- * Snap Start extension, possibly including application data. |
- * |
- * (Note that if the handshake doesn't resume a session, the client |
- * couldn't hope to predict the exact server reply unless it uses the |
- * session ticket extension to suppress session ID generation.) |
- * |
- * All this allows for a TLS handshake that doesn't incur additional |
- * latency if the client side sends application data first. */ |
- |
- /* Set if the client presented a Snap Start extension (empty or |
- * otherwise and the SSL_CTX has a cell configured. Server side only. */ |
- int snap_start_ext_seen; |
- /* Set if the client-suggested a server random value (which is stored |
- * in |server_random|) */ |
- char snap_start_requested; |
- /* Set if the appplication has indicated that the client's |
- * server_random suggestion is acceptable (see |
- * SSL_set_suggested_server_random_validity). If so, a Snap Start |
- * handshake will be attempted. */ |
- char server_random_suggestion_valid; |
- /* Client's predicted response_hash from client snap start extension. |
- * Valid if |snap_start_requested| is set. */ |
- unsigned char predicted_response_hash[8]; |
- /* Actual server handshake message hash. A Snap Start handshake is |
- * possible only if predicated_response_hash matches this. */ |
- unsigned char response_hash[8]; |
- /* If we need to enter snap start recovery then we need to reset the |
- * Finished hash with a different value for the ClientHello. Thus, we |
- * need a copy of the whole ClientHello: */ |
- SSL3_BUFFER snap_start_client_hello; |
- /* A snap start ClientHello can contain records embedded in an |
- * extension. If we wish to read them then this points to the records |
- * within |snap_start_client_hello|. */ |
- SSL3_BUFFER snap_start_records; |
- |
} SSL3_STATE; |
@@ -501,7 +546,7 @@ |
/*client */ |
/* extra state */ |
#define SSL3_ST_CW_FLUSH (0x100|SSL_ST_CONNECT) |
-#define SSL3_ST_CUTTHROUGH_COMPLETE (0x101|SSL_ST_CONNECT) |
+#define SSL3_ST_CUTTHROUGH_COMPLETE (0x101|SSL_ST_CONNECT) |
/* write to server */ |
#define SSL3_ST_CW_CLNT_HELLO_A (0x110|SSL_ST_CONNECT) |
#define SSL3_ST_CW_CLNT_HELLO_B (0x111|SSL_ST_CONNECT) |
@@ -529,8 +574,10 @@ |
#define SSL3_ST_CW_CERT_VRFY_B (0x191|SSL_ST_CONNECT) |
#define SSL3_ST_CW_CHANGE_A (0x1A0|SSL_ST_CONNECT) |
#define SSL3_ST_CW_CHANGE_B (0x1A1|SSL_ST_CONNECT) |
+#ifndef OPENSSL_NO_NEXTPROTONEG |
#define SSL3_ST_CW_NEXT_PROTO_A (0x200|SSL_ST_CONNECT) |
#define SSL3_ST_CW_NEXT_PROTO_B (0x201|SSL_ST_CONNECT) |
+#endif |
#define SSL3_ST_CW_FINISHED_A (0x1B0|SSL_ST_CONNECT) |
#define SSL3_ST_CW_FINISHED_B (0x1B1|SSL_ST_CONNECT) |
/* read from server */ |
@@ -576,8 +623,10 @@ |
#define SSL3_ST_SR_CERT_VRFY_B (0x1A1|SSL_ST_ACCEPT) |
#define SSL3_ST_SR_CHANGE_A (0x1B0|SSL_ST_ACCEPT) |
#define SSL3_ST_SR_CHANGE_B (0x1B1|SSL_ST_ACCEPT) |
+#ifndef OPENSSL_NO_NEXTPROTONEG |
#define SSL3_ST_SR_NEXT_PROTO_A (0x210|SSL_ST_ACCEPT) |
#define SSL3_ST_SR_NEXT_PROTO_B (0x211|SSL_ST_ACCEPT) |
+#endif |
#define SSL3_ST_SR_FINISHED_A (0x1C0|SSL_ST_ACCEPT) |
#define SSL3_ST_SR_FINISHED_B (0x1C1|SSL_ST_ACCEPT) |
/* write to client */ |
@@ -602,7 +651,9 @@ |
#define SSL3_MT_CLIENT_KEY_EXCHANGE 16 |
#define SSL3_MT_FINISHED 20 |
#define SSL3_MT_CERTIFICATE_STATUS 22 |
+#ifndef OPENSSL_NO_NEXTPROTONEG |
#define SSL3_MT_NEXT_PROTO 67 |
+#endif |
#define DTLS1_MT_HELLO_VERIFY_REQUEST 3 |
@@ -622,4 +673,3 @@ |
} |
#endif |
#endif |
- |