Module Name:    src
Committed By:   martin
Date:           Mon Jan 26 11:47:24 UTC 2015

Modified Files:
        src/crypto/dist/openssl/apps [netbsd-5-1]: s_client.c s_server.c
            speed.c
        src/crypto/dist/openssl/crypto [netbsd-5-1]: Makefile
            constant_time_locl.h cversion.c
        src/crypto/dist/openssl/crypto/asn1 [netbsd-5-1]: a_bitstr.c a_type.c
            a_verify.c asn1.h asn1_err.c tasn_dec.c x_algor.c
        src/crypto/dist/openssl/crypto/bio [netbsd-5-1]: bio.h bss_dgram.c
        src/crypto/dist/openssl/crypto/bn [netbsd-5-1]: bn_asm.c bntest.c
        src/crypto/dist/openssl/crypto/bn/asm [netbsd-5-1]: mips3.s
            x86_64-gcc.c
        src/crypto/dist/openssl/crypto/dsa [netbsd-5-1]: dsa_vrf.c
        src/crypto/dist/openssl/crypto/ec [netbsd-5-1]: ec_mult.c ec_pmeth.c
        src/crypto/dist/openssl/crypto/ecdsa [netbsd-5-1]: ecs_vrf.c
        src/crypto/dist/openssl/crypto/evp [netbsd-5-1]: Makefile evp_enc.c
        src/crypto/dist/openssl/crypto/objects [netbsd-5-1]: obj_xref.h
            objxref.pl
        src/crypto/dist/openssl/crypto/ts [netbsd-5-1]: ts_rsp_sign.c
        src/crypto/dist/openssl/crypto/x509 [netbsd-5-1]: x509.h x509_vpm.c
            x_all.c
        src/crypto/dist/openssl/ssl [netbsd-5-1]: d1_both.c d1_clnt.c d1_enc.c
            d1_lib.c d1_pkt.c d1_srvr.c dtls1.h s23_srvr.c s2_enc.c s2_pkt.c
            s2_srvr.c s3_both.c s3_clnt.c s3_enc.c s3_lib.c s3_pkt.c s3_srvr.c
            ssl.h ssl_cert.c ssl_lib.c ssl_locl.h
        src/crypto/dist/openssl/util [netbsd-5-1]: libeay.num mk1mf.pl
        src/distrib/sets/lists/base [netbsd-5-1]: md.amd64 md.sparc64 shl.mi
        src/lib/libcrypto [netbsd-5-1]: shlib_version
        src/lib/libssl [netbsd-5-1]: shlib_version

Log Message:
Change the following, requested by spz in ticket #1945:
        crypto/dist/openssl/apps/s_client.c                          patch
        crypto/dist/openssl/apps/s_server.c                          patch
        crypto/dist/openssl/apps/speed.c                             patch
        crypto/dist/openssl/crypto/Makefile                          patch
        crypto/dist/openssl/crypto/constant_time_locl.h              patch
        crypto/dist/openssl/crypto/cversion.c                        patch
        crypto/dist/openssl/crypto/asn1/a_bitstr.c                   patch
        crypto/dist/openssl/crypto/asn1/a_type.c                     patch
        crypto/dist/openssl/crypto/asn1/a_verify.c                   patch
        crypto/dist/openssl/crypto/asn1/asn1.h                       patch
        crypto/dist/openssl/crypto/asn1/asn1_err.c                   patch
        crypto/dist/openssl/crypto/asn1/tasn_dec.c                   patch
        crypto/dist/openssl/crypto/asn1/x_algor.c                    patch
        crypto/dist/openssl/crypto/bio/bio.h                         patch
        crypto/dist/openssl/crypto/bio/bss_dgram.c                   patch
        crypto/dist/openssl/crypto/bn/bn_asm.c                       patch
        crypto/dist/openssl/crypto/bn/bntest.c                       patch
        crypto/dist/openssl/crypto/bn/asm/mips3.s                    patch
        crypto/dist/openssl/crypto/bn/asm/x86_64-gcc.c               patch
        crypto/dist/openssl/crypto/dsa/dsa_vrf.c                     patch
        crypto/dist/openssl/crypto/ec/ec_mult.c                      patch
        crypto/dist/openssl/crypto/ec/ec_pmeth.c                     patch
        crypto/dist/openssl/crypto/ecdsa/ecs_vrf.c                   patch
        crypto/dist/openssl/crypto/evp/Makefile                      patch
        crypto/dist/openssl/crypto/evp/evp_enc.c                     patch
        crypto/dist/openssl/crypto/objects/obj_xref.h                patch
        crypto/dist/openssl/crypto/objects/objxref.pl                patch
        crypto/dist/openssl/crypto/ts/ts_rsp_sign.c                  patch
        crypto/dist/openssl/crypto/x509/x509.h                       patch
        crypto/dist/openssl/crypto/x509/x509_vpm.c                   patch
        crypto/dist/openssl/crypto/x509/x_all.c                      patch
        crypto/dist/openssl/ssl/d1_both.c                            patch
        crypto/dist/openssl/ssl/d1_clnt.c                            patch
        crypto/dist/openssl/ssl/d1_enc.c                             patch
        crypto/dist/openssl/ssl/d1_lib.c                             patch
        crypto/dist/openssl/ssl/d1_pkt.c                             patch
        crypto/dist/openssl/ssl/d1_srvr.c                            patch
        crypto/dist/openssl/ssl/dtls1.h                              patch
        crypto/dist/openssl/ssl/s23_srvr.c                           patch
        crypto/dist/openssl/ssl/s2_enc.c                             patch
        crypto/dist/openssl/ssl/s2_pkt.c                             patch
        crypto/dist/openssl/ssl/s2_srvr.c                            patch
        crypto/dist/openssl/ssl/s3_both.c                            patch
        crypto/dist/openssl/ssl/s3_clnt.c                            patch
        crypto/dist/openssl/ssl/s3_enc.c                             patch
        crypto/dist/openssl/ssl/s3_lib.c                             patch
        crypto/dist/openssl/ssl/s3_pkt.c                             patch
        crypto/dist/openssl/ssl/s3_srvr.c                            patch
        crypto/dist/openssl/ssl/ssl.h                                patch
        crypto/dist/openssl/ssl/ssl_cert.c                           patch
        crypto/dist/openssl/ssl/ssl_lib.c                            patch
        crypto/dist/openssl/ssl/ssl_locl.h                           patch
        crypto/dist/openssl/util/libeay.num                          patch
        crypto/dist/openssl/util/mk1mf.pl                            patch
        distrib/sets/lists/base/md.amd64                             patch
        distrib/sets/lists/base/md.sparc64                           patch
        distrib/sets/lists/base/shl.mi                               patch
        lib/libcrypto/shlib_version                                  patch
        lib/libssl/shlib_version                                     patch

Apply fixes for the following OpenSSL vulnerabilities:

DTLS segmentation fault in dtls1_get_record (CVE-2014-3571)
DTLS memory leak in dtls1_buffer_record (CVE-2015-0206)
no-ssl3 configuration sets method to NULL (CVE-2014-3569)
ECDHE silently downgrades to ECDH [Client] (CVE-2014-3572)
RSA silently downgrades to EXPORT_RSA [Client] (CVE-2015-0204)
DH client certificates accepted without verification [Server] (CVE-2015-0205)
Certificate fingerprints can be modified (CVE-2014-8275)
Bignum squaring may produce incorrect results (CVE-2014-3570)


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.11.12.1 -r1.1.1.11.12.2 \
    src/crypto/dist/openssl/apps/s_client.c
cvs rdiff -u -r1.1.1.8 -r1.1.1.8.12.1 src/crypto/dist/openssl/apps/s_server.c
cvs rdiff -u -r1.8.4.1 -r1.8.4.1.6.1 src/crypto/dist/openssl/apps/speed.c
cvs rdiff -u -r1.1.1.4.12.1 -r1.1.1.4.12.2 \
    src/crypto/dist/openssl/crypto/Makefile
cvs rdiff -u -r1.1.4.2 -r1.1.4.3 \
    src/crypto/dist/openssl/crypto/constant_time_locl.h
cvs rdiff -u -r1.5 -r1.5.34.1 src/crypto/dist/openssl/crypto/cversion.c
cvs rdiff -u -r1.1.1.9 -r1.1.1.9.12.1 \
    src/crypto/dist/openssl/crypto/asn1/a_bitstr.c
cvs rdiff -u -r1.1.1.7 -r1.1.1.7.12.1 \
    src/crypto/dist/openssl/crypto/asn1/a_type.c \
    src/crypto/dist/openssl/crypto/asn1/a_verify.c
cvs rdiff -u -r1.9.4.1.6.1 -r1.9.4.1.6.2 \
    src/crypto/dist/openssl/crypto/asn1/asn1.h
cvs rdiff -u -r1.1.1.8.4.1.6.1 -r1.1.1.8.4.1.6.2 \
    src/crypto/dist/openssl/crypto/asn1/asn1_err.c
cvs rdiff -u -r1.8.4.1 -r1.8.4.1.6.1 \
    src/crypto/dist/openssl/crypto/asn1/tasn_dec.c
cvs rdiff -u -r1.1.1.5 -r1.1.1.5.12.1 \
    src/crypto/dist/openssl/crypto/asn1/x_algor.c
cvs rdiff -u -r1.11 -r1.11.12.1 src/crypto/dist/openssl/crypto/bio/bio.h
cvs rdiff -u -r1.1.1.2 -r1.1.1.2.12.1 \
    src/crypto/dist/openssl/crypto/bio/bss_dgram.c
cvs rdiff -u -r1.1.1.6 -r1.1.1.6.12.1 \
    src/crypto/dist/openssl/crypto/bn/bn_asm.c
cvs rdiff -u -r1.6 -r1.6.12.1 src/crypto/dist/openssl/crypto/bn/bntest.c
cvs rdiff -u -r1.1.1.4 -r1.1.1.4.48.1 \
    src/crypto/dist/openssl/crypto/bn/asm/mips3.s
cvs rdiff -u -r1.1.1.4.32.1 -r1.1.1.4.32.2 \
    src/crypto/dist/openssl/crypto/bn/asm/x86_64-gcc.c
cvs rdiff -u -r1.1.1.6 -r1.1.1.6.12.1 \
    src/crypto/dist/openssl/crypto/dsa/dsa_vrf.c
cvs rdiff -u -r1.1.1.5 -r1.1.1.5.12.1 \
    src/crypto/dist/openssl/crypto/ec/ec_mult.c
cvs rdiff -u -r1.1.1.1 -r1.1.1.1.16.1 \
    src/crypto/dist/openssl/crypto/ec/ec_pmeth.c
cvs rdiff -u -r1.1.1.1 -r1.1.1.1.34.1 \
    src/crypto/dist/openssl/crypto/ecdsa/ecs_vrf.c
cvs rdiff -u -r1.1.1.5.12.1 -r1.1.1.5.12.2 \
    src/crypto/dist/openssl/crypto/evp/Makefile
cvs rdiff -u -r1.1.1.8.26.1 -r1.1.1.8.26.2 \
    src/crypto/dist/openssl/crypto/evp/evp_enc.c
cvs rdiff -u -r1.1.1.1 -r1.1.1.1.16.1 \
    src/crypto/dist/openssl/crypto/objects/obj_xref.h \
    src/crypto/dist/openssl/crypto/objects/objxref.pl
cvs rdiff -u -r1.1.1.1 -r1.1.1.1.16.1 \
    src/crypto/dist/openssl/crypto/ts/ts_rsp_sign.c
cvs rdiff -u -r1.12 -r1.12.12.1 src/crypto/dist/openssl/crypto/x509/x509.h
cvs rdiff -u -r1.1.1.3 -r1.1.1.3.12.1 \
    src/crypto/dist/openssl/crypto/x509/x509_vpm.c
cvs rdiff -u -r1.1.1.7 -r1.1.1.7.12.1 \
    src/crypto/dist/openssl/crypto/x509/x_all.c
cvs rdiff -u -r1.3.4.2.2.2 -r1.3.4.2.2.3 \
    src/crypto/dist/openssl/ssl/d1_both.c
cvs rdiff -u -r1.1.1.3 -r1.1.1.3.12.1 src/crypto/dist/openssl/ssl/d1_clnt.c \
    src/crypto/dist/openssl/ssl/d1_lib.c \
    src/crypto/dist/openssl/ssl/d1_srvr.c
cvs rdiff -u -r1.1.1.3.12.1 -r1.1.1.3.12.2 \
    src/crypto/dist/openssl/ssl/d1_enc.c
cvs rdiff -u -r1.1.1.5.4.1.2.1 -r1.1.1.5.4.1.2.2 \
    src/crypto/dist/openssl/ssl/d1_pkt.c
cvs rdiff -u -r1.3 -r1.3.12.1 src/crypto/dist/openssl/ssl/dtls1.h
cvs rdiff -u -r1.6.12.2 -r1.6.12.3 src/crypto/dist/openssl/ssl/s23_srvr.c
cvs rdiff -u -r1.1.1.10 -r1.1.1.10.12.1 src/crypto/dist/openssl/ssl/s2_enc.c
cvs rdiff -u -r1.1.1.7 -r1.1.1.7.12.1 src/crypto/dist/openssl/ssl/s2_pkt.c \
    src/crypto/dist/openssl/ssl/s3_both.c
cvs rdiff -u -r1.9.4.1 -r1.9.4.1.6.1 src/crypto/dist/openssl/ssl/s2_srvr.c
cvs rdiff -u -r1.12.4.2.2.4 -r1.12.4.2.2.5 \
    src/crypto/dist/openssl/ssl/s3_clnt.c
cvs rdiff -u -r1.1.1.12.4.1.2.2 -r1.1.1.12.4.1.2.3 \
    src/crypto/dist/openssl/ssl/s3_enc.c
cvs rdiff -u -r1.14.4.1.2.1 -r1.14.4.1.2.2 \
    src/crypto/dist/openssl/ssl/s3_lib.c
cvs rdiff -u -r1.9.4.3.2.2 -r1.9.4.3.2.3 src/crypto/dist/openssl/ssl/s3_pkt.c
cvs rdiff -u -r1.15.4.3.2.3 -r1.15.4.3.2.4 \
    src/crypto/dist/openssl/ssl/s3_srvr.c
cvs rdiff -u -r1.18.4.1.2.1 -r1.18.4.1.2.2 src/crypto/dist/openssl/ssl/ssl.h
cvs rdiff -u -r1.13 -r1.13.12.1 src/crypto/dist/openssl/ssl/ssl_cert.c
cvs rdiff -u -r1.5.12.1 -r1.5.12.2 src/crypto/dist/openssl/ssl/ssl_lib.c
cvs rdiff -u -r1.13.4.1 -r1.13.4.1.2.1 src/crypto/dist/openssl/ssl/ssl_locl.h
cvs rdiff -u -r1.1.1.13 -r1.1.1.13.12.1 \
    src/crypto/dist/openssl/util/libeay.num
cvs rdiff -u -r1.1.1.12 -r1.1.1.12.12.1 src/crypto/dist/openssl/util/mk1mf.pl
cvs rdiff -u -r1.25.2.8.2.2 -r1.25.2.8.2.3 \
    src/distrib/sets/lists/base/md.amd64
cvs rdiff -u -r1.23.2.8.2.2 -r1.23.2.8.2.3 \
    src/distrib/sets/lists/base/md.sparc64
cvs rdiff -u -r1.450.2.7.2.2 -r1.450.2.7.2.3 \
    src/distrib/sets/lists/base/shl.mi
cvs rdiff -u -r1.14.4.1 -r1.14.4.1.2.1 src/lib/libcrypto/shlib_version
cvs rdiff -u -r1.8 -r1.8.10.1 src/lib/libssl/shlib_version

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/crypto/dist/openssl/apps/s_client.c
diff -u src/crypto/dist/openssl/apps/s_client.c:1.1.1.11.12.1 src/crypto/dist/openssl/apps/s_client.c:1.1.1.11.12.2
--- src/crypto/dist/openssl/apps/s_client.c:1.1.1.11.12.1	Sun Oct 19 20:10:10 2014
+++ src/crypto/dist/openssl/apps/s_client.c	Mon Jan 26 11:47:23 2015
@@ -934,9 +934,21 @@ re_start:
 
 		if (socket_mtu > 0)
 			{
+			if(socket_mtu < DTLS_get_link_min_mtu(con))
+				{
+				BIO_printf(bio_err,"MTU too small. Must be at least %ld\n",
+				       DTLS_get_link_min_mtu(con));
+				BIO_free(sbio);
+				goto shut;
+				}
 			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
-			SSL_set_mtu(con, socket_mtu);
-			}
+			if(!DTLS_set_link_mtu(con, socket_mtu))
+				{
+				BIO_printf(bio_err, "Failed to set MTU\n");
+				BIO_free(sbio);
+				goto shut;
+				}
+                        }
 		else
 			/* want to do MTU discovery */
 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);

Index: src/crypto/dist/openssl/apps/s_server.c
diff -u src/crypto/dist/openssl/apps/s_server.c:1.1.1.8 src/crypto/dist/openssl/apps/s_server.c:1.1.1.8.12.1
--- src/crypto/dist/openssl/apps/s_server.c:1.1.1.8	Fri May  9 21:34:13 2008
+++ src/crypto/dist/openssl/apps/s_server.c	Mon Jan 26 11:47:23 2015
@@ -1782,9 +1782,23 @@ static int sv_body(char *hostname, int s
 
 		if (socket_mtu > 0)
 			{
+			if(socket_mtu < DTLS_get_link_min_mtu(con))
+				{
+				BIO_printf(bio_err,"MTU too small. Must be at least %ld\n",
+				       DTLS_get_link_min_mtu(con));
+				ret = -1;
+				BIO_free(sbio);
+				goto err;
+				}
 			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
-			SSL_set_mtu(con, socket_mtu);
-			}
+			if(!DTLS_set_link_mtu(con, socket_mtu))
+				{
+				BIO_printf(bio_err, "Failed to set MTU\n");
+				ret = -1;
+				BIO_free(sbio);
+				goto err;
+				}
+                        }
 		else
 			/* want to do MTU discovery */
 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);

