diff options
Diffstat (limited to 'tests/hwsim/test_ocv.py')
-rw-r--r-- | tests/hwsim/test_ocv.py | 1247 |
1 files changed, 0 insertions, 1247 deletions
diff --git a/tests/hwsim/test_ocv.py b/tests/hwsim/test_ocv.py deleted file mode 100644 index e93cea6ffa18..000000000000 --- a/tests/hwsim/test_ocv.py +++ /dev/null @@ -1,1247 +0,0 @@ -# WPA2-Personal OCV tests -# Copyright (c) 2018, Mathy Vanhoef -# -# This software may be distributed under the terms of the BSD license. -# See README for more details - -from remotehost import remote_compatible -import binascii, struct -import logging, time -logger = logging.getLogger() - -import hostapd -from wpasupplicant import WpaSupplicant -import hwsim_utils -from utils import * -from test_erp import start_erp_as -from test_ap_ft import ft_params1, ft_params2 -from test_ap_psk import parse_eapol, build_eapol, pmk_to_ptk, eapol_key_mic, recv_eapol, send_eapol, reply_eapol, build_eapol_key_3_4, aes_wrap, pad_key_data - -#TODO: Refuse setting up AP with OCV but without MFP support -#TODO: Refuse to connect to AP that advertises OCV but not MFP - -def make_ocikde(op_class, channel, seg1_idx): - WLAN_EID_VENDOR_SPECIFIC = 221 - RSN_KEY_DATA_OCI = b"\x00\x0f\xac\x0d" - - data = RSN_KEY_DATA_OCI + struct.pack("<BBB", op_class, channel, seg1_idx) - ocikde = struct.pack("<BB", WLAN_EID_VENDOR_SPECIFIC, len(data)) + data - - return ocikde - -def ocv_setup_ap(apdev, params): - ssid = "test-wpa2-ocv" - passphrase = "qwertyuiop" - params.update(hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)) - try: - hapd = hostapd.add_ap(apdev, params) - except Exception as e: - if "Failed to set hostapd parameter ocv" in str(e): - raise HwsimSkip("OCV not supported") - raise - return hapd, ssid, passphrase - -def build_eapol_key_1_2(kck, key_data, replay_counter=3, key_info=0x1382, - extra_len=0, descr_type=2, key_len=16): - msg = {} - msg['version'] = 2 - msg['type'] = 3 - msg['length'] = 95 + len(key_data) + extra_len - - msg['descr_type'] = descr_type - msg['rsn_key_info'] = key_info - msg['rsn_key_len'] = key_len - msg['rsn_replay_counter'] = struct.pack('>Q', replay_counter) - msg['rsn_key_nonce'] = binascii.unhexlify('0000000000000000000000000000000000000000000000000000000000000000') - msg['rsn_key_iv'] = binascii.unhexlify('00000000000000000000000000000000') - msg['rsn_key_rsc'] = binascii.unhexlify('0000000000000000') - msg['rsn_key_id'] = binascii.unhexlify('0000000000000000') - msg['rsn_key_data_len'] = len(key_data) - msg['rsn_key_data'] = key_data - eapol_key_mic(kck, msg) - return msg - -def build_eapol_key_2_2(kck, key_data, replay_counter=3, key_info=0x0302, - extra_len=0, descr_type=2, key_len=16): - return build_eapol_key_1_2(kck, key_data, replay_counter, key_info, - extra_len, descr_type, key_len) - -@remote_compatible -def test_wpa2_ocv(dev, apdev): - """OCV on 2.4 GHz""" - params = {"channel": "1", - "ieee80211w": "2", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - for ocv in range(2): - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv=str(ocv), - ieee80211w="1") - dev[0].request("REMOVE_NETWORK all") - dev[0].wait_disconnected() - -@remote_compatible -def test_wpa2_ocv_5ghz(dev, apdev): - """OCV on 5 GHz""" - try: - run_wpa2_ocv_5ghz(dev, apdev) - finally: - set_world_reg(apdev[0], apdev[1], dev[0]) - dev[0].flush_scan_cache() - -def run_wpa2_ocv_5ghz(dev, apdev): - params = {"hw_mode": "a", - "channel": "40", - "ieee80211w": "2", - "country_code": "US", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - for ocv in range(2): - dev[0].connect(ssid, psk=passphrase, scan_freq="5200", ocv=str(ocv), - ieee80211w="1") - dev[0].wait_regdom(country_ie=True) - dev[0].request("REMOVE_NETWORK all") - dev[0].wait_disconnected() - -@remote_compatible -def test_wpa2_ocv_ht20(dev, apdev): - """OCV with HT20 channel""" - params = {"channel": "6", - "ieee80211n": "1", - "ieee80211w": "1", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - for ocv in range(2): - dev[0].connect(ssid, psk=passphrase, scan_freq="2437", ocv=str(ocv), - ieee80211w="1", disable_ht="1") - dev[1].connect(ssid, psk=passphrase, scan_freq="2437", ocv=str(ocv), - ieee80211w="1") - dev[0].request("REMOVE_NETWORK all") - dev[1].request("REMOVE_NETWORK all") - dev[0].wait_disconnected() - dev[1].wait_disconnected() - -@remote_compatible -def test_wpa2_ocv_ht40(dev, apdev): - """OCV with HT40 channel""" - try: - run_wpa2_ocv_ht40(dev, apdev) - finally: - set_world_reg(apdev[0], apdev[1], dev[0]) - dev[0].flush_scan_cache() - dev[1].flush_scan_cache() - -def run_wpa2_ocv_ht40(dev, apdev): - for channel, capab, freq, mode in [("6", "[HT40-]", "2437", "g"), - ("6", "[HT40+]", "2437", "g"), - ("40", "[HT40-]", "5200", "a"), - ("36", "[HT40+]", "5180", "a")]: - params = {"hw_mode": mode, - "channel": channel, - "country_code": "US", - "ieee80211n": "1", - "ht_capab": capab, - "ieee80211w": "1", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - dev[0].flush_scan_cache() - dev[1].flush_scan_cache() - for ocv in range(2): - dev[0].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1", disable_ht="1") - dev[1].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1") - dev[0].wait_regdom(country_ie=True) - dev[0].request("REMOVE_NETWORK all") - dev[1].request("REMOVE_NETWORK all") - dev[0].wait_disconnected() - dev[1].wait_disconnected() - hapd.disable() - -@remote_compatible -def test_wpa2_ocv_vht40(dev, apdev): - """OCV with VHT40 channel""" - try: - run_wpa2_ocv_vht40(dev, apdev) - finally: - set_world_reg(apdev[0], apdev[1], dev[0]) - dev[0].flush_scan_cache() - dev[1].flush_scan_cache() - dev[2].flush_scan_cache() - -def run_wpa2_ocv_vht40(dev, apdev): - for channel, capab, freq in [("40", "[HT40-]", "5200"), - ("36", "[HT40+]", "5180")]: - params = {"hw_mode": "a", - "channel": channel, - "country_code": "US", - "ht_capab": capab, - "ieee80211n": "1", - "ieee80211ac": "1", - "vht_oper_chwidth": "0", - "vht_oper_centr_freq_seg0_idx": "38", - "ieee80211w": "1", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - dev[0].flush_scan_cache() - dev[1].flush_scan_cache() - dev[2].flush_scan_cache() - for ocv in range(2): - dev[0].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1", disable_ht="1") - dev[1].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1", disable_vht="1") - dev[2].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1") - dev[0].wait_regdom(country_ie=True) - dev[0].request("REMOVE_NETWORK all") - dev[1].request("REMOVE_NETWORK all") - dev[2].request("REMOVE_NETWORK all") - dev[0].wait_disconnected() - dev[1].wait_disconnected() - dev[2].wait_disconnected() - hapd.disable() - -@remote_compatible -def test_wpa2_ocv_vht80(dev, apdev): - """OCV with VHT80 channel""" - try: - run_wpa2_ocv_vht80(dev, apdev) - finally: - set_world_reg(apdev[0], apdev[1], dev[0]) - dev[0].flush_scan_cache() - dev[1].flush_scan_cache() - dev[2].flush_scan_cache() - -def run_wpa2_ocv_vht80(dev, apdev): - for channel, capab, freq in [("40", "[HT40-]", "5200"), - ("36", "[HT40+]", "5180")]: - params = {"hw_mode": "a", - "channel": channel, - "country_code": "US", - "ht_capab": capab, - "ieee80211n": "1", - "ieee80211ac": "1", - "vht_oper_chwidth": "1", - "vht_oper_centr_freq_seg0_idx": "42", - "ieee80211w": "1", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - for ocv in range(2): - dev[0].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1", disable_ht="1") - dev[1].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1", disable_vht="1") - dev[2].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1") - dev[0].wait_regdom(country_ie=True) - dev[0].request("REMOVE_NETWORK all") - dev[1].request("REMOVE_NETWORK all") - dev[2].request("REMOVE_NETWORK all") - dev[0].wait_disconnected() - dev[1].wait_disconnected() - dev[2].wait_disconnected() - hapd.disable() - -@remote_compatible -def test_wpa2_ocv_vht160(dev, apdev): - """OCV with VHT160 channel""" - try: - run_wpa2_ocv_vht160(dev, apdev) - finally: - set_world_reg(apdev[0], apdev[1], dev[0]) - dev[0].flush_scan_cache() - dev[1].flush_scan_cache() - dev[2].flush_scan_cache() - -def run_wpa2_ocv_vht160(dev, apdev): - for channel, capab, freq in [("100", "[HT40+]", "5500"), - ("104", "[HT40-]", "5520")]: - params = {"hw_mode": "a", - "channel": channel, - "country_code": "ZA", - "ht_capab": capab, - "vht_capab": "[VHT160]", - "ieee80211n": "1", - "ieee80211ac": "1", - "vht_oper_chwidth": "2", - "vht_oper_centr_freq_seg0_idx": "114", - "ieee80211w": "1", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - for ocv in range(2): - dev[0].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1", disable_ht="1") - dev[1].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1", disable_vht="1") - dev[2].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1") - dev[0].wait_regdom(country_ie=True) - dev[0].request("REMOVE_NETWORK all") - dev[1].request("REMOVE_NETWORK all") - dev[2].request("REMOVE_NETWORK all") - dev[0].wait_disconnected() - dev[1].wait_disconnected() - dev[2].wait_disconnected() - hapd.disable() - -@remote_compatible -def test_wpa2_ocv_vht80plus80(dev, apdev): - """OCV with VHT80+80 channel""" - try: - run_wpa2_ocv_vht80plus80(dev, apdev) - finally: - set_world_reg(apdev[0], apdev[1], dev[0]) - dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=0.5) - dev[0].flush_scan_cache() - dev[1].flush_scan_cache() - dev[2].flush_scan_cache() - -def run_wpa2_ocv_vht80plus80(dev, apdev): - for channel, capab, freq in [("36", "[HT40+]", "5180"), - ("40", "[HT40-]", "5200")]: - params = {"hw_mode": "a", - "channel": channel, - "country_code": "US", - "ht_capab": capab, - "vht_capab": "[VHT160-80PLUS80]", - "ieee80211n": "1", - "ieee80211ac": "1", - "vht_oper_chwidth": "3", - "vht_oper_centr_freq_seg0_idx": "42", - "vht_oper_centr_freq_seg1_idx": "155", - "ieee80211w": "1", - "ieee80211d": "1", - "ieee80211h": "1", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - for ocv in range(2): - dev[0].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1", disable_ht="1") - dev[1].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1", disable_vht="1") - dev[2].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1") - dev[0].wait_regdom(country_ie=True) - dev[0].request("REMOVE_NETWORK all") - dev[1].request("REMOVE_NETWORK all") - dev[2].request("REMOVE_NETWORK all") - dev[0].wait_disconnected() - dev[1].wait_disconnected() - dev[2].wait_disconnected() - for i in range(3): - dev[i].connect(ssid, psk=passphrase, scan_freq=freq, ocv=str(ocv), - ieee80211w="1") - if i == 0: - dev[i].wait_regdom(country_ie=True) - hapd.disable() - for i in range(3): - dev[i].request("DISCONNECT") - for i in range(3): - dev[i].disconnect_and_stop_scan() - -class APConnection: - def init_params(self): - # Static parameters - self.ssid = "test-wpa2-ocv" - self.passphrase = "qwertyuiop" - self.psk = "c2c6c255af836bed1b3f2f1ded98e052f5ad618bb554e2836757b55854a0eab7" - - # Dynamic parameters - self.hapd = None - self.addr = None - self.rsne = None - self.kck = None - self.kek = None - self.msg = None - self.bssid = None - self.anonce = None - self.snonce = None - - def __init__(self, apdev, dev, params): - self.init_params() - - # By default, OCV is enabled for both the client and AP. The following - # parameters can be used to disable OCV for the client or AP. - ap_ocv = params.pop("ap_ocv", "1") - sta_ocv = params.pop("sta_ocv", "1") - - freq = params.pop("freq") - params.update(hostapd.wpa2_params(ssid=self.ssid, - passphrase=self.passphrase)) - params["wpa_pairwise_update_count"] = "10" - params["ocv"] = ap_ocv - try: - self.hapd = hostapd.add_ap(apdev, params) - except Exception as e: - if "Failed to set hostapd parameter ocv" in str(e): - raise HwsimSkip("OCV not supported") - raise - self.hapd.request("SET ext_eapol_frame_io 1") - dev.request("SET ext_eapol_frame_io 1") - - self.bssid = apdev['bssid'] - pmk = binascii.unhexlify("c2c6c255af836bed1b3f2f1ded98e052f5ad618bb554e2836757b55854a0eab7") - - if sta_ocv != "0": - self.rsne = binascii.unhexlify("301a0100000fac040100000fac040100000fac0280400000000fac06") - else: - self.rsne = binascii.unhexlify("301a0100000fac040100000fac040100000fac0280000000000fac06") - self.snonce = binascii.unhexlify('1111111111111111111111111111111111111111111111111111111111111111') - - dev.connect(self.ssid, raw_psk=self.psk, scan_freq=freq, ocv=sta_ocv, - ieee80211w="1", wait_connect=False) - if "country_code" in params: - dev.wait_regdom(country_ie=True) - self.addr = dev.p2p_interface_addr() - - # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated - self.msg = recv_eapol(self.hapd) - self.anonce = self.msg['rsn_key_nonce'] - (ptk, self.kck, self.kek) = pmk_to_ptk(pmk, self.addr, self.bssid, - self.snonce, self.anonce) - - # hapd, addr, rsne, kck, msg, anonce, snonce - def test_bad_oci(self, logmsg, op_class, channel, seg1_idx): - logger.debug("Bad OCI element: " + logmsg) - if op_class is None: - ocikde = b'' - else: - ocikde = make_ocikde(op_class, channel, seg1_idx) - - reply_eapol("2/4", self.hapd, self.addr, self.msg, 0x010a, self.snonce, - self.rsne + ocikde, self.kck) - self.msg = recv_eapol(self.hapd) - if self.anonce != self.msg['rsn_key_nonce'] or self.msg["rsn_key_info"] != 138: - raise Exception("Didn't receive retransmitted 1/4") - - def confirm_valid_oci(self, op_class, channel, seg1_idx): - logger.debug("Valid OCI element to complete handshake") - ocikde = make_ocikde(op_class, channel, seg1_idx) - - reply_eapol("2/4", self.hapd, self.addr, self.msg, 0x010a, self.snonce, - self.rsne + ocikde, self.kck) - self.msg = recv_eapol(self.hapd) - if self.anonce != self.msg['rsn_key_nonce'] or self.msg["rsn_key_info"] != 5066: - raise Exception("Didn't receive 3/4 in response to valid 2/4") - - reply_eapol("4/4", self.hapd, self.addr, self.msg, 0x030a, None, None, - self.kck) - self.hapd.wait_sta(timeout=15) - -@remote_compatible -def test_wpa2_ocv_ap_mismatch(dev, apdev): - """OCV AP mismatch""" - params = {"channel": "1", - "ieee80211w": "1", - "freq": "2412"} - conn = APConnection(apdev[0], dev[0], params) - conn.test_bad_oci("element missing", None, 0, 0) - conn.test_bad_oci("wrong channel number", 81, 6, 0) - conn.test_bad_oci("invalid channel number", 81, 0, 0) - conn.test_bad_oci("wrong operating class", 80, 0, 0) - conn.test_bad_oci("invalid operating class", 0, 0, 0) - conn.confirm_valid_oci(81, 1, 0) - -@remote_compatible -def test_wpa2_ocv_ap_ht_mismatch(dev, apdev): - """OCV AP mismatch (HT)""" - params = {"channel": "6", - "ht_capab": "[HT40-]", - "ieee80211w": "1", - "freq": "2437"} - conn = APConnection(apdev[0], dev[0], params) - conn.test_bad_oci("wrong primary channel", 84, 5, 0) - conn.test_bad_oci("lower bandwidth than negotiated", 81, 6, 0) - conn.test_bad_oci("bad upper/lower channel", 83, 6, 0) - conn.confirm_valid_oci(84, 6, 0) - -@remote_compatible -def test_wpa2_ocv_ap_vht80_mismatch(dev, apdev): - """OCV AP mismatch (VHT80)""" - try: - run_wpa2_ocv_ap_vht80_mismatch(dev, apdev) - finally: - set_world_reg(apdev[0], apdev[1], dev[0]) - dev[0].flush_scan_cache() - -def run_wpa2_ocv_ap_vht80_mismatch(dev, apdev): - params = {"hw_mode": "a", - "channel": "36", - "country_code": "US", - "ht_capab": "[HT40+]", - "ieee80211w": "1", - "ieee80211n": "1", - "ieee80211ac": "1", - "vht_oper_chwidth": "1", - "freq": "5180", - "vht_oper_centr_freq_seg0_idx": "42"} - conn = APConnection(apdev[0], dev[0], params) - conn.test_bad_oci("wrong primary channel", 128, 38, 0) - conn.test_bad_oci("wrong primary channel", 128, 32, 0) - conn.test_bad_oci("smaller bandwidth than negotiated", 116, 36, 0) - conn.test_bad_oci("smaller bandwidth than negotiated", 115, 36, 0) - conn.confirm_valid_oci(128, 36, 0) - - dev[0].dump_monitor() - dev[0].request("DISCONNECT") - dev[0].wait_disconnected() - -@remote_compatible -def test_wpa2_ocv_ap_vht160_mismatch(dev, apdev): - """OCV AP mismatch (VHT160)""" - try: - run_wpa2_ocv_ap_vht160_mismatch(dev, apdev) - finally: - set_world_reg(apdev[0], apdev[1], dev[0]) - dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=0.5) - dev[0].flush_scan_cache() - -def run_wpa2_ocv_ap_vht160_mismatch(dev, apdev): - params = {"hw_mode": "a", - "channel": "100", - "country_code": "ZA", - "ht_capab": "[HT40+]", - "ieee80211w": "1", - "ieee80211n": "1", - "ieee80211ac": "1", - "vht_oper_chwidth": "2", - "freq": "5500", - "vht_oper_centr_freq_seg0_idx": "114", - "ieee80211d": "1", - "ieee80211h": "1"} - conn = APConnection(apdev[0], dev[0], params) - conn.test_bad_oci("wrong primary channel", 129, 36, 0) - conn.test_bad_oci("wrong primary channel", 129, 114, 0) - conn.test_bad_oci("smaller bandwidth (20 Mhz) than negotiated", 121, 100, 0) - conn.test_bad_oci("smaller bandwidth (40 Mhz) than negotiated", 122, 100, 0) - conn.test_bad_oci("smaller bandwidth (80 Mhz) than negotiated", 128, 100, 0) - conn.test_bad_oci("using 80+80 channel instead of 160", 130, 100, 155) - conn.confirm_valid_oci(129, 100, 0) - - dev[0].dump_monitor() - if conn.hapd: - conn.hapd.request("DISABLE") - dev[0].disconnect_and_stop_scan() - -@remote_compatible -def test_wpa2_ocv_ap_vht80plus80_mismatch(dev, apdev): - """OCV AP mismatch (VHT80+80)""" - try: - run_wpa2_ocv_ap_vht80plus80_mismatch(dev, apdev) - finally: - set_world_reg(apdev[0], apdev[1], dev[0]) - dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=0.5) - dev[0].flush_scan_cache() - -def run_wpa2_ocv_ap_vht80plus80_mismatch(dev, apdev): - params = {"hw_mode": "a", - "channel": "36", - "country_code": "US", - "ht_capab": "[HT40+]", - "ieee80211w": "1", - "ieee80211n": "1", - "ieee80211ac": "1", - "vht_oper_chwidth": "3", - "freq": "5180", - "vht_oper_centr_freq_seg0_idx": "42", - "ieee80211d": "1", - "vht_oper_centr_freq_seg1_idx": "155", - "ieee80211h": "1"} - conn = APConnection(apdev[0], dev[0], params) - conn.test_bad_oci("using 80 MHz operating class", 128, 36, 155) - conn.test_bad_oci("wrong frequency segment 1", 130, 36, 138) - conn.confirm_valid_oci(130, 36, 155) - - dev[0].dump_monitor() - if conn.hapd: - conn.hapd.request("DISABLE") - dev[0].disconnect_and_stop_scan() - -@remote_compatible -def test_wpa2_ocv_ap_unexpected1(dev, apdev): - """OCV and unexpected OCI KDE from station""" - params = {"channel": "1", - "ieee80211w": "1", - "ap_ocv": "0", - "sta_ocv": "1", - "freq": "2412"} - conn = APConnection(apdev[0], dev[0], params) - logger.debug("Client will send OCI KDE even if it was not negotiated") - conn.confirm_valid_oci(81, 1, 0) - -@remote_compatible -def test_wpa2_ocv_ap_unexpected2(dev, apdev): - """OCV and unexpected OCI KDE from station""" - params = {"channel": "1", - "ieee80211w": "1", - "ap_ocv": "1", - "sta_ocv": "0", - "freq": "2412"} - conn = APConnection(apdev[0], dev[0], params) - logger.debug("Client will send OCI KDE even if it was not negotiated") - conn.confirm_valid_oci(81, 1, 0) - -@remote_compatible -def test_wpa2_ocv_ap_retransmit_msg3(dev, apdev): - """Verify that manually retransmitted msg 3/4 contain a correct OCI""" - bssid = apdev[0]['bssid'] - ssid = "test-wpa2-ocv" - passphrase = "qwertyuiop" - psk = "c2c6c255af836bed1b3f2f1ded98e052f5ad618bb554e2836757b55854a0eab7" - params = hostapd.wpa2_params(ssid=ssid) - params["wpa_psk"] = psk - params["ieee80211w"] = "1" - params["ocv"] = "1" - params['wpa_disable_eapol_key_retries'] = "1" - try: - hapd = hostapd.add_ap(apdev[0], params) - except Exception as e: - if "Failed to set hostapd parameter ocv" in str(e): - raise HwsimSkip("OCV not supported") - raise - hapd.request("SET ext_eapol_frame_io 1") - dev[0].request("SET ext_eapol_frame_io 1") - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False, - ocv="1", ieee80211w="1") - addr = dev[0].own_addr() - - # EAPOL-Key msg 1/4 - ev = hapd.wait_event(["EAPOL-TX"], timeout=15) - if ev is None: - raise Exception("Timeout on EAPOL-TX from hostapd") - res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) - if "OK" not in res: - raise Exception("EAPOL_RX to wpa_supplicant failed") - - # EAPOL-Key msg 2/4 - ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) - if ev is None: - raise Exception("Timeout on EAPOL-TX from wpa_supplicant") - res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) - if "OK" not in res: - raise Exception("EAPOL_RX to hostapd failed") - - # EAPOL-Key msg 3/4 - ev = hapd.wait_event(["EAPOL-TX"], timeout=15) - if ev is None: - raise Exception("Timeout on EAPOL-TX from hostapd") - logger.info("Drop the first EAPOL-Key msg 3/4") - - # Use normal EAPOL TX/RX to handle retries. - hapd.request("SET ext_eapol_frame_io 0") - dev[0].request("SET ext_eapol_frame_io 0") - - # Manually retransmit EAPOL-Key msg 3/4 - if "OK" not in hapd.request("RESEND_M3 " + addr): - raise Exception("RESEND_M3 failed") - - dev[0].wait_connected() - hwsim_utils.test_connectivity(dev[0], hapd) - -def test_wpa2_ocv_ap_group_hs(dev, apdev): - """OCV group handshake (AP)""" - params = {"channel": "1", - "ieee80211w": "1", - "freq": "2412", - "wpa_strict_rekey": "1"} - conn = APConnection(apdev[0], dev[0], params) - conn.confirm_valid_oci(81, 1, 0) - - conn.hapd.request("SET ext_eapol_frame_io 0") - dev[1].connect(conn.ssid, psk=conn.passphrase, scan_freq="2412", ocv="1", - ieee80211w="1") - conn.hapd.wait_sta() - conn.hapd.request("SET ext_eapol_frame_io 1") - - # Trigger a group key handshake - dev[1].request("DISCONNECT") - dev[0].dump_monitor() - - # Wait for EAPOL-Key msg 1/2 - conn.msg = recv_eapol(conn.hapd) - if conn.msg["rsn_key_info"] != 4994: - raise Exception("Didn't receive 1/2 of group key handshake") - - # Send a EAPOL-Key msg 2/2 with a bad OCI - logger.info("Bad OCI element") - ocikde = make_ocikde(1, 1, 1) - msg = build_eapol_key_2_2(conn.kck, ocikde, replay_counter=3) - conn.hapd.dump_monitor() - send_eapol(conn.hapd, conn.addr, build_eapol(msg)) - - # Wait for retransmitted EAPOL-Key msg 1/2 - conn.msg = recv_eapol(conn.hapd) - if conn.msg["rsn_key_info"] != 4994: - raise Exception("Didn't receive 1/2 of group key handshake") - - # Send a EAPOL-Key msg 2/2 with a good OCI - logger.info("Good OCI element") - ocikde = make_ocikde(81, 1, 0) - msg = build_eapol_key_2_2(conn.kck, ocikde, replay_counter=4) - conn.hapd.dump_monitor() - send_eapol(conn.hapd, conn.addr, build_eapol(msg)) - - # Verify that group key handshake has completed - ev = conn.hapd.wait_event(["EAPOL-TX"], timeout=1) - if ev is not None: - eapol = binascii.unhexlify(ev.split(' ')[2]) - msg = parse_eapol(eapol) - if msg["rsn_key_info"] == 4994: - raise Exception("AP didn't accept 2/2 of group key handshake") - -class STAConnection: - def init_params(self): - # Static parameters - self.ssid = "test-wpa2-ocv" - self.passphrase = "qwertyuiop" - self.psk = "c2c6c255af836bed1b3f2f1ded98e052f5ad618bb554e2836757b55854a0eab7" - - # Dynamic parameters - self.hapd = None - self.dev = None - self.addr = None - self.rsne = None - self.kck = None - self.kek = None - self.msg = None - self.bssid = None - self.anonce = None - self.snonce = None - self.gtkie = None - self.counter = None - - def __init__(self, apdev, dev, params, sta_params=None): - self.init_params() - self.dev = dev - self.bssid = apdev['bssid'] - - freq = params.pop("freq") - if sta_params is None: - sta_params = dict() - if "ocv" not in sta_params: - sta_params["ocv"] = "1" - if "ieee80211w" not in sta_params: - sta_params["ieee80211w"] = "1" - - params.update(hostapd.wpa2_params(ssid=self.ssid, - passphrase=self.passphrase)) - params['wpa_pairwise_update_count'] = "10" - - try: - self.hapd = hostapd.add_ap(apdev, params) - except Exception as e: - if "Failed to set hostapd parameter ocv" in str(e): - raise HwsimSkip("OCV not supported") - raise - self.hapd.request("SET ext_eapol_frame_io 1") - self.dev.request("SET ext_eapol_frame_io 1") - pmk = binascii.unhexlify("c2c6c255af836bed1b3f2f1ded98e052f5ad618bb554e2836757b55854a0eab7") - - self.gtkie = binascii.unhexlify("dd16000fac010100dc11188831bf4aa4a8678d2b41498618") - if sta_params["ocv"] != "0": - self.rsne = binascii.unhexlify("30140100000fac040100000fac040100000fac028c40") - else: - self.rsne = binascii.unhexlify("30140100000fac040100000fac040100000fac028c00") - - self.dev.connect(self.ssid, raw_psk=self.psk, scan_freq=freq, - wait_connect=False, **sta_params) - if "country_code" in params: - self.dev.wait_regdom(country_ie=True) - self.addr = dev.p2p_interface_addr() - - # Forward msg 1/4 from AP to STA - self.msg = recv_eapol(self.hapd) - self.anonce = self.msg['rsn_key_nonce'] - send_eapol(self.dev, self.bssid, build_eapol(self.msg)) - - # Capture msg 2/4 from the STA so we can derive the session keys - self.msg = recv_eapol(dev) - self.snonce = self.msg['rsn_key_nonce'] - (ptk, self.kck, self.kek) = pmk_to_ptk(pmk, self.addr, self.bssid, - self.snonce, self.anonce) - - self.counter = struct.unpack('>Q', - self.msg['rsn_replay_counter'])[0] + 1 - - def test_bad_oci(self, logmsg, op_class, channel, seg1_idx, errmsg): - logger.info("Bad OCI element: " + logmsg) - if op_class is None: - ocikde = b'' - else: - ocikde = make_ocikde(op_class, channel, seg1_idx) - - plain = self.rsne + self.gtkie + ocikde - wrapped = aes_wrap(self.kek, pad_key_data(plain)) - msg = build_eapol_key_3_4(self.anonce, self.kck, wrapped, - replay_counter=self.counter) - - self.dev.dump_monitor() - send_eapol(self.dev, self.bssid, build_eapol(msg)) - self.counter += 1 - - ev = self.dev.wait_event([errmsg], timeout=5) - if ev is None: - raise Exception("Bad OCI not reported") - - def confirm_valid_oci(self, op_class, channel, seg1_idx): - logger.debug("Valid OCI element to complete handshake") - ocikde = make_ocikde(op_class, channel, seg1_idx) - - plain = self.rsne + self.gtkie + ocikde - wrapped = aes_wrap(self.kek, pad_key_data(plain)) - msg = build_eapol_key_3_4(self.anonce, self.kck, wrapped, - replay_counter=self.counter) - - self.dev.dump_monitor() - send_eapol(self.dev, self.bssid, build_eapol(msg)) - self.counter += 1 - - self.dev.wait_connected(timeout=1) - -@remote_compatible -def test_wpa2_ocv_mismatch_client(dev, apdev): - """OCV client mismatch""" - params = {"channel": "1", - "ieee80211w": "1", - "ocv": "1", - "freq": "2412"} - conn = STAConnection(apdev[0], dev[0], params) - conn.test_bad_oci("element missing", None, 0, 0, - "did not receive mandatory OCI") - conn.test_bad_oci("wrong channel number", 81, 6, 0, - "primary channel mismatch") - conn.test_bad_oci("invalid channel number", 81, 0, 0, - "unable to interpret received OCI") - conn.test_bad_oci("wrong operating class", 80, 0, 0, - "unable to interpret received OCI") - conn.test_bad_oci("invalid operating class", 0, 0, 0, - "unable to interpret received OCI") - conn.confirm_valid_oci(81, 1, 0) - -@remote_compatible -def test_wpa2_ocv_vht160_mismatch_client(dev, apdev): - """OCV client mismatch (VHT160)""" - try: - run_wpa2_ocv_vht160_mismatch_client(dev, apdev) - finally: - set_world_reg(apdev[0], apdev[1], dev[0]) - dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=0.5) - dev[0].flush_scan_cache() - -def run_wpa2_ocv_vht160_mismatch_client(dev, apdev): - params = {"hw_mode": "a", - "channel": "100", - "country_code": "ZA", - "ht_capab": "[HT40+]", - "ieee80211w": "1", - "ieee80211n": "1", - "ieee80211ac": "1", - "vht_oper_chwidth": "2", - "ocv": "1", - "vht_oper_centr_freq_seg0_idx": "114", - "freq": "5500", - "ieee80211d": "1", - "ieee80211h": "1"} - sta_params = {"disable_vht": "1"} - conn = STAConnection(apdev[0], dev[0], params, sta_params) - conn.test_bad_oci("smaller bandwidth (20 Mhz) than negotiated", - 121, 100, 0, "channel bandwidth mismatch") - conn.test_bad_oci("wrong frequency, bandwith, and secondary channel", - 123, 104, 0, "primary channel mismatch") - conn.test_bad_oci("wrong upper/lower behaviour", - 129, 104, 0, "primary channel mismatch") - conn.confirm_valid_oci(122, 100, 0) - - dev[0].dump_monitor() - if conn.hapd: - conn.hapd.request("DISABLE") - dev[0].disconnect_and_stop_scan() - -def test_wpa2_ocv_sta_group_hs(dev, apdev): - """OCV group handshake (STA)""" - params = {"channel": "1", - "ieee80211w": "1", - "ocv": "1", - "freq": "2412", - "wpa_strict_rekey": "1"} - conn = STAConnection(apdev[0], dev[0], params.copy()) - conn.confirm_valid_oci(81, 1, 0) - - # Send a EAPOL-Key msg 1/2 with a bad OCI - logger.info("Bad OCI element") - plain = conn.gtkie + make_ocikde(1, 1, 1) - wrapped = aes_wrap(conn.kek, pad_key_data(plain)) - msg = build_eapol_key_1_2(conn.kck, wrapped, replay_counter=3) - send_eapol(dev[0], conn.bssid, build_eapol(msg)) - - # We shouldn't get a EAPOL-Key message back - ev = dev[0].wait_event(["EAPOL-TX"], timeout=1) - if ev is not None: - raise Exception("Received response to invalid EAPOL-Key 1/2") - - # Reset AP to try with valid OCI - conn.hapd.disable() - conn = STAConnection(apdev[0], dev[0], params.copy()) - conn.confirm_valid_oci(81, 1, 0) - - # Send a EAPOL-Key msg 1/2 with a good OCI - logger.info("Good OCI element") - plain = conn.gtkie + make_ocikde(81, 1, 0) - wrapped = aes_wrap(conn.kek, pad_key_data(plain)) - msg = build_eapol_key_1_2(conn.kck, wrapped, replay_counter=4) - send_eapol(dev[0], conn.bssid, build_eapol(msg)) - - # Wait for EAPOL-Key msg 2/2 - conn.msg = recv_eapol(dev[0]) - if conn.msg["rsn_key_info"] != 0x0302: - raise Exception("Didn't receive 2/2 of group key handshake") - -def test_wpa2_ocv_auto_enable_pmf(dev, apdev): - """OCV on 2.4 GHz with PMF getting enabled automatically""" - params = {"channel": "1", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - for ocv in range(2): - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv=str(ocv), - ieee80211w="2") - dev[0].request("REMOVE_NETWORK all") - dev[0].wait_disconnected() - -def test_wpa2_ocv_sta_override_eapol(dev, apdev): - """OCV on 2.4 GHz and STA override EAPOL-Key msg 2/4""" - params = {"channel": "1", - "ieee80211w": "2", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - dev[0].set("oci_freq_override_eapol", "2462") - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="1", - ieee80211w="2", wait_connect=False) - ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED", - "CTRL-EVENT-DISCONNECTED"], timeout=15) - dev[0].request("DISCONNECT") - if ev is None: - raise Exception("No connection result reported") - if "CTRL-EVENT-CONNECTED" in ev: - raise Exception("Unexpected connection") - if "reason=15" not in ev: - raise Exception("Unexpected disconnection reason: " + ev) - - check_ocv_failure(hapd, "EAPOL-Key msg 2/4", "eapol-key-m2", - dev[0].own_addr()) - -def test_wpa2_ocv_sta_override_sa_query_req(dev, apdev): - """OCV on 2.4 GHz and STA override SA Query Request""" - params = {"channel": "1", - "ieee80211w": "2", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="1", - ieee80211w="2") - hapd.wait_sta() - dev[0].set("oci_freq_override_saquery_req", "2462") - if "OK" not in dev[0].request("UNPROT_DEAUTH"): - raise Exception("Triggering SA Query from the STA failed") - ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=3) - if ev is None: - raise Exception("Disconnection after failed SA Query not reported") - dev[0].set("oci_freq_override_saquery_req", "0") - dev[0].wait_connected() - if "OK" not in dev[0].request("UNPROT_DEAUTH"): - raise Exception("Triggering SA Query from the STA failed") - check_ocv_failure(hapd, "SA Query Request", "saqueryreq", - dev[0].own_addr()) - ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=3) - if ev is not None: - raise Exception("SA Query from the STA failed") - -def test_wpa2_ocv_sta_override_sa_query_resp(dev, apdev): - """OCV on 2.4 GHz and STA override SA Query Response""" - params = {"channel": "1", - "ieee80211w": "2", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="1", - ieee80211w="2") - dev[0].set("oci_freq_override_saquery_resp", "2462") - hapd.wait_sta() - if "OK" not in hapd.request("SA_QUERY " + dev[0].own_addr()): - raise Exception("SA_QUERY failed") - check_ocv_failure(hapd, "SA Query Response", "saqueryresp", - dev[0].own_addr()) - -def check_ocv_failure(dev, frame_txt, frame, addr): - ev = dev.wait_event(["OCV-FAILURE"], timeout=3) - if ev is None: - raise Exception("OCV failure for %s not reported" % frame_txt) - if "addr=" + addr not in ev: - raise Exception("Unexpected OCV failure addr: " + ev) - if "frame=" + frame not in ev: - raise Exception("Unexpected OCV failure frame: " + ev) - if "error=primary channel mismatch" not in ev: - raise Exception("Unexpected OCV failure error: " + ev) - -def test_wpa2_ocv_ap_override_eapol_m3(dev, apdev): - """OCV on 2.4 GHz and AP override EAPOL-Key msg 3/4""" - run_wpa2_ocv_ap_override_eapol_m3(dev, apdev) - -def test_wpa2_ocv_ap_override_eapol_m3_post_enable(dev, apdev): - """OCV on 2.4 GHz and AP override EAPOL-Key msg 3/4 (post enable)""" - run_wpa2_ocv_ap_override_eapol_m3(dev, apdev, True) - -def run_wpa2_ocv_ap_override_eapol_m3(dev, apdev, post_enable=False): - params = {"channel": "1", - "ieee80211w": "2", - "ocv": "1"} - if not post_enable: - params["oci_freq_override_eapol_m3"] = "2462" - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - bssid = hapd.own_addr() - if post_enable: - hapd.set("oci_freq_override_eapol_m3", "2462") - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="1", - ieee80211w="2", wait_connect=False) - - check_ocv_failure(dev[0], "EAPOL-Key msg 3/4", "eapol-key-m3", bssid) - - ev = dev[0].wait_disconnected() - if "reason=15" not in ev: - raise Exception("Unexpected disconnection reason: " + ev) - -def test_wpa2_ocv_ap_override_eapol_g1(dev, apdev): - """OCV on 2.4 GHz and AP override EAPOL-Key group msg 1/2""" - run_wpa2_ocv_ap_override_eapol_g1(dev, apdev) - -def test_wpa2_ocv_ap_override_eapol_g1_post_enable(dev, apdev): - """OCV on 2.4 GHz and AP override EAPOL-Key group msg 1/2 (post enable)""" - run_wpa2_ocv_ap_override_eapol_g1(dev, apdev, True) - -def run_wpa2_ocv_ap_override_eapol_g1(dev, apdev, post_enable=False): - params = {"channel": "1", - "ieee80211w": "2", - "ocv": "1"} - if not post_enable: - params["oci_freq_override_eapol_g1"] = "2462" - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - bssid = hapd.own_addr() - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="1", - ieee80211w="2") - - if post_enable: - hapd.set("oci_freq_override_eapol_g1", "2462") - if "OK" not in hapd.request("REKEY_GTK"): - raise Exception("REKEY_GTK failed") - check_ocv_failure(dev[0], "EAPOL-Key group msg 1/2", "eapol-key-g1", bssid) - -def test_wpa2_ocv_ap_override_saquery_req(dev, apdev): - """OCV on 2.4 GHz and AP override SA Query Request""" - params = {"channel": "1", - "ieee80211w": "2", - "ocv": "1", - "oci_freq_override_saquery_req": "2462"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - bssid = hapd.own_addr() - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="1", - ieee80211w="2") - - if "OK" not in hapd.request("SA_QUERY " + dev[0].own_addr()): - raise Exception("SA_QUERY failed") - check_ocv_failure(dev[0], "SA Query Request", "saqueryreq", bssid) - -def test_wpa2_ocv_ap_override_saquery_resp(dev, apdev): - """OCV on 2.4 GHz and AP override SA Query Response""" - params = {"channel": "1", - "ieee80211w": "2", - "ocv": "1", - "oci_freq_override_saquery_resp": "2462"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - bssid = hapd.own_addr() - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="1", - ieee80211w="2") - - if "OK" not in dev[0].request("UNPROT_DEAUTH"): - raise Exception("Triggering SA Query from the STA failed") - check_ocv_failure(dev[0], "SA Query Response", "saqueryresp", bssid) - -def test_wpa2_ocv_ap_override_fils_assoc(dev, apdev, params): - """OCV on 2.4 GHz and AP override FILS association""" - run_wpa2_ocv_ap_override_fils_assoc(dev, apdev, params) - -def test_wpa2_ocv_ap_override_fils_assoc_post_enable(dev, apdev, params): - """OCV on 2.4 GHz and AP override FILS association (post enable)""" - run_wpa2_ocv_ap_override_fils_assoc(dev, apdev, params, True) - -def run_wpa2_ocv_ap_override_fils_assoc(dev, apdev, params, post_enable=False): - check_fils_capa(dev[0]) - check_erp_capa(dev[0]) - - start_erp_as(msk_dump=os.path.join(params['logdir'], "msk.lst")) - - bssid = apdev[0]['bssid'] - ssid = "test-wpa2-ocv" - params = hostapd.wpa2_eap_params(ssid=ssid) - params['wpa_key_mgmt'] = "FILS-SHA256" - params['auth_server_port'] = "18128" - params['erp_send_reauth_start'] = '1' - params['erp_domain'] = 'example.com' - params['fils_realm'] = 'example.com' - params['wpa_group_rekey'] = '1' - params["ieee80211w"] = "2" - params["ocv"] = "1" - if not post_enable: - params["oci_freq_override_fils_assoc"] = "2462" - try: - hapd = hostapd.add_ap(apdev[0], params) - except Exception as e: - if "Failed to set hostapd parameter ocv" in str(e): - raise HwsimSkip("OCV not supported") - raise - bssid = hapd.own_addr() - if post_enable: - hapd.set("oci_freq_override_fils_assoc", "2462") - dev[0].request("ERP_FLUSH") - id = dev[0].connect(ssid, key_mgmt="FILS-SHA256", - eap="PSK", identity="psk.user@example.com", - password_hex="0123456789abcdef0123456789abcdef", - erp="1", scan_freq="2412", ocv="1", ieee80211w="2") - - dev[0].request("DISCONNECT") - dev[0].wait_disconnected() - - dev[0].dump_monitor() - dev[0].select_network(id, freq=2412) - - check_ocv_failure(dev[0], "FILS Association Response", "fils-assoc", bssid) - dev[0].request("DISCONNECT") - -def test_wpa2_ocv_ap_override_ft_assoc(dev, apdev): - """OCV on 2.4 GHz and AP override FT reassociation""" - run_wpa2_ocv_ap_override_ft_assoc(dev, apdev) - -def test_wpa2_ocv_ap_override_ft_assoc_post_enable(dev, apdev): - """OCV on 2.4 GHz and AP override FT reassociation (post enable)""" - run_wpa2_ocv_ap_override_ft_assoc(dev, apdev, True) - -def run_wpa2_ocv_ap_override_ft_assoc(dev, apdev, post_enable=False): - ssid = "test-wpa2-ocv" - passphrase = "qwertyuiop" - params = ft_params1(ssid=ssid, passphrase=passphrase) - params["ieee80211w"] = "2" - params["ocv"] = "1" - if not post_enable: - params["oci_freq_override_ft_assoc"] = "2462" - try: - hapd0 = hostapd.add_ap(apdev[0], params) - except Exception as e: - if "Failed to set hostapd parameter ocv" in str(e): - raise HwsimSkip("OCV not supported") - raise - params = ft_params2(ssid=ssid, passphrase=passphrase) - params["ieee80211w"] = "2" - params["ocv"] = "1" - if not post_enable: - params["oci_freq_override_ft_assoc"] = "2462" - hapd1 = hostapd.add_ap(apdev[1], params) - - if post_enable: - hapd0.set("oci_freq_override_ft_assoc", "2462") - hapd1.set("oci_freq_override_ft_assoc", "2462") - - dev[0].connect(ssid, key_mgmt="FT-PSK", psk=passphrase, - scan_freq="2412", ocv="1", ieee80211w="2") - - bssid = dev[0].get_status_field("bssid") - bssid0 = hapd0.own_addr() - bssid1 = hapd1.own_addr() - target = bssid0 if bssid == bssid1 else bssid1 - - dev[0].scan_for_bss(target, freq="2412") - if "OK" not in dev[0].request("ROAM " + target): - raise Exception("ROAM failed") - - check_ocv_failure(dev[0], "FT Reassociation Response", "ft-assoc", target) - dev[0].request("DISCONNECT") - -@remote_compatible -def test_wpa2_ocv_no_pmf(dev, apdev): - """OCV on 2.4 GHz and no PMF on STA""" - params = {"channel": "1", - "ieee80211w": "1", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - ie = "301a0100000fac040100000fac040100000fac0200400000000fac06" - if "OK" not in dev[0].request("TEST_ASSOC_IE " + ie): - raise Exception("Could not set TEST_ASSOC_IE") - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="0", - ieee80211w="0", wait_connect=False) - ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED", "CTRL-EVENT-ASSOC-REJECT"], - timeout=10) - dev[0].request("DISCONNECT") - if ev is None: - raise Exception("No connection result seen") - if "CTRL-EVENT-CONNECTED" in ev: - raise Exception("Unexpected connection") - if "status_code=31" not in ev: - raise Exception("Unexpected status code: " + ev) - -@remote_compatible -def test_wpa2_ocv_no_pmf_workaround(dev, apdev): - """OCV on 2.4 GHz and no PMF on STA with workaround""" - params = {"channel": "1", - "ieee80211w": "1", - "ocv": "2"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - ie = "301a0100000fac040100000fac040100000fac0200400000000fac06" - if "OK" not in dev[0].request("TEST_ASSOC_IE " + ie): - raise Exception("Could not set TEST_ASSOC_IE") - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="0", - ieee80211w="0") - -@remote_compatible -def test_wpa2_ocv_no_oci(dev, apdev): - """OCV on 2.4 GHz and no OCI from STA""" - params = {"channel": "1", - "ieee80211w": "1", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - ie = "301a0100000fac040100000fac040100000fac0280400000000fac06" - if "OK" not in dev[0].request("TEST_ASSOC_IE " + ie): - raise Exception("Could not set TEST_ASSOC_IE") - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="0", - ieee80211w="1", wait_connect=False) - ev = hapd.wait_event(["OCV-FAILURE"], timeout=10) - if ev is None: - raise Exception("No OCV failure reported") - if "frame=eapol-key-m2 error=did not receive mandatory OCI" not in ev: - raise Exception("Unexpected error: " + ev) - ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED", - "WPA: 4-Way Handshake failed"], timeout=10) - dev[0].request("DISCONNECT") - if "CTRL-EVENT-CONNECTED" in ev: - raise Exception("Unexpected connection") - if ev is None: - raise Exception("4-way handshake failure not reported") - -@remote_compatible -def test_wpa2_ocv_no_oci_workaround(dev, apdev): - """OCV on 2.4 GHz and no OCI from STA with workaround""" - params = {"channel": "1", - "ieee80211w": "1", - "ocv": "2"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - ie = "301a0100000fac040100000fac040100000fac0280400000000fac06" - if "OK" not in dev[0].request("TEST_ASSOC_IE " + ie): - raise Exception("Could not set TEST_ASSOC_IE") - dev[0].connect(ssid, psk=passphrase, scan_freq="2412", ocv="0", - ieee80211w="1") - -def test_wpa2_ocv_without_pmf(dev, apdev): - """OCV without PMF""" - params = {"channel": "6", - "ieee80211n": "1", - "ieee80211w": "1", - "ocv": "1"} - hapd, ssid, passphrase = ocv_setup_ap(apdev[0], params) - hapd.disable() - hapd.set("ieee80211w", "0") - if "FAIL" not in hapd.request("ENABLE"): - raise Exception("OCV without PMF accepted") |