Bug#930491: unblock: gnutls28/3.6.7-4

Andreas Metzler ametzler at bebt.de
Thu Jun 13 18:13:22 BST 2019


Package: release.debian.org
Severity: normal
User: release.debian.org at packages.debian.org
Usertags: unblock

Please unblock package gnutls28. This upload cherry-picks the
recommended fixes[1] from upstream latest stable release (3.6.8) and fixes
#929907.

+ 40_rel3.6.8_01-gnutls_srp_entry_free-follow-consistent-behavior-in.patch
  The gnutls_srp_set_server_credentials_function can be used with the 8192
  parameters as well.
  https://gitlab.com/gnutls/gnutls/issues/761
+ 40_rel3.6.8_05-lib-nettle-fix-carry-flag-in-Streebog-code.patch
  Fix calculation of Streebog digests (incorrect carry operation in
  512 bit addition).
+ 40_rel3.6.8_10-ext-record_size_limit-distinguish-sending-and-receiv.patch
  Fix compatibility of GnuTLS 3.6.[456] server with GnuTLS 3.6.7 client.
  Closes: #929907
+ 40_rel3.6.8_15-Apply-STD3-ASCII-rules-in-gnutls_idna_map.patch
  Apply STD3 ASCII rules in gnutls_idna_map() to prevent hostname/domain
  crafting via IDNA conversion.
  https://gitlab.com/gnutls/gnutls/issues/720
+ 40_rel3.6.8_20-pubkey-remove-deprecated-TLS1_RSA-flag-check.patch
  Fixed bug preventing the use of gnutls_pubkey_verify_data2() and
  gnutls_pubkey_verify_hash2() with the GNUTLS_VERIFY_DISABLE_CA_SIGN
  flag.
  https://gitlab.com/gnutls/gnutls/issues/754

(explain the reason for the unblock here)

(include/attach the debdiff against the package in testing)

unblock gnutls28/3.6.7-4

cu Andreas

[1] https://lists.gnutls.org/pipermail/gnutls-help/2019-June/004552.html
I have left out the fix for the DH security hardening measure in this
upload as adds new symbols.
-------------- next part --------------
[The following lists of changes regard files as different if they have
different names, permissions or owners.]

Files only in first set of .debs, found in package libgnutls-dane0-dbgsym
-------------------------------------------------------------------------
-rw-r--r--  root/root   /usr/lib/debug/.build-id/d5/67cd17694664c4204ff158450183359925afb1.debug

Files only in first set of .debs, found in package libgnutls-openssl27-dbgsym
-----------------------------------------------------------------------------
-rw-r--r--  root/root   /usr/lib/debug/.build-id/6c/cd7f2e8735b2f7448f0757271b8413bbaac807.debug

Files only in first set of .debs, found in package libgnutls30-dbgsym
---------------------------------------------------------------------
-rw-r--r--  root/root   /usr/lib/debug/.build-id/fe/becd51bb621afd4a8f0352f55d6c2ed96df57a.debug

New files in second set of .debs, found in package libgnutls-dane0-dbgsym
-------------------------------------------------------------------------
-rw-r--r--  root/root   /usr/lib/debug/.build-id/d3/28298de34135fca5f236357f2f2dd56cb109f3.debug

New files in second set of .debs, found in package libgnutls-openssl27-dbgsym
-----------------------------------------------------------------------------
-rw-r--r--  root/root   /usr/lib/debug/.build-id/fe/4c3c0c38af44779c38ae5d1e187b6250f7afe0.debug

New files in second set of .debs, found in package libgnutls30-dbgsym
---------------------------------------------------------------------
-rw-r--r--  root/root   /usr/lib/debug/.build-id/4d/66d28cd2e7537e1e1d2905595b260226b22ad2.debug


