mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-25 17:59:25 +01:00
auto-t: SAE: Rework SAE tests
Break up the SAE tests into two parts: testSAE and testSAE-AntiClogging testSAE is simplified to only use two radios and a single phy managed by hostapd. hostapd configurations are changed via the new 'set_value' method added to hostapd utils. This allows forcing hostapd to use a particular sae group set, or force hostapd to use SAE H2E/Hunting and Pecking Loop for key derivation. A separate test for IKE Group 20 is no longer required and is folded into connection_test.py testSAE-AntiClogging is added with an environment for 5 radios instead of 7, again with hostapd running on a single phy. 'sae_pwe' is used to force hostapd to use SAE H2E or Hunting and Pecking for key derivation. Both Anti-Clogging protocol variants are thus tested. main.conf is added to both directories to force scan randomization off. This seems to be required for hostapd to work properly on hwsim.
This commit is contained in:
parent
38e3e72684
commit
6d76b3e21d
@ -8,6 +8,7 @@ import iwd
|
|||||||
from iwd import IWD
|
from iwd import IWD
|
||||||
from iwd import PSKAgent
|
from iwd import PSKAgent
|
||||||
from iwd import NetworkType
|
from iwd import NetworkType
|
||||||
|
from hostapd import HostapdCLI
|
||||||
|
|
||||||
class Test(unittest.TestCase):
|
class Test(unittest.TestCase):
|
||||||
|
|
||||||
@ -21,20 +22,16 @@ class Test(unittest.TestCase):
|
|||||||
self.assertIsNotNone(devices)
|
self.assertIsNotNone(devices)
|
||||||
|
|
||||||
for d in devices:
|
for d in devices:
|
||||||
condition = 'not obj.scanning'
|
d.disconnect()
|
||||||
wd.wait_for_object_condition(d, condition)
|
|
||||||
|
|
||||||
d.scan()
|
d.scan()
|
||||||
|
wd.wait_for_object_condition(d, 'obj.scanning')
|
||||||
|
|
||||||
for d in devices:
|
for d in devices:
|
||||||
condition = 'not obj.scanning'
|
wd.wait_for_object_condition(d, 'not obj.scanning')
|
||||||
wd.wait_for_object_condition(d, condition)
|
|
||||||
|
|
||||||
for i in range(len(devices)):
|
for i in range(len(devices)):
|
||||||
network = devices[i].get_ordered_network('ssidSAE-Clogging')
|
network = devices[i].get_ordered_network('ssidSAE-Clogging')
|
||||||
|
|
||||||
self.assertEqual(network.type, NetworkType.psk)
|
self.assertEqual(network.type, NetworkType.psk)
|
||||||
|
|
||||||
networks.append(network)
|
networks.append(network)
|
||||||
|
|
||||||
condition = 'not obj.connected'
|
condition = 'not obj.connected'
|
||||||
@ -47,10 +44,6 @@ class Test(unittest.TestCase):
|
|||||||
condition = 'obj.state == DeviceState.connected'
|
condition = 'obj.state == DeviceState.connected'
|
||||||
wd.wait_for_object_condition(d, condition)
|
wd.wait_for_object_condition(d, condition)
|
||||||
|
|
||||||
for d in devices:
|
|
||||||
condition = 'obj.state == DeviceState.connected'
|
|
||||||
wd.wait_for_object_condition(d, condition)
|
|
||||||
|
|
||||||
for d in devices:
|
for d in devices:
|
||||||
d.disconnect()
|
d.disconnect()
|
||||||
|
|
||||||
@ -60,14 +53,27 @@ class Test(unittest.TestCase):
|
|||||||
|
|
||||||
wd.unregister_psk_agent(psk_agent)
|
wd.unregister_psk_agent(psk_agent)
|
||||||
|
|
||||||
def test_connection_success(self):
|
def test_SAE_H2E_Group20(self):
|
||||||
|
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)
|
wd = IWD(True)
|
||||||
|
|
||||||
self.validate_connection(wd)
|
self.validate_connection(wd)
|
||||||
|
wd.clear_storage()
|
||||||
|
|
||||||
|
def test_SAE(self):
|
||||||
|
self.hostapd.set_value('sae_pwe', '0');
|
||||||
|
self.hostapd.set_value('sae_groups', '19');
|
||||||
|
self.hostapd.reload()
|
||||||
|
self.hostapd.wait_for_event("AP-ENABLED")
|
||||||
|
wd = IWD(True)
|
||||||
|
self.validate_connection(wd)
|
||||||
|
wd.clear_storage()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
pass
|
cls.hostapd = HostapdCLI(config='ssidSAE-Clogging.conf')
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def tearDownClass(cls):
|
def tearDownClass(cls):
|
6
autotests/testSAE-AntiClogging/hw.conf
Normal file
6
autotests/testSAE-AntiClogging/hw.conf
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[SETUP]
|
||||||
|
num_radios=5
|
||||||
|
start_iwd=0
|
||||||
|
|
||||||
|
[HOSTAPD]
|
||||||
|
rad0=ssidSAE-Clogging.conf
|
6
autotests/testSAE-AntiClogging/main.conf
Normal file
6
autotests/testSAE-AntiClogging/main.conf
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[Scan]
|
||||||
|
#
|
||||||
|
# Discovery of the hidden networks with randomization flag set works with real
|
||||||
|
# hardware, but fails when used in simulated environment with mac80211_hwsim.
|
||||||
|
# Disable MAC randomization for the tests with hidden networks.
|
||||||
|
DisableMacAddressRandomization=true
|
@ -8,21 +8,16 @@ import iwd
|
|||||||
from iwd import IWD
|
from iwd import IWD
|
||||||
from iwd import PSKAgent
|
from iwd import PSKAgent
|
||||||
from iwd import NetworkType
|
from iwd import NetworkType
|
||||||
|
from hostapd import HostapdCLI
|
||||||
|
|
||||||
class Test(unittest.TestCase):
|
class Test(unittest.TestCase):
|
||||||
|
|
||||||
def validate_connection(self, wd):
|
def validate_connection(self, wd):
|
||||||
|
|
||||||
devices = wd.list_devices(4)
|
devices = wd.list_devices(1)
|
||||||
self.assertIsNotNone(devices)
|
self.assertIsNotNone(devices)
|
||||||
device = devices[0]
|
device = devices[0]
|
||||||
|
|
||||||
# These devices aren't used in this test, this makes logs a bit nicer
|
|
||||||
# since these devices would presumably start autoconnecting.
|
|
||||||
devices[1].disconnect()
|
|
||||||
devices[2].disconnect()
|
|
||||||
devices[3].disconnect()
|
|
||||||
|
|
||||||
condition = 'obj.state == DeviceState.connected'
|
condition = 'obj.state == DeviceState.connected'
|
||||||
wd.wait_for_object_condition(device, condition)
|
wd.wait_for_object_condition(device, condition)
|
||||||
|
|
||||||
@ -38,13 +33,26 @@ class Test(unittest.TestCase):
|
|||||||
condition = 'not obj.connected'
|
condition = 'not obj.connected'
|
||||||
wd.wait_for_object_condition(ordered_network.network_object, condition)
|
wd.wait_for_object_condition(ordered_network.network_object, condition)
|
||||||
|
|
||||||
def test_connection_success(self):
|
def test_SAE(self):
|
||||||
wd = IWD(True)
|
self.hostapd.set_value('sae_pwe', '0');
|
||||||
|
self.hostapd.set_value('sae_groups', '19');
|
||||||
|
self.hostapd.reload()
|
||||||
|
self.hostapd.wait_for_event("AP-ENABLED")
|
||||||
|
|
||||||
|
wd = IWD(True)
|
||||||
|
self.validate_connection(wd)
|
||||||
|
|
||||||
|
def test_SAE_H2E(self):
|
||||||
|
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)
|
self.validate_connection(wd)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
|
cls.hostapd = HostapdCLI(config='ssidSAE.conf')
|
||||||
IWD.copy_to_storage('ssidSAE.psk')
|
IWD.copy_to_storage('ssidSAE.psk')
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -14,36 +14,26 @@ import testutil
|
|||||||
class Test(unittest.TestCase):
|
class Test(unittest.TestCase):
|
||||||
|
|
||||||
def validate_connection(self, wd):
|
def validate_connection(self, wd):
|
||||||
hostapd = HostapdCLI(config='ssidSAE.conf')
|
|
||||||
|
|
||||||
psk_agent = PSKAgent("secret123")
|
psk_agent = PSKAgent("secret123")
|
||||||
wd.register_psk_agent(psk_agent)
|
wd.register_psk_agent(psk_agent)
|
||||||
|
|
||||||
devices = wd.list_devices(4)
|
devices = wd.list_devices(1)
|
||||||
self.assertIsNotNone(devices)
|
self.assertIsNotNone(devices)
|
||||||
device = devices[0]
|
device = devices[0]
|
||||||
|
|
||||||
# These devices aren't used in this test, this makes logs a bit nicer
|
device.disconnect()
|
||||||
# since these devices would presumably start autoconnecting.
|
|
||||||
devices[1].disconnect()
|
|
||||||
devices[2].disconnect()
|
|
||||||
devices[3].disconnect()
|
|
||||||
|
|
||||||
condition = 'not obj.scanning'
|
wd.wait_for_object_condition(device, 'not obj.scanning')
|
||||||
wd.wait_for_object_condition(device, condition)
|
|
||||||
|
|
||||||
device.scan()
|
device.scan()
|
||||||
|
|
||||||
condition = 'not obj.scanning'
|
wd.wait_for_object_condition(device, 'obj.scanning')
|
||||||
wd.wait_for_object_condition(device, condition)
|
wd.wait_for_object_condition(device, 'not obj.scanning')
|
||||||
|
|
||||||
network = device.get_ordered_network('ssidSAE')
|
network = device.get_ordered_network('ssidSAE')
|
||||||
|
|
||||||
self.assertEqual(network.type, NetworkType.psk)
|
self.assertEqual(network.type, NetworkType.psk)
|
||||||
|
|
||||||
condition = 'not obj.connected'
|
|
||||||
wd.wait_for_object_condition(network.network_object, condition)
|
|
||||||
|
|
||||||
network.network_object.connect()
|
network.network_object.connect()
|
||||||
|
|
||||||
condition = 'obj.state == DeviceState.connected'
|
condition = 'obj.state == DeviceState.connected'
|
||||||
@ -52,7 +42,7 @@ class Test(unittest.TestCase):
|
|||||||
wd.wait(2)
|
wd.wait(2)
|
||||||
|
|
||||||
testutil.test_iface_operstate(intf=device.name)
|
testutil.test_iface_operstate(intf=device.name)
|
||||||
testutil.test_ifaces_connected(if0=device.name, if1=hostapd.ifname)
|
testutil.test_ifaces_connected(if0=device.name, if1=self.hostapd.ifname)
|
||||||
|
|
||||||
device.disconnect()
|
device.disconnect()
|
||||||
|
|
||||||
@ -61,18 +51,49 @@ class Test(unittest.TestCase):
|
|||||||
|
|
||||||
wd.unregister_psk_agent(psk_agent)
|
wd.unregister_psk_agent(psk_agent)
|
||||||
|
|
||||||
def test_connection_success(self):
|
def test_SAE(self):
|
||||||
|
self.hostapd.set_value('sae_pwe', '0');
|
||||||
|
self.hostapd.set_value('sae_groups', '19');
|
||||||
|
self.hostapd.reload()
|
||||||
|
self.hostapd.wait_for_event("AP-ENABLED")
|
||||||
wd = IWD(True)
|
wd = IWD(True)
|
||||||
|
|
||||||
self.validate_connection(wd)
|
self.validate_connection(wd)
|
||||||
|
wd.clear_storage()
|
||||||
|
|
||||||
|
def test_SAE_Group20(self):
|
||||||
|
self.hostapd.set_value('sae_pwe', '0');
|
||||||
|
self.hostapd.set_value('sae_groups', '20');
|
||||||
|
self.hostapd.reload()
|
||||||
|
self.hostapd.wait_for_event("AP-ENABLED")
|
||||||
|
wd = IWD(True)
|
||||||
|
self.validate_connection(wd)
|
||||||
|
wd.clear_storage()
|
||||||
|
|
||||||
|
def test_SAE_H2E(self):
|
||||||
|
self.hostapd.set_value('sae_pwe', '1');
|
||||||
|
self.hostapd.set_value('sae_groups', '19');
|
||||||
|
self.hostapd.reload()
|
||||||
|
self.hostapd.wait_for_event("AP-ENABLED")
|
||||||
|
wd = IWD(True)
|
||||||
|
self.validate_connection(wd)
|
||||||
|
wd.clear_storage()
|
||||||
|
|
||||||
|
def test_SAE_H2E_Group20(self):
|
||||||
|
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)
|
||||||
|
wd.clear_storage()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
pass
|
cls.hostapd = HostapdCLI(config='ssidSAE.conf')
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def tearDownClass(cls):
|
def tearDownClass(cls):
|
||||||
IWD.clear_storage()
|
pass
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main(exit=True)
|
unittest.main(exit=True)
|
||||||
|
@ -12,7 +12,6 @@ from iwd import NetworkType
|
|||||||
class Test(unittest.TestCase):
|
class Test(unittest.TestCase):
|
||||||
|
|
||||||
def validate_connection(self, wd):
|
def validate_connection(self, wd):
|
||||||
|
|
||||||
psk_agent = PSKAgent("InvalidSecret")
|
psk_agent = PSKAgent("InvalidSecret")
|
||||||
wd.register_psk_agent(psk_agent)
|
wd.register_psk_agent(psk_agent)
|
||||||
|
|
||||||
@ -42,7 +41,6 @@ class Test(unittest.TestCase):
|
|||||||
|
|
||||||
def test_connection_success(self):
|
def test_connection_success(self):
|
||||||
wd = IWD(True)
|
wd = IWD(True)
|
||||||
|
|
||||||
self.validate_connection(wd)
|
self.validate_connection(wd)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -1,78 +0,0 @@
|
|||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
import unittest
|
|
||||||
import sys
|
|
||||||
|
|
||||||
sys.path.append('../util')
|
|
||||||
import iwd
|
|
||||||
from iwd import IWD
|
|
||||||
from iwd import PSKAgent
|
|
||||||
from iwd import NetworkType
|
|
||||||
from hostapd import HostapdCLI
|
|
||||||
import testutil
|
|
||||||
|
|
||||||
class Test(unittest.TestCase):
|
|
||||||
|
|
||||||
def validate_connection(self, wd):
|
|
||||||
hostapd = HostapdCLI(config='ssidSAE-20.conf')
|
|
||||||
|
|
||||||
psk_agent = PSKAgent("secret123")
|
|
||||||
wd.register_psk_agent(psk_agent)
|
|
||||||
|
|
||||||
devices = wd.list_devices(4)
|
|
||||||
self.assertIsNotNone(devices)
|
|
||||||
device = devices[0]
|
|
||||||
|
|
||||||
# These devices aren't used in this test, this makes logs a bit nicer
|
|
||||||
# since these devices would presumably start autoconnecting.
|
|
||||||
devices[1].disconnect()
|
|
||||||
devices[2].disconnect()
|
|
||||||
devices[3].disconnect()
|
|
||||||
|
|
||||||
condition = 'not obj.scanning'
|
|
||||||
wd.wait_for_object_condition(device, condition)
|
|
||||||
|
|
||||||
device.scan()
|
|
||||||
|
|
||||||
condition = 'not obj.scanning'
|
|
||||||
wd.wait_for_object_condition(device, condition)
|
|
||||||
|
|
||||||
network = device.get_ordered_network('ssidSAE-20')
|
|
||||||
|
|
||||||
self.assertEqual(network.type, NetworkType.psk)
|
|
||||||
|
|
||||||
condition = 'not obj.connected'
|
|
||||||
wd.wait_for_object_condition(network.network_object, condition)
|
|
||||||
|
|
||||||
network.network_object.connect()
|
|
||||||
|
|
||||||
condition = 'obj.state == DeviceState.connected'
|
|
||||||
wd.wait_for_object_condition(device, condition)
|
|
||||||
|
|
||||||
wd.wait(2)
|
|
||||||
|
|
||||||
testutil.test_iface_operstate(intf=device.name)
|
|
||||||
testutil.test_ifaces_connected(if0=device.name, if1=hostapd.ifname)
|
|
||||||
|
|
||||||
device.disconnect()
|
|
||||||
|
|
||||||
condition = 'not obj.connected'
|
|
||||||
wd.wait_for_object_condition(network.network_object, condition)
|
|
||||||
|
|
||||||
wd.unregister_psk_agent(psk_agent)
|
|
||||||
|
|
||||||
def test_connection_success(self):
|
|
||||||
wd = IWD(True)
|
|
||||||
|
|
||||||
self.validate_connection(wd)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def setUpClass(cls):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def tearDownClass(cls):
|
|
||||||
IWD.clear_storage()
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
unittest.main(exit=True)
|
|
@ -1,8 +1,6 @@
|
|||||||
[SETUP]
|
[SETUP]
|
||||||
num_radios=7
|
num_radios=2
|
||||||
start_iwd=0
|
start_iwd=0
|
||||||
|
|
||||||
[HOSTAPD]
|
[HOSTAPD]
|
||||||
rad0=ssidSAE.conf
|
rad0=ssidSAE.conf
|
||||||
rad1=ssidSAE-Clogging.conf
|
|
||||||
rad2=ssidSAE-20.conf
|
|
||||||
|
6
autotests/testSAE/main.conf
Normal file
6
autotests/testSAE/main.conf
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[Scan]
|
||||||
|
#
|
||||||
|
# Discovery of the hidden networks with randomization flag set works with real
|
||||||
|
# hardware, but fails when used in simulated environment with mac80211_hwsim.
|
||||||
|
# Disable MAC randomization for the tests with hidden networks.
|
||||||
|
DisableMacAddressRandomization=true
|
@ -1,10 +0,0 @@
|
|||||||
hw_mode=g
|
|
||||||
channel=1
|
|
||||||
ssid=ssidSAE-20
|
|
||||||
|
|
||||||
wpa=2
|
|
||||||
wpa_key_mgmt=SAE
|
|
||||||
wpa_pairwise=CCMP
|
|
||||||
sae_password=secret123|mac=ff:ff:ff:ff:ff:ff
|
|
||||||
sae_groups=20
|
|
||||||
ieee80211w=2
|
|
@ -6,4 +6,5 @@ wpa=2
|
|||||||
wpa_key_mgmt=SAE
|
wpa_key_mgmt=SAE
|
||||||
wpa_pairwise=CCMP
|
wpa_pairwise=CCMP
|
||||||
sae_password=secret123|mac=ff:ff:ff:ff:ff:ff
|
sae_password=secret123|mac=ff:ff:ff:ff:ff:ff
|
||||||
|
sae_groups=19
|
||||||
ieee80211w=2
|
ieee80211w=2
|
||||||
|
@ -1,3 +1,2 @@
|
|||||||
[Security]
|
[Security]
|
||||||
PreSharedKey=6d44ed0e3a2e1de04c753d66369ece3b9534094ab7ec9ce76798641a9fa68b13
|
|
||||||
Passphrase=secret123
|
Passphrase=secret123
|
||||||
|
@ -19,14 +19,7 @@ class Test(unittest.TestCase):
|
|||||||
psk_agent = PSKAgent(["secret123", "secret123"])
|
psk_agent = PSKAgent(["secret123", "secret123"])
|
||||||
wd.register_psk_agent(psk_agent)
|
wd.register_psk_agent(psk_agent)
|
||||||
|
|
||||||
devices = wd.list_devices(4)
|
devices = wd.list_devices(1)
|
||||||
|
|
||||||
# These devices aren't used in this test, this makes logs a bit nicer
|
|
||||||
# since these devices would presumably start autoconnecting.
|
|
||||||
devices[1].disconnect()
|
|
||||||
devices[2].disconnect()
|
|
||||||
devices[3].disconnect()
|
|
||||||
|
|
||||||
self.assertIsNotNone(devices)
|
self.assertIsNotNone(devices)
|
||||||
device = devices[0]
|
device = devices[0]
|
||||||
|
|
||||||
@ -68,7 +61,6 @@ class Test(unittest.TestCase):
|
|||||||
|
|
||||||
def test_connection_success(self):
|
def test_connection_success(self):
|
||||||
wd = IWD(True)
|
wd = IWD(True)
|
||||||
|
|
||||||
self.validate_connection(wd)
|
self.validate_connection(wd)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -129,6 +129,10 @@ class HostapdCLI:
|
|||||||
def __del__(self):
|
def __del__(self):
|
||||||
self._del_hostapd()
|
self._del_hostapd()
|
||||||
|
|
||||||
|
def set_value(self, key, value):
|
||||||
|
cmd = self.cmdline + ['set', key, value]
|
||||||
|
ctx.start_process(cmd, wait=True)
|
||||||
|
|
||||||
def wps_push_button(self):
|
def wps_push_button(self):
|
||||||
ctx.start_process(self.cmdline + ['wps_pbc'], wait=True)
|
ctx.start_process(self.cmdline + ['wps_pbc'], wait=True)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user