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.
This commit is contained in:
James Prestwood 2024-02-27 10:34:03 -08:00 committed by Denis Kenzior
parent 82161909a1
commit e296a61e3f
8 changed files with 52 additions and 40 deletions

View File

@ -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)

View File

@ -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):

View File

@ -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

View File

@ -0,0 +1,2 @@
[Security]
Passphrase=secret123

View File

@ -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

View File

@ -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