From e296a61e3fb4f9f2a8183e272d3d00b64c2c4f88 Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Tue, 27 Feb 2024 10:34:03 -0800 Subject: [PATCH] auto-t: refactor/fix testSAE The SAE test made some assumptions on certain conditions due to there being no way of checking if those conditions were met Mainly the use of H2E/hunt-and-peck. We assumed that when we told hostapd to use H2E or hunt/peck it would but in reality it was not. Hostapd is apparently not very good at swapping between the two with a simple "reload" command. Once H2E is enabled it appears that it cannot be undone. Similarly the vendor elements seem to carry over from test to test, and sometimes not which causes unintended behavior. To fix this create separate APs for the specific scenario being tested: - Hunt and peck - H2E - Special vendor_element simulating buggy APs Another issue found was that if password identifies are used hostapd automatically chooses H2E which was not intented, at least based on the test names (in reality it wasn't causing any problems). The tests have also been improved to use hostapds "sta_status" command which contains the group number used when authenticating, so now that at least can be verified. --- autotests/testSAE/autoconnect_test.py | 32 +++++++------- autotests/testSAE/connection_test.py | 42 +++++++++---------- autotests/testSAE/hw.conf | 3 +- .../ssidSAE-H2E.psk.default} | 0 .../testSAE/profiles/ssidSAE.psk.default | 2 + .../{ => profiles}/ssidSAE.psk.identifier | 0 autotests/testSAE/ssidSAE-H2E.conf | 12 ++++++ autotests/testSAE/ssidSAE.conf | 1 - 8 files changed, 52 insertions(+), 40 deletions(-) rename autotests/testSAE/{ssidSAE.psk.default => profiles/ssidSAE-H2E.psk.default} (100%) create mode 100644 autotests/testSAE/profiles/ssidSAE.psk.default rename autotests/testSAE/{ => profiles}/ssidSAE.psk.identifier (100%) create mode 100644 autotests/testSAE/ssidSAE-H2E.conf diff --git a/autotests/testSAE/autoconnect_test.py b/autotests/testSAE/autoconnect_test.py index 4ce3b845..605de14d 100644 --- a/autotests/testSAE/autoconnect_test.py +++ b/autotests/testSAE/autoconnect_test.py @@ -12,8 +12,7 @@ from hostapd import HostapdCLI class Test(unittest.TestCase): - def validate_connection(self, wd): - + def validate_connection(self, wd, ssid): devices = wd.list_devices(1) self.assertIsNotNone(devices) device = devices[0] @@ -25,7 +24,7 @@ class Test(unittest.TestCase): condition = 'obj.connected_network is not None' wd.wait_for_object_condition(device, condition) - ordered_network = device.get_ordered_network('ssidSAE') + ordered_network = device.get_ordered_network(ssid) self.assertTrue(ordered_network.network_object.connected) @@ -35,29 +34,27 @@ 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") + IWD.copy_to_storage("profiles/ssidSAE.psk.default", name="ssidSAE.psk") self.hostapd.wait_for_event("AP-ENABLED") wd = IWD(True) - self.validate_connection(wd) + self.validate_connection(wd, "ssidSAE") 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") + IWD.copy_to_storage("profiles/ssidSAE.psk.default", name="ssidSAE-H2E.psk") + self.hostapd_h2e.set_value('sae_groups', '20') + self.hostapd_h2e.reload() + self.hostapd_h2e.wait_for_event("AP-ENABLED") wd = IWD(True) - self.validate_connection(wd) + self.validate_connection(wd, "ssidSAE-H2E") 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() - self.hostapd.wait_for_event("AP-ENABLED") + IWD.copy_to_storage("profiles/ssidSAE.psk.identifier", name="ssidSAE-H2E.psk") + self.hostapd_h2e.set_value('sae_groups', '20') + self.hostapd_h2e.reload() + self.hostapd_h2e.wait_for_event("AP-ENABLED") wd = IWD(True) - self.validate_connection(wd) + self.validate_connection(wd, "ssidSAE-H2E") def setUp(self): self.hostapd.default() @@ -68,6 +65,7 @@ class Test(unittest.TestCase): @classmethod def setUpClass(cls): cls.hostapd = HostapdCLI(config='ssidSAE.conf') + cls.hostapd_h2e = HostapdCLI(config='ssidSAE-H2E.conf') if __name__ == '__main__': unittest.main(exit=True) diff --git a/autotests/testSAE/connection_test.py b/autotests/testSAE/connection_test.py index ecb464e2..f7776385 100644 --- a/autotests/testSAE/connection_test.py +++ b/autotests/testSAE/connection_test.py @@ -13,7 +13,7 @@ import testutil class Test(unittest.TestCase): - def validate_connection(self, wd): + def validate_connection(self, wd, ssid, hostapd, expected_group): psk_agent = PSKAgent("secret123") wd.register_psk_agent(psk_agent) @@ -23,11 +23,11 @@ class Test(unittest.TestCase): device.disconnect() - network = device.get_ordered_network('ssidSAE', full_scan=True) + network = device.get_ordered_network(ssid, full_scan=True) self.assertEqual(network.type, NetworkType.psk) - network.network_object.connect() + network.network_object.connect(wait=False) condition = 'obj.state == DeviceState.connected' wd.wait_for_object_condition(device, condition) @@ -35,7 +35,11 @@ class Test(unittest.TestCase): wd.wait(2) testutil.test_iface_operstate(intf=device.name) - testutil.test_ifaces_connected(if0=device.name, if1=self.hostapd.ifname) + testutil.test_ifaces_connected(if0=device.name, if1=hostapd.ifname) + + sta_status = hostapd.sta_status(device.address) + + self.assertEqual(int(sta_status["sae_group"]), expected_group) device.disconnect() @@ -46,37 +50,31 @@ class Test(unittest.TestCase): def test_SAE(self): self.hostapd.wait_for_event("AP-ENABLED") - self.validate_connection(self.wd) + self.validate_connection(self.wd, "ssidSAE", self.hostapd, 19) def test_SAE_force_group_19(self): # Vendor data from APs which require group 19 be used first - # TODO: (for all tests) verify the expected group was used - self.hostapd.set_value('vendor_elements', 'dd0cf4f5e8050500000000000000') self.hostapd.reload() self.hostapd.wait_for_event("AP-ENABLED") - self.validate_connection(self.wd) + self.validate_connection(self.wd, "ssidSAE-default-group", self.hostapd_defgroup, 19) def test_SAE_Group20(self): self.hostapd.set_value('sae_groups', '20') - self.hostapd.set_value('vendor_elements', '') self.hostapd.reload() self.hostapd.wait_for_event("AP-ENABLED") - self.validate_connection(self.wd) + self.validate_connection(self.wd, "ssidSAE", self.hostapd, 20) def test_SAE_H2E(self): - self.hostapd.set_value('sae_pwe', '1') - self.hostapd.set_value('vendor_elements', '') - self.hostapd.reload() - self.hostapd.wait_for_event("AP-ENABLED") - self.validate_connection(self.wd) + self.hostapd_h2e.set_value('sae_groups', '19') + self.hostapd_h2e.reload() + self.hostapd_h2e.wait_for_event("AP-ENABLED") + self.validate_connection(self.wd, "ssidSAE-H2E", self.hostapd_h2e, 19) def test_SAE_H2E_Group20(self): - self.hostapd.set_value('sae_pwe', '1') - self.hostapd.set_value('sae_groups', '20') - self.hostapd.set_value('vendor_elements', '') - self.hostapd.reload() - self.hostapd.wait_for_event("AP-ENABLED") - self.validate_connection(self.wd) + self.hostapd_h2e.set_value('sae_groups', '20') + self.hostapd_h2e.reload() + self.hostapd_h2e.wait_for_event("AP-ENABLED") + self.validate_connection(self.wd, "ssidSAE-H2E", self.hostapd_h2e, 20) def setUp(self): self.hostapd.default() @@ -89,6 +87,8 @@ class Test(unittest.TestCase): @classmethod def setUpClass(cls): cls.hostapd = HostapdCLI(config='ssidSAE.conf') + cls.hostapd_h2e = HostapdCLI(config='ssidSAE-H2E.conf') + cls.hostapd_defgroup = HostapdCLI(config='ssidSAE-default-group.conf') @classmethod def tearDownClass(cls): diff --git a/autotests/testSAE/hw.conf b/autotests/testSAE/hw.conf index 72b161b8..cc0836b7 100644 --- a/autotests/testSAE/hw.conf +++ b/autotests/testSAE/hw.conf @@ -1,7 +1,8 @@ [SETUP] -num_radios=2 +num_radios=3 start_iwd=0 hwsim_medium=yes [HOSTAPD] rad0=ssidSAE.conf +rad1=ssidSAE-H2E.conf diff --git a/autotests/testSAE/ssidSAE.psk.default b/autotests/testSAE/profiles/ssidSAE-H2E.psk.default similarity index 100% rename from autotests/testSAE/ssidSAE.psk.default rename to autotests/testSAE/profiles/ssidSAE-H2E.psk.default diff --git a/autotests/testSAE/profiles/ssidSAE.psk.default b/autotests/testSAE/profiles/ssidSAE.psk.default new file mode 100644 index 00000000..abafdb66 --- /dev/null +++ b/autotests/testSAE/profiles/ssidSAE.psk.default @@ -0,0 +1,2 @@ +[Security] +Passphrase=secret123 diff --git a/autotests/testSAE/ssidSAE.psk.identifier b/autotests/testSAE/profiles/ssidSAE.psk.identifier similarity index 100% rename from autotests/testSAE/ssidSAE.psk.identifier rename to autotests/testSAE/profiles/ssidSAE.psk.identifier diff --git a/autotests/testSAE/ssidSAE-H2E.conf b/autotests/testSAE/ssidSAE-H2E.conf new file mode 100644 index 00000000..ea963135 --- /dev/null +++ b/autotests/testSAE/ssidSAE-H2E.conf @@ -0,0 +1,12 @@ +hw_mode=g +channel=1 +ssid=ssidSAE-H2E + +wpa=2 +wpa_key_mgmt=SAE +wpa_pairwise=CCMP +sae_password=secret123 +sae_password=withidentifier|id=myidentifier +sae_groups=19 +ieee80211w=2 +sae_pwe=1 diff --git a/autotests/testSAE/ssidSAE.conf b/autotests/testSAE/ssidSAE.conf index f5ce537d..4ec254aa 100644 --- a/autotests/testSAE/ssidSAE.conf +++ b/autotests/testSAE/ssidSAE.conf @@ -6,7 +6,6 @@ wpa=2 wpa_key_mgmt=SAE wpa_pairwise=CCMP sae_password=secret123 -sae_password=withidentifier|id=myidentifier sae_groups=19 ieee80211w=2 sae_pwe=0