Blame SOURCES/macsec-0015-wpa_supplicant-Add-macsec_integ_only-setting-for-MKA.patch

b645d2
From 7b4d546e3dae57a39e50a91e47b8fcf3447b4978 Mon Sep 17 00:00:00 2001
b645d2
Message-Id: <7b4d546e3dae57a39e50a91e47b8fcf3447b4978.1488376601.git.dcaratti@redhat.com>
b645d2
From: Sabrina Dubroca <sd@queasysnail.net>
b645d2
Date: Wed, 2 Nov 2016 16:38:37 +0100
b645d2
Subject: [PATCH] wpa_supplicant: Add macsec_integ_only setting for MKA
b645d2
b645d2
So that the user can turn encryption on (MACsec provides
b645d2
confidentiality+integrity) or off (MACsec provides integrity only). This
b645d2
commit adds the configuration parameter while the actual behavior change
b645d2
to disable encryption in the driver is handled in the following commit.
b645d2
b645d2
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
b645d2
---
b645d2
 src/common/ieee802_1x_defs.h       |  6 ++++++
b645d2
 src/pae/ieee802_1x_kay.c           |  1 +
b645d2
 src/pae/ieee802_1x_kay.h           |  1 +
b645d2
 wpa_supplicant/config.c            |  1 +
b645d2
 wpa_supplicant/config_file.c       |  1 +
b645d2
 wpa_supplicant/config_ssid.h       | 12 ++++++++++++
b645d2
 wpa_supplicant/wpa_cli.c           |  1 +
b645d2
 wpa_supplicant/wpa_supplicant.conf |  7 +++++++
b645d2
 wpa_supplicant/wpas_kay.c          |  9 ++++++++-
b645d2
 9 files changed, 38 insertions(+), 1 deletion(-)
b645d2
b645d2
diff --git a/src/common/ieee802_1x_defs.h b/src/common/ieee802_1x_defs.h
b645d2
index a0c1d1b..280c439 100644
b645d2
--- a/src/common/ieee802_1x_defs.h
b645d2
+++ b/src/common/ieee802_1x_defs.h
b645d2
@@ -25,6 +25,12 @@ enum macsec_policy {
b645d2
 	 * Disabled MACsec - do not secure sessions.
b645d2
 	 */
b645d2
 	DO_NOT_SECURE,
b645d2
+
b645d2
+	/**
b645d2
+	 * Should secure sessions, and try to use encryption.
b645d2
+	 * Like @SHOULD_SECURE, this follows the key server's decision.
b645d2
+	 */
b645d2
+	SHOULD_ENCRYPT,
b645d2
 };
b645d2
 
b645d2
 