Index: src/crypto/dist/openssl/apps/speed.c
diff -u src/crypto/dist/openssl/apps/speed.c:1.8.4.1 src/crypto/dist/openssl/apps/speed.c:1.8.4.1.6.1
--- src/crypto/dist/openssl/apps/speed.c:1.8.4.1	Tue Jan 20 21:28:09 2009
+++ src/crypto/dist/openssl/apps/speed.c	Mon Jan 26 11:47:23 2015
@@ -2664,27 +2664,6 @@ static int do_multi(int multi)
 				else
 					rsa_results[k][1]=d;
 				}
-			else if(!strncmp(buf,"+F2:",4))
-				{
-				int k;
-				double d;
-				
-				p=buf+4;
-				k=atoi(sstrsep(&p,sep));
-				sstrsep(&p,sep);
-
-				d=atof(sstrsep(&p,sep));
-				if(n)
-					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);
-				else
-					rsa_results[k][0]=d;
-
-				d=atof(sstrsep(&p,sep));
-				if(n)
-					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);
-				else
-					rsa_results[k][1]=d;
-				}
 			else if(!strncmp(buf,"+F3:",4))
 				{
 				int k;

Index: src/crypto/dist/openssl/crypto/Makefile
diff -u src/crypto/dist/openssl/crypto/Makefile:1.1.1.4.12.1 src/crypto/dist/openssl/crypto/Makefile:1.1.1.4.12.2
--- src/crypto/dist/openssl/crypto/Makefile:1.1.1.4.12.1	Sun Oct 19 20:10:10 2014
+++ src/crypto/dist/openssl/crypto/Makefile	Mon Jan 26 11:47:23 2015
@@ -53,12 +53,7 @@ top:
 all: shared
 
 buildinf.h: ../Makefile
-	( echo "#ifndef MK1MF_BUILD"; \
-	echo '  /* auto-generated by crypto/Makefile for crypto/cversion.c */'; \
-	echo '  #define CFLAGS "$(CC) $(CFLAG)"'; \
-	echo '  #define PLATFORM "$(PLATFORM)"'; \
-	echo "  #define DATE \"`LC_ALL=C LC_TIME=C date`\""; \
-	echo '#endif' ) >buildinf.h
+	$(PERL) $(TOP)/util/mkbuildinf.pl "$(CC) $(CFLAGS)" "$(PLATFORM)" >buildinf.h
 
 x86cpuid.s:	x86cpuid.pl perlasm/x86asm.pl
 	$(PERL) x86cpuid.pl $(PERLASM_SCHEME) $(CFLAGS) $(PROCESSOR) > $@

Index: src/crypto/dist/openssl/crypto/constant_time_locl.h
diff -u src/crypto/dist/openssl/crypto/constant_time_locl.h:1.1.4.2 src/crypto/dist/openssl/crypto/constant_time_locl.h:1.1.4.3
--- src/crypto/dist/openssl/crypto/constant_time_locl.h:1.1.4.2	Sun Oct 19 20:10:10 2014
+++ src/crypto/dist/openssl/crypto/constant_time_locl.h	Mon Jan 26 11:47:23 2015
@@ -129,17 +129,12 @@ static inline int constant_time_select_i
 
 static inline unsigned int constant_time_msb(unsigned int a)
 	{
-	return (unsigned int)((int)(a) >> (sizeof(int) * 8 - 1));
+	return 0-(a >> (sizeof(a) * 8 - 1));
 	}
 
 static inline unsigned int constant_time_lt(unsigned int a, unsigned int b)
 	{
-	unsigned int lt;
-	/* Case 1: msb(a) == msb(b). a < b iff the MSB of a - b is set.*/
-	lt = ~(a ^ b) & (a - b);
-	/* Case 2: msb(a) != msb(b). a < b iff the MSB of b is set. */
-	lt |= ~a & b;
-	return constant_time_msb(lt);
+	return constant_time_msb(a^((a^b)|((a-b)^b)));
 	}
 
 static inline unsigned char constant_time_lt_8(unsigned int a, unsigned int b)
@@ -149,12 +144,7 @@ static inline unsigned char constant_tim
 
 static inline unsigned int constant_time_ge(unsigned int a, unsigned int b)
 	{
-	unsigned int ge;
-	/* Case 1: msb(a) == msb(b). a >= b iff the MSB of a - b is not set.*/
-	ge = ~((a ^ b) | (a - b));
-	/* Case 2: msb(a) != msb(b). a >= b iff the MSB of a is set. */
-	ge |= a & ~b;
-	return constant_time_msb(ge);
+	return ~constant_time_lt(a, b);
 	}
 
 static inline unsigned char constant_time_ge_8(unsigned int a, unsigned int b)
@@ -204,7 +194,7 @@ static inline unsigned char constant_tim
 	return (unsigned char)(constant_time_select(mask, a, b));
 	}
 
-inline int constant_time_select_int(unsigned int mask, int a, int b)
+static inline int constant_time_select_int(unsigned int mask, int a, int b)
 	{
 	return (int)(constant_time_select(mask, (unsigned)(a), (unsigned)(b)));
 	}

Index: src/crypto/dist/openssl/crypto/cversion.c
diff -u src/crypto/dist/openssl/crypto/cversion.c:1.5 src/crypto/dist/openssl/crypto/cversion.c:1.5.34.1
--- src/crypto/dist/openssl/crypto/cversion.c:1.5	Fri Nov 25 19:14:11 2005
+++ src/crypto/dist/openssl/crypto/cversion.c	Mon Jan 26 11:47:23 2015
@@ -69,10 +69,7 @@ const char *SSLeay_version(int t)
 	if (t == SSLEAY_BUILT_ON)
 		{
 #ifdef DATE
-		static char buf[sizeof(DATE)+11];
-
-		BIO_snprintf(buf,sizeof buf,"built on: %s",DATE);
-		return(buf);
+		return(DATE);
 #else
 		return("built on: date not available");
 #endif
@@ -80,10 +77,7 @@ const char *SSLeay_version(int t)
 	if (t == SSLEAY_CFLAGS)
 		{
 #ifdef CFLAGS
-		static char buf[sizeof(CFLAGS)+11];
-
-		BIO_snprintf(buf,sizeof buf,"compiler: %s",CFLAGS);
-		return(buf);
+		return(CFLAGS);
 #else
 		return("compiler: information not available");
 #endif
@@ -91,10 +85,7 @@ const char *SSLeay_version(int t)
 	if (t == SSLEAY_PLATFORM)
 		{
 #ifdef PLATFORM
-		static char buf[sizeof(PLATFORM)+11];
-
-		BIO_snprintf(buf,sizeof buf,"platform: %s", PLATFORM);
-		return(buf);
+		return(PLATFORM);
 #else
 		return("platform: information not available");
 #endif

Index: src/crypto/dist/openssl/crypto/asn1/a_bitstr.c
diff -u src/crypto/dist/openssl/crypto/asn1/a_bitstr.c:1.1.1.9 src/crypto/dist/openssl/crypto/asn1/a_bitstr.c:1.1.1.9.12.1
--- src/crypto/dist/openssl/crypto/asn1/a_bitstr.c:1.1.1.9	Fri May  9 21:34:16 2008
+++ src/crypto/dist/openssl/crypto/asn1/a_bitstr.c	Mon Jan 26 11:47:23 2015
@@ -136,11 +136,16 @@ ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN
 
 	p= *pp;
 	i= *(p++);
+	if (i > 7)
+		{
+		i=ASN1_R_INVALID_BIT_STRING_BITS_LEFT;
+		goto err;
+		}
 	/* We do this to preserve the settings.  If we modify
 	 * the settings, via the _set_bit function, we will recalculate
 	 * on output */
 	ret->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); /* clear */
-	ret->flags|=(ASN1_STRING_FLAG_BITS_LEFT|(i&0x07)); /* set */
+	ret->flags|=(ASN1_STRING_FLAG_BITS_LEFT|i); /* set */
 
 	if (len-- > 1) /* using one because of the bits left byte */
 		{

Index: src/crypto/dist/openssl/crypto/asn1/a_type.c
diff -u src/crypto/dist/openssl/crypto/asn1/a_type.c:1.1.1.7 src/crypto/dist/openssl/crypto/asn1/a_type.c:1.1.1.7.12.1
--- src/crypto/dist/openssl/crypto/asn1/a_type.c:1.1.1.7	Fri May  9 21:34:16 2008
+++ src/crypto/dist/openssl/crypto/asn1/a_type.c	Mon Jan 26 11:47:23 2015
@@ -113,7 +113,7 @@ IMPLEMENT_STACK_OF(ASN1_TYPE)
 IMPLEMENT_ASN1_SET_OF(ASN1_TYPE)
 
 /* Returns 0 if they are equal, != 0 otherwise. */
-int ASN1_TYPE_cmp(ASN1_TYPE *a, ASN1_TYPE *b)
+int ASN1_TYPE_cmp(const ASN1_TYPE *a, ASN1_TYPE *b)
 	{
 	int result = -1;
 
Index: src/crypto/dist/openssl/crypto/asn1/a_verify.c
diff -u src/crypto/dist/openssl/crypto/asn1/a_verify.c:1.1.1.7 src/crypto/dist/openssl/crypto/asn1/a_verify.c:1.1.1.7.12.1
--- src/crypto/dist/openssl/crypto/asn1/a_verify.c:1.1.1.7	Fri May  9 21:34:17 2008
+++ src/crypto/dist/openssl/crypto/asn1/a_verify.c	Mon Jan 26 11:47:23 2015
@@ -91,6 +91,12 @@ int ASN1_verify(i2d_of_void *i2d, X509_A
 		goto err;
 		}
 	
+	if (signature->type == V_ASN1_BIT_STRING && signature->flags & 0x7)
+		{
+		ASN1err(ASN1_F_ASN1_VERIFY, ASN1_R_INVALID_BIT_STRING_BITS_LEFT);
+		goto err;
+		}
+
 	inl=i2d(data,NULL);
 	buf_in=OPENSSL_malloc((unsigned int)inl);
 	if (buf_in == NULL)
@@ -136,6 +142,18 @@ int ASN1_item_verify(const ASN1_ITEM *it
 
 	int mdnid, pknid;
 
+	if (!pkey)
+		{
+		ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ERR_R_PASSED_NULL_PARAMETER);
+		return -1;
+		}
+
+	if (signature->type == V_ASN1_BIT_STRING && signature->flags & 0x7)
+		{
+		ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ASN1_R_INVALID_BIT_STRING_BITS_LEFT);
+		return -1;
+		}
+
 	EVP_MD_CTX_init(&ctx);
 
 	/* Convert signature OID into digest and public key OIDs */

Index: src/crypto/dist/openssl/crypto/asn1/asn1.h
diff -u src/crypto/dist/openssl/crypto/asn1/asn1.h:1.9.4.1.6.1 src/crypto/dist/openssl/crypto/asn1/asn1.h:1.9.4.1.6.2
--- src/crypto/dist/openssl/crypto/asn1/asn1.h:1.9.4.1.6.1	Wed Aug 27 13:32:35 2014
+++ src/crypto/dist/openssl/crypto/asn1/asn1.h	Mon Jan 26 11:47:23 2015
@@ -772,7 +772,7 @@ DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, 
 int ASN1_TYPE_get(ASN1_TYPE *a);
 void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value);
 int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value);
-int            ASN1_TYPE_cmp(ASN1_TYPE *a, ASN1_TYPE *b);
+int            ASN1_TYPE_cmp(const ASN1_TYPE *a, ASN1_TYPE *b);
 
 ASN1_OBJECT *	ASN1_OBJECT_new(void );
 void		ASN1_OBJECT_free(ASN1_OBJECT *a);
@@ -1309,6 +1309,7 @@ void ERR_load_ASN1_strings(void);
 #define ASN1_R_ILLEGAL_TIME_VALUE			 184
 #define ASN1_R_INTEGER_NOT_ASCII_FORMAT			 185
 #define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG		 128
+#define ASN1_R_INVALID_BIT_STRING_BITS_LEFT		 220
 #define ASN1_R_INVALID_BMPSTRING_LENGTH			 129
 #define ASN1_R_INVALID_DIGIT				 130
 #define ASN1_R_INVALID_MIME_TYPE			 205
@@ -1358,6 +1359,7 @@ void ERR_load_ASN1_strings(void);
 #define ASN1_R_TIME_NOT_ASCII_FORMAT			 193
 #define ASN1_R_TOO_LONG					 155
 #define ASN1_R_TYPE_NOT_CONSTRUCTED			 156
+#define ASN1_R_TYPE_NOT_PRIMITIVE			 218
 #define ASN1_R_UNABLE_TO_DECODE_RSA_KEY			 157
 #define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY		 158
 #define ASN1_R_UNEXPECTED_EOC				 159

Index: src/crypto/dist/openssl/crypto/asn1/asn1_err.c
diff -u src/crypto/dist/openssl/crypto/asn1/asn1_err.c:1.1.1.8.4.1.6.1 src/crypto/dist/openssl/crypto/asn1/asn1_err.c:1.1.1.8.4.1.6.2
--- src/crypto/dist/openssl/crypto/asn1/asn1_err.c:1.1.1.8.4.1.6.1	Wed Aug 27 13:32:35 2014
+++ src/crypto/dist/openssl/crypto/asn1/asn1_err.c	Mon Jan 26 11:47:23 2015
@@ -240,6 +240,7 @@ static ERR_STRING_DATA ASN1_str_reasons[
 {ERR_REASON(ASN1_R_ILLEGAL_TIME_VALUE)   ,"illegal time value"},
 {ERR_REASON(ASN1_R_INTEGER_NOT_ASCII_FORMAT),"integer not ascii format"},
 {ERR_REASON(ASN1_R_INTEGER_TOO_LARGE_FOR_LONG),"integer too large for long"},
+{ERR_REASON(ASN1_R_INVALID_BIT_STRING_BITS_LEFT),"invalid bit string bits left"},
 {ERR_REASON(ASN1_R_INVALID_BMPSTRING_LENGTH),"invalid bmpstring length"},
 {ERR_REASON(ASN1_R_INVALID_DIGIT)        ,"invalid digit"},
 {ERR_REASON(ASN1_R_INVALID_MIME_TYPE)    ,"invalid mime type"},
@@ -289,6 +290,7 @@ static ERR_STRING_DATA ASN1_str_reasons[
 {ERR_REASON(ASN1_R_TIME_NOT_ASCII_FORMAT),"time not ascii format"},
 {ERR_REASON(ASN1_R_TOO_LONG)             ,"too long"},
 {ERR_REASON(ASN1_R_TYPE_NOT_CONSTRUCTED) ,"type not constructed"},
+{ERR_REASON(ASN1_R_TYPE_NOT_PRIMITIVE)   ,"type not primitive"},
 {ERR_REASON(ASN1_R_UNABLE_TO_DECODE_RSA_KEY),"unable to decode rsa key"},
 {ERR_REASON(ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY),"unable to decode rsa private key"},
 {ERR_REASON(ASN1_R_UNEXPECTED_EOC)       ,"unexpected eoc"},

Index: src/crypto/dist/openssl/crypto/asn1/tasn_dec.c
diff -u src/crypto/dist/openssl/crypto/asn1/tasn_dec.c:1.8.4.1 src/crypto/dist/openssl/crypto/asn1/tasn_dec.c:1.8.4.1.6.1
--- src/crypto/dist/openssl/crypto/asn1/tasn_dec.c:1.8.4.1	Mon Mar 30 16:29:38 2009
+++ src/crypto/dist/openssl/crypto/asn1/tasn_dec.c	Mon Jan 26 11:47:23 2015
@@ -869,6 +869,14 @@ static int asn1_d2i_ex_primitive(ASN1_VA
 		}
 	else if (cst)
 		{
+		if (utype == V_ASN1_NULL || utype == V_ASN1_BOOLEAN
+			|| utype == V_ASN1_OBJECT || utype == V_ASN1_INTEGER
+			|| utype == V_ASN1_ENUMERATED)
+			{
+			ASN1err(ASN1_F_ASN1_D2I_EX_PRIMITIVE,
+			       ASN1_R_TYPE_NOT_PRIMITIVE);
+			return 0;
+			}
 		buf.length = 0;
 		buf.max = 0;
 		buf.data = NULL;

Index: src/crypto/dist/openssl/crypto/asn1/x_algor.c
diff -u src/crypto/dist/openssl/crypto/asn1/x_algor.c:1.1.1.5 src/crypto/dist/openssl/crypto/asn1/x_algor.c:1.1.1.5.12.1
--- src/crypto/dist/openssl/crypto/asn1/x_algor.c:1.1.1.5	Fri May  9 21:34:18 2008
+++ src/crypto/dist/openssl/crypto/asn1/x_algor.c	Mon Jan 26 11:47:23 2015
@@ -128,3 +128,13 @@ void X509_ALGOR_get0(ASN1_OBJECT **paobj
 		}
 	}
 
+int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b)
+	{
+	int rv;
+	rv = OBJ_cmp(a->algorithm, b->algorithm);
+	if (rv)
+		return rv;
+	if (!a->parameter && !b->parameter)
+		return 0;
+	return ASN1_TYPE_cmp(a->parameter, b->parameter);
+	}

Index: src/crypto/dist/openssl/crypto/bio/bio.h
diff -u src/crypto/dist/openssl/crypto/bio/bio.h:1.11 src/crypto/dist/openssl/crypto/bio/bio.h:1.11.12.1
--- src/crypto/dist/openssl/crypto/bio/bio.h:1.11	Fri May  9 21:49:39 2008
+++ src/crypto/dist/openssl/crypto/bio/bio.h	Mon Jan 26 11:47:23 2015
@@ -146,6 +146,7 @@ extern "C" {
 /* #endif */
 
 #define BIO_CTRL_DGRAM_QUERY_MTU          40 /* as kernel for current MTU */
+#define BIO_CTRL_DGRAM_GET_FALLBACK_MTU   47
 #define BIO_CTRL_DGRAM_GET_MTU            41 /* get cached value for MTU */
 #define BIO_CTRL_DGRAM_SET_MTU            42 /* set cached value for
 					      * MTU. want to use this
@@ -158,6 +159,12 @@ extern "C" {
 					      * operation */
 
 #define BIO_CTRL_DGRAM_SET_PEER           44 /* Destination for the data */
+#define BIO_CTRL_DGRAM_GET_PEER           46
+
+#define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT   45 /* Next DTLS handshake timeout to
+					      * adjust socket timeouts */
+
+#define BIO_CTRL_DGRAM_GET_MTU_OVERHEAD   49
 
 
 /* modifiers */
@@ -538,6 +545,8 @@ int BIO_ctrl_reset_read_request(BIO *b);
          (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL)
 #define BIO_dgram_set_peer(b,peer) \
          (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)peer)
+#define BIO_dgram_get_mtu_overhead(b) \
+         (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL)
 
 /* These two aren't currently implemented */
 /* int BIO_get_ex_num(BIO *bio); */

Index: src/crypto/dist/openssl/crypto/bio/bss_dgram.c
diff -u src/crypto/dist/openssl/crypto/bio/bss_dgram.c:1.1.1.2 src/crypto/dist/openssl/crypto/bio/bss_dgram.c:1.1.1.2.12.1
--- src/crypto/dist/openssl/crypto/bio/bss_dgram.c:1.1.1.2	Fri May  9 21:34:19 2008
+++ src/crypto/dist/openssl/crypto/bio/bss_dgram.c	Mon Jan 26 11:47:23 2015
@@ -100,7 +100,13 @@ static BIO_METHOD methods_dgramp=
 
 typedef struct bio_dgram_data_st
 	{
-	struct sockaddr peer;
+	union {
+		struct sockaddr sa;
+		struct sockaddr_in sa_in;
+#if OPENSSL_USE_IPV6
+		struct sockaddr_in6 sa_in6;
+#endif
+	} peer;
 	unsigned int connected;
 	unsigned int _errno;
 	unsigned int mtu;
@@ -171,22 +177,38 @@ static int dgram_read(BIO *b, char *out,
 	int ret=0;
 	bio_dgram_data *data = (bio_dgram_data *)b->ptr;
 
-	struct sockaddr peer;
-	int peerlen = sizeof(peer);
+	struct  {
+	union   { size_t s; int i; } len;
+	union   {
+		struct sockaddr sa;
+		struct sockaddr_in sa_in;
+#if OPENSSL_USE_IPV6
+		struct sockaddr_in6 sa_in6;
+#endif
+		} peer;
+	} sa;
+
+	sa.len.s=0;
+	sa.len.i=sizeof(sa.peer);
 
 	if (out != NULL)
 		{
 		clear_socket_error();
-		memset(&peer, 0x00, peerlen);
+		memset(&sa.peer, 0x00, sizeof(sa.peer));
 		/* Last arg in recvfrom is signed on some platforms and
 		 * unsigned on others. It is of type socklen_t on some
 		 * but this is not universal. Cast to (void *) to avoid
 		 * compiler warnings.
 		 */
-		ret=recvfrom(b->num,out,outl,0,&peer,(void *)&peerlen);
+		ret=recvfrom(b->num,out,outl,0,&sa.peer.sa,(void *)&sa.len);
+		if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0)
+			{
+			OPENSSL_assert(sa.len.s<=sizeof(sa.peer));
+			sa.len.i = (int)sa.len.s;
+			}
 
 		if ( ! data->connected  && ret > 0)
-			BIO_ctrl(b, BIO_CTRL_DGRAM_CONNECT, 0, &peer);
+			BIO_ctrl(b, BIO_CTRL_DGRAM_CONNECT, 0, &sa.peer);
 
 		BIO_clear_retry_flags(b);
 		if (ret <= 0)
@@ -211,9 +233,9 @@ static int dgram_write(BIO *b, const cha
         ret=writesocket(b->num,in,inl);
     else
 #if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
-        ret=sendto(b->num, (char *)in, inl, 0, &data->peer, sizeof(data->peer));
+        ret=sendto(b->num, (char *)in, inl, 0, &data->peer.sa, sizeof(data->peer));
 #else
-        ret=sendto(b->num, in, inl, 0, &data->peer, sizeof(data->peer));
+        ret=sendto(b->num, in, inl, 0, &data->peer.sa, sizeof(data->peer));
 #endif
 
 	BIO_clear_retry_flags(b);
@@ -234,6 +256,36 @@ static int dgram_write(BIO *b, const cha
 	return(ret);
 	}
 
+static long dgram_get_mtu_overhead(bio_dgram_data *data)
+	{
+	long ret;
+
+	switch (data->peer.sa.sa_family)
+	{
+	case AF_INET:
+	/* Assume this is UDP - 20 bytes for IP, 8 bytes for UDP */
+	ret = 28;
+	break;
+#if OPENSSL_USE_IPV6
+	case AF_INET6:
+#ifdef IN6_IS_ADDR_V4MAPPED
+	if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr))
+		/* Assume this is UDP - 20 bytes for IP, 8 bytes for UDP */
+		ret = 28;
+	else
+#endif
+		/* Assume this is UDP - 40 bytes for IP, 8 bytes for UDP */
+		ret = 48;
+	break;
+#endif
+	default:
+		/* We don't know. Go with the historical default */
+		ret = 28;
+		break;
+		}
+	return ret;
+	}
+
 static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
 	{
 	long ret=1;
@@ -309,7 +361,7 @@ static long dgram_ctrl(BIO *b, int cmd, 
 		break;
 #endif
 	case BIO_CTRL_DGRAM_QUERY_MTU:
-         sockopt_len = sizeof(sockopt_val);
+		sockopt_len = sizeof(sockopt_val);
 		if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val,
 			&sockopt_len)) < 0 || sockopt_val < 0)
 			{ ret = 0; }
@@ -319,6 +371,29 @@ static long dgram_ctrl(BIO *b, int cmd, 
 			ret = data->mtu;
 			}
 		break;
+	case BIO_CTRL_DGRAM_GET_FALLBACK_MTU:
+		ret = -dgram_get_mtu_overhead(data);
+		switch (data->peer.sa.sa_family)
+			{
+			case AF_INET:
+				ret += 576;
+				break;
+#if OPENSSL_USE_IPV6
+			case AF_INET6:
+#ifdef IN6_IS_ADDR_V4MAPPED
+				if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6
+_addr))
+					ret += 576;
+				else
+#endif 
+					ret += 1280;
+				break;
+#endif
+			default:
+				ret += 576;
+				break;
+			}  
+		break;
 	case BIO_CTRL_DGRAM_GET_MTU:
 		return data->mtu;
 		break;
@@ -391,6 +466,9 @@ static long dgram_ctrl(BIO *b, int cmd, 
 			ret = 0;
 		break;
 #endif
+	case BIO_CTRL_DGRAM_GET_MTU_OVERHEAD:
+		ret = dgram_get_mtu_overhead(data);
+		break;
 	default:
 		ret=0;
 		break;

Index: src/crypto/dist/openssl/crypto/bn/bn_asm.c
diff -u src/crypto/dist/openssl/crypto/bn/bn_asm.c:1.1.1.6 src/crypto/dist/openssl/crypto/bn/bn_asm.c:1.1.1.6.12.1
--- src/crypto/dist/openssl/crypto/bn/bn_asm.c:1.1.1.6	Fri May  9 21:34:19 2008
+++ src/crypto/dist/openssl/crypto/bn/bn_asm.c	Mon Jan 26 11:47:23 2015
@@ -438,6 +438,10 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const
 /* sqr_add_c(a,i,c0,c1,c2)  -- c+=a[i]^2 for three word number c=(c2,c1,c0) */
 /* sqr_add_c2(a,i,c0,c1,c2) -- c+=2*a[i]*a[j] for three word number c=(c2,c1,c0) */
 
+/*
+ * Keep in mind that carrying into high part of multiplication result
+ * can not overflow, because it cannot be all-ones.
+ */
 #ifdef BN_LLONG
 #define mul_add_c(a,b,c0,c1,c2) \
 	t=(BN_ULLONG)a*b; \
@@ -478,10 +482,10 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const
 #define mul_add_c2(a,b,c0,c1,c2) {	\
 	BN_ULONG ta=(a),tb=(b),t0;	\
 	BN_UMULT_LOHI(t0,t1,ta,tb);	\
-	t2 = t1+t1; c2 += (t2<t1)?1:0;	\
-	t1 = t0+t0; t2 += (t1<t0)?1:0;	\
-	c0 += t1; t2 += (c0<t1)?1:0;	\
+	c0 += t0; t2 = t1+((c0<t0)?1:0);\
 	c1 += t2; c2 += (c1<t2)?1:0;	\
+	c0 += t0; t1 += (c0<t0)?1:0;    \
+	c1 += t1; c2 += (c1<t1)?1:0;    \
 	}
 
 #define sqr_add_c(a,i,c0,c1,c2)	{	\
@@ -508,10 +512,10 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const
 	BN_ULONG ta=(a),tb=(b),t0;	\
 	t1 = BN_UMULT_HIGH(ta,tb);	\
 	t0 = ta * tb;			\
-	t2 = t1+t1; c2 += (t2<t1)?1:0;	\
-	t1 = t0+t0; t2 += (t1<t0)?1:0;	\
-	c0 += t1; t2 += (c0<t1)?1:0;	\
+	c0 += t0; t2 = t1+((c0<t0)?1:0);\
 	c1 += t2; c2 += (c1<t2)?1:0;	\
+	c0 += t0; t1 += (c0<t0)?1:0;    \
+	c1 += t1; c2 += (c1<t1)?1:0;    \
 	}
 
 #define sqr_add_c(a,i,c0,c1,c2)	{	\

