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

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