diff --git a/SOURCES/Makefile.certificate b/SOURCES/Makefile.certificate
index e839427..4f9d55d 100644
--- a/SOURCES/Makefile.certificate
+++ b/SOURCES/Makefile.certificate
@@ -1,5 +1,8 @@
 UTF8 := $(shell locale -c LC_CTYPE -k | grep -q charmap.*UTF-8 && echo -utf8)
 SERIAL=0
+DAYS=365
+KEYLEN=2048
+TYPE=rsa:$(KEYLEN)
 
 .PHONY: usage
 .SUFFIXES: .key .csr .crt .pem
@@ -21,6 +24,7 @@ usage:
 	@echo "To create a test certificate for use with Apache, run \"make testcert\"."
 	@echo
 	@echo "To create a test certificate with serial number other than zero, add SERIAL=num"
+	@echo "You can also specify key length with KEYLEN=n and expiration in days with DAYS=n"
 	@echo
 	@echo Examples:
 	@echo "  make server.key"
@@ -38,7 +42,7 @@ usage:
 	umask 77 ; \
 	PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
 	PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
-	/usr/bin/openssl req $(UTF8) -newkey rsa:2048 -keyout $$PEM1 -nodes -x509 -days 365 -out $$PEM2 -set_serial $(SERIAL) ; \
+	/usr/bin/openssl req $(UTF8) -newkey $(TYPE) -keyout $$PEM1 -nodes -x509 -days $(DAYS) -out $$PEM2 -set_serial $(SERIAL) ; \
 	cat $$PEM1 >  $@ ; \
 	echo ""    >> $@ ; \
 	cat $$PEM2 >> $@ ; \
@@ -46,7 +50,7 @@ usage:
 
 %.key:
 	umask 77 ; \
-	/usr/bin/openssl genrsa -aes128 2048 > $@
+	/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@
 
 %.csr: %.key
 	umask 77 ; \
@@ -54,7 +58,7 @@ usage:
 
 %.crt: %.key
 	umask 77 ; \
-	/usr/bin/openssl req $(UTF8) -new -key $^ -x509 -days 365 -out $@ -set_serial $(SERIAL)
+	/usr/bin/openssl req $(UTF8) -new -key $^ -x509 -days $(DAYS) -out $@ -set_serial $(SERIAL)
 
 TLSROOT=/etc/pki/tls
 KEY=$(TLSROOT)/private/localhost.key
@@ -71,4 +75,4 @@ $(CSR): $(KEY)
 
 $(CRT): $(KEY)
 	umask 77 ; \
-	/usr/bin/openssl req $(UTF8) -new -key $(KEY) -x509 -days 365 -out $(CRT) -set_serial $(SERIAL)
+	/usr/bin/openssl req $(UTF8) -new -key $(KEY) -x509 -days $(DAYS) -out $(CRT) -set_serial $(SERIAL)
diff --git a/SOURCES/openssl-1.0.0f-defaults.patch b/SOURCES/openssl-1.0.0f-defaults.patch
deleted file mode 100644
index d20c7fc..0000000
--- a/SOURCES/openssl-1.0.0f-defaults.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-diff -up openssl-1.0.0f/apps/openssl.cnf.defaults openssl-1.0.0f/apps/openssl.cnf
---- openssl-1.0.0f/apps/openssl.cnf.defaults	2011-12-06 01:01:00.000000000 +0100
-+++ openssl-1.0.0f/apps/openssl.cnf	2012-01-05 13:16:15.000000000 +0100
-@@ -103,7 +103,8 @@ emailAddress		= optional
- 
- ####################################################################
- [ req ]
--default_bits		= 1024
-+default_bits		= 2048
-+default_md		= sha1
- default_keyfile 	= privkey.pem
- distinguished_name	= req_distinguished_name
- attributes		= req_attributes
-@@ -126,17 +127,18 @@ string_mask = utf8only
- 
- [ req_distinguished_name ]
- countryName			= Country Name (2 letter code)
--countryName_default		= AU
-+countryName_default		= XX
- countryName_min			= 2
- countryName_max			= 2
- 
- stateOrProvinceName		= State or Province Name (full name)
--stateOrProvinceName_default	= Some-State
-+#stateOrProvinceName_default	= Default Province
- 
- localityName			= Locality Name (eg, city)
-+localityName_default	= Default City
- 
- 0.organizationName		= Organization Name (eg, company)
--0.organizationName_default	= Internet Widgits Pty Ltd
-+0.organizationName_default	= Default Company Ltd
- 
- # we can do this but it is not needed normally :-)
- #1.organizationName		= Second Organization Name (eg, company)
-@@ -145,7 +147,7 @@ localityName			= Locality Name (eg, city
- organizationalUnitName		= Organizational Unit Name (eg, section)
- #organizationalUnitName_default	=
- 
--commonName			= Common Name (e.g. server FQDN or YOUR name)
-+commonName			= Common Name (eg, your name or your server\'s hostname)
- commonName_max			= 64
- 
- emailAddress			= Email Address
diff --git a/SOURCES/openssl-1.0.1e-3des-strength.patch b/SOURCES/openssl-1.0.1e-3des-strength.patch
new file mode 100644
index 0000000..7375b47
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-3des-strength.patch
@@ -0,0 +1,171 @@
+Although the real strength is rather 112 bits we use 128 here as
+we do not want to sort it behind more obscure ciphers.
+AES-128 is preferred anyway.
+diff -up openssl-1.0.1e/ssl/s2_lib.c.3des-strength openssl-1.0.1e/ssl/s2_lib.c
+--- openssl-1.0.1e/ssl/s2_lib.c.3des-strength	2013-02-11 16:26:04.000000000 +0100
++++ openssl-1.0.1e/ssl/s2_lib.c	2014-01-22 16:32:45.791700322 +0100
+@@ -250,7 +250,7 @@ OPENSSL_GLOBAL const SSL_CIPHER ssl2_cip
+ 	SSL_SSLV2,
+ 	SSL_NOT_EXP|SSL_HIGH,
+ 	0,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+diff -up openssl-1.0.1e/ssl/s3_lib.c.3des-strength openssl-1.0.1e/ssl/s3_lib.c
+--- openssl-1.0.1e/ssl/s3_lib.c.3des-strength	2014-01-17 11:41:11.000000000 +0100
++++ openssl-1.0.1e/ssl/s3_lib.c	2014-01-22 16:31:14.713666777 +0100
+@@ -328,7 +328,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_SSLV3,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -377,7 +377,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_SSLV3,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -425,7 +425,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_SSLV3,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -474,7 +474,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_SSLV3,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -522,7 +522,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_SSLV3,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -602,7 +602,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_SSLV3,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -687,7 +687,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_SSLV3,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -751,7 +751,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_SSLV3,
+ 	SSL_NOT_EXP|SSL_HIGH,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -1685,7 +1685,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_TLSV1,
+ 	SSL_NOT_EXP|SSL_HIGH,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -2062,7 +2062,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_TLSV1,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -2142,7 +2142,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_TLSV1,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -2222,7 +2222,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_TLSV1,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -2302,7 +2302,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_TLSV1,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -2382,7 +2382,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_TLSV1,
+ 	SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -2432,7 +2432,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_TLSV1,
+ 	SSL_NOT_EXP|SSL_HIGH,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -2448,7 +2448,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_TLSV1,
+ 	SSL_NOT_EXP|SSL_HIGH,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
+@@ -2464,7 +2464,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]
+ 	SSL_TLSV1,
+ 	SSL_NOT_EXP|SSL_HIGH,
+ 	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+-	168,
++	128,
+ 	168,
+ 	},
+ 
diff --git a/SOURCES/openssl-1.0.1e-backports.patch b/SOURCES/openssl-1.0.1e-backports.patch
index 5abe884..abe3017 100644
--- a/SOURCES/openssl-1.0.1e-backports.patch
+++ b/SOURCES/openssl-1.0.1e-backports.patch
@@ -323,3 +323,23 @@ diff -up openssl-1.0.1e/ssl/ssl_lib.c.backports openssl-1.0.1e/ssl/ssl_lib.c
  		return(s->cert->key->x509);
  	else
  		return(NULL);