Index: src/crypto/dist/openssl/crypto/bn/bntest.c
diff -u src/crypto/dist/openssl/crypto/bn/bntest.c:1.6 src/crypto/dist/openssl/crypto/bn/bntest.c:1.6.12.1
--- src/crypto/dist/openssl/crypto/bn/bntest.c:1.6	Fri May  9 21:49:39 2008
+++ src/crypto/dist/openssl/crypto/bn/bntest.c	Mon Jan 26 11:47:23 2015
@@ -676,44 +676,98 @@ int test_mul(BIO *bp)
 
 int test_sqr(BIO *bp, BN_CTX *ctx)
 	{
-	BIGNUM a,c,d,e;
-	int i;
+	BIGNUM *a,*c,*d,*e;
+	int i, ret = 0;;
 
-	BN_init(&a);
-	BN_init(&c);
-	BN_init(&d);
-	BN_init(&e);
+	a = BN_new();
+	c = BN_new();
+	d = BN_new();
+	e = BN_new();
+	if (a == NULL || c == NULL || d == NULL || e == NULL)
+		{
+		goto err;
+		}
 
 	for (i=0; i<num0; i++)
 		{
-		BN_bntest_rand(&a,40+i*10,0,0);
-		a.neg=rand_neg();
-		BN_sqr(&c,&a,ctx);
+		BN_bntest_rand(a,40+i*10,0,0);
+		a->neg=rand_neg();
+		BN_sqr(c,a,ctx);
 		if (bp != NULL)
 			{
 			if (!results)
 				{
-				BN_print(bp,&a);
+				BN_print(bp,a);
 				BIO_puts(bp," * ");
-				BN_print(bp,&a);
+				BN_print(bp,a);
 				BIO_puts(bp," - ");
 				}
-			BN_print(bp,&c);
+			BN_print(bp,c);
 			BIO_puts(bp,"\n");
 			}
-		BN_div(&d,&e,&c,&a,ctx);
-		BN_sub(&d,&d,&a);
-		if(!BN_is_zero(&d) || !BN_is_zero(&e))
+		BN_div(d,e,c,a,ctx);
+		BN_sub(d,d,a);
+		if(!BN_is_zero(d) || !BN_is_zero(e))
 		    {
 		    fprintf(stderr,"Square test failed!\n");
 		    return 0;
 		    }
 		}
-	BN_free(&a);
-	BN_free(&c);
-	BN_free(&d);
-	BN_free(&e);
-	return(1);
+
+	/* Regression test for a BN_sqr overflow bug. */
+	BN_hex2bn(&a,
+		"80000000000000008000000000000001FFFFFFFFFFFFFFFE0000000000000000");
+	BN_sqr(c, a, ctx);
+	if (bp != NULL)
+		{
+		if (!results)
+			{
+			BN_print(bp,a);
+			BIO_puts(bp," * ");
+			BN_print(bp,a);
+			BIO_puts(bp," - ");
+			}
+		BN_print(bp,c);
+		BIO_puts(bp,"\n");
+		}
+	BN_mul(d, a, a, ctx);
+	if (BN_cmp(c, d))
+		{
+		fprintf(stderr, "Square test failed: BN_sqr and BN_mul produce "
+			"different results!\n");
+		goto err;
+		}
+
+	/* Regression test for a BN_sqr overflow bug. */
+	BN_hex2bn(&a,
+		"80000000000000000000000080000001FFFFFFFE000000000000000000000000");
+	BN_sqr(c, a, ctx);
+	if (bp != NULL)
+		{
+		if (!results)
+			{
+			BN_print(bp,a);
+			BIO_puts(bp," * ");
+			BN_print(bp,a);
+			BIO_puts(bp," - ");
+			}
+		BN_print(bp,c);
+		BIO_puts(bp,"\n");
+		}
+	BN_mul(d, a, a, ctx);
+	if (BN_cmp(c, d))
+		{
+		fprintf(stderr, "Square test failed: BN_sqr and BN_mul produce "
+			"different results!\n");
+		goto err;
+		}
+	ret = 1;
+err:
+	if (a != NULL) BN_free(a);
+	if (c != NULL) BN_free(c);
+	if (d != NULL) BN_free(d);
+	if (e != NULL) BN_free(e);
+	return ret;
 	}
 
 int test_mont(BIO *bp, BN_CTX *ctx)

