From: Dr. Stephen Henson <steve@openssl.org>
Date: Wed, 14 Mar 2012 13:44:57 +0000 (+0000)
Subject: update FAQ, NEWS
X-Git-Tag: master-post-reformat~1904
X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=61ad8262a066aa0953df3cc84031390c0a903a28;p=oweals%2Fopenssl.git

update FAQ, NEWS
---

diff --git a/FAQ b/FAQ
index 3b07cd363d..b9243a6104 100644
--- a/FAQ
+++ b/FAQ
@@ -82,7 +82,7 @@ OpenSSL  -  Frequently Asked Questions
 * Which is the current version of OpenSSL?
 
 The current version is available from <URL: http://www.openssl.org>.
-OpenSSL 1.0.0f was released on Jan 4th, 2012.
+OpenSSL 1.0.1 was released on Mar 14th, 2012.
 
 In addition to the current stable release, you can also access daily
 snapshots of the OpenSSL development version at <URL:
diff --git a/NEWS b/NEWS
index 82a6c85443..a46361198d 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,19 @@
   This file gives a brief overview of the major changes between each OpenSSL
   release. For more details please read the CHANGES file.
 
+  Major changes between OpenSSL 1.0.0h and OpenSSL 1.0.1:
+
+      o TLS/DTLS heartbeat support.
+      o SCTP support.
+      o RFC 5705 TLS key material exporter.
+      o RFC 5764 DTLS-SRTP negotiation.
+      o Next Protocol Negotiation.
+      o PSS signatures in certificates, requests and CRLs.
+      o Support for password based recipient info for CMS.
+      o Support TLS v1.2 and TLS v1.1.
+      o Preliminary FIPS capability for unvalidated 2.0 FIPS module.
+      o SRP support.
+
   Major changes between OpenSSL 1.0.0g and OpenSSL 1.0.0h:
 
       o Fix for CMS/PKCS#7 MMA CVE-2012-0884
diff --git a/apps/s_client.c b/apps/s_client.c
index ce199be81b..30588ccf66 100644
--- a/apps/s_client.c
+++ b/apps/s_client.c
@@ -1209,6 +1209,21 @@ bad:
 #endif
 
 	con=SSL_new(ctx);
+#if 0
+{
+int curves[3];
+int rv;
+curves[0] = EC_curve_nist2nid("P-256");
+curves[1] = EC_curve_nist2nid("P-521");
+curves[2] = EC_curve_nist2nid("P-384");
+rv = SSL_set1_curvelist(con, curves, sizeof(curves)/sizeof(int));
+if (rv == 0)
+	{
+	fprintf(stderr, "Error setting curve list\n");
+	exit(1);
+	}
+}
+#endif
 	if (sess_in)
 		{
 		SSL_SESSION *sess;
diff --git a/ssl/s3_lib.c b/ssl/s3_lib.c
index 248bb94df8..e9addc4e58 100644
--- a/ssl/s3_lib.c
+++ b/ssl/s3_lib.c
@@ -3391,6 +3391,94 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
 		return (int)clistlen;
 		}
 