+diff --git a/crypto/x86cpuid.pl b/crypto/x86cpuid.pl
+index 3b6c469..e8a7518 100644
+--- a/crypto/x86cpuid.pl
++++ b/crypto/x86cpuid.pl
+@@ -69,6 +69,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
+ 	&inc	("esi");		# number of cores
+ 
+ 	&mov	("eax",1);
++	&xor	("ecx","ecx");
+ 	&cpuid	();
+ 	&bt	("edx",28);
+ 	&jnc	(&label("generic"));
+@@ -102,6 +103,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
+ 
+ &set_label("nocacheinfo");
+ 	&mov	("eax",1);
++	&xor	("ecx","ecx");
+ 	&cpuid	();
+ 	&and	("edx",0xbfefffff);	# force reserved bits #20, #30 to 0
+ 	&cmp	("ebp",0);
diff --git a/SOURCES/openssl-1.0.1e-compat-symbols.patch b/SOURCES/openssl-1.0.1e-compat-symbols.patch
new file mode 100644
index 0000000..25a9d02
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-compat-symbols.patch
@@ -0,0 +1,46 @@
+diff -up openssl-1.0.1e/crypto/dsa/dsa_key.c.compat openssl-1.0.1e/crypto/dsa/dsa_key.c
+--- openssl-1.0.1e/crypto/dsa/dsa_key.c.compat	2013-11-26 14:36:35.000000000 +0100
++++ openssl-1.0.1e/crypto/dsa/dsa_key.c	2013-12-11 16:34:58.638549687 +0100
+@@ -68,6 +68,11 @@
+ #include <openssl/fips.h>
+ #include <openssl/evp.h>
+ 
++/* just a compatibility symbol - no-op */
++void FIPS_corrupt_dsa_keygen(void)
++	{
++	}
++
+ static int fips_check_dsa(DSA *dsa)
+ 	{
+ 	EVP_PKEY *pk;
+diff -up openssl-1.0.1e/crypto/engine/eng_all.c.compat openssl-1.0.1e/crypto/engine/eng_all.c
+--- openssl-1.0.1e/crypto/engine/eng_all.c.compat	2013-11-26 14:36:35.000000000 +0100
++++ openssl-1.0.1e/crypto/engine/eng_all.c	2013-12-11 16:32:13.512820424 +0100
+@@ -62,6 +62,11 @@
+ #include <openssl/fips.h>
+ #endif
+ 
++/* just backwards compatibility symbol - no-op */
++void ENGINE_load_aesni (void)
++{
++}
++
+ void ENGINE_load_builtin_engines(void)
+ 	{
+ 	/* Some ENGINEs need this */
+diff -up openssl-1.0.1e/crypto/fips/fips.c.compat openssl-1.0.1e/crypto/fips/fips.c
+--- openssl-1.0.1e/crypto/fips/fips.c.compat	2013-11-26 14:36:35.000000000 +0100
++++ openssl-1.0.1e/crypto/fips/fips.c	2013-12-11 16:38:52.524831858 +0100
+@@ -111,6 +111,12 @@ int FIPS_module_mode(void)
+ 	return ret;
+ 	}
+ 
++/* just a compat symbol - return NULL */
++const void *FIPS_rand_check(void)
++	{
++	return NULL;
++	}
++
+ int FIPS_selftest_failed(void)
+     {
+     int ret = 0;
diff --git a/SOURCES/openssl-1.0.1e-cve-2013-4353.patch b/SOURCES/openssl-1.0.1e-cve-2013-4353.patch
new file mode 100644
index 0000000..5f96116
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-cve-2013-4353.patch
@@ -0,0 +1,21 @@
+Fix for TLS record tampering bug. A carefully crafted invalid 
+handshake could crash OpenSSL with a NULL pointer exception.
+Thanks to Anton Johansson for reporting this issues.
+(CVE-2013-4353)
+diff --git a/ssl/s3_both.c b/ssl/s3_both.c
+index 1e5dcab..53b9390 100644
+--- a/ssl/s3_both.c
++++ b/ssl/s3_both.c
+@@ -210,7 +210,11 @@ static void ssl3_take_mac(SSL *s)
+ 	{
+ 	const char *sender;
+ 	int slen;
+-
++	/* If no new cipher setup return immediately: other functions will
++	 * set the appropriate error.
++	 */
++	if (s->s3->tmp.new_cipher == NULL)
++		return;
+ 	if (s->state & SSL_ST_CONNECT)
+ 		{
+ 		sender=s->method->ssl3_enc->server_finished_label;
diff --git a/SOURCES/openssl-1.0.1e-cve-2013-6449.patch b/SOURCES/openssl-1.0.1e-cve-2013-6449.patch
new file mode 100644
index 0000000..d80a178
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-cve-2013-6449.patch
@@ -0,0 +1,111 @@
+Use version in SSL_METHOD not SSL structure.
+
+When deciding whether to use TLS 1.2 PRF and record hash algorithms
+use the version number in the corresponding SSL_METHOD structure
+instead of the SSL structure. The SSL structure version is sometimes
+inaccurate. Note: OpenSSL 1.0.2 and later effectively do this already.
+(CVE-2013-6449)
+
+Also preventively check EVP errors for handshake digests.
+
+diff --git a/ssl/s3_lib.c b/ssl/s3_lib.c
+index bf832bb..c4ef273 100644
+--- a/ssl/s3_lib.c
++++ b/ssl/s3_lib.c
+@@ -4286,7 +4286,7 @@ need to go to SSL_ST_ACCEPT.
+ long ssl_get_algorithm2(SSL *s)
+ 	{
+ 	long alg2 = s->s3->tmp.new_cipher->algorithm2;
+-	if (TLS1_get_version(s) >= TLS1_2_VERSION &&
++	if (s->method->version == TLS1_2_VERSION &&
+ 	    alg2 == (SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF))
+ 		return SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256;
+ 	return alg2;
+diff --git a/ssl/s3_both.c b/ssl/s3_both.c
+index ead01c8..1e5dcab 100644
+--- a/ssl/s3_both.c
++++ b/ssl/s3_both.c
+@@ -161,6 +161,8 @@ int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
+ 
+ 		i=s->method->ssl3_enc->final_finish_mac(s,
+ 			sender,slen,s->s3->tmp.finish_md);
++		if (i == 0)
++			return 0;
+ 		s->s3->tmp.finish_md_len = i;
+ 		memcpy(p, s->s3->tmp.finish_md, i);
+ 		p+=i;
+diff --git a/ssl/s3_pkt.c b/ssl/s3_pkt.c
+index 804291e..c4bc4e7 100644
+--- a/ssl/s3_pkt.c
++++ b/ssl/s3_pkt.c
+@@ -335,7 +335,7 @@ fprintf(stderr, "Record type=%d, Length=%d\n", rr->type, rr->length);
+ 			if (version != s->version)
+ 				{
+ 				SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_WRONG_VERSION_NUMBER);
+-                                if ((s->version & 0xFF00) == (version & 0xFF00))
++                                if ((s->version & 0xFF00) == (version & 0xFF00) && !s->enc_write_ctx && !s->write_hash)
+                                 	/* Send back error using their minor version number :-) */
+ 					s->version = (unsigned short)version;
+ 				al=SSL_AD_PROTOCOL_VERSION;
+@@ -1459,8 +1459,14 @@ int ssl3_do_change_cipher_spec(SSL *s)
+ 		slen=s->method->ssl3_enc->client_finished_label_len;
+ 		}
+ 
+-	s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
++	i = s->method->ssl3_enc->final_finish_mac(s,
+ 		sender,slen,s->s3->tmp.peer_finish_md);
++	if (i == 0)
++		{
++		SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC, ERR_R_INTERNAL_ERROR);
++		return 0;
++		}
++	s->s3->tmp.peer_finish_md_len = i;
+ 
+ 	return(1);
+ 	}
+diff --git a/ssl/s3_srvr.c b/ssl/s3_srvr.c
+index e5a8b3f..52efed3 100644
+--- a/ssl/s3_srvr.c
++++ b/ssl/s3_srvr.c
+@@ -958,7 +958,8 @@ int ssl3_get_client_hello(SSL *s)
+ 	    (s->version != DTLS1_VERSION && s->client_version < s->version))
+ 		{
+ 		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_WRONG_VERSION_NUMBER);
+-		if ((s->client_version>>8) == SSL3_VERSION_MAJOR)
++		if ((s->client_version>>8) == SSL3_VERSION_MAJOR && 
++			!s->enc_write_ctx && !s->write_hash)
+ 			{
+ 			/* similar to ssl3_get_record, send alert using remote version number */
+ 			s->version = s->client_version;
+diff --git a/ssl/t1_enc.c b/ssl/t1_enc.c
+index 809ad2e..72015f5 100644
+--- a/ssl/t1_enc.c
++++ b/ssl/t1_enc.c
+@@ -915,18 +915,19 @@ int tls1_final_finish_mac(SSL *s,
+ 		if (mask & ssl_get_algorithm2(s))
+ 			{
+ 			int hashsize = EVP_MD_size(md);
+-			if (hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf)))
++			EVP_MD_CTX *hdgst = s->s3->handshake_dgst[idx];
++			if (!hdgst || hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf)))
+ 				{
+ 				/* internal error: 'buf' is too small for this cipersuite! */
+ 				err = 1;
+ 				}
+ 			else
+ 				{
+-				EVP_MD_CTX_copy_ex(&ctx,s->s3->handshake_dgst[idx]);
+-				EVP_DigestFinal_ex(&ctx,q,&i);
+-				if (i != (unsigned int)hashsize) /* can't really happen */
++				if (!EVP_MD_CTX_copy_ex(&ctx, hdgst) ||
++					!EVP_DigestFinal_ex(&ctx,q,&i) ||
++					(i != (unsigned int)hashsize))
+ 					err = 1;
+-				q+=i;
++				q+=hashsize;
+ 				}
+ 			}
+ 		}
+-- 
+1.8.3.1
+
diff --git a/SOURCES/openssl-1.0.1e-cve-2013-6450.patch b/SOURCES/openssl-1.0.1e-cve-2013-6450.patch
new file mode 100644
index 0000000..fa096c8
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-cve-2013-6450.patch
@@ -0,0 +1,85 @@
+Fix DTLS retransmission from previous session.
+
+For DTLS we might need to retransmit messages from the previous session
+so keep a copy of write context in DTLS retransmission buffers instead
+of replacing it after sending CCS. CVE-2013-6450.
+
+diff --git a/ssl/d1_both.c b/ssl/d1_both.c
+index 65ec001..7a5596a 100644
+--- a/ssl/d1_both.c
++++ b/ssl/d1_both.c
+@@ -214,6 +214,12 @@ dtls1_hm_fragment_new(unsigned long frag_len, int reassembly)
+ static void
+ dtls1_hm_fragment_free(hm_fragment *frag)
+ 	{
++
++	if (frag->msg_header.is_ccs)
++		{
++		EVP_CIPHER_CTX_free(frag->msg_header.saved_retransmit_state.enc_write_ctx);
++		EVP_MD_CTX_destroy(frag->msg_header.saved_retransmit_state.write_hash);
++		}
+ 	if (frag->fragment) OPENSSL_free(frag->fragment);
+ 	if (frag->reassembly) OPENSSL_free(frag->reassembly);
+ 	OPENSSL_free(frag);
+diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h
+index 96ce9a7..e485907 100644
+--- a/ssl/ssl_locl.h
++++ b/ssl/ssl_locl.h
+@@ -621,6 +621,8 @@ extern SSL3_ENC_METHOD TLSv1_enc_data;
+ extern SSL3_ENC_METHOD SSLv3_enc_data;
+ extern SSL3_ENC_METHOD DTLSv1_enc_data;
+ 
++#define SSL_IS_DTLS(s) (s->method->version == DTLS1_VERSION)
++
+ #define IMPLEMENT_tls_meth_func(version, func_name, s_accept, s_connect, \
+ 				s_get_meth) \
+ const SSL_METHOD *func_name(void)  \
+diff --git a/ssl/t1_enc.c b/ssl/t1_enc.c
+index 72015f5..56db834 100644
+--- a/ssl/t1_enc.c
++++ b/ssl/t1_enc.c
+@@ -414,15 +414,20 @@ int tls1_change_cipher_state(SSL *s, int which)
+ 			s->mac_flags |= SSL_MAC_FLAG_WRITE_MAC_STREAM;
+ 			else
+ 			s->mac_flags &= ~SSL_MAC_FLAG_WRITE_MAC_STREAM;
+-		if (s->enc_write_ctx != NULL)
++		if (s->enc_write_ctx != NULL && !SSL_IS_DTLS(s))
+ 			reuse_dd = 1;
+-		else if ((s->enc_write_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
++		else if ((s->enc_write_ctx=EVP_CIPHER_CTX_new()) == NULL)
+ 			goto err;
+-		else
+-			/* make sure it's intialized in case we exit later with an error */
+-			EVP_CIPHER_CTX_init(s->enc_write_ctx);
+ 		dd= s->enc_write_ctx;
+-		mac_ctx = ssl_replace_hash(&s->write_hash,NULL);
++		if (SSL_IS_DTLS(s))
++			{
++			mac_ctx = EVP_MD_CTX_create();
++			if (!mac_ctx)
++				goto err;
++			s->write_hash = mac_ctx;
++			}
++		else
++			mac_ctx = ssl_replace_hash(&s->write_hash,NULL);
+ #ifndef OPENSSL_NO_COMP
+ 		if (s->compress != NULL)
+ 			{
+diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c
+index 6fc469f..d14e8e4 100644
+--- a/crypto/evp/digest.c
++++ b/crypto/evp/digest.c
+@@ -366,8 +366,11 @@ int EVP_Digest(const void *data, size_t count,
+ 
+ void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
+ 	{
+-	EVP_MD_CTX_cleanup(ctx);
+-	OPENSSL_free(ctx);
++	if (ctx)
++		{
++		EVP_MD_CTX_cleanup(ctx);
++		OPENSSL_free(ctx);
++		}
+ 	}
+ 
+ /* This call frees resources associated with the context */
diff --git a/SOURCES/openssl-1.0.1e-cve-2014-0160.patch b/SOURCES/openssl-1.0.1e-cve-2014-0160.patch
new file mode 100644
index 0000000..6d5c5ce
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-cve-2014-0160.patch
@@ -0,0 +1,89 @@
+diff -up openssl-1.0.1e/ssl/d1_both.c.heartbeat openssl-1.0.1e/ssl/d1_both.c
+--- openssl-1.0.1e/ssl/d1_both.c.heartbeat	2014-04-07 12:52:01.884308971 +0200
++++ openssl-1.0.1e/ssl/d1_both.c	2014-04-07 13:04:32.860128295 +0200
+@@ -1458,26 +1458,36 @@ dtls1_process_heartbeat(SSL *s)
+ 	unsigned int payload;
+ 	unsigned int padding = 16; /* Use minimum padding */
+ 
+-	/* Read type and payload length first */
+-	hbtype = *p++;
+-	n2s(p, payload);
+-	pl = p;
+-
+ 	if (s->msg_callback)
+ 		s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
+ 			&s->s3->rrec.data[0], s->s3->rrec.length,
+ 			s, s->msg_callback_arg);
+ 
++	/* Read type and payload length first */
++	if (1 + 2 + 16 > s->s3->rrec.length)
++		return 0; /* silently discard */
++	hbtype = *p++;
++	n2s(p, payload);
++	if (1 + 2 + payload + 16 > s->s3->rrec.length)
++		return 0; /* silently discard per RFC 6520 sec. 4 */
++	pl = p;
++
+ 	if (hbtype == TLS1_HB_REQUEST)
+ 		{
+ 		unsigned char *buffer, *bp;
++		unsigned int write_length = 1 /* heartbeat type */ +
++			2 /* heartbeat length */ +
++			payload + padding;
+ 		int r;
+ 
++		if (write_length > SSL3_RT_MAX_PLAIN_LENGTH)
++			return 0;
++
+ 		/* Allocate memory for the response, size is 1 byte
+ 		 * message type, plus 2 bytes payload length, plus
+ 		 * payload, plus padding
+ 		 */
+-		buffer = OPENSSL_malloc(1 + 2 + payload + padding);
++		buffer = OPENSSL_malloc(write_length);
+ 		bp = buffer;
+ 
+ 		/* Enter response type, length and copy payload */
+@@ -1488,11 +1498,11 @@ dtls1_process_heartbeat(SSL *s)
+ 		/* Random padding */
+ 		RAND_pseudo_bytes(bp, padding);
+ 
+-		r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
++		r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, write_length);
+ 
+ 		if (r >= 0 && s->msg_callback)
+ 			s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
+-				buffer, 3 + payload + padding,
++				buffer, write_length,
+ 				s, s->msg_callback_arg);
+ 
+ 		OPENSSL_free(buffer);
+diff -up openssl-1.0.1e/ssl/t1_lib.c.heartbeat openssl-1.0.1e/ssl/t1_lib.c
+--- openssl-1.0.1e/ssl/t1_lib.c.heartbeat	2014-04-07 12:52:01.891308997 +0200
++++ openssl-1.0.1e/ssl/t1_lib.c	2014-04-07 12:57:45.063603587 +0200
+@@ -2463,16 +2463,20 @@ tls1_process_heartbeat(SSL *s)
+ 	unsigned int payload;
+ 	unsigned int padding = 16; /* Use minimum padding */
+ 
+-	/* Read type and payload length first */
+-	hbtype = *p++;
+-	n2s(p, payload);
+-	pl = p;
+-
+ 	if (s->msg_callback)
+ 		s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
+ 			&s->s3->rrec.data[0], s->s3->rrec.length,
+ 			s, s->msg_callback_arg);
+ 
++	/* Read type and payload length first */
++	if (1 + 2 + 16 > s->s3->rrec.length)
++		return 0; /* silently discard */
++	hbtype = *p++;
++	n2s(p, payload);
++	if (1 + 2 + payload + 16 > s->s3->rrec.length)
++		return 0; /* silently discard per RFC 6520 sec. 4 */
++	pl = p;
++
+ 	if (hbtype == TLS1_HB_REQUEST)
+ 		{
+ 		unsigned char *buffer, *bp;
diff --git a/SOURCES/openssl-1.0.1e-defaults.patch b/SOURCES/openssl-1.0.1e-defaults.patch
new file mode 100644
index 0000000..4323e87
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-defaults.patch
@@ -0,0 +1,62 @@
+diff -up openssl-1.0.1e/apps/openssl.cnf.defaults openssl-1.0.1e/apps/openssl.cnf
+--- openssl-1.0.1e/apps/openssl.cnf.defaults	2013-02-11 16:26:04.000000000 +0100
++++ openssl-1.0.1e/apps/openssl.cnf	2014-02-06 18:00:00.170929334 +0100
+@@ -72,7 +72,7 @@ cert_opt 	= ca_default		# Certificate fi
+ 
+ default_days	= 365			# how long to certify for
+ default_crl_days= 30			# how long before next CRL
+-default_md	= default		# use public key default MD
++default_md	= sha256		# use SHA-256 by default
+ preserve	= no			# keep passed DN ordering
+ 
+ # A few difference way of specifying how similar the request should look
+@@ -103,7 +103,8 @@ emailAddress		= optional
+ 
+ ####################################################################
+ [ req ]
+-default_bits		= 1024
++default_bits		= 2048
++default_md		= sha256
+ default_keyfile 	= privkey.pem
+ distinguished_name	= req_distinguished_name
+ attributes		= req_attributes
+@@ -126,17 +127,18 @@ string_mask = utf8only
+ 
+ [ req_distinguished_name ]
+ countryName			= Country Name (2 letter code)
+-countryName_default		= AU
++countryName_default		= XX
+ countryName_min			= 2
+ countryName_max			= 2
+ 
+ stateOrProvinceName		= State or Province Name (full name)
+-stateOrProvinceName_default	= Some-State
++#stateOrProvinceName_default	= Default Province
+ 
+ localityName			= Locality Name (eg, city)
++localityName_default		= Default City
+ 
+ 0.organizationName		= Organization Name (eg, company)
+-0.organizationName_default	= Internet Widgits Pty Ltd
++0.organizationName_default	= Default Company Ltd
+ 
+ # we can do this but it is not needed normally :-)
+ #1.organizationName		= Second Organization Name (eg, company)
+@@ -145,7 +147,7 @@ localityName			= Locality Name (eg, city
+ organizationalUnitName		= Organizational Unit Name (eg, section)
+ #organizationalUnitName_default	=
+ 
+-commonName			= Common Name (e.g. server FQDN or YOUR name)
++commonName			= Common Name (eg, your name or your server\'s hostname)
+ commonName_max			= 64
+ 
+ emailAddress			= Email Address
+@@ -339,7 +341,7 @@ signer_key	= $dir/private/tsakey.pem # T
+ default_policy	= tsa_policy1		# Policy if request did not specify it
+ 					# (optional)
+ other_policies	= tsa_policy2, tsa_policy3	# acceptable policies (optional)
+-digests		= md5, sha1		# Acceptable message digests (mandatory)
++digests		= sha1, sha256, sha384, sha512	# Acceptable message digests (mandatory)
+ accuracy	= secs:1, millisecs:500, microsecs:100	# (optional)
+ clock_precision_digits  = 0	# number of digits after dot. (optional)
+ ordering		= yes	# Is ordering defined for timestamps?
diff --git a/SOURCES/openssl-1.0.1e-ephemeral-key-size.patch b/SOURCES/openssl-1.0.1e-ephemeral-key-size.patch
new file mode 100644
index 0000000..14f7940
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-ephemeral-key-size.patch
@@ -0,0 +1,135 @@
+diff -up openssl-1.0.1e/apps/s_apps.h.ephemeral openssl-1.0.1e/apps/s_apps.h
+--- openssl-1.0.1e/apps/s_apps.h.ephemeral	2014-02-12 14:49:14.333513753 +0100
++++ openssl-1.0.1e/apps/s_apps.h	2014-02-12 14:49:14.417515629 +0100
+@@ -156,6 +156,7 @@ int MS_CALLBACK verify_callback(int ok,
+ int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file);
+ int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key);
+ #endif
++int ssl_print_tmp_key(BIO *out, SSL *s);
+ int init_client(int *sock, char *server, char *port, int type);
+ int should_retry(int i);
+ int extract_host_port(char *str,char **host_ptr,char **port_ptr);
+diff -up openssl-1.0.1e/apps/s_cb.c.ephemeral openssl-1.0.1e/apps/s_cb.c
+--- openssl-1.0.1e/apps/s_cb.c.ephemeral	2013-02-11 16:26:04.000000000 +0100
++++ openssl-1.0.1e/apps/s_cb.c	2014-02-12 14:56:25.584142499 +0100
+@@ -338,6 +338,38 @@ void MS_CALLBACK apps_ssl_info_callback(
+ 		}
+ 	}
+ 
++int ssl_print_tmp_key(BIO *out, SSL *s)
++	{
++	EVP_PKEY *key;
++	if (!SSL_get_server_tmp_key(s, &key))
++		return 1;
++	BIO_puts(out, "Server Temp Key: ");
++	switch (EVP_PKEY_id(key))
++		{
++	case EVP_PKEY_RSA:
++		BIO_printf(out, "RSA, %d bits\n", EVP_PKEY_bits(key));
++		break;
++
++	case EVP_PKEY_DH:
++		BIO_printf(out, "DH, %d bits\n", EVP_PKEY_bits(key));
++		break;
++
++	case EVP_PKEY_EC:
++			{
++			EC_KEY *ec = EVP_PKEY_get1_EC_KEY(key);
++			int nid;
++			const char *cname;
++			nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec));
++			EC_KEY_free(ec);
++			cname = OBJ_nid2sn(nid);
++			BIO_printf(out, "ECDH, %s, %d bits\n",
++						cname, EVP_PKEY_bits(key));
++			}
++		}
++	EVP_PKEY_free(key);
++	return 1;
++	}
++		
+ 
+ void MS_CALLBACK msg_cb(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg)
+ 	{
+diff -up openssl-1.0.1e/apps/s_client.c.ephemeral openssl-1.0.1e/apps/s_client.c
+--- openssl-1.0.1e/apps/s_client.c.ephemeral	2014-02-12 14:49:14.407515406 +0100
++++ openssl-1.0.1e/apps/s_client.c	2014-02-12 14:49:14.418515652 +0100
+@@ -2032,6 +2032,8 @@ static void print_stuff(BIO *bio, SSL *s
+ 			BIO_write(bio,"\n",1);
+ 			}
+ 
++		ssl_print_tmp_key(bio, s);
++
+ 		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
+ 			BIO_number_read(SSL_get_rbio(s)),
+ 			BIO_number_written(SSL_get_wbio(s)));
+diff -up openssl-1.0.1e/ssl/ssl.h.ephemeral openssl-1.0.1e/ssl/ssl.h
+--- openssl-1.0.1e/ssl/ssl.h.ephemeral	2014-02-12 14:49:14.391515049 +0100
++++ openssl-1.0.1e/ssl/ssl.h	2014-02-12 14:49:14.418515652 +0100
+@@ -1563,6 +1563,8 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
+ #define SSL_CTRL_GET_EXTRA_CHAIN_CERTS		82
+ #define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS	83
+ 
++#define SSL_CTRL_GET_SERVER_TMP_KEY		109
++
+ #define DTLSv1_get_timeout(ssl, arg) \
+ 	SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)arg)
+ #define DTLSv1_handle_timeout(ssl) \
+@@ -1604,6 +1606,9 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
+ #define SSL_CTX_clear_extra_chain_certs(ctx) \
+ 	SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL)
+ 
++#define SSL_get_server_tmp_key(s, pk) \
++	SSL_ctrl(s,SSL_CTRL_GET_SERVER_TMP_KEY,0,pk)
++
+ #ifndef OPENSSL_NO_BIO
+ BIO_METHOD *BIO_f_ssl(void);
+ BIO *BIO_new_ssl(SSL_CTX *ctx,int client);
+diff -up openssl-1.0.1e/ssl/s3_lib.c.ephemeral openssl-1.0.1e/ssl/s3_lib.c
+--- openssl-1.0.1e/ssl/s3_lib.c.ephemeral	2014-02-12 14:49:14.412515518 +0100
++++ openssl-1.0.1e/ssl/s3_lib.c	2014-02-12 14:49:14.418515652 +0100
+@@ -3350,6 +3350,44 @@ long ssl3_ctrl(SSL *s, int cmd, long lar
+ #endif
+ 
+ #endif /* !OPENSSL_NO_TLSEXT */
++	case SSL_CTRL_GET_SERVER_TMP_KEY:
++		if (s->server || !s->session || !s->session->sess_cert)
++			return 0;
++		else
++			{
++			SESS_CERT *sc;
++			EVP_PKEY *ptmp;
++			int rv = 0;
++			sc = s->session->sess_cert;
++#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DH) && !defined(OPENSSL_NO_EC)
++			if (!sc->peer_rsa_tmp && !sc->peer_dh_tmp
++							&& !sc->peer_ecdh_tmp)
++				return 0;
++#endif
++			ptmp = EVP_PKEY_new();
++			if (!ptmp)
++				return 0;
++			if (0);
++#ifndef OPENSSL_NO_RSA
++			else if (sc->peer_rsa_tmp)
++				rv = EVP_PKEY_set1_RSA(ptmp, sc->peer_rsa_tmp);
++#endif
++#ifndef OPENSSL_NO_DH
++			else if (sc->peer_dh_tmp)
++				rv = EVP_PKEY_set1_DH(ptmp, sc->peer_dh_tmp);
++#endif
++#ifndef OPENSSL_NO_ECDH
++			else if (sc->peer_ecdh_tmp)
++				rv = EVP_PKEY_set1_EC_KEY(ptmp, sc->peer_ecdh_tmp);
++#endif
++			if (rv)
++				{
++				*(EVP_PKEY **)parg = ptmp;
++				return 1;
++				}
++			EVP_PKEY_free(ptmp);
++			return 0;
++			}
+ 	default:
+ 		break;
+ 		}
diff --git a/SOURCES/openssl-1.0.1e-fips.patch b/SOURCES/openssl-1.0.1e-fips.patch
index e6942b1..f5496a0 100644
--- a/SOURCES/openssl-1.0.1e-fips.patch
+++ b/SOURCES/openssl-1.0.1e-fips.patch
@@ -375,8 +375,8 @@ diff -up openssl-1.0.1e/crypto/dh/dh_gen.c.fips openssl-1.0.1e/crypto/dh/dh_gen.
  	if (ctx == NULL) goto err;
  	BN_CTX_start(ctx);
 diff -up openssl-1.0.1e/crypto/dh/dh.h.fips openssl-1.0.1e/crypto/dh/dh.h