Index: src/crypto/dist/openssl/crypto/bn/asm/mips3.s
diff -u src/crypto/dist/openssl/crypto/bn/asm/mips3.s:1.1.1.4 src/crypto/dist/openssl/crypto/bn/asm/mips3.s:1.1.1.4.48.1
--- src/crypto/dist/openssl/crypto/bn/asm/mips3.s:1.1.1.4	Wed Jul 11 03:55:04 2001
+++ src/crypto/dist/openssl/crypto/bn/asm/mips3.s	Mon Jan 26 11:47:23 2015
@@ -1584,17 +1584,17 @@ LEAF(bn_sqr_comba8)
 	dmultu	a_2,a_0		/* mul_add_c2(a[2],b[0],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_2,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	c_2,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
-	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	dmultu	a_1,a_1		/* mul_add_c(a[1],b[1],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
@@ -1609,63 +1609,63 @@ LEAF(bn_sqr_comba8)
 	dmultu	a_0,a_3		/* mul_add_c2(a[0],b[3],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_3,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	c_3,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
-	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	dmultu	a_1,a_2		/* mul_add_c2(a[1],b[2],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_3,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	AT,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
 	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	sd	c_1,24(a0)
 
 	dmultu	a_4,a_0		/* mul_add_c2(a[4],b[0],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_1,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_2,t_1
 	sltu	AT,c_2,t_1
-	daddu	t_2,AT
+	daddu	c_2,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_2,t_1
+	daddu	c_3,AT
+	daddu	t_2,t_1
+	sltu	c_1,c_3,AT
 	daddu	c_3,t_2
-	sltu	AT,c_3,t_2
-	daddu	c_1,AT
+	sltu	t_2,c_3,t_2
+	daddu	c_1,t_2
 	dmultu	a_3,a_1		/* mul_add_c2(a[3],b[1],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_1,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_2,t_1
 	sltu	AT,c_2,t_1
-	daddu	t_2,AT
+	daddu	c_2,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_2,t_1
+	daddu	c_3,AT
+	daddu	t_2,t_1
+	sltu	AT,c_3,AT
 	daddu	c_3,t_2
-	sltu	AT,c_3,t_2
 	daddu	c_1,AT
+	sltu	t_2,c_3,t_2
+	daddu	c_1,t_2
 	dmultu	a_2,a_2		/* mul_add_c(a[2],b[2],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
@@ -1680,93 +1680,93 @@ LEAF(bn_sqr_comba8)
 	dmultu	a_0,a_5		/* mul_add_c2(a[0],b[5],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_2,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	c_2,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
-	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	dmultu	a_1,a_4		/* mul_add_c2(a[1],b[4],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_2,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	AT,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
 	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	dmultu	a_2,a_3		/* mul_add_c2(a[2],b[3],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_2,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	AT,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
 	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	sd	c_3,40(a0)
 
 	dmultu	a_6,a_0		/* mul_add_c2(a[6],b[0],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_3,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	c_3,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
-	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	dmultu	a_5,a_1		/* mul_add_c2(a[5],b[1],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_3,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	AT,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
 	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	dmultu	a_4,a_2		/* mul_add_c2(a[4],b[2],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_3,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	AT,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
 	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	dmultu	a_3,a_3		/* mul_add_c(a[3],b[3],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
@@ -1781,108 +1781,108 @@ LEAF(bn_sqr_comba8)
 	dmultu	a_0,a_7		/* mul_add_c2(a[0],b[7],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_1,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_2,t_1
 	sltu	AT,c_2,t_1
-	daddu	t_2,AT
+	daddu	c_2,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_2,t_1
+	daddu	c_3,AT
+	daddu	t_2,t_1
+	sltu	c_1,c_3,AT
 	daddu	c_3,t_2
-	sltu	AT,c_3,t_2
-	daddu	c_1,AT
+	sltu	t_2,c_3,t_2
+	daddu	c_1,t_2
 	dmultu	a_1,a_6		/* mul_add_c2(a[1],b[6],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_1,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_2,t_1
 	sltu	AT,c_2,t_1
-	daddu	t_2,AT
+	daddu	c_2,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_2,t_1
+	daddu	c_3,AT
+	daddu	t_2,t_1
+	sltu	AT,c_3,AT
 	daddu	c_3,t_2
-	sltu	AT,c_3,t_2
 	daddu	c_1,AT
+	sltu	t_2,c_3,t_2
+	daddu	c_1,t_2
 	dmultu	a_2,a_5		/* mul_add_c2(a[2],b[5],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_1,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_2,t_1
 	sltu	AT,c_2,t_1
-	daddu	t_2,AT
+	daddu	c_2,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_2,t_1
+	daddu	c_3,AT
+	daddu	t_2,t_1
+	sltu	AT,c_3,AT
 	daddu	c_3,t_2
-	sltu	AT,c_3,t_2
 	daddu	c_1,AT
+	sltu	t_2,c_3,t_2
+	daddu	c_1,t_2
 	dmultu	a_3,a_4		/* mul_add_c2(a[3],b[4],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_1,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_2,t_1
 	sltu	AT,c_2,t_1
-	daddu	t_2,AT
+	daddu	c_2,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_2,t_1
+	daddu	c_3,AT
+	daddu	t_2,t_1
+	sltu	AT,c_3,AT
 	daddu	c_3,t_2
-	sltu	AT,c_3,t_2
 	daddu	c_1,AT
+	sltu	t_2,c_3,t_2
+	daddu	c_1,t_2
 	sd	c_2,56(a0)
 
 	dmultu	a_7,a_1		/* mul_add_c2(a[7],b[1],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_2,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	c_2,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
-	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	dmultu	a_6,a_2		/* mul_add_c2(a[6],b[2],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_2,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	AT,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
 	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	dmultu	a_5,a_3		/* mul_add_c2(a[5],b[3],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_2,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	AT,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
 	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	dmultu	a_4,a_4		/* mul_add_c(a[4],b[4],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
@@ -1897,78 +1897,78 @@ LEAF(bn_sqr_comba8)
 	dmultu	a_2,a_7		/* mul_add_c2(a[2],b[7],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_3,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	c_3,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
-	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	dmultu	a_3,a_6		/* mul_add_c2(a[3],b[6],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_3,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	AT,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
 	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	dmultu	a_4,a_5		/* mul_add_c2(a[4],b[5],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_3,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	AT,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
 	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	sd	c_1,72(a0)
 
 	dmultu	a_7,a_3		/* mul_add_c2(a[7],b[3],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_1,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_2,t_1
 	sltu	AT,c_2,t_1
-	daddu	t_2,AT
+	daddu	c_2,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_2,t_1
+	daddu	c_3,AT
+	daddu	t_2,t_1
+	sltu	c_1,c_3,AT
 	daddu	c_3,t_2
-	sltu	AT,c_3,t_2
-	daddu	c_1,AT
+	sltu	t_2,c_3,t_2
+	daddu	c_1,t_2
 	dmultu	a_6,a_4		/* mul_add_c2(a[6],b[4],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_1,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_2,t_1
 	sltu	AT,c_2,t_1
-	daddu	t_2,AT
+	daddu	c_2,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_2,t_1
+	daddu	c_3,AT
+	daddu	t_2,t_1
+	sltu	AT,c_3,AT
 	daddu	c_3,t_2
-	sltu	AT,c_3,t_2
 	daddu	c_1,AT
+	sltu	t_2,c_3,t_2
+	daddu	c_1,t_2
 	dmultu	a_5,a_5		/* mul_add_c(a[5],b[5],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
@@ -1983,48 +1983,48 @@ LEAF(bn_sqr_comba8)
 	dmultu	a_4,a_7		/* mul_add_c2(a[4],b[7],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_2,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	c_2,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
-	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	dmultu	a_5,a_6		/* mul_add_c2(a[5],b[6],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_2,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	AT,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
 	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	sd	c_3,88(a0)
 
 	dmultu	a_7,a_5		/* mul_add_c2(a[7],b[5],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_3,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	c_3,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
-	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	dmultu	a_6,a_6		/* mul_add_c(a[6],b[6],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
@@ -2039,17 +2039,17 @@ LEAF(bn_sqr_comba8)
 	dmultu	a_6,a_7		/* mul_add_c2(a[6],b[7],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_1,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_2,t_1
 	sltu	AT,c_2,t_1
-	daddu	t_2,AT
+	daddu	c_2,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_2,t_1
+	daddu	c_3,AT
+	daddu	t_2,t_1
+	sltu	c_1,c_3,AT
 	daddu	c_3,t_2
-	sltu	AT,c_3,t_2
-	daddu	c_1,AT
+	sltu	t_2,c_3,t_2
+	daddu	c_1,t_2
 	sd	c_2,104(a0)
 
 	dmultu	a_7,a_7		/* mul_add_c(a[7],b[7],c3,c1,c2); */
@@ -2070,9 +2070,9 @@ LEAF(bn_sqr_comba4)
 	.set	reorder
 	ld	a_0,0(a1)
 	ld	a_1,8(a1)
+	dmultu	a_0,a_0		/* mul_add_c(a[0],b[0],c1,c2,c3); */
 	ld	a_2,16(a1)
 	ld	a_3,24(a1)
-	dmultu	a_0,a_0		/* mul_add_c(a[0],b[0],c1,c2,c3); */
 	mflo	c_1
 	mfhi	c_2
 	sd	c_1,0(a0)
@@ -2093,17 +2093,17 @@ LEAF(bn_sqr_comba4)
 	dmultu	a_2,a_0		/* mul_add_c2(a[2],b[0],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_2,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	c_2,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
-	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	dmultu	a_1,a_1		/* mul_add_c(a[1],b[1],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
@@ -2118,48 +2118,48 @@ LEAF(bn_sqr_comba4)
 	dmultu	a_0,a_3		/* mul_add_c2(a[0],b[3],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_3,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	c_3,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
-	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	dmultu	a_1,a_2		/* mul_add_c(a2[1],b[2],c1,c2,c3); */
 	mflo	t_1
 	mfhi	t_2
-	slt	AT,t_2,zero
-	daddu	c_3,AT
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_1,t_1
 	sltu	AT,c_1,t_1
-	daddu	t_2,AT
+	daddu	c_1,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_1,t_1
+	daddu	c_2,AT
+	daddu	t_2,t_1
+	sltu	AT,c_2,AT
 	daddu	c_2,t_2
-	sltu	AT,c_2,t_2
 	daddu	c_3,AT
+	sltu	t_2,c_2,t_2
+	daddu	c_3,t_2
 	sd	c_1,24(a0)
 
 	dmultu	a_3,a_1		/* mul_add_c2(a[3],b[1],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_1,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_2,t_1
 	sltu	AT,c_2,t_1
-	daddu	t_2,AT
+	daddu	c_2,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_2,t_1
+	daddu	c_3,AT
+	daddu	t_2,t_1
+	sltu	c_1,c_3,AT
 	daddu	c_3,t_2
-	sltu	AT,c_3,t_2
-	daddu	c_1,AT
+	sltu	t_2,c_3,t_2
+	daddu	c_1,t_2
 	dmultu	a_2,a_2		/* mul_add_c(a[2],b[2],c2,c3,c1); */
 	mflo	t_1
 	mfhi	t_2
@@ -2174,17 +2174,17 @@ LEAF(bn_sqr_comba4)
 	dmultu	a_2,a_3		/* mul_add_c2(a[2],b[3],c3,c1,c2); */
 	mflo	t_1
 	mfhi	t_2
-	slt	c_2,t_2,zero
-	dsll	t_2,1
-	slt	a2,t_1,zero
-	daddu	t_2,a2
-	dsll	t_1,1
 	daddu	c_3,t_1
 	sltu	AT,c_3,t_1
-	daddu	t_2,AT
+	daddu	c_3,t_1
+	daddu	AT,t_2
+	sltu	t_1,c_3,t_1
+	daddu	c_1,AT
+	daddu	t_2,t_1
+	sltu	c_2,c_1,AT
 	daddu	c_1,t_2
-	sltu	AT,c_1,t_2
-	daddu	c_2,AT
+	sltu	t_2,c_1,t_2
+	daddu	c_2,t_2
 	sd	c_3,40(a0)
 
 	dmultu	a_3,a_3		/* mul_add_c(a[3],b[3],c1,c2,c3); */

Index: src/crypto/dist/openssl/crypto/bn/asm/x86_64-gcc.c
diff -u src/crypto/dist/openssl/crypto/bn/asm/x86_64-gcc.c:1.1.1.4.32.1 src/crypto/dist/openssl/crypto/bn/asm/x86_64-gcc.c:1.1.1.4.32.2
--- src/crypto/dist/openssl/crypto/bn/asm/x86_64-gcc.c:1.1.1.4.32.1	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/crypto/bn/asm/x86_64-gcc.c	Mon Jan 26 11:47:23 2015
@@ -264,6 +264,10 @@ BN_ULONG bn_sub_words(BN_ULONG *r, BN_UL
 /* sqr_add_c(a,i,c0,c1,c2)  -- c+=a[i]^2 for three word number c=(c2,c1,c0) */
 /* sqr_add_c2(a,i,c0,c1,c2) -- c+=2*a[i]*a[j] for three word number c=(c2,c1,c0) */
 
+/*
+ * Keep in mind that carrying into high part of multiplication result
+ * can not overflow, because it cannot be all-ones.
+ */
 #if 0
 /* original macros are kept for reference purposes */
 #define mul_add_c(a,b,c0,c1,c2) {	\
@@ -278,10 +282,10 @@ BN_ULONG bn_sub_words(BN_ULONG *r, BN_UL
 	BN_ULONG ta=(a),tb=(b),t0;	\
 	t1 = BN_UMULT_HIGH(ta,tb);	\
 	t0 = ta * tb;			\
-	t2 = t1+t1; c2 += (t2<t1)?1:0;	\
-	t1 = t0+t0; t2 += (t1<t0)?1:0;	\
-	c0 += t1; t2 += (c0<t1)?1:0;	\
+	c0 += t0; t2 = t1+((c0<t0)?1:0);\
 	c1 += t2; c2 += (c1<t2)?1:0;	\
+	c0 += t0; t1 += (c0<t0)?1:0;    \
+	c1 += t1; c2 += (c1<t1)?1:0;    \
 	}
 #else
 #define mul_add_c(a,b,c0,c1,c2)	do {	\
@@ -319,21 +323,13 @@ BN_ULONG bn_sub_words(BN_ULONG *r, BN_UL
 		: "=a"(t1),"=d"(t2)	\
 		: "a"(a),"m"(b)		\
 		: "cc");		\
-	asm ("addq %0,%0; adcq %2,%1"	\
-		: "+d"(t2),"+r"(c2)	\
-		: "g"(0)		\
-		: "cc");		\
-	asm ("addq %0,%0; adcq %2,%1"	\
-		: "+a"(t1),"+d"(t2)	\
-		: "g"(0)		\
-		: "cc");		\
-	asm ("addq %2,%0; adcq %3,%1"	\
-		: "+r"(c0),"+d"(t2)	\
-		: "a"(t1),"g"(0)	\
-		: "cc");		\
-	asm ("addq %2,%0; adcq %3,%1"	\
-		: "+r"(c1),"+r"(c2)	\
-		: "d"(t2),"g"(0)	\
+	asm ("addq %3,%0; adcq %4,%1; adcq %5,%2"       \
+		: "+r"(c0),"+r"(c1),"+r"(c2)            \
+		: "r"(t1),"r"(t2),"g"(0)                \
+		: "cc");                                \
+	asm ("addq %3,%0; adcq %4,%1; adcq %5,%2"       \
+		: "+r"(c0),"+r"(c1),"+r"(c2)            \
+		: "r"(t1),"r"(t2),"g"(0)                \
 		: "cc");		\
 	} while (0)
 #endif

Index: src/crypto/dist/openssl/crypto/dsa/dsa_vrf.c
diff -u src/crypto/dist/openssl/crypto/dsa/dsa_vrf.c:1.1.1.6 src/crypto/dist/openssl/crypto/dsa/dsa_vrf.c:1.1.1.6.12.1
--- src/crypto/dist/openssl/crypto/dsa/dsa_vrf.c:1.1.1.6	Fri May  9 21:34:25 2008
+++ src/crypto/dist/openssl/crypto/dsa/dsa_vrf.c	Mon Jan 26 11:47:23 2015
@@ -77,13 +77,25 @@ int DSA_verify(int type, const unsigned 
 	     const unsigned char *sigbuf, int siglen, DSA *dsa)
 	{
 	DSA_SIG *s;
+	const unsigned char *p = sigbuf;
+	unsigned char *der = NULL;
+	int derlen = -1;
 	int ret=-1;
 
 	s = DSA_SIG_new();
 	if (s == NULL) return(ret);
-	if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err;
+	if (d2i_DSA_SIG(&s,&p,siglen) == NULL) goto err;
+	/* Ensure signature uses DER and doesn't have trailing garbage */
+	derlen = i2d_DSA_SIG(s, &der);
+	if (derlen != siglen || memcmp(sigbuf, der, derlen))
+		goto err;
 	ret=DSA_do_verify(dgst,dgst_len,s,dsa);
 err:
+	if (derlen > 0)
+		{
+		OPENSSL_cleanse(der, derlen);
+		OPENSSL_free(der);
+		}
 	DSA_SIG_free(s);
 	return(ret);
 	}

Index: src/crypto/dist/openssl/crypto/ec/ec_mult.c
diff -u src/crypto/dist/openssl/crypto/ec/ec_mult.c:1.1.1.5 src/crypto/dist/openssl/crypto/ec/ec_mult.c:1.1.1.5.12.1
--- src/crypto/dist/openssl/crypto/ec/ec_mult.c:1.1.1.5	Fri May  9 21:34:26 2008
+++ src/crypto/dist/openssl/crypto/ec/ec_mult.c	Mon Jan 26 11:47:23 2015
@@ -444,14 +444,15 @@ int ec_wNAF_mul(const EC_GROUP *group, E
 	wNAF     = OPENSSL_malloc((totalnum + 1) * sizeof wNAF[0]); /* includes space for pivot */
 	val_sub  = OPENSSL_malloc(totalnum * sizeof val_sub[0]);
 		 
+	/* Ensure wNAF is initialised in case we end up going to err */
+	if (wNAF) wNAF[0] = NULL;       /* preliminary pivot */
+
 	if (!wsize || !wNAF_len || !wNAF || !val_sub)
 		{
 		ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE);
 		goto err;
 		}
 
-	wNAF[0] = NULL;	/* preliminary pivot */
-
 	/* num_val will be the total number of temporarily precomputed points */
 	num_val = 0;
 

Index: src/crypto/dist/openssl/crypto/ec/ec_pmeth.c
diff -u src/crypto/dist/openssl/crypto/ec/ec_pmeth.c:1.1.1.1 src/crypto/dist/openssl/crypto/ec/ec_pmeth.c:1.1.1.1.16.1
--- src/crypto/dist/openssl/crypto/ec/ec_pmeth.c:1.1.1.1	Fri May  9 21:34:26 2008
+++ src/crypto/dist/openssl/crypto/ec/ec_pmeth.c	Mon Jan 26 11:47:23 2015
@@ -167,6 +167,7 @@ static int pkey_ec_verify(EVP_PKEY_CTX *
 	return ret;
 	}
 
+#ifndef OPENSSL_NO_ECDH
 static int pkey_ec_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)
 	{
 	int ret;
@@ -200,6 +201,7 @@ static int pkey_ec_derive(EVP_PKEY_CTX *
 	*keylen = ret;
 	return 1;
 	}
+#endif
 
 static int pkey_ec_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
 	{
@@ -332,7 +334,11 @@ const EVP_PKEY_METHOD ec_pkey_meth = 
 	0,0,
 
 	0,
+#ifndef OPENSSL_NO_ECDH
 	pkey_ec_derive,
+#else
+	0,
+#endif
 
 	pkey_ec_ctrl,
 	pkey_ec_ctrl_str

Index: src/crypto/dist/openssl/crypto/ecdsa/ecs_vrf.c
diff -u src/crypto/dist/openssl/crypto/ecdsa/ecs_vrf.c:1.1.1.1 src/crypto/dist/openssl/crypto/ecdsa/ecs_vrf.c:1.1.1.1.34.1
--- src/crypto/dist/openssl/crypto/ecdsa/ecs_vrf.c:1.1.1.1	Fri Nov 25 03:05:50 2005
+++ src/crypto/dist/openssl/crypto/ecdsa/ecs_vrf.c	Mon Jan 26 11:47:23 2015
@@ -57,6 +57,7 @@
  */
 
 #include "ecs_locl.h"
+#include <string.h>
 #ifndef OPENSSL_NO_ENGINE
 #include <openssl/engine.h>
 #endif
@@ -84,13 +85,25 @@ int ECDSA_verify(int type, const unsigne
 		const unsigned char *sigbuf, int sig_len, EC_KEY *eckey)
  	{
 	ECDSA_SIG *s;
+	const unsigned char *p = sigbuf;
+	unsigned char *der = NULL;
+	int derlen = -1;
 	int ret=-1;
 
 	s = ECDSA_SIG_new();
 	if (s == NULL) return(ret);
-	if (d2i_ECDSA_SIG(&s, &sigbuf, sig_len) == NULL) goto err;
+	if (d2i_ECDSA_SIG(&s, &p, sig_len) == NULL) goto err;
+	/* Ensure signature uses DER and doesn't have trailing garbage */
+	derlen = i2d_ECDSA_SIG(s, &der);
+	if (derlen != sig_len || memcmp(sigbuf, der, derlen))
+		goto err;
 	ret=ECDSA_do_verify(dgst, dgst_len, s, eckey);
 err:
+	if (derlen > 0)
+		{
+		OPENSSL_cleanse(der, derlen);
+		OPENSSL_free(der);
+		}
 	ECDSA_SIG_free(s);
 	return(ret);
 	}

Index: src/crypto/dist/openssl/crypto/evp/Makefile
diff -u src/crypto/dist/openssl/crypto/evp/Makefile:1.1.1.5.12.1 src/crypto/dist/openssl/crypto/evp/Makefile:1.1.1.5.12.2
--- src/crypto/dist/openssl/crypto/evp/Makefile:1.1.1.5.12.1	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/crypto/evp/Makefile	Mon Jan 26 11:47:24 2015
@@ -327,7 +327,7 @@ evp_enc.o: ../../include/openssl/obj_mac
 evp_enc.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
 evp_enc.o: ../../include/openssl/ossl_typ.h ../../include/openssl/rand.h
 evp_enc.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
-evp_enc.o: ../../include/openssl/symhacks.h ../constant_time_locl.h
+evp_enc.o: ../../include/openssl/symhacks.h
 evp_enc.o: ../cryptlib.h evp_enc.c evp_locl.h
 evp_err.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h
 evp_err.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h

Index: src/crypto/dist/openssl/crypto/evp/evp_enc.c
diff -u src/crypto/dist/openssl/crypto/evp/evp_enc.c:1.1.1.8.26.1 src/crypto/dist/openssl/crypto/evp/evp_enc.c:1.1.1.8.26.2
--- src/crypto/dist/openssl/crypto/evp/evp_enc.c:1.1.1.8.26.1	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/crypto/evp/evp_enc.c	Mon Jan 26 11:47:24 2015
@@ -64,7 +64,6 @@
 #ifndef OPENSSL_NO_ENGINE
 #include <openssl/engine.h>
 #endif
-#include "constant_time_locl.h"
 #include "evp_locl.h"
 
 const char EVP_version[]="EVP" OPENSSL_VERSION_PTEXT;
@@ -433,11 +432,11 @@ int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx
 
 int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
 	{
-	unsigned int i, b;
-	unsigned char pad, padding_good;
+	int i,n;
+	unsigned int b;
 
 	*outl=0;
-	b=(unsigned int)(ctx->cipher->block_size);
+	b=ctx->cipher->block_size;
 	if (ctx->flags & EVP_CIPH_NO_PADDING)
 		{
 		if(ctx->buf_len)
@@ -456,34 +455,28 @@ int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *
 			return(0);
 			}
 		OPENSSL_assert(b <= sizeof ctx->final);
-		pad=ctx->final[b-1];
-
-		padding_good = (unsigned char)(~constant_time_is_zero_8(pad));
-		padding_good &= constant_time_ge_8(b, pad);
-
-                for (i = 1; i < b; ++i)
+		n=ctx->final[b-1];
+                if (n == 0 || n > (int)b)
 			{
-			unsigned char is_pad_index = constant_time_lt_8(i, pad);
-			unsigned char pad_byte_good = constant_time_eq_8(ctx->final[b-i-1], pad);
-			padding_good &= constant_time_select_8(is_pad_index, pad_byte_good, 0xff);
-			}
-
-		/*
-		 * At least 1 byte is always padding, so we always write b - 1
-		 * bytes to avoid a timing leak. The caller is required to have |b|
-		 * bytes space in |out| by the API contract.
-		 */
-		for (i = 0; i < b - 1; ++i)
-			out[i] = ctx->final[i] & padding_good;
-		/* Safe cast: for a good padding, EVP_MAX_IV_LENGTH >= b >= pad */
-		*outl = padding_good & ((unsigned char)(b - pad));
-		return padding_good & 1;
+			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
+			return(0);
+			}
+		for (i=0; i<n; i++)
+			{
+			if (ctx->final[--b] != n)
+				{
+				EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT); 
+				return(0);
+				}
+			}
+		n=ctx->cipher->block_size-n;
+		for (i=0; i<n; i++)
+			out[i]=ctx->final[i];
+		*outl=n;
 		}
 	else