b645d2
diff --git a/src/pae/ieee802_1x_kay.c b/src/pae/ieee802_1x_kay.c
b645d2
index 19b2c2f..7664e2d 100644
b645d2
--- a/src/pae/ieee802_1x_kay.c
b645d2
+++ b/src/pae/ieee802_1x_kay.c
b645d2
@@ -3129,6 +3129,7 @@ ieee802_1x_kay_init(struct ieee802_1x_kay_ctx *ctx, enum macsec_policy policy,
b645d2
 	} else {
b645d2
 		kay->macsec_desired = TRUE;
b645d2
 		kay->macsec_protect = TRUE;
b645d2
+		kay->macsec_encrypt = policy == SHOULD_ENCRYPT;
b645d2
 		kay->macsec_validate = Strict;
b645d2
 		kay->macsec_replay_protect = FALSE;
b645d2
 		kay->macsec_replay_window = 0;
b645d2
diff --git a/src/pae/ieee802_1x_kay.h b/src/pae/ieee802_1x_kay.h
b645d2
index 576a8a0..618e45b 100644
b645d2
--- a/src/pae/ieee802_1x_kay.h
b645d2
+++ b/src/pae/ieee802_1x_kay.h
b645d2
@@ -181,6 +181,7 @@ struct ieee802_1x_kay {
b645d2
 	enum macsec_cap macsec_capable;
b645d2
 	Boolean macsec_desired;
b645d2
 	Boolean macsec_protect;
b645d2
+	Boolean macsec_encrypt;
b645d2
 	Boolean macsec_replay_protect;
b645d2
 	u32 macsec_replay_window;
b645d2
 	enum validate_frames macsec_validate;
b645d2
diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c
b645d2
index 9011389..afb631e 100644
b645d2
--- a/wpa_supplicant/config.c
b645d2
+++ b/wpa_supplicant/config.c
b645d2
@@ -2125,6 +2125,7 @@ static const struct parse_data ssid_fields[] = {
b645d2
 	{ INT(beacon_int) },
b645d2
 #ifdef CONFIG_MACSEC
b645d2
 	{ INT_RANGE(macsec_policy, 0, 1) },
b645d2
+	{ INT_RANGE(macsec_integ_only, 0, 1) },
b645d2
 	{ FUNC_KEY(mka_cak) },
b645d2
 	{ FUNC_KEY(mka_ckn) },
b645d2
 #endif /* CONFIG_MACSEC */
b645d2
diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c
b645d2
index 172508e..f605fa9 100644
b645d2
--- a/wpa_supplicant/config_file.c
b645d2
+++ b/wpa_supplicant/config_file.c
b645d2
@@ -808,6 +808,7 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
b645d2
 	INT(macsec_policy);
b645d2
 	write_mka_cak(f, ssid);
b645d2
 	write_mka_ckn(f, ssid);
b645d2
+	INT(macsec_integ_only);
b645d2
 #endif /* CONFIG_MACSEC */
b645d2
 #ifdef CONFIG_HS20
b645d2
 	INT(update_identifier);
b645d2
diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h
b645d2
index a530cda..b8c3192 100644
b645d2
--- a/wpa_supplicant/config_ssid.h
b645d2
+++ b/wpa_supplicant/config_ssid.h
b645d2
@@ -730,6 +730,18 @@ struct wpa_ssid {
b645d2
 	int macsec_policy;
b645d2
 
b645d2
 	/**
b645d2
+	 * macsec_integ_only - Determines how MACsec are transmitted
b645d2
+	 *
b645d2
+	 * This setting applies only when MACsec is in use, i.e.,
b645d2
+	 *  - macsec_policy is enabled
b645d2
+	 *  - the key server has decided to enable MACsec
b645d2
+	 *
b645d2
+	 * 0: Encrypt traffic (default)
b645d2
+	 * 1: Integrity only
b645d2
+	 */
b645d2
+	int macsec_integ_only;
b645d2
+
b645d2
+	/**
b645d2
 	 * mka_ckn - MKA pre-shared CKN
b645d2
 	 */
b645d2
 #define MACSEC_CKN_LEN 32
b645d2
diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c
b645d2
index 4877989..aed95e6 100644
b645d2
--- a/wpa_supplicant/wpa_cli.c
b645d2
+++ b/wpa_supplicant/wpa_cli.c
b645d2
@@ -1390,6 +1390,7 @@ static const char *network_fields[] = {
b645d2
 	"ap_max_inactivity", "dtim_period", "beacon_int",
b645d2
 #ifdef CONFIG_MACSEC
b645d2
 	"macsec_policy",
b645d2
+	"macsec_integ_only",
b645d2
 #endif /* CONFIG_MACSEC */
b645d2
 #ifdef CONFIG_HS20
b645d2
 	"update_identifier",
b645d2
diff --git a/wpa_supplicant/wpa_supplicant.conf b/wpa_supplicant/wpa_supplicant.conf
b645d2
index 8fa740b..b23c5e6 100644
b645d2
--- a/wpa_supplicant/wpa_supplicant.conf
b645d2
+++ b/wpa_supplicant/wpa_supplicant.conf
b645d2
@@ -892,6 +892,13 @@ fast_reauth=1
b645d2
 # 1: MACsec enabled - Should secure, accept key server's advice to
b645d2
 #    determine whether to use a secure session or not.
b645d2
 #
b645d2
+# macsec_integ_only: IEEE 802.1X/MACsec transmit mode
b645d2
+# This setting applies only when MACsec is in use, i.e.,
b645d2
+#  - macsec_policy is enabled
b645d2
+#  - the key server has decided to enable MACsec
b645d2
+# 0: Encrypt traffic (default)
b645d2
+# 1: Integrity only
b645d2
+#
b645d2
 # mka_cak and mka_ckn: IEEE 802.1X/MACsec pre-shared authentication mode
b645d2
 # This allows to configure MACsec with a pre-shared key using a (CAK,CKN) pair.
b645d2
 # In this mode, instances of wpa_supplicant can act as peers, one of
b645d2
diff --git a/wpa_supplicant/wpas_kay.c b/wpa_supplicant/wpas_kay.c
b645d2
index 80b98d9..6343154 100644
b645d2
--- a/wpa_supplicant/wpas_kay.c
b645d2
+++ b/wpa_supplicant/wpas_kay.c
b645d2
@@ -187,7 +187,14 @@ int ieee802_1x_alloc_kay_sm(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
b645d2
 	if (!ssid || ssid->macsec_policy == 0)
b645d2
 		return 0;
b645d2
 
b645d2
-	policy = ssid->macsec_policy == 1 ? SHOULD_SECURE : DO_NOT_SECURE;
b645d2
+	if (ssid->macsec_policy == 1) {
b645d2
+		if (ssid->macsec_integ_only == 1)
b645d2
+			policy = SHOULD_SECURE;
b645d2
+		else
b645d2
+			policy = SHOULD_ENCRYPT;
b645d2
+	} else {
b645d2
+		policy = DO_NOT_SECURE;
b645d2
+	}
b645d2
 
b645d2
 	kay_ctx = os_zalloc(sizeof(*kay_ctx));
b645d2
 	if (!kay_ctx)
b645d2
-- 
b645d2
2.7.4
b645d2