---- openssl-1.0.1e/crypto/dh/dh.h.fips	2013-10-04 11:48:04.032690794 +0200
-+++ openssl-1.0.1e/crypto/dh/dh.h	2013-10-04 11:48:04.174694001 +0200
+--- openssl-1.0.1e/crypto/dh/dh.h.fips	2014-02-06 18:04:19.000000000 +0100
++++ openssl-1.0.1e/crypto/dh/dh.h	2014-02-11 16:01:17.039345356 +0100
 @@ -77,6 +77,8 @@
  # define OPENSSL_DH_MAX_MODULUS_BITS	10000
  #endif
@@ -386,9 +386,17 @@ diff -up openssl-1.0.1e/crypto/dh/dh.h.fips openssl-1.0.1e/crypto/dh/dh.h
  #define DH_FLAG_CACHE_MONT_P     0x01
  #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH
                                         * implementation now uses constant time
+@@ -210,6 +212,7 @@ int	DH_check(const DH *dh,int *codes);
+ int	DH_check_pub_key(const DH *dh,const BIGNUM *pub_key, int *codes);
+ int	DH_generate_key(DH *dh);
+ int	DH_compute_key(unsigned char *key,const BIGNUM *pub_key,DH *dh);
++int	DH_compute_key_padded(unsigned char *key,const BIGNUM *pub_key,DH *dh);
+ DH *	d2i_DHparams(DH **a,const unsigned char **pp, long length);
+ int	i2d_DHparams(const DH *a,unsigned char **pp);
+ #ifndef OPENSSL_NO_FP_API
 diff -up openssl-1.0.1e/crypto/dh/dh_key.c.fips openssl-1.0.1e/crypto/dh/dh_key.c
 --- openssl-1.0.1e/crypto/dh/dh_key.c.fips	2013-02-11 16:26:04.000000000 +0100
-+++ openssl-1.0.1e/crypto/dh/dh_key.c	2013-10-04 11:48:04.174694001 +0200
++++ openssl-1.0.1e/crypto/dh/dh_key.c	2014-02-11 15:57:55.266840301 +0100
 @@ -61,6 +61,9 @@
  #include <openssl/bn.h>
  #include <openssl/rand.h>
@@ -399,7 +407,29 @@ diff -up openssl-1.0.1e/crypto/dh/dh_key.c.fips openssl-1.0.1e/crypto/dh/dh_key.
  
  static int generate_key(DH *dh);
  static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh);