-		{
-		*outl = 0;
-		return 1;
-		}
+		*outl=0;
+	return 1;
 	}
 
 void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)

Index: src/crypto/dist/openssl/crypto/objects/obj_xref.h
diff -u src/crypto/dist/openssl/crypto/objects/obj_xref.h:1.1.1.1 src/crypto/dist/openssl/crypto/objects/obj_xref.h:1.1.1.1.16.1
--- src/crypto/dist/openssl/crypto/objects/obj_xref.h:1.1.1.1	Fri May  9 21:34:31 2008
+++ src/crypto/dist/openssl/crypto/objects/obj_xref.h	Mon Jan 26 11:47:24 2015
@@ -36,8 +36,6 @@ static const nid_triple sigoid_srt[] =
 
 static const nid_triple * const sigoid_srt_xref[] =
 	{
-	&sigoid_srt[17],
-	&sigoid_srt[18],
 	&sigoid_srt[0],
 	&sigoid_srt[1],
 	&sigoid_srt[7],
Index: src/crypto/dist/openssl/crypto/objects/objxref.pl
diff -u src/crypto/dist/openssl/crypto/objects/objxref.pl:1.1.1.1 src/crypto/dist/openssl/crypto/objects/objxref.pl:1.1.1.1.16.1
--- src/crypto/dist/openssl/crypto/objects/objxref.pl:1.1.1.1	Fri May  9 21:34:31 2008
+++ src/crypto/dist/openssl/crypto/objects/objxref.pl	Mon Jan 26 11:47:24 2015
@@ -74,7 +74,10 @@ EOF
 
 foreach (@srt2)
 	{
-	my $x = $xref_tbl{$_}[2];
+	my ($p1, $p2, $x) = @{$xref_tbl{$_}};
+	# If digest or signature algorithm is "undef" then the algorithm
+	# needs special handling and is excluded from the cross reference table.
+	next if $p1 eq "undef" || $p2 eq "undef";
 	print "\t\&sigoid_srt\[$x\],\n";
 	}
 

Index: src/crypto/dist/openssl/crypto/ts/ts_rsp_sign.c
diff -u src/crypto/dist/openssl/crypto/ts/ts_rsp_sign.c:1.1.1.1 src/crypto/dist/openssl/crypto/ts/ts_rsp_sign.c:1.1.1.1.16.1
--- src/crypto/dist/openssl/crypto/ts/ts_rsp_sign.c:1.1.1.1	Fri May  9 21:34:36 2008
+++ src/crypto/dist/openssl/crypto/ts/ts_rsp_sign.c	Mon Jan 26 11:47:24 2015
@@ -977,7 +977,7 @@ TS_RESP_set_genTime_with_precision(ASN1_
 	if (precision > 0)
 	{
 		/* Add fraction of seconds (leave space for dot and null). */
-		BIO_snprintf(p, 2 + precision, ".%ld", usec);
+		BIO_snprintf(p, 2 + precision, ".%06ld", usec);
 		/* We cannot use the snprintf return value, 
 		   because it might have been truncated. */
 		p += strlen(p);

Index: src/crypto/dist/openssl/crypto/x509/x509.h
diff -u src/crypto/dist/openssl/crypto/x509/x509.h:1.12 src/crypto/dist/openssl/crypto/x509/x509.h:1.12.12.1
--- src/crypto/dist/openssl/crypto/x509/x509.h:1.12	Fri May  9 21:49:42 2008
+++ src/crypto/dist/openssl/crypto/x509/x509.h	Mon Jan 26 11:47:24 2015
@@ -749,6 +749,7 @@ X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *x
 int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval);
 void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval,
 						X509_ALGOR *algor);
+int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
 
 X509_NAME *X509_NAME_dup(X509_NAME *xn);
 X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne);

Index: src/crypto/dist/openssl/crypto/x509/x509_vpm.c
diff -u src/crypto/dist/openssl/crypto/x509/x509_vpm.c:1.1.1.3 src/crypto/dist/openssl/crypto/x509/x509_vpm.c:1.1.1.3.12.1
--- src/crypto/dist/openssl/crypto/x509/x509_vpm.c:1.1.1.3	Fri May  9 21:34:38 2008
+++ src/crypto/dist/openssl/crypto/x509/x509_vpm.c	Mon Jan 26 11:47:24 2015
@@ -88,6 +88,8 @@ X509_VERIFY_PARAM *X509_VERIFY_PARAM_new
 	{
 	X509_VERIFY_PARAM *param;
 	param = OPENSSL_malloc(sizeof(X509_VERIFY_PARAM));
+	if (!param)
+		return NULL;
 	memset(param, 0, sizeof(X509_VERIFY_PARAM));
 	x509_verify_param_zero(param);
 	return param;

Index: src/crypto/dist/openssl/crypto/x509/x_all.c
diff -u src/crypto/dist/openssl/crypto/x509/x_all.c:1.1.1.7 src/crypto/dist/openssl/crypto/x509/x_all.c:1.1.1.7.12.1
--- src/crypto/dist/openssl/crypto/x509/x_all.c:1.1.1.7	Fri May  9 21:34:38 2008
+++ src/crypto/dist/openssl/crypto/x509/x_all.c	Mon Jan 26 11:47:24 2015
@@ -72,6 +72,8 @@
 
 int X509_verify(X509 *a, EVP_PKEY *r)
 	{
+	if (X509_ALGOR_cmp(a->sig_alg, a->cert_info->signature))
+		return 0;
 	return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF),a->sig_alg,
 		a->signature,a->cert_info,r));
 	}

Index: src/crypto/dist/openssl/ssl/d1_both.c
diff -u src/crypto/dist/openssl/ssl/d1_both.c:1.3.4.2.2.2 src/crypto/dist/openssl/ssl/d1_both.c:1.3.4.2.2.3
--- src/crypto/dist/openssl/ssl/d1_both.c:1.3.4.2.2.2	Wed Aug 27 13:32:35 2014
+++ src/crypto/dist/openssl/ssl/d1_both.c	Mon Jan 26 11:47:24 2015
@@ -125,10 +125,9 @@
 
 
 /* XDTLS:  figure out the right values */
-static unsigned int g_probable_mtu[] = {1500 - 28, 512 - 28, 256 - 28};
+static const unsigned int g_probable_mtu[] = {1500, 512, 256};
 
