| Index: patches/tls_exporter.patch | 
| =================================================================== | 
| --- patches/tls_exporter.patch	(revision 162408) | 
| +++ patches/tls_exporter.patch	(working copy) | 
| @@ -1,220 +0,0 @@ | 
| -diff --git a/ssl/d1_lib.c b/ssl/d1_lib.c | 
| -index c3b77c8..a94290a 100644 | 
| ---- a/ssl/d1_lib.c | 
| -+++ b/ssl/d1_lib.c | 
| -@@ -82,6 +82,7 @@ SSL3_ENC_METHOD DTLSv1_enc_data={ | 
| - 	TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE, | 
| - 	TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE, | 
| - 	tls1_alert_code, | 
| -+	tls1_export_keying_material, | 
| - 	}; | 
| - | 
| - long dtls1_default_timeout(void) | 
| -diff --git a/ssl/s3_lib.c b/ssl/s3_lib.c | 
| -index c19538a..1fecbbc 100644 | 
| ---- a/ssl/s3_lib.c | 
| -+++ b/ssl/s3_lib.c | 
| -@@ -2087,6 +2087,9 @@ SSL3_ENC_METHOD SSLv3_enc_data={ | 
| - 	SSL3_MD_CLIENT_FINISHED_CONST,4, | 
| - 	SSL3_MD_SERVER_FINISHED_CONST,4, | 
| - 	ssl3_alert_code, | 
| -+	(int (*)(SSL *, unsigned char *, size_t, const char *, | 
| -+		 size_t, const unsigned char *, size_t, | 
| -+		 int use_context)) ssl_undefined_function, | 
| - 	}; | 
| - | 
| - long ssl3_default_timeout(void) | 
| -diff --git a/ssl/ssl.h b/ssl/ssl.h | 
| -index 9336af8..be4af2f 100644 | 
| ---- a/ssl/ssl.h | 
| -+++ b/ssl/ssl.h | 
| -@@ -2116,6 +2116,7 @@ void ERR_load_SSL_strings(void); | 
| - #define SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT	 301 | 
| - #define SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT		 303 | 
| - #define SSL_F_SSL_PEEK					 270 | 
| -+#define SSL_F_TLS1_EXPORT_KEYING_MATERIAL		 312 | 
| - #define SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT		 281 | 
| - #define SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT		 282 | 
| - #define SSL_F_SSL_READ					 223 | 
| -@@ -2394,6 +2395,7 @@ void ERR_load_SSL_strings(void); | 
| - #define SSL_R_TLSV1_UNRECOGNIZED_NAME			 1112 | 
| - #define SSL_R_TLSV1_UNSUPPORTED_EXTENSION		 1110 | 
| - #define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER	 232 | 
| -+#define SSL_R_TLS_ILLEGAL_EXPORTER_LABEL		 367 | 
| - #define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST		 157 | 
| - #define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233 | 
| - #define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG	 234 | 
| -diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c | 
| -index 17d2cde..d6ad3c1 100644 | 
| ---- a/ssl/ssl_lib.c | 
| -+++ b/ssl/ssl_lib.c | 
| -@@ -3127,6 +3127,18 @@ void SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, unsigned | 
| - 	} | 
| - #endif | 
| - | 
| -+int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, | 
| -+        const char *label, size_t llen, const unsigned char *p, size_t plen, | 
| -+        int use_context) | 
| -+	{ | 
| -+	if (s->version < TLS1_VERSION) | 
| -+		return -1; | 
| -+ | 
| -+	return s->method->ssl3_enc->export_keying_material(s, out, olen, label, | 
| -+							   llen, p, plen, | 
| -+							   use_context); | 
| -+	} | 
| -+ | 
| - int SSL_cutthrough_complete(const SSL *s) | 
| - 	{ | 
| - 	return (!s->server &&                 /* cutthrough only applies to clients */ | 
| -diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h | 
| -index 146c89c..e7c6b9a 100644 | 
| ---- a/ssl/ssl_locl.h | 
| -+++ b/ssl/ssl_locl.h | 
| -@@ -557,6 +557,10 @@ typedef struct ssl3_enc_method | 
| - 	const char *server_finished_label; | 
| - 	int server_finished_label_len; | 
| - 	int (*alert_value)(int); | 
| -+	int (*export_keying_material)(SSL *, unsigned char *, size_t, | 
| -+				      const char *, size_t, | 
| -+				      const unsigned char *, size_t, | 
| -+				      int use_context); | 
| - 	} SSL3_ENC_METHOD; | 
| - | 
| - #ifndef OPENSSL_NO_COMP | 
| -@@ -1041,6 +1045,9 @@ int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *p); | 
| - int tls1_mac(SSL *ssl, unsigned char *md, int snd); | 
| - int tls1_generate_master_secret(SSL *s, unsigned char *out, | 
| - 	unsigned char *p, int len); | 
| -+int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen, | 
| -+	const char *label, size_t llen, const unsigned char *p, | 
| -+	size_t plen, int use_context); | 
| - int tls1_alert_code(int code); | 
| - int ssl3_alert_code(int code); | 
| - int ssl_ok(SSL *s); | 
| -diff --git a/ssl/t1_enc.c b/ssl/t1_enc.c | 
| -index 793ea43..b1d5b28 100644 | 
| ---- a/ssl/t1_enc.c | 
| -+++ b/ssl/t1_enc.c | 
| -@@ -1001,6 +1001,95 @@ int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p, | 
| - 	return(SSL3_MASTER_SECRET_SIZE); | 
| - 	} | 
| - | 
| -+int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen, | 
| -+	 const char *label, size_t llen, const unsigned char *context, | 
| -+	 size_t contextlen, int use_context) | 
| -+	{ | 
| -+	unsigned char *buff; | 
| -+	unsigned char *val = NULL; | 
| -+	size_t vallen, currentvalpos; | 
| -+	int rv; | 
| -+ | 
| -+#ifdef KSSL_DEBUG | 
| -+	printf ("tls1_export_keying_material(%p,%p,%d,%s,%d,%p,%d)\n", s, out, olen, label, llen, p, plen); | 
| -+#endif	/* KSSL_DEBUG */ | 
| -+ | 
| -+	buff = OPENSSL_malloc(olen); | 
| -+	if (buff == NULL) goto err2; | 
| -+ | 
| -+	/* construct PRF arguments | 
| -+	 * we construct the PRF argument ourself rather than passing separate | 
| -+	 * values into the TLS PRF to ensure that the concatenation of values | 
| -+	 * does not create a prohibited label. | 
| -+	 */ | 
| -+	vallen = llen + SSL3_RANDOM_SIZE * 2; | 
| -+	if (use_context) | 
| -+		{ | 
| -+		vallen += 2 + contextlen; | 
| -+		} | 
| -+ | 
| -+	val = OPENSSL_malloc(vallen); | 
| -+	if (val == NULL) goto err2; | 
| -+	currentvalpos = 0; | 
| -+	memcpy(val + currentvalpos, (unsigned char *) label, llen); | 
| -+	currentvalpos += llen; | 
| -+	memcpy(val + currentvalpos, s->s3->client_random, SSL3_RANDOM_SIZE); | 
| -+	currentvalpos += SSL3_RANDOM_SIZE; | 
| -+	memcpy(val + currentvalpos, s->s3->server_random, SSL3_RANDOM_SIZE); | 
| -+	currentvalpos += SSL3_RANDOM_SIZE; | 
| -+ | 
| -+	if (use_context) | 
| -+		{ | 
| -+		val[currentvalpos] = (contextlen >> 8) & 0xff; | 
| -+		currentvalpos++; | 
| -+		val[currentvalpos] = contextlen & 0xff; | 
| -+		currentvalpos++; | 
| -+		if ((contextlen > 0) || (context != NULL)) | 
| -+			{ | 
| -+			memcpy(val + currentvalpos, context, contextlen); | 
| -+			} | 
| -+		} | 
| -+ | 
| -+	/* disallow prohibited labels | 
| -+	 * note that SSL3_RANDOM_SIZE > max(prohibited label len) = | 
| -+	 * 15, so size of val > max(prohibited label len) = 15 and the | 
| -+	 * comparisons won't have buffer overflow | 
| -+	 */ | 
| -+	if (memcmp(val, TLS_MD_CLIENT_FINISH_CONST, | 
| -+		 TLS_MD_CLIENT_FINISH_CONST_SIZE) == 0) goto err1; | 
| -+	if (memcmp(val, TLS_MD_SERVER_FINISH_CONST, | 
| -+		 TLS_MD_SERVER_FINISH_CONST_SIZE) == 0) goto err1; | 
| -+	if (memcmp(val, TLS_MD_MASTER_SECRET_CONST, | 
| -+		 TLS_MD_MASTER_SECRET_CONST_SIZE) == 0) goto err1; | 
| -+	if (memcmp(val, TLS_MD_KEY_EXPANSION_CONST, | 
| -+		 TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0) goto err1; | 
| -+ | 
| -+	rv = tls1_PRF(s->s3->tmp.new_cipher->algorithm2, | 
| -+		      val, vallen, | 
| -+		      NULL, 0, | 
| -+		      NULL, 0, | 
| -+		      NULL, 0, | 
| -+		      NULL, 0, | 
| -+		      s->session->master_key,s->session->master_key_length, | 
| -+		      out,buff,olen); | 
| -+ | 
| -+#ifdef KSSL_DEBUG | 
| -+	printf ("tls1_export_keying_material() complete\n"); | 
| -+#endif	/* KSSL_DEBUG */ | 
| -+	goto ret; | 
| -+err1: | 
| -+	SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL); | 
| -+	rv = 0; | 
| -+	goto ret; | 
| -+err2: | 
| -+	SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, ERR_R_MALLOC_FAILURE); | 
| -+	rv = 0; | 
| -+ret: | 
| -+	if (buff != NULL) OPENSSL_free(buff); | 
| -+	if (val != NULL) OPENSSL_free(val); | 
| -+	return(rv); | 
| -+	} | 
| -+ | 
| - int tls1_alert_code(int code) | 
| - 	{ | 
| - 	switch (code) | 
| -diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c | 
| -index daa65c9..c094471 100644 | 
| ---- a/ssl/t1_lib.c | 
| -+++ b/ssl/t1_lib.c | 
| -@@ -209,6 +209,7 @@ SSL3_ENC_METHOD TLSv1_enc_data={ | 
| - 	TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE, | 
| - 	TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE, | 
| - 	tls1_alert_code, | 
| -+	tls1_export_keying_material, | 
| - 	}; | 
| - | 
| - long tls1_default_timeout(void) | 
| -diff --git a/ssl/tls1.h b/ssl/tls1.h | 
| -index 1fa96e5..7bbb875 100644 | 
| ---- a/ssl/tls1.h | 
| -+++ b/ssl/tls1.h | 
| -@@ -231,6 +231,9 @@ extern "C" { | 
| - | 
| - const char *SSL_get_servername(const SSL *s, const int type) ; | 
| - int SSL_get_servername_type(const SSL *s) ; | 
| -+int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, | 
| -+	const char *label, size_t llen, const unsigned char *p, size_t plen, | 
| -+	int use_context); | 
| - | 
| - #define SSL_set_tlsext_host_name(s,name) \ | 
| - SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,(char *)name) | 
|  |