* [PATCH v4 1/4] network: add support for SAE password identifiers
@ 2023-12-14 12:33 James Prestwood
2023-12-14 12:33 ` [PATCH v4 2/4] doc: document [Security].PasswordIdentifier James Prestwood
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: James Prestwood @ 2023-12-14 12:33 UTC (permalink / raw)
To: iwd; +Cc: James Prestwood
Adds a new network profile setting [Security].PasswordIdentifier.
When set (and the BSS enables SAE password identifiers) the network
and handshake object will read this and use it for the SAE
exchange.
Building the handshake will fail if:
- there is no password identifier set and the BSS sets the
"exclusive" bit.
- there is a password identifier set and the BSS does not set
the "in-use" bit.
---
src/network.c | 37 ++++++++++++++++++++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)
v4:
* Moved the checks out of network_load_psk and into the
handshake setup function. This is more consistent to where
other BSS-specific checks are made.
diff --git a/src/network.c b/src/network.c
index 79f964b2..b6723fa9 100644
--- a/src/network.c
+++ b/src/network.c
@@ -70,6 +70,7 @@ struct network {
struct network_info *info;
unsigned char *psk;
char *passphrase;
+ char *password_identifier;
struct l_ecc_point *sae_pt_19; /* SAE PT for Group 19 */
struct l_ecc_point *sae_pt_20; /* SAE PT for Group 20 */
unsigned int agent_request;
@@ -124,6 +125,13 @@ static void network_reset_passphrase(struct network *network)
network->passphrase = NULL;
}
+ if (network->password_identifier) {
+ explicit_bzero(network->password_identifier,
+ strlen(network->password_identifier));
+ l_free(network->password_identifier);
+ network->password_identifier = NULL;
+ }
+
if (network->sae_pt_19) {
l_ecc_point_free(network->sae_pt_19);
network->sae_pt_19 = NULL;
@@ -317,7 +325,8 @@ static struct l_ecc_point *network_generate_sae_pt(struct network *network,
l_debug("Generating PT for Group %u", group);
pt = crypto_derive_sae_pt_ecc(group, network->ssid,
- network->passphrase, NULL);
+ network->passphrase,
+ network->password_identifier);
if (!pt)
l_warn("SAE PT generation for Group %u failed", group);
@@ -462,6 +471,10 @@ static int network_set_handshake_secrets_psk(struct network *network,
handshake_state_set_passphrase(hs, network->passphrase);
+ if (network->password_identifier)
+ handshake_state_set_password_identifier(hs,
+ network->password_identifier);
+
if (ie_rsnxe_capable(hs->authenticator_rsnxe,
IE_RSNX_SAE_H2E)) {
l_debug("Authenticator is SAE H2E capable");
@@ -495,6 +508,19 @@ int network_handshake_setup(struct network *network, struct scan_bss *bss,
switch (network->security) {
case SECURITY_PSK:
+ /* Check the BSS password ID settings match our configuration */
+ if (bss->sae_pw_id_exclusive && !network->password_identifier) {
+ l_error("[Security].PasswordIdentifier is not set but "
+ "BSS requires SAE password identifiers");
+ return -ENOKEY;
+ }
+
+ if (!bss->sae_pw_id_used && network->password_identifier) {
+ l_error("[Security].PasswordIdentifier set but BSS "
+ "does not not use password identifiers");
+ return -ENOKEY;
+ }
+
r = network_set_handshake_secrets_psk(network, hs);
if (r < 0)
return r;
@@ -631,6 +657,9 @@ static int network_load_psk(struct network *network, struct scan_bss *bss)
_auto_(l_free) char *passphrase =
l_settings_get_string(network->settings,
"Security", "Passphrase");
+ _auto_(l_free) char *password_id =
+ l_settings_get_string(network->settings, "Security",
+ "PasswordIdentifier");
_auto_(l_free) char *path =
storage_get_network_file_path(security, ssid);
@@ -655,6 +684,7 @@ static int network_load_psk(struct network *network, struct scan_bss *bss)
network_reset_passphrase(network);
network_reset_psk(network);
network->passphrase = l_steal_ptr(passphrase);
+ network->password_identifier = l_steal_ptr(password_id);
if (network_settings_load_pt_ecc(network, path,
19, &network->sae_pt_19) > 0)
@@ -726,6 +756,11 @@ static void network_settings_save(struct network *network,
l_settings_set_string(settings, "Security", "Passphrase",
network->passphrase);
+ if (network->password_identifier)
+ l_settings_set_string(settings, "Security",
+ "PasswordIdentifier",
+ network->password_identifier);
+
if (network->sae_pt_19)
network_settings_save_sae_pt_ecc(settings, network->sae_pt_19);
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v4 2/4] doc: document [Security].PasswordIdentifier
2023-12-14 12:33 [PATCH v4 1/4] network: add support for SAE password identifiers James Prestwood
@ 2023-12-14 12:33 ` James Prestwood
2023-12-14 12:33 ` [PATCH v4 3/4] auto-t: add H2E password identifier test James Prestwood
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: James Prestwood @ 2023-12-14 12:33 UTC (permalink / raw)
To: iwd; +Cc: James Prestwood
---
src/iwd.network.rst | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/iwd.network.rst b/src/iwd.network.rst
index 719853fa..734dcfa1 100644
--- a/src/iwd.network.rst
+++ b/src/iwd.network.rst
@@ -199,6 +199,12 @@ connect to that network.
required if the *PreSharedKey* is not provided. If not provided in
settings, the agent will be asked for the passphrase at connection
time.
+ * - PasswordIdentifier
+ - string
+
+ An identifer string to be used with the passphrase. This is used for
+ WPA3-Personal (SAE) networks if the security has enabled password
+ identifiers for clients.
* - PreSharedKey
- 64 character hex string
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v4 3/4] auto-t: add H2E password identifier test
2023-12-14 12:33 [PATCH v4 1/4] network: add support for SAE password identifiers James Prestwood
2023-12-14 12:33 ` [PATCH v4 2/4] doc: document [Security].PasswordIdentifier James Prestwood
@ 2023-12-14 12:33 ` James Prestwood
2023-12-14 12:34 ` [PATCH v4 4/4] auto-t: throw exception if executable is missing James Prestwood
2023-12-15 16:20 ` [PATCH v4 1/4] network: add support for SAE password identifiers Denis Kenzior
3 siblings, 0 replies; 5+ messages in thread
From: James Prestwood @ 2023-12-14 12:33 UTC (permalink / raw)
To: iwd; +Cc: James Prestwood
In order to support identifiers the test profiles needed to be
reworked due to hostapd allowing multiple password entires. You
cannot just call set_value() with a new entry as the old ones
still exist. Instead use a unique password for the identifier and
non-identifier use cases.
After adding this test the failure_test started failing due to
hostapd not starting up. This was due to the group being unsupported
but oddly only when hostapd was reloaded (running the test
individually worked). To fix this the group number was changed to 21
which hostapd does support but IWD does not.
---
autotests/testSAE/autoconnect_test.py | 20 +++++++++++++------
autotests/testSAE/failure_test.py | 2 +-
autotests/testSAE/ssidSAE.conf | 3 ++-
.../{ssidSAE.psk => ssidSAE.psk.default} | 0
autotests/testSAE/ssidSAE.psk.identifier | 3 +++
5 files changed, 20 insertions(+), 8 deletions(-)
rename autotests/testSAE/{ssidSAE.psk => ssidSAE.psk.default} (100%)
create mode 100644 autotests/testSAE/ssidSAE.psk.identifier
diff --git a/autotests/testSAE/autoconnect_test.py b/autotests/testSAE/autoconnect_test.py
index cba59274..4ce3b845 100644
--- a/autotests/testSAE/autoconnect_test.py
+++ b/autotests/testSAE/autoconnect_test.py
@@ -35,12 +35,23 @@ class Test(unittest.TestCase):
wd.wait_for_object_condition(ordered_network.network_object, condition)
def test_SAE(self):
+ IWD.copy_to_storage("ssidSAE.psk.default", name="ssidSAE.psk")
self.hostapd.wait_for_event("AP-ENABLED")
wd = IWD(True)
self.validate_connection(wd)
def test_SAE_H2E(self):
+ IWD.copy_to_storage("ssidSAE.psk.default", name="ssidSAE.psk")
+ self.hostapd.set_value('sae_pwe', '1')
+ self.hostapd.set_value('sae_groups', '20')
+ self.hostapd.reload()
+ self.hostapd.wait_for_event("AP-ENABLED")
+ wd = IWD(True)
+ self.validate_connection(wd)
+
+ def test_SAE_H2E_password_identifier(self):
+ IWD.copy_to_storage("ssidSAE.psk.identifier", name="ssidSAE.psk")
self.hostapd.set_value('sae_pwe', '1')
self.hostapd.set_value('sae_groups', '20')
self.hostapd.reload()
@@ -51,15 +62,12 @@ class Test(unittest.TestCase):
def setUp(self):
self.hostapd.default()
+ def tearDown(self):
+ IWD.clear_storage()
+
@classmethod
def setUpClass(cls):
cls.hostapd = HostapdCLI(config='ssidSAE.conf')
- IWD.copy_to_storage('ssidSAE.psk')
- pass
-
- @classmethod
- def tearDownClass(cls):
- IWD.clear_storage()
if __name__ == '__main__':
unittest.main(exit=True)
diff --git a/autotests/testSAE/failure_test.py b/autotests/testSAE/failure_test.py
index 2aac3a07..aa4d14b9 100644
--- a/autotests/testSAE/failure_test.py
+++ b/autotests/testSAE/failure_test.py
@@ -37,7 +37,7 @@ class Test(unittest.TestCase):
self.validate_connection(wd, 'InvalidSecret')
def test_no_supported_groups(self):
- self.hostapd.set_value('sae_groups', '1')
+ self.hostapd.set_value('sae_groups', '21')
self.hostapd.reload()
wd = IWD(True)
diff --git a/autotests/testSAE/ssidSAE.conf b/autotests/testSAE/ssidSAE.conf
index 41f46cad..f5ce537d 100644
--- a/autotests/testSAE/ssidSAE.conf
+++ b/autotests/testSAE/ssidSAE.conf
@@ -5,7 +5,8 @@ ssid=ssidSAE
wpa=2
wpa_key_mgmt=SAE
wpa_pairwise=CCMP
-sae_password=secret123|mac=ff:ff:ff:ff:ff:ff
+sae_password=secret123
+sae_password=withidentifier|id=myidentifier
sae_groups=19
ieee80211w=2
sae_pwe=0
diff --git a/autotests/testSAE/ssidSAE.psk b/autotests/testSAE/ssidSAE.psk.default
similarity index 100%
rename from autotests/testSAE/ssidSAE.psk
rename to autotests/testSAE/ssidSAE.psk.default
diff --git a/autotests/testSAE/ssidSAE.psk.identifier b/autotests/testSAE/ssidSAE.psk.identifier
new file mode 100644
index 00000000..3664063a
--- /dev/null
+++ b/autotests/testSAE/ssidSAE.psk.identifier
@@ -0,0 +1,3 @@
+[Security]
+Passphrase=withidentifier
+PasswordIdentifier=myidentifier
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v4 4/4] auto-t: throw exception if executable is missing
2023-12-14 12:33 [PATCH v4 1/4] network: add support for SAE password identifiers James Prestwood
2023-12-14 12:33 ` [PATCH v4 2/4] doc: document [Security].PasswordIdentifier James Prestwood
2023-12-14 12:33 ` [PATCH v4 3/4] auto-t: add H2E password identifier test James Prestwood
@ 2023-12-14 12:34 ` James Prestwood
2023-12-15 16:20 ` [PATCH v4 1/4] network: add support for SAE password identifiers Denis Kenzior
3 siblings, 0 replies; 5+ messages in thread
From: James Prestwood @ 2023-12-14 12:34 UTC (permalink / raw)
To: iwd; +Cc: James Prestwood
Certain tests may require external processes to work
(e.g. testNetconfig) and if missing the test will just hang until
the maximum test timeout. Check in start_process if the exe
actually exists and if not throw an exception.
---
tools/utils.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/tools/utils.py b/tools/utils.py
index a07c3183..8219542e 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -34,6 +34,9 @@ class Process(subprocess.Popen):
logfile = args[0]
+ if not shutil.which(args[0]):
+ raise Exception("%s is not found on system" % args[0])
+
if Process.is_verbose(args[0], log=False):
self.verbose = True
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v4 1/4] network: add support for SAE password identifiers
2023-12-14 12:33 [PATCH v4 1/4] network: add support for SAE password identifiers James Prestwood
` (2 preceding siblings ...)
2023-12-14 12:34 ` [PATCH v4 4/4] auto-t: throw exception if executable is missing James Prestwood
@ 2023-12-15 16:20 ` Denis Kenzior
3 siblings, 0 replies; 5+ messages in thread
From: Denis Kenzior @ 2023-12-15 16:20 UTC (permalink / raw)
To: James Prestwood, iwd
Hi James,
On 12/14/23 06:33, James Prestwood wrote:
> Adds a new network profile setting [Security].PasswordIdentifier.
> When set (and the BSS enables SAE password identifiers) the network
> and handshake object will read this and use it for the SAE
> exchange.
>
> Building the handshake will fail if:
> - there is no password identifier set and the BSS sets the
> "exclusive" bit.
> - there is a password identifier set and the BSS does not set
> the "in-use" bit.
> ---
> src/network.c | 37 ++++++++++++++++++++++++++++++++++++-
> 1 file changed, 36 insertions(+), 1 deletion(-)
>
> v4:
> * Moved the checks out of network_load_psk and into the
> handshake setup function. This is more consistent to where
> other BSS-specific checks are made.
>
All applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-12-15 16:20 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-12-14 12:33 [PATCH v4 1/4] network: add support for SAE password identifiers James Prestwood
2023-12-14 12:33 ` [PATCH v4 2/4] doc: document [Security].PasswordIdentifier James Prestwood
2023-12-14 12:33 ` [PATCH v4 3/4] auto-t: add H2E password identifier test James Prestwood
2023-12-14 12:34 ` [PATCH v4 4/4] auto-t: throw exception if executable is missing James Prestwood
2023-12-15 16:20 ` [PATCH v4 1/4] network: add support for SAE password identifiers Denis Kenzior
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox