svn commit: r361507 - head/sys/netipsec

Marcin Wojtas mw at FreeBSD.org
Tue May 26 14:16:27 UTC 2020


Author: mw
Date: Tue May 26 14:16:26 2020
New Revision: 361507
URL: https://svnweb.freebsd.org/changeset/base/361507

Log:
  Fix AES-CTR compatibility issue in ipsec
  
  r361390 decreased blocksize of AES-CTR from 16 to 1.
  Because of that ESP payload is no longer aligned to 16 bytes
  before being encrypted and sent.
  This is a good change since RFC3686 specifies that the last block
  doesn't need to be aligned.
  Since FreeBSD before r361390 couldn't decrypt partial blocks encrypted
  with AES-CTR we need to enforce 16 byte alignment in order to preserve
  compatibility.
  Add a sysctl(on by default) to control it.
  
  Submitted by: Kornel Duleba <mindal at semihalf.com>
  Reviewed by: jhb
  Obtained from: Semihalf
  Sponsored by: Stormshield
  Differential Revision: https://reviews.freebsd.org/D24999

Modified:
  head/sys/netipsec/xform_esp.c

Modified: head/sys/netipsec/xform_esp.c
==============================================================================
--- head/sys/netipsec/xform_esp.c	Tue May 26 14:10:53 2020	(r361506)
+++ head/sys/netipsec/xform_esp.c	Tue May 26 14:16:26 2020	(r361507)
@@ -80,6 +80,8 @@
 #include <opencrypto/xform.h>
 
 VNET_DEFINE(int, esp_enable) = 1;
+VNET_DEFINE_STATIC(int, esp_ctr_compatibility) = 1;
+#define V_esp_ctr_compatibility VNET(esp_ctr_compatibility)
 VNET_PCPUSTAT_DEFINE(struct espstat, espstat);
 VNET_PCPUSTAT_SYSINIT(espstat);
 
@@ -90,6 +92,9 @@ VNET_PCPUSTAT_SYSUNINIT(espstat);
 SYSCTL_DECL(_net_inet_esp);
 SYSCTL_INT(_net_inet_esp, OID_AUTO, esp_enable,
 	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(esp_enable), 0, "");
+SYSCTL_INT(_net_inet_esp, OID_AUTO, ctr_compatibility,
+    CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(esp_ctr_compatibility), 0,
+    "Align AES-CTR encrypted transmitted frames to blocksize");
 SYSCTL_VNET_PCPUSTAT(_net_inet_esp, IPSECCTL_STATS, stats,
     struct espstat, espstat,
     "ESP statistics (struct espstat, netipsec/esp_var.h");
@@ -652,8 +657,14 @@ esp_output(struct mbuf *m, struct secpolicy *sp, struc
 	rlen = m->m_pkthdr.len - skip;	/* Raw payload length. */
 	/*
 	 * RFC4303 2.4 Requires 4 byte alignment.
+	 * Old versions of FreeBSD can't decrypt partial blocks encrypted
+	 * with AES-CTR. Align payload to native_blocksize (16 bytes)
+	 * in order to preserve compatibility.
 	 */
-	blks = MAX(4, espx->blocksize);		/* Cipher blocksize */
+	if (SAV_ISCTR(sav) && V_esp_ctr_compatibility)
+		blks = MAX(4, espx->native_blocksize);	/* Cipher blocksize */
+	else
+		blks = MAX(4, espx->blocksize);
 
 	/* XXX clamp padding length a la KAME??? */
 	padding = ((blks - ((rlen + 2) % blks)) % blks) + 2;


More information about the svn-src-head mailing list