-static unsigned int dtls1_min_mtu(void);
-static unsigned int dtls1_guess_mtu(unsigned int curr_mtu);
+static unsigned int dtls1_min_mtu(SSL *);
 static void dtls1_fix_message_header(SSL *s, unsigned long frag_off, 
 	unsigned long frag_len);
 static unsigned char *dtls1_write_message_header(SSL *s,
@@ -166,71 +165,71 @@ dtls1_hm_fragment_new(unsigned long frag
 	return frag;
 	}
 
-static void
-dtls1_hm_fragment_free(hm_fragment *frag)
+void dtls1_hm_fragment_free(hm_fragment *frag)
 	{
 	if (frag->fragment) OPENSSL_free(frag->fragment);
 	OPENSSL_free(frag);
 	}
 
-/* send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC) */
-int dtls1_do_write(SSL *s, int type)
-	{
-	int ret;
-	int curr_mtu;
-	unsigned int len, frag_off;
+static int dtls1_query_mtu(SSL *s)
+{ 
+	if(s->d1->link_mtu)
+		{
+		s->d1->mtu = s->d1->link_mtu-BIO_dgram_get_mtu_overhead(SSL_get_wbio(s));
+		s->d1->link_mtu = 0;
+		}
 
 	/* AHA!  Figure out the MTU, and stick to the right size */
-	if ( ! (SSL_get_options(s) & SSL_OP_NO_QUERY_MTU))
+	if (s->d1->mtu < dtls1_min_mtu(s))
 		{
-		s->d1->mtu = 
-			BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
-
-		/* I've seen the kernel return bogus numbers when it doesn't know
-		 * (initial write), so just make sure we have a reasonable number */
-		if ( s->d1->mtu < dtls1_min_mtu())
-			{
-			s->d1->mtu = 0;
-			s->d1->mtu = dtls1_guess_mtu(s->d1->mtu);
-			BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SET_MTU, 
-				s->d1->mtu, NULL);
+		if(!(SSL_get_options(s) & SSL_OP_NO_QUERY_MTU))
+			{ 
+			s->d1->mtu =
+				BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
+
+			/* I've seen the kernel return bogus numbers when it doesn't know
+			 * (initial write), so just make sure we have a reasonable number */
+			if (s->d1->mtu < dtls1_min_mtu(s))
+				{
+				/* Set to min mtu */
+				s->d1->mtu = dtls1_min_mtu(s);
+				BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SET_MTU,
+					s->d1->mtu, NULL); 
+				}
 			}
+		else
+			return 0;
 		}
-#if 0 
-	mtu = s->d1->mtu;
-
-	fprintf(stderr, "using MTU = %d\n", mtu);
-
-	mtu -= (DTLS1_HM_HEADER_LENGTH + DTLS1_RT_HEADER_LENGTH);
-
-	curr_mtu = mtu - BIO_wpending(SSL_get_wbio(s));
-
-	if ( curr_mtu > 0)
-		mtu = curr_mtu;
-	else if ( ( ret = BIO_flush(SSL_get_wbio(s))) <= 0)
-		return ret;
+	return 1;
+}
 
-	if ( BIO_wpending(SSL_get_wbio(s)) + s->init_num >= mtu)
-		{
-		ret = BIO_flush(SSL_get_wbio(s));
-		if ( ret <= 0)
-			return ret;
-		mtu = s->d1->mtu - (DTLS1_HM_HEADER_LENGTH + DTLS1_RT_HEADER_LENGTH);
-		}
+/* send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC) */
+int dtls1_do_write(SSL *s, int type)
+	{
+	int ret;
+	unsigned int curr_mtu;
+	int retry = 1;
+	unsigned int len, frag_off, mac_size, blocksize, used_len;
 
-	OPENSSL_assert(mtu > 0);  /* should have something reasonable now */
+	if(!dtls1_query_mtu(s))
+		return -1;
 
-#endif
+	OPENSSL_assert(s->d1->mtu >= dtls1_min_mtu(s));  /* should have something reasonable now */
 
 	if ( s->init_off == 0  && type == SSL3_RT_HANDSHAKE)
 		OPENSSL_assert(s->init_num == 
 			(int)s->d1->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH);
 
 	frag_off = 0;
-	while( s->init_num)
+	/* s->init_num shouldn't ever be < 0...but just in case */
+	while(s->init_num > 0)
 		{
-		curr_mtu = s->d1->mtu - BIO_wpending(SSL_get_wbio(s)) - 
-			DTLS1_RT_HEADER_LENGTH;
+		used_len = BIO_wpending(SSL_get_wbio(s)) +  DTLS1_RT_HEADER_LENGTH
+			+ mac_size + blocksize;
+		if(s->d1->mtu > used_len)
+			curr_mtu = s->d1->mtu - used_len;
+		else
+			curr_mtu = 0;
 
 		if ( curr_mtu <= DTLS1_HM_HEADER_LENGTH)
 			{
@@ -238,14 +237,27 @@ int dtls1_do_write(SSL *s, int type)
 			ret = BIO_flush(SSL_get_wbio(s));
 			if ( ret <= 0)
 				return ret;
-			curr_mtu = s->d1->mtu - DTLS1_RT_HEADER_LENGTH;
+			used_len = DTLS1_RT_HEADER_LENGTH + mac_size + blocksize;
+			if(s->d1->mtu > used_len + DTLS1_HM_HEADER_LENGTH)
+				{
+				curr_mtu = s->d1->mtu - used_len;
+				}
+			else
+				{
+				/* Shouldn't happen */
+				return -1;
+				}
 			}
 
-		if ( s->init_num > curr_mtu)
+		/* We just checked that s->init_num > 0 so this cast should be safe */
+		if (((unsigned int)s->init_num) > curr_mtu)
 			len = curr_mtu;
 		else
 			len = s->init_num;
 
+		/* Shouldn't ever happen */
+		if(len > INT_MAX)
+			len = INT_MAX;
 
 		/* XDTLS: this function is too long.  split out the CCS part */
 		if ( type == SSL3_RT_HANDSHAKE)
@@ -256,17 +268,29 @@ int dtls1_do_write(SSL *s, int type)
 				s->init_off -= DTLS1_HM_HEADER_LENGTH;
 				s->init_num += DTLS1_HM_HEADER_LENGTH;
 
-				/* write atleast DTLS1_HM_HEADER_LENGTH bytes */
-				if ( len <= DTLS1_HM_HEADER_LENGTH)  
-					len += DTLS1_HM_HEADER_LENGTH;
+				/* We just checked that s->init_num > 0 so this cast should be safe */
+				if (((unsigned int)s->init_num) > curr_mtu)
+					len = curr_mtu;
+				else
+					len = s->init_num;
 				}
 
+			/* Shouldn't ever happen */
+			if(len > INT_MAX)
+				len = INT_MAX;
+
+			if ( len < DTLS1_HM_HEADER_LENGTH )
+				{
+				/*
+				 * len is so small that we really can't do anything sensible
+				 * so fail
+				 */
+				return -1;
+				}
 			dtls1_fix_message_header(s, frag_off, 
 				len - DTLS1_HM_HEADER_LENGTH);
 
 			dtls1_write_message_header(s, (unsigned char *)&s->init_buf->data[s->init_off]);
-
-			OPENSSL_assert(len >= DTLS1_HM_HEADER_LENGTH);
 			}
 
 		ret=dtls1_write_bytes(s,type,&s->init_buf->data[s->init_off],
@@ -279,12 +303,23 @@ int dtls1_do_write(SSL *s, int type)
 			 * is fine and wait for an alert to handle the
 			 * retransmit 
 			 */
-			if ( BIO_ctrl(SSL_get_wbio(s),
+			if ( retry && BIO_ctrl(SSL_get_wbio(s),
 				BIO_CTRL_DGRAM_MTU_EXCEEDED, 0, NULL))
-				s->d1->mtu = BIO_ctrl(SSL_get_wbio(s),
-					BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
+				{
+				if(!(SSL_get_options(s) & SSL_OP_NO_QUERY_MTU))
+					{
+					if(!dtls1_query_mtu(s))
+						return -1;
+					/* Have one more go */
+					retry = 0;
+					}
+				else
+					return -1;
+				}
 			else
+				{
 				return(-1);
+				}
 			}
 		else
 			{
@@ -1184,26 +1219,17 @@ dtls1_write_message_header(SSL *s, unsig
 	return p;
 	}
 
-static unsigned int 
-dtls1_min_mtu(void)
-	{
-	return (g_probable_mtu[(sizeof(g_probable_mtu) / 
+unsigned int
+dtls1_link_min_mtu(void)
+	{                
+	return (g_probable_mtu[(sizeof(g_probable_mtu) /
 		sizeof(g_probable_mtu[0])) - 1]);
 	}
 
 static unsigned int 
-dtls1_guess_mtu(unsigned int curr_mtu)
+dtls1_min_mtu(SSL *s)
 	{
-	unsigned int i;
-
-	if ( curr_mtu == 0 )
-		return g_probable_mtu[0] ;
-
-	for ( i = 0; i < sizeof(g_probable_mtu)/sizeof(g_probable_mtu[0]); i++)
-		if ( curr_mtu > g_probable_mtu[i])
-			return g_probable_mtu[i];
-
-	return curr_mtu;
+	return dtls1_link_min_mtu()-BIO_dgram_get_mtu_overhead(SSL_get_wbio(s));
 	}
 
 void

Index: src/crypto/dist/openssl/ssl/d1_clnt.c
diff -u src/crypto/dist/openssl/ssl/d1_clnt.c:1.1.1.3 src/crypto/dist/openssl/ssl/d1_clnt.c:1.1.1.3.12.1
--- src/crypto/dist/openssl/ssl/d1_clnt.c:1.1.1.3	Fri May  9 21:34:43 2008
+++ src/crypto/dist/openssl/ssl/d1_clnt.c	Mon Jan 26 11:47:24 2015
@@ -1142,6 +1142,12 @@ int dtls1_send_client_certificate(SSL *s
 		s->state=SSL3_ST_CW_CERT_D;
 		l=dtls1_output_cert_chain(s,
 			(s->s3->tmp.cert_req == 2)?NULL:s->cert->key->x509);
+		if (!l)
+			{
+			SSLerr(SSL_F_DTLS1_SEND_CLIENT_CERTIFICATE, ERR_R_INTERNAL_ERROR);
+			ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_INTERNAL_ERROR);
+			return 0;
+			}
 		s->init_num=(int)l;
 		s->init_off=0;
 
Index: src/crypto/dist/openssl/ssl/d1_lib.c
diff -u src/crypto/dist/openssl/ssl/d1_lib.c:1.1.1.3 src/crypto/dist/openssl/ssl/d1_lib.c:1.1.1.3.12.1
--- src/crypto/dist/openssl/ssl/d1_lib.c:1.1.1.3	Fri May  9 21:34:43 2008
+++ src/crypto/dist/openssl/ssl/d1_lib.c	Mon Jan 26 11:47:24 2015
@@ -104,6 +104,9 @@ int dtls1_new(SSL *s)
 		d1->cookie_len = sizeof(s->d1->cookie);
 		}
 
+	d1->link_mtu = 0;
+	d1->mtu = 0;
+
 	if( ! d1->unprocessed_rcds.q || ! d1->processed_rcds.q 
         || ! d1->buffered_messages || ! d1->sent_messages)
 		{
@@ -144,8 +147,7 @@ void dtls1_free(SSL *s)
     while( (item = pqueue_pop(s->d1->buffered_messages)) != NULL)
         {
         frag = (hm_fragment *)item->data;
-        OPENSSL_free(frag->fragment);
-        OPENSSL_free(frag);
+        dtls1_hm_fragment_free(frag);
         pitem_free(item);
         }
     pqueue_free(s->d1->buffered_messages);
@@ -153,8 +155,7 @@ void dtls1_free(SSL *s)
     while ( (item = pqueue_pop(s->d1->sent_messages)) != NULL)
         {
         frag = (hm_fragment *)item->data;
-        OPENSSL_free(frag->fragment);
-        OPENSSL_free(frag);
+        dtls1_hm_fragment_free(frag);
         pitem_free(item);
         }
 	pqueue_free(s->d1->sent_messages);
Index: src/crypto/dist/openssl/ssl/d1_srvr.c
diff -u src/crypto/dist/openssl/ssl/d1_srvr.c:1.1.1.3 src/crypto/dist/openssl/ssl/d1_srvr.c:1.1.1.3.12.1
--- src/crypto/dist/openssl/ssl/d1_srvr.c:1.1.1.3	Fri May  9 21:34:43 2008
+++ src/crypto/dist/openssl/ssl/d1_srvr.c	Mon Jan 26 11:47:24 2015
@@ -205,6 +205,7 @@ int dtls1_accept(SSL *s)
 					}
 				if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
 					{
+					BUF_MEM_free(buf);
 					ret= -1;
 					goto end;
 					}
@@ -322,24 +323,15 @@ int dtls1_accept(SSL *s)
 		case SSL3_ST_SW_KEY_EXCH_B:
 			alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
 
-			/* clear this, it may get reset by
-			 * send_server_key_exchange */
-			if ((s->options & SSL_OP_EPHEMERAL_RSA)
-#ifndef OPENSSL_NO_KRB5
-				&& !(alg_k & SSL_kKRB5)
-#endif /* OPENSSL_NO_KRB5 */
-				)
-				/* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
-				 * even when forbidden by protocol specs
-				 * (handshake may fail as clients are not required to
-				 * be able to handle this) */
-				s->s3->tmp.use_rsa_tmp=1;
-			else
-				s->s3->tmp.use_rsa_tmp=0;
+			/*
+			 * clear this, it may get reset by
+			 * send_server_key_exchange
+			 */
+			s->s3->tmp.use_rsa_tmp=0;
 
 			/* only send if a DH key exchange or
 			 * RSA but we have a sign only certificate */
-			if (s->s3->tmp.use_rsa_tmp
+			if (0
 			    || (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
 			    || ((alg_k & SSL_kRSA)
 				&& (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
@@ -1128,6 +1120,11 @@ int dtls1_send_server_certificate(SSL *s
 			}
 
 		l=dtls1_output_cert_chain(s,x);
+		if (!l)
+			{
+			SSLerr(SSL_F_DTLS1_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
+			return(0);
+			}
 		s->state=SSL3_ST_SW_CERT_B;
 		s->init_num=(int)l;
 		s->init_off=0;

Index: src/crypto/dist/openssl/ssl/d1_enc.c
diff -u src/crypto/dist/openssl/ssl/d1_enc.c:1.1.1.3.12.1 src/crypto/dist/openssl/ssl/d1_enc.c:1.1.1.3.12.2
--- src/crypto/dist/openssl/ssl/d1_enc.c:1.1.1.3.12.1	Tue May 22 18:53:42 2012
+++ src/crypto/dist/openssl/ssl/d1_enc.c	Mon Jan 26 11:47:24 2015
@@ -228,7 +228,8 @@ int dtls1_enc(SSL *s, int send)
 				}
 			}
 		
-		EVP_Cipher(ds,rec->data,rec->input,l);
+		if(EVP_Cipher(ds,rec->data,rec->input,l) < 1)
+			return -1;
 
 #ifdef KSSL_DEBUG
 		{

Index: src/crypto/dist/openssl/ssl/d1_pkt.c
diff -u src/crypto/dist/openssl/ssl/d1_pkt.c:1.1.1.5.4.1.2.1 src/crypto/dist/openssl/ssl/d1_pkt.c:1.1.1.5.4.1.2.2
--- src/crypto/dist/openssl/ssl/d1_pkt.c:1.1.1.5.4.1.2.1	Wed Jan 25 18:54:43 2012
+++ src/crypto/dist/openssl/ssl/d1_pkt.c	Mon Jan 26 11:47:24 2015
@@ -229,14 +229,6 @@ dtls1_buffer_record(SSL *s, record_pqueu
 
 	item->data = rdata;
 
-	/* insert should not fail, since duplicates are dropped */
-	if (pqueue_insert(queue->q, item) == NULL)
-		{
-		OPENSSL_free(rdata);
-		pitem_free(item);
-		return(0);
-		}
-
 	s->packet = NULL;
 	s->packet_length = 0;
 	memset(&(s->s3->rbuf), 0, sizeof(SSL3_BUFFER));
@@ -245,11 +237,24 @@ dtls1_buffer_record(SSL *s, record_pqueu
 	if (!ssl3_setup_buffers(s))
 		{
 		SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
+		if (rdata->rbuf.buf != NULL)
+			OPENSSL_free(rdata->rbuf.buf);
 		OPENSSL_free(rdata);
 		pitem_free(item);
-		return(0);
+		return(-1);
 		}
 	
+	/* insert should not fail, since duplicates are dropped */
+	if (pqueue_insert(queue->q, item) == NULL)
+		{
+		SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
+		if (rdata->rbuf.buf != NULL)
+			OPENSSL_free(rdata->rbuf.buf);
+		OPENSSL_free(rdata);
+		pitem_free(item);
+		return(-1);
+		}
+
 	return(1);
 	}
 
@@ -306,8 +311,9 @@ dtls1_process_buffered_records(SSL *s)
             dtls1_get_unprocessed_record(s);
             if ( ! dtls1_process_record(s))
                 return(0);
-            dtls1_buffer_record(s, &(s->d1->processed_rcds), 
-                s->s3->rrec.seq_num);
+            if(dtls1_buffer_record(s, &(s->d1->processed_rcds), 
+                s->s3->rrec.seq_num)<0)
+		return -1;
             }
         }
 
@@ -501,7 +507,6 @@ printf("\n");
 
 	/* we have pulled in a full packet so zero things */
 	s->packet_length=0;
-	dtls1_record_bitmap_update(s, &(s->d1->bitmap));/* Mark receipt of record. */
 	return(1);
 
 f_err:
@@ -536,8 +541,8 @@ int dtls1_get_record(SSL *s)
 
 	/* The epoch may have changed.  If so, process all the
 	 * pending records.  This is a non-blocking operation. */
-	if ( ! dtls1_process_buffered_records(s))
-            return 0;
+	if(dtls1_process_buffered_records(s)<0)
+            return -1;
 
 	/* if we're renegotiating, then there may be buffered records */
 	if (dtls1_get_processed_record(s))
@@ -610,8 +615,6 @@ again:
 		/* now s->packet_length == DTLS1_RT_HEADER_LENGTH */
 		i=rr->length;
 		n=ssl3_read_n(s,i,i,1);
-		if (n <= 0) return(n); /* error or non-blocking io */
-
 		/* this packet contained a partial record, dump it */
 		if ( n != i)
 			{
@@ -632,10 +635,19 @@ again:
 		goto again;   /* get another record */
 		}
 
-	/* check whether this is a repeat, or aged record */
-	if ( ! dtls1_record_replay_check(s, bitmap))
+	/* Check whether this is a repeat, or aged record.
+	 * Don't check if we're listening and this message is
+	 * a ClientHello. They can look as if they're replayed,
+	 * since they arrive from different connections and
+	 * would be dropped unnecessarily.
+	 */
+	if (!(s->server && rr->type == SSL3_RT_HANDSHAKE &&
+		s->packet_length > DTLS1_RT_HEADER_LENGTH &&
+		s->packet[DTLS1_RT_HEADER_LENGTH] == SSL3_MT_CLIENT_HELLO) &&
+		!dtls1_record_replay_check(s, bitmap))
 		{
-		s->packet_length=0; /* dump this record */
+		rr->length = 0;
+		s->packet_length=0; /* dump this record */  
 		goto again;     /* get another record */
 		}
 
@@ -650,13 +662,22 @@ again:
 	if (is_next_epoch)
 		{
 		dtls1_record_bitmap_update(s, bitmap);
-		dtls1_buffer_record(s, &(s->d1->unprocessed_rcds), rr->seq_num);
+		if(dtls1_buffer_record(s, &(s->d1->unprocessed_rcds), rr->seq_num)<0)
+			{
+			SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR);
+			return -1;
+			}
 		s->packet_length = 0;
 		goto again;
 		}
 
-	if ( ! dtls1_process_record(s))
-		return(0);
+        if (!dtls1_process_record(s))
+                {
+                rr->length = 0;
+                s->packet_length = 0;  /* dump this record */
+                goto again;   /* get another record */ 
+                }
+        dtls1_record_bitmap_update(s, bitmap);/* Mark receipt of record. */
 
 	dtls1_clear_timeouts(s);  /* done waiting */
 	return(1);
@@ -1436,7 +1457,7 @@ int do_dtls1_write(SSL *s, int type, con
 		wr->length += bs;
 		}
 
-	s->method->ssl3_enc->enc(s,1);
+	if(s->method->ssl3_enc->enc(s,1) < 1) goto err;
 
 	/* record length after mac and block padding */
 /*	if (type == SSL3_RT_APPLICATION_DATA ||

Index: src/crypto/dist/openssl/ssl/dtls1.h
diff -u src/crypto/dist/openssl/ssl/dtls1.h:1.3 src/crypto/dist/openssl/ssl/dtls1.h:1.3.12.1
--- src/crypto/dist/openssl/ssl/dtls1.h:1.3	Fri May  9 21:49:42 2008
+++ src/crypto/dist/openssl/ssl/dtls1.h	Mon Jan 26 11:47:24 2015
@@ -68,6 +68,9 @@ extern "C" {
 #endif
 
 #define DTLS1_VERSION			0xFEFF
+#define DTLS_MAX_VERSION		DTLS1_VERSION
+
+#define DTLS1_BAD_VER			0x0100
 
 #if 0
 #define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE    110
@@ -87,6 +90,8 @@ extern "C" {
 
 #define DTLS1_AL_HEADER_LENGTH                   7
 
+/* Max MTU overhead we know about so far is 40 for IPv6 + 8 for UDP */
+#define DTLS1_MAX_MTU_OVERHEAD                   48
 
 typedef struct dtls1_bitmap_st
 	{
@@ -174,6 +179,7 @@ typedef struct dtls1_state_st
 	/* Buffered (sent) handshake records */
 	pqueue sent_messages;
 
+	unsigned int link_mtu; /* max on-the-wire DTLS packet size */
 	unsigned int mtu; /* max wire packet size */
 
 	struct hm_header_st w_msg_hdr;

Index: src/crypto/dist/openssl/ssl/s23_srvr.c
diff -u src/crypto/dist/openssl/ssl/s23_srvr.c:1.6.12.2 src/crypto/dist/openssl/ssl/s23_srvr.c:1.6.12.3
--- src/crypto/dist/openssl/ssl/s23_srvr.c:1.6.12.2	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/ssl/s23_srvr.c	Mon Jan 26 11:47:24 2015
@@ -185,6 +185,7 @@ int ssl23_accept(SSL *s)
 					}
 				if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
 					{
+					BUF_MEM_free(buf);
 					ret= -1;
 					goto end;
 					}
@@ -556,12 +557,14 @@ int ssl23_get_client_hello(SSL *s)
 	if ((type == 2) || (type == 3))
 		{
 		/* we have SSLv3/TLSv1 (type 2: SSL2 style, type 3: SSL3/TLS style) */
-                s->method = ssl23_get_server_method(s->version);
-		if (s->method == NULL)
+		const SSL_METHOD *new_method;
+                new_method = ssl23_get_server_method(s->version);
+		if (new_method == NULL)
 			{
 			SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
 			goto err;
 			}
+		s->method = new_method;
 
 		if (!ssl_init_wbio_buffer(s,1)) goto err;
 

Index: src/crypto/dist/openssl/ssl/s2_enc.c
diff -u src/crypto/dist/openssl/ssl/s2_enc.c:1.1.1.10 src/crypto/dist/openssl/ssl/s2_enc.c:1.1.1.10.12.1
--- src/crypto/dist/openssl/ssl/s2_enc.c:1.1.1.10	Fri May  9 21:34:43 2008
+++ src/crypto/dist/openssl/ssl/s2_enc.c	Mon Jan 26 11:47:24 2015
@@ -117,8 +117,9 @@ err:
 
 /* read/writes from s->s2->mac_data using length for encrypt and 
  * decrypt.  It sets s->s2->padding and s->[rw]length
- * if we are encrypting */
-void ssl2_enc(SSL *s, int send)
+ * if we are encrypting
+ * Returns 0 on error and 1 on success */
+int ssl2_enc(SSL *s, int send)
 	{
 	EVP_CIPHER_CTX *ds;
 	unsigned long l;
@@ -136,7 +137,7 @@ void ssl2_enc(SSL *s, int send)
 		}
 
 	/* check for NULL cipher */
-	if (ds == NULL) return;
+	if (ds == NULL) return 1;
 
 
 	bs=ds->cipher->block_size;
@@ -145,7 +146,10 @@ void ssl2_enc(SSL *s, int send)
 	if (bs == 8)
 		l=(l+7)/8*8;
 
-	EVP_Cipher(ds,s->s2->mac_data,s->s2->mac_data,l);
+	if(EVP_Cipher(ds,s->s2->mac_data,s->s2->mac_data,l) < 1)
+		return 0;
+
+	return 1;
 	}
 
 void ssl2_mac(SSL *s, unsigned char *md, int send)

Index: src/crypto/dist/openssl/ssl/s2_pkt.c
diff -u src/crypto/dist/openssl/ssl/s2_pkt.c:1.1.1.7 src/crypto/dist/openssl/ssl/s2_pkt.c:1.1.1.7.12.1
--- src/crypto/dist/openssl/ssl/s2_pkt.c:1.1.1.7	Fri May  9 21:34:44 2008
+++ src/crypto/dist/openssl/ssl/s2_pkt.c	Mon Jan 26 11:47:24 2015
@@ -263,7 +263,11 @@ static int ssl2_read_internal(SSL *s, vo
 		if ((!s->s2->clear_text) &&
 			(s->s2->rlength >= mac_size))
 			{
-			ssl2_enc(s,0);
+			if(!ssl2_enc(s,0))
+				{
+				SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_DECRYPTION_FAILED);
+				return(-1);
+				}
 			s->s2->ract_data_length-=mac_size;
 			ssl2_mac(s,mac,0);
 			s->s2->ract_data_length-=s->s2->padding;
@@ -610,7 +614,8 @@ static int do_ssl_write(SSL *s, const un
 		s->s2->wact_data_length=len+p;
 		ssl2_mac(s,s->s2->mac_data,1);
 		s->s2->wlength+=p+mac_size;
-		ssl2_enc(s,1);
+		if(ssl2_enc(s,1) < 1)
+			return -1;
 		}
 
 	/* package up the header */
Index: src/crypto/dist/openssl/ssl/s3_both.c
diff -u src/crypto/dist/openssl/ssl/s3_both.c:1.1.1.7 src/crypto/dist/openssl/ssl/s3_both.c:1.1.1.7.12.1
--- src/crypto/dist/openssl/ssl/s3_both.c:1.1.1.7	Fri May  9 21:34:44 2008
+++ src/crypto/dist/openssl/ssl/s3_both.c	Mon Jan 26 11:47:24 2015
@@ -374,6 +374,7 @@ long ssl3_get_message(SSL *s, int st1, i
 			goto f_err;
 			}
 		*ok=1;
+		s->state = stn;
 		s->init_msg = s->init_buf->data + 4;
 		s->init_num = (int)s->s3->tmp.message_size;
 		return s->init_num;

Index: src/crypto/dist/openssl/ssl/s2_srvr.c
diff -u src/crypto/dist/openssl/ssl/s2_srvr.c:1.9.4.1 src/crypto/dist/openssl/ssl/s2_srvr.c:1.9.4.1.6.1
--- src/crypto/dist/openssl/ssl/s2_srvr.c:1.9.4.1	Tue Jan 20 21:28:09 2009
+++ src/crypto/dist/openssl/ssl/s2_srvr.c	Mon Jan 26 11:47:24 2015
@@ -188,13 +188,21 @@ int ssl2_accept(SSL *s)
 			s->version=SSL2_VERSION;
 			s->type=SSL_ST_ACCEPT;
 
-			buf=s->init_buf;
-			if ((buf == NULL) && ((buf=BUF_MEM_new()) == NULL))
-				{ ret= -1; goto end; }
-			if (!BUF_MEM_grow(buf,(int)
-				SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER))
-				{ ret= -1; goto end; }
-			s->init_buf=buf;
+			if(s->init_buf == NULL)
+				{
+				if ((buf=BUF_MEM_new()) == NULL)
+					{
+					ret= -1;
+					goto end;
+					}
+				if (!BUF_MEM_grow(buf,(int) SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER))
+					{
+					BUF_MEM_free(buf);
+					ret= -1;
+					goto end;
+					}
+				s->init_buf=buf;
+				}
 			s->init_num=0;
 			s->ctx->stats.sess_accept++;
 			s->handshake_func=ssl2_accept;

Index: src/crypto/dist/openssl/ssl/s3_clnt.c
diff -u src/crypto/dist/openssl/ssl/s3_clnt.c:1.12.4.2.2.4 src/crypto/dist/openssl/ssl/s3_clnt.c:1.12.4.2.2.5
--- src/crypto/dist/openssl/ssl/s3_clnt.c:1.12.4.2.2.4	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/ssl/s3_clnt.c	Mon Jan 26 11:47:24 2015
@@ -1126,6 +1126,8 @@ int ssl3_get_key_exchange(SSL *s)
 	int encoded_pt_len = 0;
 #endif
 
+	EVP_MD_CTX_init(&md_ctx);
+
 	/* use same message size as in ssl3_get_certificate_request()
 	 * as ServerKeyExchange message may be skipped */
 	n=s->method->ssl_get_message(s,
@@ -1136,14 +1138,26 @@ int ssl3_get_key_exchange(SSL *s)
 		&ok);
 	if (!ok) return((int)n);
 
+	alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
+
 	if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE)
 		{
+		/*
+		 * Can't skip server key exchange if this is an ephemeral
+		 * ciphersuite.
+		 */
+		if (alg_k & (SSL_kEDH|SSL_kEECDH))
+			{
+			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNEXPECTED_MESSAGE);
+			al = SSL_AD_UNEXPECTED_MESSAGE;
+			goto f_err;
+			}
 #ifndef OPENSSL_NO_PSK
 		/* In plain PSK ciphersuite, ServerKeyExchange can be
 		   omitted if no identity hint is sent. Set
 		   session->sess_cert anyway to avoid problems
 		   later.*/
-		if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)
+		if (alg_k & SSL_kPSK)
 			{
 			s->session->sess_cert=ssl_sess_cert_new();
 			if (s->ctx->psk_identity_hint)
@@ -1188,9 +1202,7 @@ int ssl3_get_key_exchange(SSL *s)
 	/* Total length of the parameters including the length prefix */
 	param_len=0;
 
-	alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
 	alg_a=s->s3->tmp.new_cipher->algorithm_auth;
-	EVP_MD_CTX_init(&md_ctx);
 
 	al=SSL_AD_DECODE_ERROR;
 
@@ -1251,6 +1263,13 @@ int ssl3_get_key_exchange(SSL *s)
 #ifndef OPENSSL_NO_RSA
 	if (alg_k & SSL_kRSA)
 		{
+		/* Temporary RSA keys only allowed in export ciphersuites */
+		if (!SSL_C_IS_EXPORT(s->s3->tmp.new_cipher))
+			{
+			al=SSL_AD_UNEXPECTED_MESSAGE;
+			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
+			goto f_err;
+			}
 		if ((rsa=RSA_new()) == NULL)
 			{
 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
@@ -2864,6 +2883,12 @@ int ssl3_send_client_certificate(SSL *s)
 		s->state=SSL3_ST_CW_CERT_D;
 		l=ssl3_output_cert_chain(s,
 			(s->s3->tmp.cert_req == 2)?NULL:s->cert->key->x509);
+		if (!l)
+			{
+			SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE, ERR_R_INTERNAL_ERROR);
+			ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_INTERNAL_ERROR);
+			return 0;
+			}
 		s->init_num=(int)l;
 		s->init_off=0;
 		}

Index: src/crypto/dist/openssl/ssl/s3_enc.c
diff -u src/crypto/dist/openssl/ssl/s3_enc.c:1.1.1.12.4.1.2.2 src/crypto/dist/openssl/ssl/s3_enc.c:1.1.1.12.4.1.2.3
--- src/crypto/dist/openssl/ssl/s3_enc.c:1.1.1.12.4.1.2.2	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/ssl/s3_enc.c	Mon Jan 26 11:47:24 2015
@@ -522,7 +522,8 @@ int ssl3_enc(SSL *s, int send)
 			/* otherwise, rec->length >= bs */
 			}
 		
-		EVP_Cipher(ds,rec->data,rec->input,l);
+		if(EVP_Cipher(ds,rec->data,rec->input,l) < 1)
+			return -1;
 
 		if ((bs != 1) && !send)
 			{

Index: src/crypto/dist/openssl/ssl/s3_lib.c
diff -u src/crypto/dist/openssl/ssl/s3_lib.c:1.14.4.1.2.1 src/crypto/dist/openssl/ssl/s3_lib.c:1.14.4.1.2.2
--- src/crypto/dist/openssl/ssl/s3_lib.c:1.14.4.1.2.1	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/ssl/s3_lib.c	Mon Jan 26 11:47:24 2015
@@ -3047,6 +3047,7 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, S
 				}
 			ok = ok && ec_ok;
 			}
+#ifndef OPENSSL_NO_ECDH
 		if (
 			/* if we are considering an ECC cipher suite that uses an ephemeral EC key */
 			(alg_k & SSL_kEECDH)
@@ -3094,6 +3095,7 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, S
 				}
 			ok = ok && ec_ok;
 			}
+#endif /* OPENSSL_NO_ECDH */
 #endif /* OPENSSL_NO_EC */
 #endif /* OPENSSL_NO_TLSEXT */
 

Index: src/crypto/dist/openssl/ssl/s3_pkt.c
diff -u src/crypto/dist/openssl/ssl/s3_pkt.c:1.9.4.3.2.2 src/crypto/dist/openssl/ssl/s3_pkt.c:1.9.4.3.2.3
--- src/crypto/dist/openssl/ssl/s3_pkt.c:1.9.4.3.2.2	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/ssl/s3_pkt.c	Mon Jan 26 11:47:24 2015
@@ -137,6 +137,7 @@ int ssl3_read_n(SSL *s, int n, int max, 
 	if (n <= 0) return n;
 
 	rb    = &(s->s3->rbuf);
+
 	left  = rb->left;
 #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
 	align = (long)rb->buf + SSL3_RT_HEADER_LENGTH;
@@ -173,9 +174,10 @@ int ssl3_read_n(SSL *s, int n, int max, 
 		}
 
 	/* extend reads should not span multiple packets for DTLS */
-	if ( SSL_version(s) == DTLS1_VERSION &&
-		extend)
+	if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER)
 		{
+		if (left == 0 && extend)
+			return 0;
 		if ( left > 0 && n > left)
 			n = left;
 		}
@@ -763,8 +765,7 @@ static int do_ssl3_write(SSL *s, int typ
 		wr->data=p;
 		}
 
-	/* ssl3_enc can only have an error on read */
-	s->method->ssl3_enc->enc(s,1);
+	if(s->method->ssl3_enc->enc(s,1)<1) goto err;
 
 	/* record length after mac and block padding */
 	s2n(wr->length,plen);

Index: src/crypto/dist/openssl/ssl/s3_srvr.c
diff -u src/crypto/dist/openssl/ssl/s3_srvr.c:1.15.4.3.2.3 src/crypto/dist/openssl/ssl/s3_srvr.c:1.15.4.3.2.4
--- src/crypto/dist/openssl/ssl/s3_srvr.c:1.15.4.3.2.3	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/ssl/s3_srvr.c	Mon Jan 26 11:47:24 2015
@@ -247,6 +247,7 @@ int ssl3_accept(SSL *s)
 					}
 				if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
 					{
+					BUF_MEM_free(buf);
 					ret= -1;
 					goto end;
 					}
@@ -367,20 +368,11 @@ int ssl3_accept(SSL *s)
 		case SSL3_ST_SW_KEY_EXCH_B:
 			alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
 
-			/* clear this, it may get reset by
-			 * send_server_key_exchange */
-			if ((s->options & SSL_OP_EPHEMERAL_RSA)
-#ifndef OPENSSL_NO_KRB5
-				&& !(alg_k & SSL_kKRB5)
-#endif /* OPENSSL_NO_KRB5 */
-				)
-				/* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
-				 * even when forbidden by protocol specs
-				 * (handshake may fail as clients are not required to
-				 * be able to handle this) */
-				s->s3->tmp.use_rsa_tmp=1;
-			else
-				s->s3->tmp.use_rsa_tmp=0;
+			/*
+			 * clear this, it may get reset by
+			 * send_server_key_exchange
+			 */
+			s->s3->tmp.use_rsa_tmp=0;
 
 
 			/* only send if a DH key exchange, fortezza or
@@ -394,7 +386,7 @@ int ssl3_accept(SSL *s)
 			 * server certificate contains the server's
 			 * public key for key exchange.
 			 */
-			if (s->s3->tmp.use_rsa_tmp
+			if (0
 			/* PSK: send ServerKeyExchange if PSK identity
 			 * hint if provided */
 #ifndef OPENSSL_NO_PSK
@@ -1837,6 +1829,7 @@ int ssl3_get_client_key_exchange(SSL *s)
 		unsigned char rand_premaster_secret[SSL_MAX_MASTER_KEY_LENGTH];
 		int decrypt_len;
 		unsigned char decrypt_good, version_good;
+		size_t j;
 
 		/* FIX THIS UP EAY EAY EAY EAY */
 		if (s->s3->tmp.use_rsa_tmp)
@@ -1875,8 +1868,9 @@ int ssl3_get_client_key_exchange(SSL *s)
 				{
 				if (!(s->options & SSL_OP_TLS_D5_BUG))
 					{
+					al = SSL_AD_DECODE_ERROR;
 					SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG);
-					goto err;
+					goto f_err;
 					}
 				else
 					p-=2;
@@ -1885,6 +1879,20 @@ int ssl3_get_client_key_exchange(SSL *s)
 				n=i;
 			}
 
+		/*
+		 * Reject overly short RSA ciphertext because we want to be sure
+		 * that the buffer size makes it safe to iterate over the entire
+		 * size of a premaster secret (SSL_MAX_MASTER_KEY_LENGTH). The
+		 * actual expected size is larger due to RSA padding, but the
+		 * bound is sufficient to be safe.
+		 */
+		if (n < SSL_MAX_MASTER_KEY_LENGTH)
+			{
+			al = SSL_AD_DECRYPT_ERROR;
+			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG);
+			goto f_err;
+                        }
+
 		/* We must not leak whether a decryption failure occurs because
 		 * of Bleichenbacher's attack on PKCS #1 v1.5 RSA padding (see
 		 * RFC 2246, section 7.4.7.1). The code follows that advice of
@@ -1932,19 +1940,23 @@ int ssl3_get_client_key_exchange(SSL *s)
 		 * to remain non-zero (0xff). */
 		decrypt_good &= version_good;
 
-		/* Now copy rand_premaster_secret over p using
-		 * decrypt_good_mask. */
-		for (i = 0; i < (int) sizeof(rand_premaster_secret); i++)
+		/*
+		 * Now copy rand_premaster_secret over from p using
+		 * decrypt_good_mask. If decryption failed, then p does not
+		 * contain valid plaintext, however, a check above guarantees
+		 * it is still sufficiently large to read from.
+		 */
+		for (j = 0; j < sizeof(rand_premaster_secret); j++)
 			{
-			p[i] = constant_time_select_8(decrypt_good, p[i],
-						      rand_premaster_secret[i]);
+			p[j] = constant_time_select_8(decrypt_good, p[j],
+						      rand_premaster_secret[j]);
 			}
 
 		s->session->master_key_length=
 			s->method->ssl3_enc->generate_master_secret(s,
 				s->session->master_key,
-				p,i);
-		OPENSSL_cleanse(p,i);
+				p,sizeof(rand_premaster_secret));
+		OPENSSL_cleanse(p,sizeof(rand_premaster_secret));
 		}
 	else
 #endif
@@ -2534,7 +2546,7 @@ int ssl3_get_cert_verify(SSL *s)
 	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_VERIFY)
 		{
 		s->s3->tmp.reuse_message=1;
-		if ((peer != NULL) && (type | EVP_PKT_SIGN))
+		if (peer != NULL)
 			{
 			al=SSL_AD_UNEXPECTED_MESSAGE;
 			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_MISSING_VERIFY_MESSAGE);
@@ -2864,6 +2876,11 @@ int ssl3_send_server_certificate(SSL *s)
 			}
 
 		l=ssl3_output_cert_chain(s,x);
+		if (!l)
+			{
+			SSLerr(SSL_F_SSL3_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
+			return(0);
+			}
 		s->state=SSL3_ST_SW_CERT_B;
 		s->init_num=(int)l;
 		s->init_off=0;

Index: src/crypto/dist/openssl/ssl/ssl.h
diff -u src/crypto/dist/openssl/ssl/ssl.h:1.18.4.1.2.1 src/crypto/dist/openssl/ssl/ssl.h:1.18.4.1.2.2
--- src/crypto/dist/openssl/ssl/ssl.h:1.18.4.1.2.1	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/ssl/ssl.h	Mon Jan 26 11:47:24 2015
@@ -549,9 +549,8 @@ typedef struct ssl_session_st
 #define SSL_OP_SINGLE_ECDH_USE				0x00080000L
 /* If set, always create a new key when using tmp_dh parameters */
 #define SSL_OP_SINGLE_DH_USE				0x00100000L
-/* Set to always use the tmp_rsa key when doing RSA operations,
- * even when this violates protocol specs */
-#define SSL_OP_EPHEMERAL_RSA				0x00200000L
+/* Does nothing: retained for compatibility */
+#define SSL_OP_EPHEMERAL_RSA				0x0
 /* Set on servers to choose the cipher according to the server's
  * preferences */
 #define SSL_OP_CIPHER_SERVER_PREFERENCE			0x00400000L
@@ -591,8 +590,13 @@ typedef struct ssl_session_st
 /* Don't attempt to automatically build certificate chain */
 #define SSL_MODE_NO_AUTO_CHAIN 0x00000008L
 /* Send TLS_FALLBACK_SCSV in the ClientHello.
- * To be set by applications that reconnect with a downgraded protocol
- * version; see draft-ietf-tls-downgrade-scsv-00 for details. */
+ * To be set only by applications that reconnect with a downgraded protocol
+ * version; see draft-ietf-tls-downgrade-scsv-00 for details.
+ *
+ * DO NOT ENABLE THIS if your application attempts a normal handshake.
+ * Only use this in explicit fallback retries, following the guidance
+ * in draft-ietf-tls-downgrade-scsv-00.
+ */
 #define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080L
 
 
@@ -618,6 +622,10 @@ typedef struct ssl_session_st
         SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL)
 #define SSL_set_mtu(ssl, mtu) \
         SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL)
+#define DTLS_set_link_mtu(ssl, mtu) \
+	SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL)
+#define DTLS_get_link_min_mtu(ssl) \
+	SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL)
 
 
 void SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg));