Control files of package gnutls-bin: lines which differ (wdiff format)
----------------------------------------------------------------------
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package gnutls-bin-dbgsym: lines which differ (wdiff format)
-----------------------------------------------------------------------------
Depends: gnutls-bin (= [-3.6.7-3)-] {+3.6.7-4)+}
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package gnutls-doc: lines which differ (wdiff format)
----------------------------------------------------------------------
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package libgnutls-dane0: lines which differ (wdiff format)
---------------------------------------------------------------------------
Depends: libgnutls30 (= [-3.6.7-3),-] {+3.6.7-4),+} libc6 (>= 2.14), libunbound8 (>= 1.8.0)
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package libgnutls-dane0-dbgsym: lines which differ (wdiff format)
----------------------------------------------------------------------------------
Build-Ids: [-d567cd17694664c4204ff158450183359925afb1-] {+d328298de34135fca5f236357f2f2dd56cb109f3+}
Depends: libgnutls-dane0 (= [-3.6.7-3)-] {+3.6.7-4)+}
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package libgnutls-openssl27: lines which differ (wdiff format)
-------------------------------------------------------------------------------
Depends: libgnutls30 (= [-3.6.7-3),-] {+3.6.7-4),+} libc6 (>= 2.14)
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package libgnutls-openssl27-dbgsym: lines which differ (wdiff format)
--------------------------------------------------------------------------------------
Build-Ids: [-6ccd7f2e8735b2f7448f0757271b8413bbaac807-] {+fe4c3c0c38af44779c38ae5d1e187b6250f7afe0+}
Depends: libgnutls-openssl27 (= [-3.6.7-3)-] {+3.6.7-4)+}
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package libgnutls28-dev: lines which differ (wdiff format)
---------------------------------------------------------------------------
Depends: libc6-dev | libc-dev, libgnutls-dane0 (= [-3.6.7-3),-] {+3.6.7-4),+} libgnutls-openssl27 (= [-3.6.7-3),-] {+3.6.7-4),+} libgnutls30 (= [-3.6.7-3),-] {+3.6.7-4),+} libgnutlsxx28 (= [-3.6.7-3),-] {+3.6.7-4),+} libidn2-dev, libp11-kit-dev (>= 0.23.10), libtasn1-6-dev, nettle-dev (>= 3.4.1~rc1)
Installed-Size: [-4312-] {+4313+}
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package libgnutls30: lines which differ (wdiff format)
-----------------------------------------------------------------------
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package libgnutls30-dbgsym: lines which differ (wdiff format)
------------------------------------------------------------------------------
Build-Ids: [-febecd51bb621afd4a8f0352f55d6c2ed96df57a-] {+4d66d28cd2e7537e1e1d2905595b260226b22ad2+}
Depends: libgnutls30 (= [-3.6.7-3)-] {+3.6.7-4)+}
Installed-Size: [-4058-] {+4061+}
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package libgnutlsxx28: lines which differ (wdiff format)
-------------------------------------------------------------------------
Depends: libgnutls30 (= [-3.6.7-3),-] {+3.6.7-4),+} libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 5)
Version: [-3.6.7-3-] {+3.6.7-4+}

Control files of package libgnutlsxx28-dbgsym: lines which differ (wdiff format)
--------------------------------------------------------------------------------
Depends: libgnutlsxx28 (= [-3.6.7-3)-] {+3.6.7-4)+}
Version: [-3.6.7-3-] {+3.6.7-4+}
diff -Nru gnutls28-3.6.7/debian/changelog gnutls28-3.6.7/debian/changelog
--- gnutls28-3.6.7/debian/changelog	2019-05-19 10:48:52.000000000 +0200
+++ gnutls28-3.6.7/debian/changelog	2019-06-12 19:21:23.000000000 +0200
@@ -1,3 +1,28 @@
+gnutls28 (3.6.7-4) unstable; urgency=medium
+
+  * Cherry-pick important bug-fixes from 3.6.8:
+    + 40_rel3.6.8_01-gnutls_srp_entry_free-follow-consistent-behavior-in.patch
+      The gnutls_srp_set_server_credentials_function can be used with the 8192
+      parameters as well.
+      https://gitlab.com/gnutls/gnutls/issues/761
+    + 40_rel3.6.8_05-lib-nettle-fix-carry-flag-in-Streebog-code.patch
+      Fix calculation of Streebog digests (incorrect carry operation in
+      512 bit addition).
+    + 40_rel3.6.8_10-ext-record_size_limit-distinguish-sending-and-receiv.patch
+      Fix compatibility of GnuTLS 3.6.[456] server with GnuTLS 3.6.7 client.
+      Closes: #929907
+    + 40_rel3.6.8_15-Apply-STD3-ASCII-rules-in-gnutls_idna_map.patch
+      Apply STD3 ASCII rules in gnutls_idna_map() to prevent hostname/domain
+      crafting via IDNA conversion.
+      https://gitlab.com/gnutls/gnutls/issues/720
+    + 40_rel3.6.8_20-pubkey-remove-deprecated-TLS1_RSA-flag-check.patch
+      Fixed bug preventing the use of gnutls_pubkey_verify_data2() and
+      gnutls_pubkey_verify_hash2() with the GNUTLS_VERIFY_DISABLE_CA_SIGN
+      flag.
+      https://gitlab.com/gnutls/gnutls/issues/754
+
+ -- Andreas Metzler <ametzler at debian.org>  Wed, 12 Jun 2019 19:21:23 +0200
+
 gnutls28 (3.6.7-3) unstable; urgency=medium
 
   * Revert debhelper upgrade, use DH 10.
