[exim-cvs] TLS1.2 and TLS1.1 support with GnuTLS

Top Page
Delete this message
Reply to this message
Author: Exim Git Commits Mailing List
Date:  
To: exim-cvs
Subject: [exim-cvs] TLS1.2 and TLS1.1 support with GnuTLS
Gitweb: http://git.exim.org/exim.git/commitdiff/c566dd90401a8b20b873644e3cdab175f1e86ede
Commit:     c566dd90401a8b20b873644e3cdab175f1e86ede
Parent:     eb02738d2e3fe3fc140781d90f776a4e7bf04c08
Author:     Phil Pennock <pdp@???>
AuthorDate: Sat Sep 24 01:30:34 2011 -0400
Committer:  Phil Pennock <pdp@???>
CommitDate: Sat Sep 24 01:30:34 2011 -0400


    TLS1.2 and TLS1.1 support with GnuTLS
---
 doc/doc-docbook/spec.xfpt |   10 ++++++++--
 doc/doc-txt/ChangeLog     |    3 +++
 src/README.UPDATING       |   10 ++++++++++
 src/src/tls-gnu.c         |   34 ++++++++++++++++++++++++++++++++--
 4 files changed, 53 insertions(+), 4 deletions(-)


diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index d18b09d..51c9b8b 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -24595,8 +24595,14 @@ DHE_DSS). The default list contains RSA, DHE_DSS, DHE_RSA.
For &%gnutls_require_mac%&, the recognized names are SHA (synonym SHA1), and
MD5. The default list contains SHA, MD5.

-For &%gnutls_require_protocols%&, the recognized names are TLS1 and SSL3.
-The default list contains TLS1, SSL3.
+.new
+For &%gnutls_require_protocols%&, the recognized names are TLS1.2, TLS1.1,
+TLS1.0, (TLS1) and SSL3.
+The default list contains TLS1.2, TLS1.1, TLS1.0, SSL3.
+TLS1 is an alias for TLS1.0, for backwards compatibility.
+For sufficiently old versions of the GnuTLS library, TLS1.2 or TLS1.1 might
+not be supported and will not be recognised by Exim.
+.wen

 In a server, the order of items in these lists is unimportant. The server
 advertises the availability of all the relevant cipher suites. However, in a
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index b0d6b06..c1362b1 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -112,6 +112,9 @@ PP/08 Handle ${run} returning more data than OS pipe buffer size.
 PP/09 Handle IPv6 addresses with SPF.
       Bugzilla 860.  Patch from Wolfgang Breyha.


+PP/10 GnuTLS: support TLS 1.2 & 1.1.
+      Bugzilla 1156.
+


Exim version 4.76
-----------------
diff --git a/src/README.UPDATING b/src/README.UPDATING
index 2f6e576..fadf59a 100644
--- a/src/README.UPDATING
+++ b/src/README.UPDATING
@@ -26,6 +26,16 @@ The rest of this document contains information about changes in 4.xx releases
that might affect a running system.


+Exim version 4.77
+-----------------
+
+ * GnuTLS will now attempt to use TLS 1.2 and TLS 1.1 before TLS 1.0 and SSL3,
+ if supported by your GnuTLS library. Use the existing
+ "gnutls_require_protocols" option to downgrade this if that will be a
+ problem. Prior to this release, supported values were "TLS1" and "SSL3",
+ so you should be able to update configuration prior to update.
+
+
Exim version 4.74
-----------------

diff --git a/src/src/tls-gnu.c b/src/src/tls-gnu.c
index bf10526..4de9d4f 100644
--- a/src/src/tls-gnu.c
+++ b/src/src/tls-gnu.c
@@ -12,6 +12,13 @@ is based on a patch that was contributed by Nikos Mavroyanopoulos.
No cryptographic code is included in Exim. All this module does is to call
functions from the GnuTLS library. */

+/* Note: This appears to be using an old API from compat.h; it is likely that
+someone familiary with GnuTLS programming could rework a lot of this to a
+modern API and perhaps remove the explicit knowledge of crypto algorithms from
+Exim. Such a re-work would be most welcome and we'd sacrifice support for
+older GnuTLS releases without too many qualms -- maturity and experience
+in crypto libraries tends to improve their robustness against attack.
+Frankly, if you maintain it, you decide what's supported and what isn't. */

/* Heading stuff for GnuTLS */

@@ -46,6 +53,13 @@ static int verify_requirement;
and space into which it can be copied and altered. */

static const int default_proto_priority[16] = {
+ /* These are gnutls_protocol_t enum values */
+#if GNUTLS_VERSION_MAJOR > 1 || GNUTLS_VERSION_MINOR >= 7
+ GNUTLS_TLS1_2,
+#endif
+#if GNUTLS_VERSION_MAJOR > 1 || GNUTLS_VERSION_MINOR >= 2
+ GNUTLS_TLS1_1,
+#endif
GNUTLS_TLS1,
GNUTLS_SSL3,
0 };
@@ -89,11 +103,27 @@ typedef struct pri_item {
} pri_item;


-static int tls1_codes[] = { GNUTLS_TLS1, 0 };
+#if GNUTLS_VERSION_MAJOR > 1 || GNUTLS_VERSION_MINOR >= 7
+static int tls1_2_codes[] = { GNUTLS_TLS1_2, 0 };
+#endif
+#if GNUTLS_VERSION_MAJOR > 1 || GNUTLS_VERSION_MINOR >= 2
+static int tls1_1_codes[] = { GNUTLS_TLS1_1, 0 };
+#endif
+/* more recent libraries define this as an equivalent value to the
+canonical GNUTLS_TLS1_0; since they're the same, we stick to the
+older name. */
+static int tls1_0_codes[] = { GNUTLS_TLS1, 0 };
static int ssl3_codes[] = { GNUTLS_SSL3, 0 };

static pri_item proto_index[] = {
- { US"TLS1", tls1_codes },
+#if GNUTLS_VERSION_MAJOR > 1 || GNUTLS_VERSION_MINOR >= 7
+ { US"TLS1.2", tls1_2_codes },
+#endif
+#if GNUTLS_VERSION_MAJOR > 1 || GNUTLS_VERSION_MINOR >= 2
+ { US"TLS1.1", tls1_1_codes },
+#endif
+ { US"TLS1.0", tls1_0_codes },
+ { US"TLS1", tls1_0_codes },
{ US"SSL3", ssl3_codes }
};