-@@ -104,7 +107,7 @@ compute_key,
+@@ -97,6 +100,21 @@ int DH_compute_key(unsigned char *key, c
+ 	return dh->meth->compute_key(key, pub_key, dh);
+ 	}
+ 
++int DH_compute_key_padded(unsigned char *key, const BIGNUM *pub_key, DH *dh)
++	{
++	int rv, pad;
++	rv = DH_compute_key(key, pub_key, dh);
++	if (rv <= 0)
++		return rv;
++	pad = BN_num_bytes(dh->p) - rv;
++	if (pad > 0)
++		{
++		memmove(key + pad, key, rv);
++		memset(key, 0, pad);
++		}
++	return rv + pad;
++	}
++
+ static DH_METHOD dh_ossl = {
+ "OpenSSL DH Method",
+ generate_key,
+@@ -104,7 +122,7 @@ compute_key,
  dh_bn_mod_exp,
  dh_init,
  dh_finish,
@@ -408,7 +438,7 @@ diff -up openssl-1.0.1e/crypto/dh/dh_key.c.fips openssl-1.0.1e/crypto/dh/dh_key.
  NULL,
  NULL
  };
-@@ -123,6 +126,14 @@ static int generate_key(DH *dh)
+@@ -123,6 +141,14 @@ static int generate_key(DH *dh)
  	BN_MONT_CTX *mont=NULL;
  	BIGNUM *pub_key=NULL,*priv_key=NULL;
  
@@ -423,7 +453,7 @@ diff -up openssl-1.0.1e/crypto/dh/dh_key.c.fips openssl-1.0.1e/crypto/dh/dh_key.
  	ctx = BN_CTX_new();
  	if (ctx == NULL) goto err;
  