+	case SSL_CTRL_SET_CURVELIST:
+		{
+		int *nid_list = parg;
+		size_t nid_listlen = larg, i;
+		unsigned char *clist, *p;
+		/* Bitmap of curves included to detect duplicates: only works
+		 * while curve ids < 32 
+		 */
+		unsigned long dup_list = 0;
+		clist = OPENSSL_malloc(nid_listlen * 2);
+		for (i = 0, p = clist; i < nid_listlen; i++)
+			{
+			unsigned long idmask;
+			int id;
+			id = tls1_ec_nid2curve_id(nid_list[i]);
+			idmask = 1L << id;
+			if (!id || (dup_list & idmask))
+				{
+				OPENSSL_free(clist);
+				return 0;
+				}
+			dup_list |= idmask;
+			s2n(id, p);
+			}
+		if (s->tlsext_ellipticcurvelist)
+			OPENSSL_free(s->tlsext_ellipticcurvelist);
+		s->tlsext_ellipticcurvelist = clist;
+		s->tlsext_ellipticcurvelist_length = nid_listlen * 2;
+		return 1;
+		}
+
+	case SSL_CTRL_SHARED_CURVES:
+		{
+		unsigned long mask = 0;
+		unsigned char *pmask, *pref;
+		size_t pmasklen, preflen, i;
+		int nmatch = 0;
+		/* Must be server */
+		if (!s->server)
+			return 0;
+		/* No curves if client didn't sent supported curves extension */
+		if (!s->session->tlsext_ellipticcurvelist)
+			return 0;
+		if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE)
+			{
+			pref = s->tlsext_ellipticcurvelist;
+			preflen = s->tlsext_ellipticcurvelist_length;
+			pmask = s->session->tlsext_ellipticcurvelist;
+			pmasklen = s->session->tlsext_ellipticcurvelist_length;
+			}
+		else
+			{
+			pref = s->session->tlsext_ellipticcurvelist;
+			preflen = s->session->tlsext_ellipticcurvelist_length;
+			pmask = s->tlsext_ellipticcurvelist;
+			pmasklen = s->tlsext_ellipticcurvelist_length;
+			}
+		/* Build a mask of supported curves */
+		for (i = 0; i < pmasklen; i+=2, pmask+=2)
+			{
+			/* Skip any curves that wont fit in mask */
+			if (pmask[0] || (pmask[1] > 31))
+				continue;
+			mask |= 1L << pmask[1];
+			}
+		/* Check preference order against mask */
+		for (i = 0; i < preflen; i+=2, pref+=2)
+			{
+			if (pref[0] || (pref[1] > 30))
+				continue;
+			/* Search for matching curves in preference order */
+			if (mask & (1L << pref[1]))
+				{
+				int id = tls1_ec_curve_id2nid(pref[1]);
+				if (id && parg && nmatch == larg)
+					{
+					*((int *)parg) = id;
+					return 1;
+					}
+				nmatch++;
+				}
+			}
+		if (parg)
+			return 0;
+		return nmatch;
+
+		}
+
 	default:
 		break;
 		}
diff --git a/ssl/ssl.h b/ssl/ssl.h
index 3e255fcfee..4215dda89e 100644
--- a/ssl/ssl.h
+++ b/ssl/ssl.h
@@ -1619,6 +1619,8 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
 #define SSL_CTRL_CHAIN_CERT			89
 
 #define SSL_CTRL_GET_CURVELIST			90
+#define SSL_CTRL_SET_CURVELIST			91
+#define SSL_CTRL_SHARED_CURVES			92
 
 #define DTLSv1_get_timeout(ssl, arg) \
 	SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)arg)
@@ -1680,6 +1682,8 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
 	SSL_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)x509)
 #define SSL_get1_curvelist(ctx, s) \
 	SSL_ctrl(ctx,SSL_CTRL_GET_CURVELIST,0,(char *)s)
+#define SSL_set1_curvelist(ctx, clist, clistlen) \
+	SSL_ctrl(ctx,SSL_CTRL_SET_CURVELIST,clistlen,(char *)clist)
 
 
 #ifndef OPENSSL_NO_BIO
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
index dfd397f9b7..33c0b654d6 100644
--- a/ssl/t1_lib.c
+++ b/ssl/t1_lib.c
@@ -1678,20 +1678,26 @@ int ssl_prepare_clienthello_tlsext(SSL *s)
 		s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
 
 		/* we support all named elliptic curves in draft-ietf-tls-ecc-12 */
-		if (s->tlsext_ellipticcurvelist != NULL) OPENSSL_free(s->tlsext_ellipticcurvelist);
-		s->tlsext_ellipticcurvelist_length = sizeof(pref_list)/sizeof(pref_list[0]) * 2;
-		if ((s->tlsext_ellipticcurvelist = OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL)
+		if (s->tlsext_ellipticcurvelist == NULL)
 			{
+			unsigned char *clist;
+			size_t clistlen;
 			s->tlsext_ellipticcurvelist_length = 0;
-			SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
-			return -1;
-			}
-		for (i = 0, j = s->tlsext_ellipticcurvelist; (unsigned int)i <
-				sizeof(pref_list)/sizeof(pref_list[0]); i++)
-			{
-			int id = tls1_ec_nid2curve_id(pref_list[i]);
-			s2n(id,j);
-			}
+			clistlen = sizeof(pref_list)/sizeof(pref_list[0]) * 2;
+			clist = OPENSSL_malloc(clistlen);
+			if (!clist)
+				{
+				SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
+				return -1;
+				}
+			for (i = 0, j = clist; i < (int)clistlen/2; i++)
+				{
+				int id = tls1_ec_nid2curve_id(pref_list[i]);
+				s2n(id,j);
+				}
+			s->tlsext_ellipticcurvelist = clist;
+			s->tlsext_ellipticcurvelist_length = clistlen;
+			}	
 		}
 #endif /* OPENSSL_NO_EC */