@@ -1365,6 +1373,9 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
 
 #define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB	72
 
+#define DTLS_CTRL_SET_LINK_MTU			120
+#define DTLS_CTRL_GET_LINK_MIN_MTU		121
+
 #define SSL_CTRL_CHECK_PROTO_VERSION		119
 #endif
 
@@ -1578,9 +1589,9 @@ const SSL_METHOD *SSLv3_method(void);		/
 const SSL_METHOD *SSLv3_server_method(void);	/* SSLv3 */
 const SSL_METHOD *SSLv3_client_method(void);	/* SSLv3 */
 
-const SSL_METHOD *SSLv23_method(void);	/* SSLv3 but can rollback to v2 */
-const SSL_METHOD *SSLv23_server_method(void);	/* SSLv3 but can rollback to v2 */
-const SSL_METHOD *SSLv23_client_method(void);	/* SSLv3 but can rollback to v2 */
+const SSL_METHOD *SSLv23_method(void);	/* Negotiate highest available SSL/TLS version */
+const SSL_METHOD *SSLv23_server_method(void);	/* Negotiate highest available SSL/TLS version */
+const SSL_METHOD *SSLv23_client_method(void);	/* Negotiate highest available SSL/TLS version */
 
 const SSL_METHOD *TLSv1_method(void);		/* TLSv1.0 */
 const SSL_METHOD *TLSv1_server_method(void);	/* TLSv1.0 */