diff -Nru gnutls28-3.6.7/debian/patches/40_rel3.6.8_01-gnutls_srp_entry_free-follow-consistent-behavior-in.patch gnutls28-3.6.7/debian/patches/40_rel3.6.8_01-gnutls_srp_entry_free-follow-consistent-behavior-in.patch
--- gnutls28-3.6.7/debian/patches/40_rel3.6.8_01-gnutls_srp_entry_free-follow-consistent-behavior-in.patch	1970-01-01 01:00:00.000000000 +0100
+++ gnutls28-3.6.7/debian/patches/40_rel3.6.8_01-gnutls_srp_entry_free-follow-consistent-behavior-in.patch	2019-06-12 19:21:15.000000000 +0200
@@ -0,0 +1,65 @@
+From 0bdca5d51f203cf414d645e75ac197e3fadfadc8 Mon Sep 17 00:00:00 2001
+From: Nikos Mavrogiannopoulos <nmav at gnutls.org>
+Date: Fri, 10 May 2019 06:30:12 +0200
+Subject: [PATCH] _gnutls_srp_entry_free: follow consistent behavior in freeing
+ data
+
+_gnutls_srp_entry_free would previously not free any parameters that
+were known to gnutls to account for documented behavior of
+gnutls_srp_set_server_credentials_function(). This was not updated
+when the newly added 8192 parameter was added to the library.
+
+This introduces a safety check for generator parameters, even though
+in practice they are the same pointer.
+
+Resolves: #761
+
+Signed-off-by: Nikos Mavrogiannopoulos <nmav at gnutls.org>
+---
+ NEWS                  |  3 +++
+ lib/auth/srp_passwd.c | 12 ++++++++----
+ 2 files changed, 11 insertions(+), 4 deletions(-)
+
+--- a/NEWS
++++ b/NEWS
+@@ -47,6 +47,9 @@ See the end for copying conditions.
+ 
+ ** gnutls-cli: Added option --logfile to redirect informational messages output.
+ 
++** libgnutls: the gnutls_srp_set_server_credentials_function can be used
++   with the 8192 parameters as well (#995).
++
+ ** API and ABI modifications:
+ No changes since last version.
+ 
+--- a/lib/auth/srp_passwd.c
++++ b/lib/auth/srp_passwd.c
+@@ -447,20 +447,24 @@ void _gnutls_srp_entry_free(SRP_PWD_ENTR
+ 	_gnutls_free_key_datum(&entry->v);
+ 	_gnutls_free_datum(&entry->salt);
+ 
+-	if ((entry->g.data != gnutls_srp_1024_group_generator.data)
+-	    && (entry->g.data != gnutls_srp_3072_group_generator.data))
++	if ((entry->g.data != gnutls_srp_1024_group_generator.data) &&
++	    (entry->g.data != gnutls_srp_1536_group_generator.data) &&
++	    (entry->g.data != gnutls_srp_2048_group_generator.data) &&
++	    (entry->g.data != gnutls_srp_3072_group_generator.data) &&
++	    (entry->g.data != gnutls_srp_4096_group_generator.data) &&
++	    (entry->g.data != gnutls_srp_8192_group_generator.data))
+ 		_gnutls_free_datum(&entry->g);
+ 
+ 	if (entry->n.data != gnutls_srp_1024_group_prime.data &&
+ 	    entry->n.data != gnutls_srp_1536_group_prime.data &&
+ 	    entry->n.data != gnutls_srp_2048_group_prime.data &&
+ 	    entry->n.data != gnutls_srp_3072_group_prime.data &&
+-	    entry->n.data != gnutls_srp_4096_group_prime.data)
++	    entry->n.data != gnutls_srp_4096_group_prime.data &&
++	    entry->n.data != gnutls_srp_8192_group_prime.data)
+ 		_gnutls_free_datum(&entry->n);
+ 
+ 	gnutls_free(entry->username);
+ 	gnutls_free(entry);
+ }
+ 
+-
+ #endif				/* ENABLE SRP */
diff -Nru gnutls28-3.6.7/debian/patches/40_rel3.6.8_05-lib-nettle-fix-carry-flag-in-Streebog-code.patch gnutls28-3.6.7/debian/patches/40_rel3.6.8_05-lib-nettle-fix-carry-flag-in-Streebog-code.patch
--- gnutls28-3.6.7/debian/patches/40_rel3.6.8_05-lib-nettle-fix-carry-flag-in-Streebog-code.patch	1970-01-01 01:00:00.000000000 +0100
+++ gnutls28-3.6.7/debian/patches/40_rel3.6.8_05-lib-nettle-fix-carry-flag-in-Streebog-code.patch	2019-06-12 19:21:15.000000000 +0200
@@ -0,0 +1,81 @@
+From c1441665abe761536b3ed67d36b12f2198be6b12 Mon Sep 17 00:00:00 2001
+From: Dmitry Eremin-Solenikov <dbaryshkov at gmail.com>
+Date: Tue, 7 May 2019 14:49:05 +0300
+Subject: [PATCH] lib/nettle: fix carry flag in Streebog code
+
+Fix carry flag being calculated incorrectly in Streebog code.
+
+Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov at gmail.com>
+---
+ NEWS                       |  3 +++
+ lib/crypto-selftests.c     | 16 ++++++++++++++++
+ lib/nettle/gost/streebog.c | 12 +++++++-----
+ 3 files changed, 26 insertions(+), 5 deletions(-)
+
+--- a/NEWS
++++ b/NEWS
+@@ -50,6 +50,9 @@ See the end for copying conditions.
+ ** libgnutls: the gnutls_srp_set_server_credentials_function can be used
+    with the 8192 parameters as well (#995).
+ 
++** libgnutls: Fix calculation of Streebog digests (incorrect carry operation in
++   512 bit addition)
++
+ ** API and ABI modifications:
+ No changes since last version.
+ 
+--- a/lib/crypto-selftests.c
++++ b/lib/crypto-selftests.c
+@@ -1239,6 +1239,22 @@ const struct hash_vectors_st streebog_51
+ 		"\x03\x5f\xe8\x35\x49\xad\xa2\xb8\x62\x0f\xcd\x7c\x49\x6c\xe5\xb3"
+ 		"\x3f\x0c\xb9\xdd\xdc\x2b\x64\x60\x14\x3b\x03\xda\xba\xc9\xfb\x28"),
+ 	},
++	{
++            STR(plaintext, plaintext_size,
++		"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
++		"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
++		"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
++		"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
++		"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
++		"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
++		"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
++		"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"),
++            STR(output, output_size,
++		"\x90\xa1\x61\xd1\x2a\xd3\x09\x49\x8d\x3f\xe5\xd4\x82\x02\xd8\xa4"
++		"\xe9\xc4\x06\xd6\xa2\x64\xae\xab\x25\x8a\xc5\xec\xc3\x7a\x79\x62"
++		"\xaa\xf9\x58\x7a\x5a\xbb\x09\xb6\xbb\x81\xec\x4b\x37\x52\xa3\xff"
++		"\x5a\x83\x8e\xf1\x75\xbe\x57\x72\x05\x6b\xc5\xfe\x54\xfc\xfc\x7e"),
++	},
+ };
+ 
+ /* GOST R 34.11-2012 */
+--- a/lib/nettle/gost/streebog.c
++++ b/lib/nettle/gost/streebog.c
+@@ -1200,7 +1200,7 @@ static void
+ streebog512_compress (struct streebog512_ctx *ctx, const uint8_t *input, size_t count)
+ {
+   uint64_t M[8];
+-  uint64_t l;
++  uint64_t l, cf;
+   int i;
+ 
+   for (i = 0; i < 8; i++, input += 8)
+@@ -1219,12 +1219,14 @@ streebog512_compress (struct streebog512
+         }
+     }
+ 
++  cf = 0;
+   ctx->sigma[0] += M[0];
+   for (i = 1; i < 8; i++)
+-    if (ctx->sigma[i-1] < M[i-1])
+-      ctx->sigma[i] += M[i] + 1;
+-    else
+-      ctx->sigma[i] += M[i];
++    {
++      if (ctx->sigma[i-1] != M[i-1])
++	cf = (ctx->sigma[i-1] < M[i-1]);
++      ctx->sigma[i] += M[i] + cf;
++    }
+ }
+ 
+ static void
diff -Nru gnutls28-3.6.7/debian/patches/40_rel3.6.8_10-ext-record_size_limit-distinguish-sending-and-receiv.patch gnutls28-3.6.7/debian/patches/40_rel3.6.8_10-ext-record_size_limit-distinguish-sending-and-receiv.patch
--- gnutls28-3.6.7/debian/patches/40_rel3.6.8_10-ext-record_size_limit-distinguish-sending-and-receiv.patch	1970-01-01 01:00:00.000000000 +0100
+++ gnutls28-3.6.7/debian/patches/40_rel3.6.8_10-ext-record_size_limit-distinguish-sending-and-receiv.patch	2019-06-12 19:21:15.000000000 +0200
@@ -0,0 +1,312 @@
+From 2dc96e3b8d0e043bebf0815edaaa945f66ac0531 Mon Sep 17 00:00:00 2001
+From: Daiki Ueno <dueno at redhat.com>
+Date: Thu, 25 Apr 2019 17:08:43 +0200
+Subject: [PATCH] ext/record_size_limit: distinguish sending and receiving
+ limits
+
+The previous behavior was that both sending and receiving limits are
+negotiated to be the same value.  It was problematic when:
+
+- client sends a record_size_limit with a large value in CH
+- server sends a record_size_limit with a smaller value in EE
+- client updates the limit for both sending and receiving, upon
+  receiving EE
+- server sends a Certificate message larger than the limit
+
+With this patch, each peer maintains the sending / receiving limits
+separately so not to confuse with the contradicting settings.
+
+Andreas Metzler for Debian upload:
+Strip out addition of gnutls_record_set_max_recv_size() to the API from
+this patchset.
+
+--- a/lib/constate.c
++++ b/lib/constate.c
+@@ -821,14 +821,12 @@ int _gnutls_write_connection_state_init(
+ 	    session->security_parameters.epoch_next;
+ 	int ret;
+ 
+-	/* reset max_record_recv_size if it was negotiated in the
++	/* reset max_record_send_size if it was negotiated in the
+ 	 * previous handshake using the record_size_limit extension */
+-	if (session->security_parameters.max_record_recv_size !=
+-	    session->security_parameters.max_record_send_size &&
+-	    !(session->internals.hsk_flags & HSK_RECORD_SIZE_LIMIT_NEGOTIATED) &&
++	if (!(session->internals.hsk_flags & HSK_RECORD_SIZE_LIMIT_NEGOTIATED) &&
+ 	    session->security_parameters.entity == GNUTLS_SERVER)
+-		session->security_parameters.max_record_recv_size =
+-			session->security_parameters.max_record_send_size;
++		session->security_parameters.max_record_send_size =
++			session->security_parameters.max_user_record_send_size;
+ 
+ /* Update internals from CipherSuite selected.
+  * If we are resuming just copy the connection session
+--- a/lib/dtls.c
++++ b/lib/dtls.c
+@@ -65,8 +65,8 @@ transmit_message(gnutls_session_t sessio
+ 	unsigned int mtu =
+ 	    gnutls_dtls_get_data_mtu(session);
+ 
+-	if (session->security_parameters.max_record_recv_size < mtu)
+-		mtu = session->security_parameters.max_record_recv_size;
++	if (session->security_parameters.max_record_send_size < mtu)
++		mtu = session->security_parameters.max_record_send_size;
+ 
+ 	mtu -= DTLS_HANDSHAKE_HEADER_SIZE;
+ 
+--- a/lib/ext/max_record.c
++++ b/lib/ext/max_record.c
+@@ -105,11 +105,13 @@ _gnutls_max_record_recv_params(gnutls_se
+ 			}
+ 
+ 			if (new_size != session->security_parameters.
+-			    max_record_send_size) {
++			    max_user_record_send_size) {
+ 				gnutls_assert();
+ 				return GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
+ 			} else {
+ 				session->security_parameters.
++				    max_record_send_size = new_size;
++				session->security_parameters.
+ 				    max_record_recv_size = new_size;
+ 			}
+ 
+@@ -132,11 +134,18 @@ _gnutls_max_record_send_params(gnutls_se
+ 
+ 	/* this function sends the client extension data (dnsname) */
+ 	if (session->security_parameters.entity == GNUTLS_CLIENT) {
+-		if (session->security_parameters.max_record_send_size !=
++		/* if the user limits for sending and receiving are
++		 * different, that means the programmer had chosen to
++		 * use record_size_limit instead */
++		if (session->security_parameters.max_user_record_send_size !=
++		    session->security_parameters.max_user_record_recv_size)
++			return 0;
++
++		if (session->security_parameters.max_user_record_send_size !=
+ 		    DEFAULT_MAX_RECORD_SIZE) {
+ 			ret = _gnutls_mre_record2num
+ 			      (session->security_parameters.
+-			       max_record_send_size);
++			       max_user_record_send_size);
+ 
+ 			/* it's not an error, as long as we send the
+ 			 * record_size_limit extension with that value */
+@@ -239,23 +248,18 @@ size_t gnutls_record_get_max_size(gnutls
+  * @session: is a #gnutls_session_t type.
+  * @size: is the new size
+  *
+- * This function sets the maximum record packet size in this
+- * connection.
+- *
+- * The requested record size does get in effect immediately only while
+- * sending data. The receive part will take effect after a successful
+- * handshake.
++ * This function sets the maximum amount of plaintext sent and
++ * received in a record in this connection.
+  *
+  * Prior to 3.6.4, this function was implemented using a TLS extension
+- * called 'max record size', which limits the acceptable values to
+- * 512(=2^9), 1024(=2^10), 2048(=2^11) and 4096(=2^12). Since 3.6.4,
+- * it uses another TLS extension called 'record size limit', which
+- * doesn't have the limitation, as long as the value ranges between
+- * 512 and 16384.  Note that not all TLS implementations use or even
+- * understand those extension.
++ * called 'max fragment length', which limits the acceptable values to
++ * 512(=2^9), 1024(=2^10), 2048(=2^11) and 4096(=2^12).
+  *
+- * In TLS 1.3, the value is the length of plaintext content plus its
+- * padding, excluding content type octet.
++ * Since 3.6.4, the limit is also negotiated through a new TLS
++ * extension called 'record size limit', which doesn't have the
++ * limitation, as long as the value ranges between 512 and 16384.
++ * Note that while the 'record size limit' extension is preferred, not
++ * all TLS implementations use or even understand the extension.
+  *
+  * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned,
+  *   otherwise a negative error code is returned.
+@@ -265,7 +269,11 @@ ssize_t gnutls_record_set_max_size(gnutl
+ 	if (size < MIN_RECORD_SIZE || size > DEFAULT_MAX_RECORD_SIZE)
+ 		return GNUTLS_E_INVALID_REQUEST;
+ 
+-	session->security_parameters.max_record_send_size = size;
++	if (session->internals.handshake_in_progress)
++		return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
++
++	session->security_parameters.max_user_record_send_size = size;
++	session->security_parameters.max_user_record_recv_size = size;
+ 
+ 	return 0;
+ }
+--- a/lib/ext/record_size_limit.c
++++ b/lib/ext/record_size_limit.c
+@@ -81,6 +81,12 @@ _gnutls_record_size_limit_recv_params(gn
+ 
+ 	session->internals.hsk_flags |= HSK_RECORD_SIZE_LIMIT_NEGOTIATED;
+ 
++	/* client uses the reception of this extension as an
++	 * indication of the request was accepted by the server */
++	if (session->security_parameters.entity == GNUTLS_CLIENT)
++		session->security_parameters.max_record_recv_size =
++			session->security_parameters.max_user_record_recv_size;
++
+ 	_gnutls_handshake_log("EXT[%p]: record_size_limit %u negotiated\n",
+ 			      session, (unsigned)new_size);
+ 
+@@ -89,9 +95,9 @@ _gnutls_record_size_limit_recv_params(gn
+ 	if (unlikely(vers == NULL))
+ 		return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+ 
+-	session->security_parameters.max_record_recv_size =
++	session->security_parameters.max_record_send_size =
+ 		MIN(new_size - vers->tls13_sem,
+-		    session->security_parameters.max_record_send_size);
++		    session->security_parameters.max_user_record_send_size);
+ 
+ 	return 0;
+ }
+@@ -105,11 +111,11 @@ _gnutls_record_size_limit_send_params(gn
+ 	int ret;
+ 	uint16_t send_size;
+ 
+-	assert(session->security_parameters.max_record_send_size >= 64 &&
+-	       session->security_parameters.max_record_send_size <=
++	assert(session->security_parameters.max_user_record_recv_size >= 64 &&
++	       session->security_parameters.max_user_record_recv_size <=
+ 	       DEFAULT_MAX_RECORD_SIZE);
+ 
+-	send_size = session->security_parameters.max_record_send_size;
++	send_size = session->security_parameters.max_user_record_recv_size;
+ 
+ 	if (session->security_parameters.entity == GNUTLS_SERVER) {
+ 		const version_entry_st *vers;
+@@ -124,6 +130,9 @@ _gnutls_record_size_limit_send_params(gn
+ 		if (unlikely(vers == NULL))
+ 			return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+ 
++		session->security_parameters.max_record_recv_size =
++			send_size;
++
+ 		send_size += vers->tls13_sem;
+ 	} else {
+ 		const version_entry_st *vers;
+--- a/lib/gnutls_int.h
++++ b/lib/gnutls_int.h
+@@ -779,12 +779,18 @@ typedef struct {
+ 	/* whether client has agreed in post handshake auth - only set on server side */
+ 	uint8_t post_handshake_auth;
+ 
+-	/* The send size is the one requested by the programmer.
+-	 * The recv size is the one negotiated with the peer.
++	/* The maximum amount of plaintext sent in a record,
++	 * negotiated with the peer.
+ 	 */
+ 	uint16_t max_record_send_size;
+ 	uint16_t max_record_recv_size;
+ 
++	/* The maximum amount of plaintext sent in a record, set by
++	 * the programmer.
++	 */
++	uint16_t max_user_record_send_size;
++	uint16_t max_user_record_recv_size;
++
+ 	/* The maximum amount of early data */
+ 	uint32_t max_early_data_size;
+ 
+@@ -1552,17 +1558,17 @@ inline static int _gnutls_set_current_ve
+ 	return 0;
+ }
+ 
+-/* Returns the maximum size of the plaintext to be sent, considering
++/* Returns the maximum amount of the plaintext to be sent, considering
+  * both user-specified/negotiated maximum values.
+  */
+-inline static size_t max_user_send_size(gnutls_session_t session,
+-					record_parameters_st *
+-					record_params)
++inline static size_t max_record_send_size(gnutls_session_t session,
++					  record_parameters_st *
++					  record_params)
+ {
+ 	size_t max;
+ 
+ 	max = MIN(session->security_parameters.max_record_send_size,
+-		  session->security_parameters.max_record_recv_size);
++		  session->security_parameters.max_user_record_send_size);
+ 
+ 	if (IS_DTLS(session))
+ 		max = MIN(gnutls_dtls_get_data_mtu(session), max);
+--- a/lib/range.c
++++ b/lib/range.c
+@@ -66,7 +66,7 @@ _gnutls_range_max_lh_pad(gnutls_session_
+ 		return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+ 
+ 	if (vers->tls13_sem) {
+-		max_pad = max_user_send_size(session, record_params);
++		max_pad = max_record_send_size(session, record_params);
+ 		fixed_pad = 2;
+ 	} else {
+ 		max_pad = MAX_PAD_SIZE;
+@@ -182,7 +182,7 @@ gnutls_range_split(gnutls_session_t sess
+ 	if (ret < 0)
+ 		return gnutls_assert_val(ret);
+ 
+-	max_frag = max_user_send_size(session, record_params);
++	max_frag = max_record_send_size(session, record_params);
+ 
+ 	if (orig_high == orig_low) {
+ 		int length = MIN(orig_high, max_frag);
+--- a/lib/record.c
++++ b/lib/record.c
+@@ -467,7 +467,7 @@ _gnutls_send_tlen_int(gnutls_session_t s
+ 			return GNUTLS_E_INVALID_SESSION;
+ 		}
+ 
+-	max_send_size = max_user_send_size(session, record_params);
++	max_send_size = max_record_send_size(session, record_params);
+ 
+ 	if (data_size > max_send_size) {
+ 		if (IS_DTLS(session))
+--- a/lib/session_pack.c
++++ b/lib/session_pack.c
+@@ -918,20 +918,22 @@ pack_security_parameters(gnutls_session_
+ 		BUFFER_APPEND_PFX1(ps, session->security_parameters.server_random,
+ 			      GNUTLS_RANDOM_SIZE);
+ 
+-		BUFFER_APPEND_NUM(ps,
+-				  session->security_parameters.
+-				  max_record_send_size);
+-
+ 		/* reset max_record_recv_size if it was negotiated
+ 		 * using the record_size_limit extension */
+ 		if (session->internals.hsk_flags & HSK_RECORD_SIZE_LIMIT_NEGOTIATED) {
+ 			BUFFER_APPEND_NUM(ps,
+ 					  session->security_parameters.
+-					  max_record_send_size);
++					  max_user_record_send_size);
++			BUFFER_APPEND_NUM(ps,
++					  session->security_parameters.
++					  max_user_record_recv_size);
+ 		} else {
+ 			BUFFER_APPEND_NUM(ps,
+ 					  session->security_parameters.
+ 					  max_record_recv_size);
++			BUFFER_APPEND_NUM(ps,
++					  session->security_parameters.
++					  max_record_send_size);
+ 		}
+ 
+ 		if (session->security_parameters.grp) {
+--- a/lib/state.c
++++ b/lib/state.c
+@@ -522,6 +522,10 @@ int gnutls_init(gnutls_session_t * sessi
+ 	    DEFAULT_MAX_RECORD_SIZE;
+ 	(*session)->security_parameters.max_record_send_size =
+ 	    DEFAULT_MAX_RECORD_SIZE;
++	(*session)->security_parameters.max_user_record_recv_size =
++	    DEFAULT_MAX_RECORD_SIZE;
++	(*session)->security_parameters.max_user_record_send_size =
++	    DEFAULT_MAX_RECORD_SIZE;
+ 
+ 	/* set the default early data size for TLS
+ 	 */
diff -Nru gnutls28-3.6.7/debian/patches/40_rel3.6.8_15-Apply-STD3-ASCII-rules-in-gnutls_idna_map.patch gnutls28-3.6.7/debian/patches/40_rel3.6.8_15-Apply-STD3-ASCII-rules-in-gnutls_idna_map.patch
--- gnutls28-3.6.7/debian/patches/40_rel3.6.8_15-Apply-STD3-ASCII-rules-in-gnutls_idna_map.patch	1970-01-01 01:00:00.000000000 +0100
+++ gnutls28-3.6.7/debian/patches/40_rel3.6.8_15-Apply-STD3-ASCII-rules-in-gnutls_idna_map.patch	2019-06-12 19:21:15.000000000 +0200
@@ -0,0 +1,73 @@
+From b697e948b6f66440ee1f15337dfc83b6816bd21a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Tim=20R=C3=BChsen?= <tim.ruehsen at gmx.de>
+Date: Mon, 20 May 2019 11:10:11 +0200
+Subject: [PATCH] Apply STD3 ASCII rules in gnutls_idna_map()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Tim Rühsen <tim.ruehsen at gmx.de>
+---
+ NEWS             |  3 +++
+ lib/str-idna.c   | 10 +++++++---
+ tests/str-idna.c |  5 +++++
+ 3 files changed, 15 insertions(+), 3 deletions(-)
+
+--- a/NEWS
++++ b/NEWS
+@@ -53,6 +53,9 @@ See the end for copying conditions.
+ ** libgnutls: Fix calculation of Streebog digests (incorrect carry operation in
+    512 bit addition)
+ 
++** libgnutls: Apply STD3 ASCII rules in gnutls_idna_map() to prevent
++   hostname/domain crafting via IDNA conversion
++
+ ** API and ABI modifications:
+ No changes since last version.
+ 
+--- a/lib/str-idna.c
++++ b/lib/str-idna.c
+@@ -76,9 +76,13 @@ int gnutls_idna_map(const char *input, u
+ 	 * Since IDN2_NONTRANSITIONAL implicitly does NFC conversion, we don't need
+ 	 * the additional IDN2_NFC_INPUT. But just for the unlikely case that the linked
+ 	 * library is not matching the headers when building and it doesn't support TR46,
+-	 * we provide IDN2_NFC_INPUT. */
+-	idn2_flags |= IDN2_NONTRANSITIONAL;
+-	idn2_tflags |= IDN2_TRANSITIONAL;
++	 * we provide IDN2_NFC_INPUT.
++	 *
++	 * Without IDN2_USE_STD3_ASCII_RULES, the result could contain any ASCII characters,
++	 * e.g. 'evil.c\u2100.example.com' will be converted into
++	 * 'evil.ca/c.example.com', which seems no good idea. */
++	idn2_flags |= IDN2_NONTRANSITIONAL | IDN2_USE_STD3_ASCII_RULES;
++	idn2_tflags |= IDN2_TRANSITIONAL | IDN2_USE_STD3_ASCII_RULES;
+ #endif
+ 
+ 	/* This avoids excessive CPU usage with libidn2 < 2.1.1 */
+--- a/tests/str-idna.c
++++ b/tests/str-idna.c
+@@ -94,12 +94,16 @@ MATCH_FUNC(test_caps_german1, "Ü.ü", "
+ MATCH_FUNC(test_caps_german2, "Bücher.de", "xn--bcher-kva.de");
+ MATCH_FUNC(test_caps_german3, "Faß.de", "xn--fa-hia.de");
+ MATCH_FUNC(test_dots, "a.b.c。d。", "a.b.c.d.");
++
++/* without STD3 ASCII rules, the result is: evil.ca/c..example.com */
++MATCH_FUNC(test_evil, "evil.c\u2100.example.com", "evil.c.example.com");
+ # else
+ EMPTY_FUNC(test_caps_german1);
+ EMPTY_FUNC(test_caps_german2);
+ EMPTY_FUNC(test_caps_german3);
+ EMPTY_FUNC(test_caps_greek);
+ EMPTY_FUNC(test_dots);
++EMPTY_FUNC(test_evil);
+ # endif
+ 
+ int main(void)
+@@ -130,6 +134,7 @@ int main(void)
+ 		cmocka_unit_test(test_jp2),
+ 		cmocka_unit_test(test_jp2_reverse),
+ 		cmocka_unit_test(test_dots),
++		cmocka_unit_test(test_evil),
+ 		cmocka_unit_test(test_valid_idna2003)
+ 	};
+ 
diff -Nru gnutls28-3.6.7/debian/patches/40_rel3.6.8_20-pubkey-remove-deprecated-TLS1_RSA-flag-check.patch gnutls28-3.6.7/debian/patches/40_rel3.6.8_20-pubkey-remove-deprecated-TLS1_RSA-flag-check.patch
--- gnutls28-3.6.7/debian/patches/40_rel3.6.8_20-pubkey-remove-deprecated-TLS1_RSA-flag-check.patch	1970-01-01 01:00:00.000000000 +0100
+++ gnutls28-3.6.7/debian/patches/40_rel3.6.8_20-pubkey-remove-deprecated-TLS1_RSA-flag-check.patch	2019-06-12 19:21:15.000000000 +0200
@@ -0,0 +1,52 @@
+From b1476abeb6f8b5046e6cd62724cdac241f71aa7b Mon Sep 17 00:00:00 2001
+From: "Kenneth J. Miller" <ken at miller.ec>
+Date: Mon, 15 Apr 2019 17:56:13 +0200
+Subject: [PATCH 1/2] pubkey: remove deprecated TLS1_RSA flag check
+
+The gnutls_certificate_verify_flags comparisons against
+OLD_PUBKEY_VERIFY_FLAG_TLS1_RSA conflicts with
+GNUTLS_VERIFY_DISABLE_CA_SIGN and no longer seems to be used in calls to
+both gnutls_pubkey_verify_data2 and gnutls_pubkey_verify_hash2 as it
+seems to have been fully replaced by GNUTLS_VERIFY_USE_TLS1_RSA.
+
+Resolves: #754
+
+Signed-off-by: Kenneth J. Miller <ken at miller.ec>
+---
+ lib/pubkey.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/lib/pubkey.c b/lib/pubkey.c
+index f1a0302fc..2dfe5d56e 100644
+--- a/lib/pubkey.c
++++ b/lib/pubkey.c
+@@ -1678,8 +1678,6 @@ gnutls_pubkey_import_dsa_raw(gnutls_pubkey_t key,
+ 
+ }
+ 
+-#define OLD_PUBKEY_VERIFY_FLAG_TLS1_RSA 1
+-
+ /* Updates the gnutls_x509_spki_st parameters based on the signature
+  * information, and reports any incompatibilities between the existing
+  * parameters (if any) with the signature algorithm */
+@@ -1758,7 +1756,7 @@ gnutls_pubkey_verify_data2(gnutls_pubkey_t pubkey,
+ 		return GNUTLS_E_INVALID_REQUEST;
+ 	}
+ 
+-	if (flags & OLD_PUBKEY_VERIFY_FLAG_TLS1_RSA || flags & GNUTLS_VERIFY_USE_TLS1_RSA)
++	if (flags & GNUTLS_VERIFY_USE_TLS1_RSA)
+ 		return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+ 
+ 	memcpy(&params, &pubkey->params.spki, sizeof(gnutls_x509_spki_st));
+@@ -1830,7 +1828,7 @@ gnutls_pubkey_verify_hash2(gnutls_pubkey_t key,
+ 
+ 	memcpy(&params, &key->params.spki, sizeof(gnutls_x509_spki_st));
+ 
+-	if (flags & OLD_PUBKEY_VERIFY_FLAG_TLS1_RSA || flags & GNUTLS_VERIFY_USE_TLS1_RSA) {
++	if (flags & GNUTLS_VERIFY_USE_TLS1_RSA) {
+ 		if (!GNUTLS_PK_IS_RSA(key->params.algo))
+ 			return gnutls_assert_val(GNUTLS_E_INCOMPATIBLE_SIG_WITH_KEY);
+ 		params.pk = GNUTLS_PK_RSA;
+-- 
+2.20.1
+
diff -Nru gnutls28-3.6.7/debian/patches/series gnutls28-3.6.7/debian/patches/series
--- gnutls28-3.6.7/debian/patches/series	2019-03-09 10:44:53.000000000 +0100
+++ gnutls28-3.6.7/debian/patches/series	2019-06-12 19:21:15.000000000 +0200
@@ -1,2 +1,7 @@
 14_version_gettextcat.diff
 30_guile-snarf.diff
+40_rel3.6.8_01-gnutls_srp_entry_free-follow-consistent-behavior-in.patch
+40_rel3.6.8_05-lib-nettle-fix-carry-flag-in-Streebog-code.patch
+40_rel3.6.8_10-ext-record_size_limit-distinguish-sending-and-receiv.patch
+40_rel3.6.8_15-Apply-STD3-ASCII-rules-in-gnutls_idna_map.patch
+40_rel3.6.8_20-pubkey-remove-deprecated-TLS1_RSA-flag-check.patch
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-gnutls-maint/attachments/20190613/5fd6725f/attachment-0001.sig>


More information about the Pkg-gnutls-maint mailing list