-@@ -213,6 +224,13 @@ static int compute_key(unsigned char *ke
+@@ -213,6 +239,13 @@ static int compute_key(unsigned char *ke
  		DHerr(DH_F_COMPUTE_KEY,DH_R_MODULUS_TOO_LARGE);
  		goto err;
  		}
@@ -437,7 +467,7 @@ diff -up openssl-1.0.1e/crypto/dh/dh_key.c.fips openssl-1.0.1e/crypto/dh/dh_key.
  
  	ctx = BN_CTX_new();
  	if (ctx == NULL) goto err;
-@@ -280,6 +298,9 @@ static int dh_bn_mod_exp(const DH *dh, B
+@@ -280,6 +313,9 @@ static int dh_bn_mod_exp(const DH *dh, B
  
  static int dh_init(DH *dh)
  	{
diff --git a/SOURCES/openssl-1.0.1e-new-fips-reqs.patch b/SOURCES/openssl-1.0.1e-new-fips-reqs.patch
new file mode 100644
index 0000000..055a087
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-new-fips-reqs.patch
@@ -0,0 +1,1089 @@
+diff -up openssl-1.0.1e/crypto/bn/bn_rand.c.fips-reqs openssl-1.0.1e/crypto/bn/bn_rand.c
+--- openssl-1.0.1e/crypto/bn/bn_rand.c.fips-reqs	2013-02-11 16:02:47.000000000 +0100
++++ openssl-1.0.1e/crypto/bn/bn_rand.c	2014-02-13 16:50:34.280893285 +0100
+@@ -138,9 +138,12 @@ static int bnrand(int pseudorand, BIGNUM
+ 		goto err;
+ 		}
+ 
+-	/* make a random number and set the top and bottom bits */
+-	time(&tim);
+-	RAND_add(&tim,sizeof(tim),0.0);
++	if (!FIPS_mode()) /* in FIPS mode the RNG is always properly seeded or the module fails */
++		{
++		/* make a random number and set the top and bottom bits */
++		time(&tim);
++		RAND_add(&tim,sizeof(tim),0.0);
++		}
+ 
+ 	if (pseudorand)
+ 		{
+diff -up openssl-1.0.1e/crypto/dh/dh_gen.c.fips-reqs openssl-1.0.1e/crypto/dh/dh_gen.c
+--- openssl-1.0.1e/crypto/dh/dh_gen.c.fips-reqs	2013-12-18 12:17:09.748636614 +0100
++++ openssl-1.0.1e/crypto/dh/dh_gen.c	2013-12-18 12:17:09.798637687 +0100
+@@ -125,7 +125,7 @@ static int dh_builtin_genparams(DH *ret,
+ 		return 0;
+ 		}
+ 
+-	if (FIPS_mode() && (prime_len < OPENSSL_DH_FIPS_MIN_MODULUS_BITS))
++	if (FIPS_mode() && (prime_len < OPENSSL_DH_FIPS_MIN_MODULUS_BITS_GEN))
+ 		{
+ 		DHerr(DH_F_DH_BUILTIN_GENPARAMS, DH_R_KEY_SIZE_TOO_SMALL);
+ 		goto err;
+diff -up openssl-1.0.1e/crypto/dh/dh.h.fips-reqs openssl-1.0.1e/crypto/dh/dh.h
+--- openssl-1.0.1e/crypto/dh/dh.h.fips-reqs	2013-12-18 12:17:09.748636614 +0100
++++ openssl-1.0.1e/crypto/dh/dh.h	2013-12-18 12:17:09.798637687 +0100
+@@ -78,6 +78,7 @@
+ #endif
+ 
+ #define OPENSSL_DH_FIPS_MIN_MODULUS_BITS 1024
++#define OPENSSL_DH_FIPS_MIN_MODULUS_BITS_GEN 2048
+ 
+ #define DH_FLAG_CACHE_MONT_P     0x01
+ #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH
+diff -up openssl-1.0.1e/crypto/dh/dh_check.c.fips-reqs openssl-1.0.1e/crypto/dh/dh_check.c
+--- openssl-1.0.1e/crypto/dh/dh_check.c.fips-reqs	2013-02-11 16:26:04.000000000 +0100
++++ openssl-1.0.1e/crypto/dh/dh_check.c	2013-12-18 12:17:09.799637708 +0100
+@@ -134,7 +134,33 @@ int DH_check_pub_key(const DH *dh, const
+ 	BN_sub_word(q,1);
+ 	if (BN_cmp(pub_key,q)>=0)
+ 		*ret|=DH_CHECK_PUBKEY_TOO_LARGE;
++#ifdef OPENSSL_FIPS
++	if (FIPS_mode() && dh->q != NULL)
++		{
++		BN_CTX *ctx = NULL;
+ 
++		ctx = BN_CTX_new();
++		if (ctx == NULL)
++			goto err;
++
++		if (BN_mod_exp_mont(q, pub_key, dh->q, dh->p, ctx, NULL) <= 0)
++			{
++			BN_CTX_free(ctx);
++			goto err;
++			}
++		if (!BN_is_one(q))
++			{
++			/* it would be more correct to add new return flag 
++			 * for this test, but we do not want to do it
++			 * so just error out
++			 */
++			BN_CTX_free(ctx);
++			goto err;
++			}
++		
++		BN_CTX_free(ctx);
++		}
++#endif
+ 	ok = 1;
+ err:
+ 	if (q != NULL) BN_free(q);
+diff -up openssl-1.0.1e/crypto/dsa/dsa_gen.c.fips-reqs openssl-1.0.1e/crypto/dsa/dsa_gen.c
+--- openssl-1.0.1e/crypto/dsa/dsa_gen.c.fips-reqs	2013-12-18 12:17:09.749636636 +0100
++++ openssl-1.0.1e/crypto/dsa/dsa_gen.c	2013-12-18 12:17:09.799637708 +0100
+@@ -159,7 +159,6 @@ int dsa_builtin_paramgen(DSA *ret, size_
+ 	    }
+ 
+ 	if (FIPS_module_mode() &&
+-	    (bits != 1024 || qbits != 160) &&
+ 	    (bits != 2048 || qbits != 224) &&
+ 	    (bits != 2048 || qbits != 256) &&
+ 	    (bits != 3072 || qbits != 256))
+diff -up openssl-1.0.1e/crypto/dsa/dsa.h.fips-reqs openssl-1.0.1e/crypto/dsa/dsa.h
+--- openssl-1.0.1e/crypto/dsa/dsa.h.fips-reqs	2013-12-18 12:17:09.749636636 +0100
++++ openssl-1.0.1e/crypto/dsa/dsa.h	2013-12-18 12:17:09.799637708 +0100
+@@ -89,6 +89,7 @@
+ #endif
+ 
+ #define OPENSSL_DSA_FIPS_MIN_MODULUS_BITS 1024
++#define OPENSSL_DSA_FIPS_MIN_MODULUS_BITS_GEN 2048
+ 
+ #define DSA_FLAG_CACHE_MONT_P	0x01
+ #define DSA_FLAG_NO_EXP_CONSTTIME       0x02 /* new with 0.9.7h; the built-in DSA
+@@ -254,9 +255,9 @@ int	DSAparams_print_fp(FILE *fp, const D
+ int	DSA_print_fp(FILE *bp, const DSA *x, int off);
+ #endif
+ 
+-#define DSS_prime_checks 50
+-/* Primality test according to FIPS PUB 186[-1], Appendix 2.1:
+- * 50 rounds of Rabin-Miller */
++#define DSS_prime_checks 64
++/* Primality test according to FIPS PUB 186[-4], Appendix 2.1:
++ * 64 rounds of Rabin-Miller */
+ #define DSA_is_prime(n, callback, cb_arg) \
+ 	BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg)
+ 
+diff -up openssl-1.0.1e/crypto/dsa/dsa_key.c.fips-reqs openssl-1.0.1e/crypto/dsa/dsa_key.c
+--- openssl-1.0.1e/crypto/dsa/dsa_key.c.fips-reqs	2013-12-18 12:17:09.797637665 +0100
++++ openssl-1.0.1e/crypto/dsa/dsa_key.c	2013-12-18 12:17:09.799637708 +0100
+@@ -127,7 +127,7 @@ static int dsa_builtin_keygen(DSA *dsa)
+ 
+ #ifdef OPENSSL_FIPS
+ 	if (FIPS_mode() && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW)
+-		&& (BN_num_bits(dsa->p) < OPENSSL_DSA_FIPS_MIN_MODULUS_BITS))
++		&& (BN_num_bits(dsa->p) < OPENSSL_DSA_FIPS_MIN_MODULUS_BITS_GEN))
+ 		{
+ 		DSAerr(DSA_F_DSA_BUILTIN_KEYGEN, DSA_R_KEY_SIZE_TOO_SMALL);
+ 		goto err;
+diff -up openssl-1.0.1e/crypto/fips/fips_dh_selftest.c.fips-reqs openssl-1.0.1e/crypto/fips/fips_dh_selftest.c
+--- openssl-1.0.1e/crypto/fips/fips_dh_selftest.c.fips-reqs	2013-12-18 17:06:36.575114314 +0100
++++ openssl-1.0.1e/crypto/fips/fips_dh_selftest.c	2013-12-18 17:26:14.409036334 +0100
+@@ -0,0 +1,162 @@
++/* ====================================================================
++ * Copyright (c) 2011 The OpenSSL Project.  All rights reserved.
++ * Copyright (c) 2013 Red Hat, Inc.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer. 
++ *
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in
++ *    the documentation and/or other materials provided with the
++ *    distribution.
++ *
++ * 3. All advertising materials mentioning features or use of this
++ *    software must display the following acknowledgment:
++ *    "This product includes software developed by the OpenSSL Project
++ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
++ *
++ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
++ *    endorse or promote products derived from this software without
++ *    prior written permission. For written permission, please contact
++ *    openssl-core@openssl.org.
++ *
++ * 5. Products derived from this software may not be called "OpenSSL"
++ *    nor may "OpenSSL" appear in their names without prior written
++ *    permission of the OpenSSL Project.
++ *
++ * 6. Redistributions of any form whatsoever must retain the following
++ *    acknowledgment:
++ *    "This product includes software developed by the OpenSSL Project
++ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
++ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
++ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
++ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
++ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
++ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
++ * OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ */
++
++#include <string.h>
++#include <openssl/crypto.h>
++#include <openssl/dh.h>
++#include <openssl/fips.h>
++#include <openssl/err.h>
++#include <openssl/evp.h>
++#include <openssl/bn.h>
++#include "fips_locl.h"
++
++#ifdef OPENSSL_FIPS
++
++static const unsigned char dh_test_2048_p[] = {
++	0xAE,0xEC,0xEE,0x22,0xFA,0x3A,0xA5,0x22,0xC0,0xDE,0x0F,0x09,
++	0x7E,0x17,0xC0,0x05,0xF9,0xF1,0xE7,0xC6,0x87,0x14,0x6D,0x11,
++	0xE7,0xAE,0xED,0x2F,0x72,0x59,0xC5,0xA9,0x9B,0xB8,0x02,0xA5,
++	0xF3,0x69,0x70,0xD6,0xDD,0x90,0xF9,0x19,0x79,0xBE,0x60,0x8F,
++	0x25,0x92,0x30,0x1C,0x51,0x51,0x38,0x26,0x82,0x25,0xE6,0xFC,
++	0xED,0x65,0x96,0x8F,0x57,0xE5,0x53,0x8B,0x38,0x63,0xC7,0xCE,
++	0xBC,0x1B,0x4D,0x18,0x2A,0x5B,0x04,0x3F,0x6A,0x3C,0x94,0x39,
++	0xAE,0x36,0xD6,0x5E,0x0F,0xA2,0xCC,0xD0,0xD4,0xD5,0xC6,0x1E,
++	0xF6,0xA0,0xF5,0x89,0x4E,0xB4,0x0B,0xA4,0xB3,0x2B,0x3D,0xE2,
++	0x4E,0xE1,0x49,0x25,0x99,0x5F,0x32,0x16,0x33,0x32,0x1B,0x7A,
++	0xA5,0x5C,0x6B,0x34,0x0D,0x39,0x99,0xDC,0xF0,0x76,0xE5,0x5A,
++	0xD4,0x71,0x00,0xED,0x5A,0x73,0xFB,0xC8,0x01,0xAD,0x99,0xCF,
++	0x99,0x52,0x7C,0x9C,0x64,0xC6,0x76,0x40,0x57,0xAF,0x59,0xD7,
++	0x38,0x0B,0x40,0xDE,0x33,0x0D,0xB8,0x76,0xEC,0xA9,0xD8,0x73,
++	0xF8,0xEF,0x26,0x66,0x06,0x27,0xDD,0x7C,0xA4,0x10,0x9C,0xA6,
++	0xAA,0xF9,0x53,0x62,0x73,0x1D,0xBA,0x1C,0xF1,0x67,0xF4,0x35,
++	0xED,0x6F,0x37,0x92,0xE8,0x4F,0x6C,0xBA,0x52,0x6E,0xA1,0xED,
++	0xDA,0x9F,0x85,0x11,0x82,0x52,0x62,0x08,0x44,0xF1,0x30,0x03,
++	0xC3,0x38,0x2C,0x79,0xBD,0xD4,0x43,0x45,0xEE,0x8E,0x50,0xFC,
++	0x29,0x46,0x9A,0xFE,0x54,0x1A,0x19,0x8F,0x4B,0x84,0x08,0xDE,
++	0x20,0x62,0x73,0xCC,0xDD,0x7E,0xF0,0xEF,0xA2,0xFD,0x86,0x58,
++	0x4B,0xD8,0x37,0xEB
++};
++
++static const unsigned char dh_test_2048_g[] = {
++	0x02
++};
++
++static const unsigned char dh_test_2048_pub_key[] = {
++	0xA0,0x39,0x11,0x77,0x9A,0xC1,0x30,0x1F,0xBE,0x48,0xA7,0xAA,
++	0xA0,0x84,0x54,0x64,0xAD,0x1B,0x70,0xFA,0x13,0x55,0x63,0xD2,
++	0x1F,0x62,0x32,0x93,0x8E,0xC9,0x3E,0x09,0xA7,0x64,0xE4,0x12,
++	0x6E,0x1B,0xF2,0x92,0x3B,0xB9,0xCB,0x56,0xEA,0x07,0x88,0xB5,
++	0xA6,0xBC,0x16,0x1F,0x27,0xFE,0xD8,0xAA,0x40,0xB2,0xB0,0x2D,
++	0x37,0x76,0xA6,0xA4,0x82,0x2C,0x0E,0x22,0x64,0x9D,0xCB,0xD1,
++	0x00,0xB7,0x89,0x14,0x72,0x4E,0xBE,0x48,0x41,0xF8,0xB2,0x51,
++	0x11,0x09,0x4B,0x22,0x01,0x23,0x39,0x96,0xE0,0x15,0xD7,0x9F,
++	0x60,0xD1,0xB7,0xAE,0xFE,0x5F,0xDB,0xE7,0x03,0x17,0x97,0xA6,
++	0x16,0x74,0xBD,0x53,0x81,0x19,0xC5,0x47,0x5E,0xCE,0x8D,0xED,
++	0x45,0x5D,0x3C,0x00,0xA0,0x0A,0x68,0x6A,0xE0,0x8E,0x06,0x46,
++	0x6F,0xD7,0xF9,0xDF,0x31,0x7E,0x77,0x44,0x0D,0x98,0xE0,0xCA,
++	0x98,0x09,0x52,0x04,0x90,0xEA,0x6D,0xF4,0x30,0x69,0x8F,0xB1,
++	0x9B,0xC1,0x43,0xDB,0xD5,0x8D,0xC8,0x8E,0xB6,0x0B,0x05,0xBE,
++	0x0E,0xC5,0x99,0xC8,0x6E,0x4E,0xF3,0xCB,0xC3,0x5E,0x9B,0x53,
++	0xF7,0x06,0x1C,0x4F,0xC7,0xB8,0x6E,0x30,0x18,0xCA,0x9B,0xB9,
++	0xBC,0x5F,0x17,0x72,0x29,0x5A,0xE5,0xD9,0x96,0xB7,0x0B,0xF3,
++	0x2D,0x8C,0xF1,0xE1,0x0E,0x0D,0x74,0xD5,0x9D,0xF0,0x06,0xA9,
++	0xB4,0x95,0x63,0x76,0x46,0x55,0x48,0x82,0x39,0x90,0xEF,0x56,
++	0x75,0x34,0xB8,0x34,0xC3,0x18,0x6E,0x1E,0xAD,0xE3,0x48,0x7E,
++	0x93,0x2C,0x23,0xE7,0xF8,0x90,0x73,0xB1,0x77,0x80,0x67,0xA9,
++	0x36,0x9E,0xDA,0xD2
++};
++
++static const unsigned char dh_test_2048_priv_key[] = {
++	0x0C,0x4B,0x30,0x89,0xD1,0xB8,0x62,0xCB,0x3C,0x43,0x64,0x91,
++	0xF0,0x91,0x54,0x70,0xC5,0x27,0x96,0xE3,0xAC,0xBE,0xE8,0x00,
++	0xEC,0x55,0xF6,0xCC
++};
++
++int FIPS_selftest_dh()
++	{
++	DH *dh = NULL;
++	int ret = 0;
++	void *pub_key = NULL;
++	int len;
++
++	dh = DH_new();
++
++	if(dh == NULL)
++		goto err;
++
++	fips_load_key_component(dh, p, dh_test_2048);
++	fips_load_key_component(dh, g, dh_test_2048);
++	/* note that the private key is much shorter than normally used
++	 * but still g ** priv_key > p
++	 */
++	fips_load_key_component(dh, priv_key, dh_test_2048);
++
++	if (DH_generate_key(dh) <= 0)
++		goto err;
++
++	len = BN_num_bytes(dh->pub_key);
++	if ((pub_key = OPENSSL_malloc(len)) == NULL)
++		goto err;
++	BN_bn2bin(dh->pub_key, pub_key);
++
++	if (len != sizeof(dh_test_2048_pub_key) ||
++		memcmp(pub_key, dh_test_2048_pub_key, len) != 0)
++		goto err;
++
++	ret = 1;
++
++	err:
++	if (dh)
++		DH_free(dh);
++
++	OPENSSL_free(pub_key);
++	return ret;
++	}
++#endif
+diff -up openssl-1.0.1e/crypto/fips/fips_drbg_rand.c.fips-reqs openssl-1.0.1e/crypto/fips/fips_drbg_rand.c
+--- openssl-1.0.1e/crypto/fips/fips_drbg_rand.c.fips-reqs	2013-12-18 12:17:09.757636808 +0100
++++ openssl-1.0.1e/crypto/fips/fips_drbg_rand.c	2013-12-18 18:53:33.263711297 +0100
+@@ -77,7 +77,8 @@ static int fips_drbg_bytes(unsigned char
+ 	int rv = 0;
+ 	unsigned char *adin = NULL;
+ 	size_t adinlen = 0;
+-	CRYPTO_w_lock(CRYPTO_LOCK_RAND);
++	int locked;
++	locked = private_RAND_lock(1);
+ 	do 
+ 		{
+ 		size_t rcnt;
+@@ -109,7 +110,8 @@ static int fips_drbg_bytes(unsigned char
+ 	while (count);
+ 	rv = 1;
+ 	err:
+-	CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
++	if (locked)
++		private_RAND_lock(0);
+ 	return rv;
+ 	}
+ 
+@@ -124,35 +126,51 @@ static int fips_drbg_status(void)
+ 	{
+ 	DRBG_CTX *dctx = &ossl_dctx;
+ 	int rv;
+-	CRYPTO_r_lock(CRYPTO_LOCK_RAND);
++	int locked;
++	locked = private_RAND_lock(1);
+ 	rv = dctx->status == DRBG_STATUS_READY ? 1 : 0;
+-	CRYPTO_r_unlock(CRYPTO_LOCK_RAND);
++	if (locked)
++		private_RAND_lock(0);
+ 	return rv;
+ 	}
+ 
+ static void fips_drbg_cleanup(void)
+ 	{
+ 	DRBG_CTX *dctx = &ossl_dctx;
+-	CRYPTO_w_lock(CRYPTO_LOCK_RAND);
++	int locked;
++	locked = private_RAND_lock(1);
+ 	FIPS_drbg_uninstantiate(dctx);
+-	CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
++	if (locked)
++		private_RAND_lock(0);
+ 	}
+ 
+ static int fips_drbg_seed(const void *seed, int seedlen)
+ 	{
+ 	DRBG_CTX *dctx = &ossl_dctx;
++	int locked;
++	int ret = 1;
++
++	locked = private_RAND_lock(1);
+ 	if (dctx->rand_seed_cb)
+-		return dctx->rand_seed_cb(dctx, seed, seedlen);
+-	return 1;
++		ret = dctx->rand_seed_cb(dctx, seed, seedlen);
++	if (locked)
++		private_RAND_lock(0);
++	return ret;
+ 	}
+ 
+ static int fips_drbg_add(const void *seed, int seedlen,
+ 					double add_entropy)
+ 	{
+ 	DRBG_CTX *dctx = &ossl_dctx;
++	int locked;
++	int ret = 1;
++
++	locked = private_RAND_lock(1);
+ 	if (dctx->rand_add_cb)
+-		return dctx->rand_add_cb(dctx, seed, seedlen, add_entropy);
+-	return 1;
++		ret = dctx->rand_add_cb(dctx, seed, seedlen, add_entropy);
++	if (locked)
++		private_RAND_lock(0);
++	return ret;
+ 	}
+ 
+ static const RAND_METHOD rand_drbg_meth =
+diff -up openssl-1.0.1e/crypto/fips/fips.h.fips-reqs openssl-1.0.1e/crypto/fips/fips.h
+--- openssl-1.0.1e/crypto/fips/fips.h.fips-reqs	2013-12-18 12:17:09.000000000 +0100
++++ openssl-1.0.1e/crypto/fips/fips.h	2013-12-18 17:13:00.928586689 +0100
+@@ -96,6 +96,7 @@ void FIPS_corrupt_dsa_keygen(void);
+ int FIPS_selftest_dsa(void);
+ int FIPS_selftest_ecdsa(void);
+ int FIPS_selftest_ecdh(void);
++int FIPS_selftest_dh(void);
+ void FIPS_corrupt_rng(void);
+ void FIPS_rng_stick(void);
+ void FIPS_x931_stick(int onoff);
+diff -up openssl-1.0.1e/crypto/fips/fips_post.c.fips-reqs openssl-1.0.1e/crypto/fips/fips_post.c
+--- openssl-1.0.1e/crypto/fips/fips_post.c.fips-reqs	2013-12-18 12:17:09.000000000 +0100
++++ openssl-1.0.1e/crypto/fips/fips_post.c	2013-12-18 17:12:26.721832716 +0100
+@@ -99,6 +99,8 @@ int FIPS_selftest(void)
+ 		rv = 0;
+ 	if (!FIPS_selftest_dsa())
+ 		rv = 0;
++	if (!FIPS_selftest_dh())
++		rv = 0;
+ 	if (!FIPS_selftest_ecdh())
+ 		rv = 0;
+ 	return rv;
+diff -up openssl-1.0.1e/crypto/fips/fips_rsa_selftest.c.fips-reqs openssl-1.0.1e/crypto/fips/fips_rsa_selftest.c
+--- openssl-1.0.1e/crypto/fips/fips_rsa_selftest.c.fips-reqs	2013-12-18 12:17:09.761636893 +0100
++++ openssl-1.0.1e/crypto/fips/fips_rsa_selftest.c	2013-12-18 12:17:09.799637708 +0100
+@@ -340,6 +340,42 @@ static const unsigned char kat_RSA_X931_
+   0x60, 0x83, 0x18, 0x88, 0xA3, 0xF5, 0x59, 0xC3
+ };
+ 
++static int fips_rsa_encrypt_test(RSA *rsa, const unsigned char *plaintext, int ptlen)
++	{
++	unsigned char *ctbuf = NULL, *ptbuf = NULL;
++	int ret = 0;
++	int len;
++
++	ctbuf = OPENSSL_malloc(RSA_size(rsa));
++	if (!ctbuf)
++		goto err;
++
++	len = RSA_public_encrypt(ptlen, plaintext, ctbuf, rsa, RSA_PKCS1_PADDING);
++	if (len <= 0)
++		goto err;
++	/* Check ciphertext doesn't match plaintext */
++	if (len >= ptlen && !memcmp(plaintext, ctbuf, ptlen))
++		goto err;
++
++	ptbuf = OPENSSL_malloc(RSA_size(rsa));
++	if (!ptbuf)
++		goto err;
++
++	len = RSA_private_decrypt(len, ctbuf, ptbuf, rsa, RSA_PKCS1_PADDING);
++	if (len != ptlen)
++		goto err;
++	if (memcmp(ptbuf, plaintext, len))
++		goto err;
++
++	ret = 1;
++
++	err:
++	if (ctbuf)
++		OPENSSL_free(ctbuf);
++	if (ptbuf)
++		OPENSSL_free(ptbuf);
++	return ret;
++	}
+ 
+ int FIPS_selftest_rsa()
+ 	{
+@@ -353,7 +389,7 @@ int FIPS_selftest_rsa()
+ 	if ((pk=EVP_PKEY_new()) == NULL)
+ 		goto err;
+ 
+-	EVP_PKEY_assign_RSA(pk, key);
++	EVP_PKEY_set1_RSA(pk, key);
+ 
+ 	if (!fips_pkey_signature_test(pk, kat_tbs, sizeof(kat_tbs) - 1,
+ 				kat_RSA_SHA1, sizeof(kat_RSA_SHA1),
+@@ -430,13 +466,15 @@ int FIPS_selftest_rsa()
+ 			"RSA SHA512 X931"))
+ 		goto err;
+ 
++	if (!fips_rsa_encrypt_test(key, kat_tbs, sizeof(kat_tbs) - 1))
++		goto err;
+ 
+ 	ret = 1;
+ 
+ 	err:
+ 	if (pk)
+ 		EVP_PKEY_free(pk);
+-	else if (key)
++	if (key)
+ 		RSA_free(key);
+ 	return ret;
+ 	}
+diff -up openssl-1.0.1e/crypto/fips/Makefile.fips-reqs openssl-1.0.1e/crypto/fips/Makefile
+--- openssl-1.0.1e/crypto/fips/Makefile.fips-reqs	2013-12-18 12:17:20.000000000 +0100
++++ openssl-1.0.1e/crypto/fips/Makefile	2013-12-18 17:14:20.348337362 +0100
+@@ -24,13 +24,15 @@ LIBSRC=fips_aes_selftest.c fips_des_self
+     fips_rsa_selftest.c fips_sha_selftest.c fips.c fips_dsa_selftest.c  fips_rand.c \
+     fips_rsa_x931g.c fips_post.c fips_drbg_ctr.c fips_drbg_hash.c fips_drbg_hmac.c \
+     fips_drbg_lib.c fips_drbg_rand.c fips_drbg_selftest.c fips_rand_lib.c \
+-    fips_cmac_selftest.c fips_ecdh_selftest.c fips_ecdsa_selftest.c fips_enc.c fips_md.c
++    fips_cmac_selftest.c fips_ecdh_selftest.c fips_ecdsa_selftest.c fips_enc.c fips_md.c \
++    fips_dh_selftest.c
+ 
+ LIBOBJ=fips_aes_selftest.o fips_des_selftest.o fips_hmac_selftest.o fips_rand_selftest.o \
+     fips_rsa_selftest.o fips_sha_selftest.o fips.o fips_dsa_selftest.o  fips_rand.o \
+     fips_rsa_x931g.o fips_post.o fips_drbg_ctr.o fips_drbg_hash.o fips_drbg_hmac.o \
+     fips_drbg_lib.o fips_drbg_rand.o fips_drbg_selftest.o fips_rand_lib.o \
+-    fips_cmac_selftest.o fips_ecdh_selftest.o fips_ecdsa_selftest.o fips_enc.o fips_md.o
++    fips_cmac_selftest.o fips_ecdh_selftest.o fips_ecdsa_selftest.o fips_enc.o fips_md.o \
++    fips_dh_selftest.o
+ 
+ LIBCRYPTO=-L.. -lcrypto
+ 
+diff -up openssl-1.0.1e/crypto/modes/gcm128.c.fips-reqs openssl-1.0.1e/crypto/modes/gcm128.c
+--- openssl-1.0.1e/crypto/modes/gcm128.c.fips-reqs	2013-02-11 16:26:04.000000000 +0100
++++ openssl-1.0.1e/crypto/modes/gcm128.c	2013-12-18 12:17:09.800637730 +0100
+@@ -898,6 +898,10 @@ int CRYPTO_gcm128_encrypt(GCM128_CONTEXT
+ # endif
+ #endif
+ 
++	ctx->totlen += len;
++	if (ctx->totlen>(U64(1)<<36) || (sizeof(len)==8 && ctx->totlen<len))
++		return -1;
++
+ #if 0
+ 	n = (unsigned int)mlen%16; /* alternative to ctx->mres */
+ #endif
+@@ -1200,6 +1204,10 @@ int CRYPTO_gcm128_encrypt_ctr32(GCM128_C
+ # endif
+ #endif
+ 
++	ctx->totlen += len;
++	if (ctx->totlen>(U64(1)<<36) || (sizeof(len)==8 && ctx->totlen<len))
++		return -1;
++
+ 	mlen += len;
+ 	if (mlen>((U64(1)<<36)-32) || (sizeof(len)==8 && mlen<len))
+ 		return -1;
+diff -up openssl-1.0.1e/crypto/modes/modes_lcl.h.fips-reqs openssl-1.0.1e/crypto/modes/modes_lcl.h
+--- openssl-1.0.1e/crypto/modes/modes_lcl.h.fips-reqs	2013-12-18 12:17:09.388628895 +0100
++++ openssl-1.0.1e/crypto/modes/modes_lcl.h	2013-12-18 12:17:09.800637730 +0100
+@@ -115,6 +115,7 @@ struct gcm128_context {
+ 	unsigned int mres, ares;
+ 	block128_f block;
+ 	void *key;
++	u64 totlen;
+ };
+ 
+ struct xts128_context {
+diff -up openssl-1.0.1e/crypto/rand/md_rand.c.fips-reqs openssl-1.0.1e/crypto/rand/md_rand.c
+--- openssl-1.0.1e/crypto/rand/md_rand.c.fips-reqs	2013-12-18 12:17:09.763636936 +0100
++++ openssl-1.0.1e/crypto/rand/md_rand.c	2013-12-18 12:17:09.800637730 +0100
+@@ -143,12 +143,6 @@ static long md_count[2]={0,0};
+ static double entropy=0;
+ static int initialized=0;
+ 
+-static unsigned int crypto_lock_rand = 0; /* may be set only when a thread
+-                                           * holds CRYPTO_LOCK_RAND
+-                                           * (to prevent double locking) */
+-/* access to lockin_thread is synchronized by CRYPTO_LOCK_RAND2 */
+-static CRYPTO_THREADID locking_threadid; /* valid iff crypto_lock_rand is set */
+-
+ 
+ #ifdef PREDICT
+ int rand_predictable=0;
+@@ -196,7 +190,7 @@ static void ssleay_rand_add(const void *
+ 	long md_c[2];
+ 	unsigned char local_md[MD_DIGEST_LENGTH];
+ 	EVP_MD_CTX m;
+-	int do_not_lock;
++	int locked;
+ 
+ 	/*
+ 	 * (Based on the rand(3) manpage)
+@@ -213,19 +207,8 @@ static void ssleay_rand_add(const void *
+          * hash function.
+ 	 */
+ 
+-	/* check if we already have the lock */
+-	if (crypto_lock_rand)
+-		{
+-		CRYPTO_THREADID cur;
+-		CRYPTO_THREADID_current(&cur);
+-		CRYPTO_r_lock(CRYPTO_LOCK_RAND2);
+-		do_not_lock = !CRYPTO_THREADID_cmp(&locking_threadid, &cur);
+-		CRYPTO_r_unlock(CRYPTO_LOCK_RAND2);
+-		}
+-	else
+-		do_not_lock = 0;
++	locked = private_RAND_lock(1);
+ 
+-	if (!do_not_lock) CRYPTO_w_lock(CRYPTO_LOCK_RAND);
+ 	st_idx=state_index;
+ 
+ 	/* use our own copies of the counters so that even
+@@ -257,7 +240,8 @@ static void ssleay_rand_add(const void *
+ 
+ 	md_count[1] += (num / MD_DIGEST_LENGTH) + (num % MD_DIGEST_LENGTH > 0);
+ 
+-	if (!do_not_lock) CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
++	if (locked)
++		private_RAND_lock(0);
+ 
+ 	EVP_MD_CTX_init(&m);
+ 	for (i=0; i<num; i+=MD_DIGEST_LENGTH)
+@@ -308,7 +292,7 @@ static void ssleay_rand_add(const void *
+ 		}
+ 	EVP_MD_CTX_cleanup(&m);
+ 
+-	if (!do_not_lock) CRYPTO_w_lock(CRYPTO_LOCK_RAND);
++	locked = private_RAND_lock(1);
+ 	/* Don't just copy back local_md into md -- this could mean that
+ 	 * other thread's seeding remains without effect (except for
+ 	 * the incremented counter).  By XORing it we keep at least as
+@@ -319,7 +303,8 @@ static void ssleay_rand_add(const void *
+ 		}
+ 	if (entropy < ENTROPY_NEEDED) /* stop counting when we have enough */
+ 	    entropy += add;
+-	if (!do_not_lock) CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
++	if (locked)
++		private_RAND_lock(0);
+ 	
+ #if !defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32)
+ 	assert(md_c[1] == md_count[1]);
+@@ -344,6 +329,7 @@ static int ssleay_rand_bytes(unsigned ch
+ 	pid_t curr_pid = getpid();
+ #endif
+ 	int do_stir_pool = 0;
++	int locked;
+ 
+ #ifdef PREDICT
+ 	if (rand_predictable)
+@@ -381,13 +367,7 @@ static int ssleay_rand_bytes(unsigned ch
+ 	 * global 'md'.
+ 	 */
+ 
+-	CRYPTO_w_lock(CRYPTO_LOCK_RAND);
+-
+-	/* prevent ssleay_rand_bytes() from trying to obtain the lock again */
+-	CRYPTO_w_lock(CRYPTO_LOCK_RAND2);
+-	CRYPTO_THREADID_current(&locking_threadid);
+-	CRYPTO_w_unlock(CRYPTO_LOCK_RAND2);
+-	crypto_lock_rand = 1;
++	locked = private_RAND_lock(1);
+ 
+ 	/* always poll for external entropy in FIPS mode, drbg provides the 
+ 	 * expansion
+@@ -461,9 +441,8 @@ static int ssleay_rand_bytes(unsigned ch
+ 
+ 	md_count[0] += 1;
+ 
+-	/* before unlocking, we must clear 'crypto_lock_rand' */
+-	crypto_lock_rand = 0;
+-	CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
++	if (locked)
++		private_RAND_lock(0);
+ 
+ 	while (num > 0)
+ 		{
+@@ -515,10 +494,11 @@ static int ssleay_rand_bytes(unsigned ch
+ 	MD_Init(&m);
+ 	MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
+ 	MD_Update(&m,local_md,MD_DIGEST_LENGTH);
+-	CRYPTO_w_lock(CRYPTO_LOCK_RAND);
++	locked = private_RAND_lock(1);
+ 	MD_Update(&m,md,MD_DIGEST_LENGTH);
+ 	MD_Final(&m,md);
+-	CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
++	if (locked)
++		private_RAND_lock(0);
+ 
+ 	EVP_MD_CTX_cleanup(&m);
+ 	if (ok)
+@@ -548,32 +528,10 @@ static int ssleay_rand_pseudo_bytes(unsi
+ 
+ static int ssleay_rand_status(void)
+ 	{
+-	CRYPTO_THREADID cur;
+ 	int ret;
+-	int do_not_lock;
++	int locked;
+ 
+-	CRYPTO_THREADID_current(&cur);
+-	/* check if we already have the lock
+-	 * (could happen if a RAND_poll() implementation calls RAND_status()) */
+-	if (crypto_lock_rand)
+-		{
+-		CRYPTO_r_lock(CRYPTO_LOCK_RAND2);
+-		do_not_lock = !CRYPTO_THREADID_cmp(&locking_threadid, &cur);
+-		CRYPTO_r_unlock(CRYPTO_LOCK_RAND2);
+-		}
+-	else
+-		do_not_lock = 0;
+-	
+-	if (!do_not_lock)
+-		{
+-		CRYPTO_w_lock(CRYPTO_LOCK_RAND);
+-		
+-		/* prevent ssleay_rand_bytes() from trying to obtain the lock again */
+-		CRYPTO_w_lock(CRYPTO_LOCK_RAND2);
+-		CRYPTO_THREADID_cpy(&locking_threadid, &cur);
+-		CRYPTO_w_unlock(CRYPTO_LOCK_RAND2);
+-		crypto_lock_rand = 1;
+-		}
++	locked = private_RAND_lock(1);
+ 	
+ 	if (!initialized)
+ 		{
+@@ -583,13 +541,8 @@ static int ssleay_rand_status(void)
+ 
+ 	ret = entropy >= ENTROPY_NEEDED;
+ 
+-	if (!do_not_lock)
+-		{
+-		/* before unlocking, we must clear 'crypto_lock_rand' */
+-		crypto_lock_rand = 0;
+-		
+-		CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
+-		}
++	if (locked)
++		private_RAND_lock(0);
+ 	
+ 	return ret;
+ 	}
+diff -up openssl-1.0.1e/crypto/rand/rand.h.fips-reqs openssl-1.0.1e/crypto/rand/rand.h
+--- openssl-1.0.1e/crypto/rand/rand.h.fips-reqs	2013-12-18 12:17:09.764636958 +0100
++++ openssl-1.0.1e/crypto/rand/rand.h	2013-12-18 12:17:09.800637730 +0100
+@@ -124,6 +124,8 @@ void RAND_set_fips_drbg_type(int type, i
+ int RAND_init_fips(void);
+ #endif
+ 
++int private_RAND_lock(int lock);
++
+ /* BEGIN ERROR CODES */
+ /* The following lines are auto generated by the script mkerr.pl. Any changes
+  * made after this point may be overwritten when the script is next run.
+diff -up openssl-1.0.1e/crypto/rand/rand_lcl.h.fips-reqs openssl-1.0.1e/crypto/rand/rand_lcl.h
+--- openssl-1.0.1e/crypto/rand/rand_lcl.h.fips-reqs	2013-12-18 12:17:09.507631447 +0100
++++ openssl-1.0.1e/crypto/rand/rand_lcl.h	2013-12-18 12:17:09.800637730 +0100
+@@ -112,7 +112,7 @@
+ #ifndef HEADER_RAND_LCL_H
+ #define HEADER_RAND_LCL_H
+ 
+-#define ENTROPY_NEEDED 32  /* require 256 bits = 32 bytes of randomness */
++#define ENTROPY_NEEDED 48  /* require 384 bits = 48 bytes of randomness */
+ 
+ 
+ #if !defined(USE_MD5_RAND) && !defined(USE_SHA1_RAND) && !defined(USE_MDC2_RAND) && !defined(USE_MD2_RAND)
+diff -up openssl-1.0.1e/crypto/rand/rand_lib.c.fips-reqs openssl-1.0.1e/crypto/rand/rand_lib.c
+--- openssl-1.0.1e/crypto/rand/rand_lib.c.fips-reqs	2013-02-11 16:26:04.000000000 +0100
++++ openssl-1.0.1e/crypto/rand/rand_lib.c	2013-12-18 18:16:45.625850730 +0100
+@@ -181,6 +181,41 @@ int RAND_status(void)
+ 	return 0;
+ 	}
+ 
++int private_RAND_lock(int lock)
++	{
++	static int crypto_lock_rand;
++	static CRYPTO_THREADID locking_threadid;
++	int do_lock;
++
++	if (!lock)
++		{
++		crypto_lock_rand = 0;
++		CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
++		return 0;
++		}
++
++	/* check if we already have the lock */
++	if (crypto_lock_rand)
++		{
++		CRYPTO_THREADID cur;
++		CRYPTO_THREADID_current(&cur);
++		CRYPTO_r_lock(CRYPTO_LOCK_RAND2);
++		do_lock = !!CRYPTO_THREADID_cmp(&locking_threadid, &cur);
++		CRYPTO_r_unlock(CRYPTO_LOCK_RAND2);
++		}
++        else
++		do_lock = 1;
++	if (do_lock)
++		{
++		CRYPTO_w_lock(CRYPTO_LOCK_RAND);
++		crypto_lock_rand = 1;
++		CRYPTO_w_lock(CRYPTO_LOCK_RAND2);
++		CRYPTO_THREADID_current(&locking_threadid);
++		CRYPTO_w_unlock(CRYPTO_LOCK_RAND2);
++		}
++	return do_lock;
++	}
++
+ #ifdef OPENSSL_FIPS
+ 
+ /* FIPS DRBG initialisation code. This sets up the DRBG for use by the
+@@ -239,12 +274,16 @@ static int drbg_rand_add(DRBG_CTX *ctx,
+ 				double entropy)
+ 	{
+ 	RAND_SSLeay()->add(in, inlen, entropy);
++	if (FIPS_rand_status())
++		FIPS_drbg_reseed(ctx, NULL, 0);
+ 	return 1;
+ 	}
+ 
+ static int drbg_rand_seed(DRBG_CTX *ctx, const void *in, int inlen)
+ 	{
+ 	RAND_SSLeay()->seed(in, inlen);
++	if (FIPS_rand_status())
++		FIPS_drbg_reseed(ctx, NULL, 0);
+ 	return 1;
+ 	}
+ 
+diff -up openssl-1.0.1e/crypto/rsa/rsa_gen.c.fips-reqs openssl-1.0.1e/crypto/rsa/rsa_gen.c
+--- openssl-1.0.1e/crypto/rsa/rsa_gen.c.fips-reqs	2013-12-18 12:17:09.764636958 +0100
++++ openssl-1.0.1e/crypto/rsa/rsa_gen.c	2013-12-19 17:40:58.483154314 +0100
+@@ -1,5 +1,6 @@
+ /* crypto/rsa/rsa_gen.c */
+ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
++ * Copyright (C) 2013 Red Hat, Inc.
+  * All rights reserved.
+  *
+  * This package is an SSL implementation written
+@@ -165,6 +166,222 @@ int RSA_generate_key_ex(RSA *rsa, int bi
+ 	return rsa_builtin_keygen(rsa, bits, e_value, cb);
+ 	}
+ 
++#ifdef OPENSSL_FIPS
++static int FIPS_rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb)
++	{
++	BIGNUM *r0 = NULL, *r1 = NULL, *r2 = NULL, *r3 = NULL, *tmp;
++	BIGNUM local_r0, local_d, local_p;
++	BIGNUM *pr0, *d, *p;
++	BN_CTX *ctx = NULL;
++	int ok = -1;
++	int i;
++        int n = 0;
++	int test = 0;
++        int pbits = bits/2;
++
++	if(FIPS_selftest_failed())
++		{
++		FIPSerr(FIPS_F_RSA_BUILTIN_KEYGEN, FIPS_R_FIPS_SELFTEST_FAILED);
++	    	return 0;
++	    	}
++
++	if (bits != 2048 && bits != 3072)
++		{
++		FIPSerr(FIPS_F_RSA_BUILTIN_KEYGEN, FIPS_R_INVALID_KEY_LENGTH);
++		return 0;
++		}
++
++	ctx = BN_CTX_new();
++	if (ctx == NULL) goto err;
++	BN_CTX_start(ctx);
++	r0 = BN_CTX_get(ctx);
++	r1 = BN_CTX_get(ctx);
++	r2 = BN_CTX_get(ctx);
++	r3 = BN_CTX_get(ctx);
++
++	if (r3 == NULL) goto err;
++
++	/* We need the RSA components non-NULL */
++	if (!rsa->n && ((rsa->n=BN_new()) == NULL)) goto err;
++	if (!rsa->d && ((rsa->d=BN_new()) == NULL)) goto err;
++	if (!rsa->e && ((rsa->e=BN_new()) == NULL)) goto err;
++	if (!rsa->p && ((rsa->p=BN_new()) == NULL)) goto err;
++	if (!rsa->q && ((rsa->q=BN_new()) == NULL)) goto err;
++	if (!rsa->dmp1 && ((rsa->dmp1=BN_new()) == NULL)) goto err;
++	if (!rsa->dmq1 && ((rsa->dmq1=BN_new()) == NULL)) goto err;
++	if (!rsa->iqmp && ((rsa->iqmp=BN_new()) == NULL)) goto err;
++
++	if (!BN_set_word(r0, RSA_F4)) goto err;
++	if (BN_cmp(e_value, r0) < 0 || BN_num_bits(e_value) > 256)
++		{
++		ok = 0; /* we set our own err */
++		RSAerr(RSA_F_RSA_BUILTIN_KEYGEN,RSA_R_BAD_E_VALUE);
++		goto err;
++		}
++
++	/* prepare approximate minimum p and q */
++	if (!BN_set_word(r0, 0xB504F334)) goto err;
++	if (!BN_lshift(r0, r0, pbits - 32)) goto err;
++
++	/* prepare minimum p and q difference */
++	if (!BN_one(r3)) goto err;
++	if (!BN_lshift(r3, r3, pbits - 100)) goto err;
++
++	BN_copy(rsa->e, e_value);
++
++	if (!BN_is_zero(rsa->p) && !BN_is_zero(rsa->q))
++		test = 1;
++
++	/* generate p and q */
++	for (i = 0; i < 5 * pbits; i++)
++		{
++        ploop:
++                if (!test)
++                        if (!BN_rand(rsa->p, pbits, 0, 1)) goto err;
++                if (BN_cmp(rsa->p, r0) < 0)
++                        {
++                        if (test) goto err;
++                        goto ploop;
++                        }
++
++		if (!BN_sub(r2, rsa->p, BN_value_one())) goto err;
++		if (!BN_gcd(r1, r2, rsa->e, ctx)) goto err;
++		if (BN_is_one(r1))
++                        {
++                        int r;
++                        r = BN_is_prime_fasttest_ex(rsa->p, pbits>1024?4:5, ctx, 0, cb);
++        		if (r == -1 || (test && r <= 0)) goto err;
++        		if (r > 0) break;
++                        } 
++
++		if(!BN_GENCB_call(cb, 2, n++))
++			goto err;
++		}
++
++	if(!BN_GENCB_call(cb, 3, 0))
++		goto err;
++
++        if(i >= 5*pbits)
++                /* prime not found */
++                goto err;
++
++	for (i = 0; i < 5 * pbits; i++)
++		{
++        qloop:
++                if (!test)
++                        if (!BN_rand(rsa->q, pbits, 0, 1)) goto err;
++                if (BN_cmp(rsa->q, r0) < 0)
++                        {
++                        if (test) goto err;
++                        goto qloop;
++                        }
++       		if (!BN_sub(r2, rsa->q, rsa->p)) goto err;
++                if (BN_ucmp(r2, r3) <= 0)
++                        {
++                        if (test) goto err;
++                        goto qloop;
++                        }
++
++		if (!BN_sub(r2, rsa->q, BN_value_one())) goto err;
++		if (!BN_gcd(r1, r2, rsa->e, ctx)) goto err;
++		if (BN_is_one(r1))
++                        {
++                        int r;
++                        r = BN_is_prime_fasttest_ex(rsa->q, pbits>1024?4:5, ctx, 0, cb);
++        		if (r == -1 || (test && r <= 0)) goto err;
++        		if (r > 0) break;
++                        } 
++
++		if(!BN_GENCB_call(cb, 2, n++))
++			goto err;
++		}
++
++	if(!BN_GENCB_call(cb, 3, 1))
++		goto err;
++
++        if(i >= 5*pbits)
++                /* prime not found */
++                goto err;
++
++        if (test)
++                {
++                /* do not try to calculate the remaining key values */
++                BN_clear(rsa->n);
++                ok = 1;
++                goto err;
++                }
++
++	if (BN_cmp(rsa->p,rsa->q) < 0)
++		{
++		tmp=rsa->p;
++		rsa->p=rsa->q;
++		rsa->q=tmp;
++		}
++
++	/* calculate n */
++	if (!BN_mul(rsa->n,rsa->p,rsa->q,ctx)) goto err;
++
++	/* calculate d */
++	if (!BN_sub(r1,rsa->p,BN_value_one())) goto err;	/* p-1 */
++	if (!BN_sub(r2,rsa->q,BN_value_one())) goto err;	/* q-1 */
++	if (!BN_mul(r0,r1,r2,ctx)) goto err;	/* (p-1)(q-1) */
++	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
++		{
++		  pr0 = &local_r0;
++		  BN_with_flags(pr0, r0, BN_FLG_CONSTTIME);
++		}
++	else
++	  pr0 = r0;
++	if (!BN_mod_inverse(rsa->d,rsa->e,pr0,ctx)) goto err;	/* d */
++
++	/* set up d for correct BN_FLG_CONSTTIME flag */
++	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
++		{
++		d = &local_d;
++		BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
++		}
++	else
++		d = rsa->d;
++
++	/* calculate d mod (p-1) */
++	if (!BN_mod(rsa->dmp1,d,r1,ctx)) goto err;
++
++	/* calculate d mod (q-1) */
++	if (!BN_mod(rsa->dmq1,d,r2,ctx)) goto err;
++
++	/* calculate inverse of q mod p */
++	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
++		{
++		p = &local_p;
++		BN_with_flags(p, rsa->p, BN_FLG_CONSTTIME);
++		}
++	else
++		p = rsa->p;
++	if (!BN_mod_inverse(rsa->iqmp,rsa->q,p,ctx)) goto err;
++
++	if (fips_rsa_pairwise_fail)
++		BN_add_word(rsa->n, 1);
++
++	if(!fips_check_rsa(rsa))
++	    goto err;
++
++	ok=1;
++err:
++	if (ok == -1)
++		{
++		RSAerr(RSA_F_RSA_BUILTIN_KEYGEN,ERR_LIB_BN);
++		ok = 0;
++		}
++	if (ctx != NULL)
++		{
++		BN_CTX_end(ctx);
++		BN_CTX_free(ctx);
++		}
++
++	return ok;
++	}
++#endif
++
+ static int rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb)
+ 	{
+ 	BIGNUM *r0=NULL,*r1=NULL,*r2=NULL,*r3=NULL,*tmp;
+@@ -176,17 +393,7 @@ static int rsa_builtin_keygen(RSA *rsa,
+ #ifdef OPENSSL_FIPS
+ 	if (FIPS_module_mode())
+ 		{
+-		if(FIPS_selftest_failed())
+-	    	{
+-		    FIPSerr(FIPS_F_RSA_BUILTIN_KEYGEN,FIPS_R_FIPS_SELFTEST_FAILED);
+-	    	return 0;
+-	    	}
+-
+-		if (bits < OPENSSL_RSA_FIPS_MIN_MODULUS_BITS)
+-		    {
+-		    FIPSerr(FIPS_F_RSA_BUILTIN_KEYGEN,FIPS_R_KEY_TOO_SHORT);
+-		    return 0;
+-		    }
++		return FIPS_rsa_builtin_keygen(rsa, bits, e_value, cb);
+ 		}
+ #endif
+ 
+@@ -301,17 +508,6 @@ static int rsa_builtin_keygen(RSA *rsa,
+ 		p = rsa->p;
+ 	if (!BN_mod_inverse(rsa->iqmp,rsa->q,p,ctx)) goto err;
+ 
+-#ifdef OPENSSL_FIPS
+-	if (FIPS_module_mode())
+-		{
+-		if (fips_rsa_pairwise_fail)
+-			BN_add_word(rsa->n, 1);
+-
+-		if(!fips_check_rsa(rsa))
+-		    goto err;
+-		}
+-#endif
+-
+ 	ok=1;
+ err:
+ 	if (ok == -1)
+diff -up openssl-1.0.1e/ssl/t1_enc.c.fips-reqs openssl-1.0.1e/ssl/t1_enc.c
+--- openssl-1.0.1e/ssl/t1_enc.c.fips-reqs	2013-02-11 16:26:04.000000000 +0100
++++ openssl-1.0.1e/ssl/t1_enc.c	2013-12-18 12:17:09.801637751 +0100
+@@ -291,6 +291,27 @@ static int tls1_PRF(long digest_mask,
+ err:
+ 	return ret;
+ }
++
++int private_tls1_PRF(long digest_mask,
++		     const void *seed1, int seed1_len,
++		     const void *seed2, int seed2_len,
++		     const void *seed3, int seed3_len,
++		     const void *seed4, int seed4_len,
++		     const void *seed5, int seed5_len,
++		     const unsigned char *sec, int slen,
++		     unsigned char *out1,
++		     unsigned char *out2, int olen)
++	{
++	return tls1_PRF(digest_mask,
++		seed1, seed1_len,
++		seed2, seed2_len,
++		seed3, seed3_len,
++		seed4, seed4_len,
++		seed5, seed5_len,
++		sec, slen,
++		out1, out2, olen);
++	}
++
+ static int tls1_generate_key_block(SSL *s, unsigned char *km,
+ 	     unsigned char *tmp, int num)
+ 	{
diff --git a/SOURCES/openssl-1.0.1e-no-md5-verify.patch b/SOURCES/openssl-1.0.1e-no-md5-verify.patch
new file mode 100644
index 0000000..f379735
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-no-md5-verify.patch
@@ -0,0 +1,25 @@
+diff -up openssl-1.0.1e/crypto/asn1/a_verify.c.no-md5-verify openssl-1.0.1e/crypto/asn1/a_verify.c
+--- openssl-1.0.1e/crypto/asn1/a_verify.c.no-md5-verify	2013-02-11 16:26:04.000000000 +0100
++++ openssl-1.0.1e/crypto/asn1/a_verify.c	2013-11-13 16:30:04.628791616 +0100
+@@ -56,6 +56,9 @@
+  * [including the GNU Public Licence.]
+  */
+ 
++/* for secure_getenv */
++#define _GNU_SOURCE
++
+ #include <stdio.h>
+ #include <time.h>
+ 
+@@ -171,6 +174,11 @@ int ASN1_item_verify(const ASN1_ITEM *it
+ 			goto err;
+ 		ret = -1;
+ 		}
++	else if (mdnid == NID_md5 && secure_getenv("OPENSSL_ENABLE_MD5_VERIFY") == NULL)
++		{
++		ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM);
++		goto err;
++		}
+ 	else
+ 		{
+ 		const EVP_MD *type;
diff --git a/SOURCES/openssl-1.0.1e-req-keylen.patch b/SOURCES/openssl-1.0.1e-req-keylen.patch
new file mode 100644
index 0000000..1574bb8
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-req-keylen.patch
@@ -0,0 +1,38 @@
+diff -up openssl-1.0.1e/apps/req.c.keylen openssl-1.0.1e/apps/req.c
+--- openssl-1.0.1e/apps/req.c.keylen	2014-02-12 14:58:29.000000000 +0100
++++ openssl-1.0.1e/apps/req.c	2014-02-14 13:52:48.692325000 +0100
+@@ -644,6 +644,12 @@ bad:
+ 		if (inrand)
+ 			app_RAND_load_files(inrand);
+ 
++		if (newkey <= 0)
++			{
++			if (!NCONF_get_number(req_conf,SECTION,BITS, &newkey))
++				newkey=DEFAULT_KEY_LENGTH;
++			}
++
+ 		if (keyalg)
+ 			{
+ 			genctx = set_keygen_ctx(bio_err, keyalg, &pkey_type, &newkey,
+@@ -651,12 +657,6 @@ bad:
+ 			if (!genctx)
+ 				goto end;
+ 			}
+-	
+-		if (newkey <= 0)
+-			{
+-			if (!NCONF_get_number(req_conf,SECTION,BITS, &newkey))
+-				newkey=DEFAULT_KEY_LENGTH;
+-			}
+ 
+ 		if (newkey < MIN_KEY_LENGTH && (pkey_type == EVP_PKEY_RSA || pkey_type == EVP_PKEY_DSA))
+ 			{
+@@ -1649,6 +1649,8 @@ static EVP_PKEY_CTX *set_keygen_ctx(BIO
+ 				keylen = atol(p + 1);
+ 				*pkeylen = keylen;
+ 				}
++			else
++				keylen = *pkeylen;
+ 			}
+ 		else if (p)
+ 			paramfile = p + 1;
diff --git a/SOURCES/openssl-1.0.1e-weak-ciphers.patch b/SOURCES/openssl-1.0.1e-weak-ciphers.patch
new file mode 100644
index 0000000..8657345
--- /dev/null
+++ b/SOURCES/openssl-1.0.1e-weak-ciphers.patch
@@ -0,0 +1,12 @@
+diff -up openssl-1.0.1e/ssl/ssl.h.weak-ciphers openssl-1.0.1e/ssl/ssl.h
+--- openssl-1.0.1e/ssl/ssl.h.weak-ciphers	2013-12-18 15:50:40.881620314 +0100
++++ openssl-1.0.1e/ssl/ssl.h	2013-12-18 14:25:25.596566704 +0100
+@@ -331,7 +331,7 @@ extern "C" {
+ /* The following cipher list is used by default.
+  * It also is substituted when an application-defined cipher list string
+  * starts with 'DEFAULT'. */
+-#define SSL_DEFAULT_CIPHER_LIST	"ALL:!aNULL:!eNULL:!SSLv2"
++#define SSL_DEFAULT_CIPHER_LIST	"ALL:!aNULL:!eNULL:!SSLv2:!EXPORT:!RC2:!DES"
+ /* As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always
+  * starts with a reasonable order, and all we have to do for DEFAULT is
+  * throwing out anonymous and unencrypted ciphersuites!
diff --git a/SPECS/openssl.spec b/SPECS/openssl.spec
index ee81939..a67dd77 100644
--- a/SPECS/openssl.spec
+++ b/SPECS/openssl.spec
@@ -18,10 +18,12 @@
 # also be handled in opensslconf-new.h.
 %define multilib_arches %{ix86} ia64 ppc %{power64} s390 s390x sparcv9 sparc64 x86_64
 
+%global _performance_build 1
+
 Summary: Utilities from the general purpose cryptography library with TLS implementation
 Name: openssl
 Version: 1.0.1e
-Release: 23%{?dist}
+Release: 34%{?dist}
 Epoch: 1
 # We have to remove certain patented algorithms from the openssl source
 # tarball with the hobble-openssl script which is included below.
@@ -39,7 +41,7 @@ Source12: ec_curve.c
 Source13: ectest.c
 # Build changes
 Patch1: openssl-1.0.1-beta2-rpmbuild.patch
-Patch2: openssl-1.0.0f-defaults.patch
+Patch2: openssl-1.0.1e-defaults.patch
 Patch4: openssl-1.0.0-beta5-enginesdir.patch
 Patch5: openssl-0.9.8a-no-rpath.patch
 Patch6: openssl-0.9.8b-test-use-localhost.patch
@@ -74,12 +76,23 @@ Patch70: openssl-1.0.1e-fips-ec.patch
 Patch71: openssl-1.0.1e-manfix.patch
 Patch72: openssl-1.0.1e-fips-ctor.patch
 Patch73: openssl-1.0.1e-ecc-suiteb.patch
+Patch74: openssl-1.0.1e-no-md5-verify.patch
+Patch75: openssl-1.0.1e-compat-symbols.patch
+Patch76: openssl-1.0.1e-new-fips-reqs.patch
+Patch77: openssl-1.0.1e-weak-ciphers.patch
+Patch78: openssl-1.0.1e-3des-strength.patch
+Patch79: openssl-1.0.1e-req-keylen.patch
 # Backported fixes including security fixes
 Patch81: openssl-1.0.1-beta2-padlock64.patch
 Patch82: openssl-1.0.1e-backports.patch
 Patch83: openssl-1.0.1e-bad-mac.patch
 Patch84: openssl-1.0.1e-trusted-first.patch
 Patch85: openssl-1.0.1e-arm-use-elf-auxv-caps.patch
+Patch86: openssl-1.0.1e-cve-2013-6449.patch
+Patch87: openssl-1.0.1e-cve-2013-6450.patch
+Patch88: openssl-1.0.1e-cve-2013-4353.patch
+Patch89: openssl-1.0.1e-ephemeral-key-size.patch
+Patch90: openssl-1.0.1e-cve-2014-0160.patch
 
 License: OpenSSL
 Group: System Environment/Libraries
@@ -186,6 +199,12 @@ cp %{SOURCE12} %{SOURCE13} crypto/ec/
 %patch70 -p1 -b .fips-ec
 %patch72 -p1 -b .fips-ctor
 %patch73 -p1 -b .suiteb
+%patch74 -p1 -b .no-md5-verify
+%patch75 -p1 -b .compat
+%patch76 -p1 -b .fips-reqs
+%patch77 -p1 -b .weak-ciphers
+%patch78 -p1 -b .3des-strength
+%patch79 -p1 -b .keylen
 
 %patch81 -p1 -b .padlock64
 %patch82 -p1 -b .backports
@@ -193,6 +212,11 @@ cp %{SOURCE12} %{SOURCE13} crypto/ec/
 %patch83 -p1 -b .bad-mac
 %patch84 -p1 -b .trusted-first
 %patch85 -p1 -b .armcap
+%patch86 -p1 -b .hash-crash
+%patch87 -p1 -b .dtls1-mitm
+%patch88 -p1 -b .handshake-crash
+%patch89 -p1 -b .ephemeral
+%patch90 -p1 -b .heartbeat
 
 sed -i 's/SHLIB_VERSION_NUMBER "1.0.0"/SHLIB_VERSION_NUMBER "%{version}"/' crypto/opensslv.h
 
@@ -273,6 +297,8 @@ patch -p1 -R < %{PATCH33}
 
 LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
 export LD_LIBRARY_PATH
+OPENSSL_ENABLE_MD5_VERIFY=
+export OPENSSL_ENABLE_MD5_VERIFY
 make -C test apps tests
 %{__cc} -o openssl-thread-test \
 	`krb5-config --cflags` \
@@ -454,6 +480,51 @@ rm -rf $RPM_BUILD_ROOT/%{_libdir}/fipscanister.*
 %postun libs -p /sbin/ldconfig
 
 %changelog
+* Tue Apr  8 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-34
+- fix CVE-2014-0160 - information disclosure in TLS heartbeat extension
+
+* Fri Feb 14 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-33
+- use the key length from configuration file if req -newkey rsa is invoked
+
+* Thu Feb 13 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-32
+- avoid unnecessary reseeding in BN_rand in the FIPS mode
+
+* Wed Feb 12 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-31
+- print ephemeral key size negotiated in TLS handshake (#1057715)
+- add DH_compute_key_padded needed for FIPS CAVS testing
+- make expiration and key length changeable by DAYS and KEYLEN
+  variables in the certificate Makefile (#1058108)
+- change default hash to sha256 (#1062325)
+- lower the actual 3des strength so it is sorted behind aes128 (#1056616)
+
+* Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 1:1.0.1e-30
+- Mass rebuild 2014-01-24
+
+* Wed Jan 15 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-29
+- rebuild with -O3 on ppc64 architecture
+
+* Tue Jan  7 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-28
+- fix CVE-2013-4353 - Invalid TLS handshake crash
+- fix CVE-2013-6450 - possible MiTM attack on DTLS1
+
+* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 1:1.0.1e-27
+- Mass rebuild 2013-12-27
+
+* Fri Dec 20 2013 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-26
+- fix CVE-2013-6449 - crash when version in SSL structure is incorrect
+- drop weak ciphers from the default TLS ciphersuite list
+- add back some symbols that were dropped with update to 1.0.1 branch
+- more FIPS validation requirement changes
+
+* Tue Nov 19 2013 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-25
+- fix locking and reseeding problems with FIPS drbg
+
+* Fri Nov 15 2013 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-24
+- additional changes required for FIPS validation
+- disable verification of certificate, CRL, and OCSP signatures
+  using MD5 if OPENSSL_ENABLE_MD5_VERIFY environment variable
+  is not set
+
 * Fri Nov  8 2013 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-23
 - add back support for secp521r1 EC curve
 - add aarch64 to Configure (#969692)