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

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