Index: src/crypto/dist/openssl/ssl/ssl_cert.c
diff -u src/crypto/dist/openssl/ssl/ssl_cert.c:1.13 src/crypto/dist/openssl/ssl/ssl_cert.c:1.13.12.1
--- src/crypto/dist/openssl/ssl/ssl_cert.c:1.13	Fri May  9 21:49:42 2008
+++ src/crypto/dist/openssl/ssl/ssl_cert.c	Mon Jan 26 11:47:24 2015
@@ -271,35 +271,6 @@ CERT *ssl_cert_dup(CERT *cert)
 			ret->pkeys[i].privatekey = cert->pkeys[i].privatekey;
 			CRYPTO_add(&ret->pkeys[i].privatekey->references, 1,
 				CRYPTO_LOCK_EVP_PKEY);
-
-			switch(i) 
-				{
-				/* If there was anything special to do for
-				 * certain types of keys, we'd do it here.
-				 * (Nothing at the moment, I think.) */
-
-			case SSL_PKEY_RSA_ENC:
-			case SSL_PKEY_RSA_SIGN:
-				/* We have an RSA key. */
-				break;
-				
-			case SSL_PKEY_DSA_SIGN:
-				/* We have a DSA key. */
-				break;
-				
-			case SSL_PKEY_DH_RSA:
-			case SSL_PKEY_DH_DSA:
-				/* We have a DH key. */
-				break;
-
-			case SSL_PKEY_ECC:
-				/* We have an ECC key */
-				break;
-
-			default:
-				/* Can't happen. */
-				SSLerr(SSL_F_SSL_CERT_DUP, SSL_R_LIBRARY_BUG);
-				}
 			}
 		}
 	

Index: src/crypto/dist/openssl/ssl/ssl_lib.c
diff -u src/crypto/dist/openssl/ssl/ssl_lib.c:1.5.12.1 src/crypto/dist/openssl/ssl/ssl_lib.c:1.5.12.2
--- src/crypto/dist/openssl/ssl/ssl_lib.c:1.5.12.1	Sun Oct 19 20:10:11 2014
+++ src/crypto/dist/openssl/ssl/ssl_lib.c	Mon Jan 26 11:47:24 2015
@@ -373,13 +373,7 @@ SSL *SSL_new(SSL_CTX *ctx)
 	return(s);
 err:
 	if (s != NULL)
-		{
-		if (s->cert != NULL)
-			ssl_cert_free(s->cert);
-		if (s->ctx != NULL)
-			SSL_CTX_free(s->ctx); /* decrement reference count */
-		OPENSSL_free(s);
-		}
+		SSL_free(s);
 	SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
 	return(NULL);
 	}
@@ -1032,13 +1026,6 @@ long SSL_ctrl(SSL *s,int cmd,long larg,v
 		l=s->max_cert_list;
 		s->max_cert_list=larg;
 		return(l);
-	case SSL_CTRL_SET_MTU:
-		if (SSL_version(s) == DTLS1_VERSION)
-			{
-			s->d1->mtu = larg;
-			return larg;
-			}
-		return 0;
 	case SSL_CTRL_SET_MAX_SEND_FRAGMENT:
 		if (larg < 512 || larg > SSL3_RT_MAX_PLAIN_LENGTH)
 			return 0;
@@ -1447,6 +1434,7 @@ STACK_OF(SSL_CIPHER) *ssl_bytes_to_ciphe
 					ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_INAPPROPRIATE_FALLBACK);
 				goto err;
 				}
+			p += n;
 			continue;
 			}
 

Index: src/crypto/dist/openssl/ssl/ssl_locl.h
diff -u src/crypto/dist/openssl/ssl/ssl_locl.h:1.13.4.1 src/crypto/dist/openssl/ssl/ssl_locl.h:1.13.4.1.2.1
--- src/crypto/dist/openssl/ssl/ssl_locl.h:1.13.4.1	Tue Jan 12 09:07:51 2010
+++ src/crypto/dist/openssl/ssl/ssl_locl.h	Mon Jan 26 11:47:24 2015
@@ -799,7 +799,7 @@ void ssl_load_ciphers(void);
 
 int ssl2_enc_init(SSL *s, int client);
 int ssl2_generate_key_material(SSL *s);
-void ssl2_enc(SSL *s,int send_data);
+int ssl2_enc(SSL *s,int send_data);
 void ssl2_mac(SSL *s,unsigned char *mac,int send_data);
 SSL_CIPHER *ssl2_get_cipher_by_char(const unsigned char *p);
 int ssl2_put_cipher_by_char(const SSL_CIPHER *c,unsigned char *p);

Index: src/crypto/dist/openssl/util/libeay.num
diff -u src/crypto/dist/openssl/util/libeay.num:1.1.1.13 src/crypto/dist/openssl/util/libeay.num:1.1.1.13.12.1
--- src/crypto/dist/openssl/util/libeay.num:1.1.1.13	Fri May  9 21:34:48 2008
+++ src/crypto/dist/openssl/util/libeay.num	Mon Jan 26 11:47:24 2015
@@ -1807,6 +1807,7 @@ ASN1_UTCTIME_get                        
 X509_REQ_digest                         2362	EXIST::FUNCTION:EVP
 X509_CRL_digest                         2391	EXIST::FUNCTION:EVP
 d2i_ASN1_SET_OF_PKCS7                   2397	NOEXIST::FUNCTION:
+X509_ALGOR_cmp				2398	EXIST::FUNCTION:
 EVP_CIPHER_CTX_set_key_length           2399	EXIST::FUNCTION:
 EVP_CIPHER_CTX_ctrl                     2400	EXIST::FUNCTION:
 BN_mod_exp_mont_word                    2401	EXIST::FUNCTION:

Index: src/crypto/dist/openssl/util/mk1mf.pl
diff -u src/crypto/dist/openssl/util/mk1mf.pl:1.1.1.12 src/crypto/dist/openssl/util/mk1mf.pl:1.1.1.12.12.1
--- src/crypto/dist/openssl/util/mk1mf.pl:1.1.1.12	Fri May  9 21:34:48 2008
+++ src/crypto/dist/openssl/util/mk1mf.pl	Mon Jan 26 11:47:24 2015
@@ -588,7 +588,7 @@ open (OUT,">>crypto/buildinf.h") || die 
 printf OUT <<EOF;
 #ifdef $platform_cpp_symbol
   /* auto-generated/updated by util/mk1mf.pl for crypto/cversion.c */
-  #define CFLAGS "$cc $cflags"
+  #define CFLAGS "compiler: $cc $cflags"
   #define PLATFORM "$platform"
 EOF
 printf OUT "  #define DATE \"%s\"\n", scalar gmtime();
@@ -624,12 +624,6 @@ foreach (values %lib_nam)
 	$lib_obj=$lib_obj{$_};
 	local($slib)=$shlib;
 
-	if (($_ eq "SSL") && $no_ssl2 && $no_ssl3)
-		{
-		$rules.="\$(O_SSL):\n\n"; 
-		next;
-		}
-
 	$defs.=&do_defs(${_}."OBJ",$lib_obj,"\$(OBJ_D)",$obj);
 	$lib=($slib)?" \$(SHLIB_CFLAGS)".$shlib_ex_cflags{$_}:" \$(LIB_CFLAGS)";
 	$rules.=&do_compile_rule("\$(OBJ_D)",$lib_obj{$_},$lib);

Index: src/distrib/sets/lists/base/md.amd64
diff -u src/distrib/sets/lists/base/md.amd64:1.25.2.8.2.2 src/distrib/sets/lists/base/md.amd64:1.25.2.8.2.3
--- src/distrib/sets/lists/base/md.amd64:1.25.2.8.2.2	Fri Jul  8 21:04:05 2011
+++ src/distrib/sets/lists/base/md.amd64	Mon Jan 26 11:47:24 2015
@@ -1,4 +1,4 @@
-# $NetBSD: md.amd64,v 1.25.2.8.2.2 2011/07/08 21:04:05 sborrill Exp $
+# $NetBSD: md.amd64,v 1.25.2.8.2.3 2015/01/26 11:47:24 martin Exp $
 ./@MODULEDIR@/adosfs				base-kernel-modules
 ./@MODULEDIR@/adosfs/adosfs.kmod		base-kernel-modules
 ./@MODULEDIR@/azalia				base-kernel-modules
@@ -131,7 +131,7 @@
 ./usr/lib/i386/libcrypt.so.0			base-compat-shlib	compat,pic
 ./usr/lib/i386/libcrypt.so.0.2			base-compat-shlib	compat,pic
 ./usr/lib/i386/libcrypto.so.4			base-compat-shlib	compat,pic
-./usr/lib/i386/libcrypto.so.4.2			base-compat-shlib	compat,pic
+./usr/lib/i386/libcrypto.so.4.3			base-compat-shlib	compat,pic
 ./usr/lib/i386/librefuse.so.0			base-compat-shlib	compat,pic
 ./usr/lib/i386/librefuse.so.0.0			base-compat-shlib	compat,pic
 ./usr/lib/i386/libp2k.so.0			base-compat-shlib	compat,pic
@@ -247,7 +247,7 @@
 ./usr/lib/i386/libssh.so.10			base-compat-shlib	compat,pic
 ./usr/lib/i386/libssh.so.10.0			base-compat-shlib	compat,pic
 ./usr/lib/i386/libssl.so.6			base-compat-shlib	compat,pic
-./usr/lib/i386/libssl.so.6.0			base-compat-shlib	compat,pic
+./usr/lib/i386/libssl.so.6.1			base-compat-shlib	compat,pic
 ./usr/lib/i386/libstdc++.so.6			base-compat-shlib	compat,pic
 ./usr/lib/i386/libstdc++.so.6.0			base-compat-shlib	compat,pic
 ./usr/lib/i386/libsupc++.so.0			base-compat-shlib	compat,pic

Index: src/distrib/sets/lists/base/md.sparc64
diff -u src/distrib/sets/lists/base/md.sparc64:1.23.2.8.2.2 src/distrib/sets/lists/base/md.sparc64:1.23.2.8.2.3
--- src/distrib/sets/lists/base/md.sparc64:1.23.2.8.2.2	Fri Jul  8 21:04:05 2011
+++ src/distrib/sets/lists/base/md.sparc64	Mon Jan 26 11:47:24 2015
@@ -1,4 +1,4 @@
-# $NetBSD: md.sparc64,v 1.23.2.8.2.2 2011/07/08 21:04:05 sborrill Exp $
+# $NetBSD: md.sparc64,v 1.23.2.8.2.3 2015/01/26 11:47:24 martin Exp $
 ./sbin/edlabel					base-sysutil-root
 ./usr/bin/fdformat				base-util-bin
 ./usr/lib/sparc					base-compat-lib		compat
@@ -68,7 +68,7 @@
 ./usr/lib/sparc/libcrypt.so.0			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libcrypt.so.0.2			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libcrypto.so.4			base-compat-shlib	compat,pic
-./usr/lib/sparc/libcrypto.so.4.2		base-compat-shlib	compat,pic
+./usr/lib/sparc/libcrypto.so.4.3		base-compat-shlib	compat,pic
 ./usr/lib/sparc/libcurses.so.6			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libcurses.so.6.4		base-compat-shlib	compat,pic
 ./usr/lib/sparc/libdes.so.7			base-compat-shlib	compat,pic
@@ -182,7 +182,7 @@
 ./usr/lib/sparc/libssh.so.10			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libssh.so.10.0			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libssl.so.6			base-compat-shlib	compat,pic
-./usr/lib/sparc/libssl.so.6.0			base-compat-shlib	compat,pic
+./usr/lib/sparc/libssl.so.6.1			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libstdc++.so.6			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libstdc++.so.6.0		base-compat-shlib	compat,pic
 ./usr/lib/sparc/libsupc++.so.0			base-compat-shlib	compat,pic

Index: src/distrib/sets/lists/base/shl.mi
diff -u src/distrib/sets/lists/base/shl.mi:1.450.2.7.2.2 src/distrib/sets/lists/base/shl.mi:1.450.2.7.2.3
--- src/distrib/sets/lists/base/shl.mi:1.450.2.7.2.2	Fri Jul  8 21:04:05 2011
+++ src/distrib/sets/lists/base/shl.mi	Mon Jan 26 11:47:24 2015
@@ -1,4 +1,4 @@
-# $NetBSD: shl.mi,v 1.450.2.7.2.2 2011/07/08 21:04:05 sborrill Exp $
+# $NetBSD: shl.mi,v 1.450.2.7.2.3 2015/01/26 11:47:24 martin Exp $
 #
 # Note:	Don't delete entries from here - mark them as "obsolete" instead,
 #	unless otherwise stated below.
@@ -15,7 +15,7 @@
 #
 ./lib/libc.so.12.164				base-sys-shlib		dynamicroot
 ./lib/libcrypt.so.0.2				base-sys-shlib		dynamicroot
-./lib/libcrypto.so.4.2				base-crypto-shlib	crypto,dynamicroot
+./lib/libcrypto.so.4.3				base-crypto-shlib	crypto,dynamicroot
 ./lib/libedit.so.2.11				base-sys-shlib		dynamicroot
 ./lib/libevent.so.2.1				base-sys-shlib		dynamicroot
 ./lib/libipsec.so.2.2				base-net-shlib		dynamicroot
@@ -61,7 +61,7 @@
 ./usr/lib/libc.so.12.164			base-sys-shlib
 ./usr/lib/libcom_err.so.5.0			base-krb5-shlib		kerberos
 ./usr/lib/libcrypt.so.0.2			base-sys-shlib
-./usr/lib/libcrypto.so.4.2			base-crypto-shlib	crypto
+./usr/lib/libcrypto.so.4.3			base-crypto-shlib	crypto
 ./usr/lib/libcurses.so.6.4			base-sys-shlib
 ./usr/lib/libdes.so.7.0				base-crypto-shlib	crypto
 ./usr/lib/libdns.so.1.4				base-bind-shlib
@@ -138,7 +138,7 @@
 ./usr/lib/libsl.so.3.0				base-krb5-shlib		kerberos
 ./usr/lib/libss.so.5.0				base-krb5-shlib		kerberos
 ./usr/lib/libssh.so.10.0			base-secsh-shlib	crypto
-./usr/lib/libssl.so.6.0				base-crypto-shlib	crypto
+./usr/lib/libssl.so.6.1				base-crypto-shlib	crypto
 ./usr/lib/libstdc++.so.5.0			base-sys-shlib		gcc=3
 ./usr/lib/libstdc++.so.6.0			base-sys-shlib		gcc=4
 ./usr/lib/libtermcap.so.0.6			base-sys-shlib

Index: src/lib/libcrypto/shlib_version
diff -u src/lib/libcrypto/shlib_version:1.14.4.1 src/lib/libcrypto/shlib_version:1.14.4.1.2.1
--- src/lib/libcrypto/shlib_version:1.14.4.1	Tue Jul 14 19:48:04 2009
+++ src/lib/libcrypto/shlib_version	Mon Jan 26 11:47:24 2015
@@ -1,7 +1,7 @@
-#	$NetBSD: shlib_version,v 1.14.4.1 2009/07/14 19:48:04 snj Exp $
+#	$NetBSD: shlib_version,v 1.14.4.1.2.1 2015/01/26 11:47:24 martin Exp $
 #	Remember to update distrib/sets/lists/base/shl.* when changing
 #
 # Things to do on the next major bump:
 # - Make openssl/sha.h and sha2.h compatible.
 major=4
-minor=2
+minor=3

Index: src/lib/libssl/shlib_version
diff -u src/lib/libssl/shlib_version:1.8 src/lib/libssl/shlib_version:1.8.10.1
--- src/lib/libssl/shlib_version:1.8	Sun May 11 19:17:07 2008
+++ src/lib/libssl/shlib_version	Mon Jan 26 11:47:24 2015
@@ -1,5 +1,5 @@
-#	$NetBSD: shlib_version,v 1.8 2008/05/11 19:17:07 he Exp $
+#	$NetBSD: shlib_version,v 1.8.10.1 2015/01/26 11:47:24 martin Exp $
 #	Remember to update distrib/sets/lists/base/shl.* when changing
 #
 major=6
-minor=0
+minor=1

Reply via email to