1# WPA2-Personal tests 2# Copyright (c) 2014, Qualcomm Atheros, Inc. 3# 4# This software may be distributed under the terms of the BSD license. 5# See README for more details. 6 7from remotehost import remote_compatible 8import binascii 9try: 10 from Cryptodome.Cipher import AES 11except ImportError: 12 from Crypto.Cipher import AES 13import hashlib 14import hmac 15import logging 16logger = logging.getLogger() 17import os 18import re 19import socket 20import struct 21import subprocess 22import time 23 24import hostapd 25from utils import * 26import hwsim_utils 27from wpasupplicant import WpaSupplicant 28from tshark import run_tshark 29from wlantest import WlantestCapture, Wlantest 30 31def check_mib(dev, vals): 32 mib = dev.get_mib() 33 for v in vals: 34 if mib[v[0]] != v[1]: 35 raise Exception("Unexpected {} = {} (expected {})".format(v[0], mib[v[0]], v[1])) 36 37@remote_compatible 38def test_ap_wpa2_psk(dev, apdev): 39 """WPA2-PSK AP with PSK instead of passphrase""" 40 ssid = "test-wpa2-psk" 41 passphrase = 'qwertyuiop' 42 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6' 43 params = hostapd.wpa2_params(ssid=ssid) 44 params['wpa_psk'] = psk 45 hapd = hostapd.add_ap(apdev[0], params) 46 key_mgmt = hapd.get_config()['key_mgmt'] 47 if key_mgmt.split(' ')[0] != "WPA-PSK": 48 raise Exception("Unexpected GET_CONFIG(key_mgmt): " + key_mgmt) 49 dev[0].connect(ssid, raw_psk=psk, scan_freq="2412") 50 dev[1].connect(ssid, psk=passphrase, scan_freq="2412") 51 52 sig = dev[0].request("SIGNAL_POLL").splitlines() 53 pkt = dev[0].request("PKTCNT_POLL").splitlines() 54 if "FREQUENCY=2412" not in sig: 55 raise Exception("Unexpected SIGNAL_POLL value: " + str(sig)) 56 if "TXBAD=0" not in pkt: 57 raise Exception("Unexpected TXBAD value: " + str(pkt)) 58 59def test_ap_wpa2_psk_file(dev, apdev): 60 """WPA2-PSK AP with PSK from a file""" 61 ssid = "test-wpa2-psk" 62 passphrase = 'qwertyuiop' 63 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6' 64 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 65 params['wpa_psk_file'] = 'hostapd.wpa_psk' 66 hostapd.add_ap(apdev[0], params) 67 dev[1].connect(ssid, psk="very secret", scan_freq="2412", wait_connect=False) 68 dev[2].connect(ssid, raw_psk=psk, scan_freq="2412") 69 dev[2].request("REMOVE_NETWORK all") 70 dev[0].connect(ssid, psk="very secret", scan_freq="2412") 71 dev[0].request("REMOVE_NETWORK all") 72 dev[2].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412") 73 dev[0].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412") 74 ev = dev[1].wait_event(["WPA: 4-Way Handshake failed"], timeout=10) 75 if ev is None: 76 raise Exception("Timed out while waiting for failure report") 77 dev[1].request("REMOVE_NETWORK all") 78 79def check_no_keyid(hapd, dev): 80 addr = dev.own_addr() 81 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=1) 82 if ev is None: 83 raise Exception("No AP-STA-CONNECTED indicated") 84 if addr not in ev: 85 raise Exception("AP-STA-CONNECTED for unexpected STA") 86 if "keyid=" in ev: 87 raise Exception("Unexpected keyid indication") 88 89def check_keyid(hapd, dev, keyid): 90 addr = dev.own_addr() 91 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=1) 92 if ev is None: 93 raise Exception("No AP-STA-CONNECTED indicated") 94 if addr not in ev: 95 raise Exception("AP-STA-CONNECTED for unexpected STA") 96 if "keyid=" + keyid not in ev: 97 raise Exception("Incorrect keyid indication") 98 sta = hapd.get_sta(addr) 99 if 'keyid' not in sta or sta['keyid'] != keyid: 100 raise Exception("Incorrect keyid in STA output") 101 dev.request("REMOVE_NETWORK all") 102 103def check_disconnect(dev, expected): 104 for i in range(2): 105 if expected[i]: 106 dev[i].wait_disconnected() 107 dev[i].request("REMOVE_NETWORK all") 108 else: 109 ev = dev[i].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.1) 110 if ev is not None: 111 raise Exception("Unexpected disconnection") 112 dev[i].request("REMOVE_NETWORK all") 113 dev[i].wait_disconnected() 114 115def test_ap_wpa2_psk_file_keyid(dev, apdev, params): 116 """WPA2-PSK AP with PSK from a file (keyid and reload)""" 117 psk_file = os.path.join(params['logdir'], 'ap_wpa2_psk_file_keyid.wpa_psk') 118 with open(psk_file, 'w') as f: 119 f.write('00:00:00:00:00:00 secret passphrase\n') 120 f.write('02:00:00:00:00:00 very secret\n') 121 f.write('00:00:00:00:00:00 another passphrase for all STAs\n') 122 ssid = "test-wpa2-psk" 123 params = hostapd.wpa2_params(ssid=ssid, passphrase='qwertyuiop') 124 params['wpa_psk_file'] = psk_file 125 hapd = hostapd.add_ap(apdev[0], params) 126 127 dev[0].connect(ssid, psk="very secret", scan_freq="2412") 128 check_no_keyid(hapd, dev[0]) 129 130 dev[1].connect(ssid, psk="another passphrase for all STAs", 131 scan_freq="2412") 132 check_no_keyid(hapd, dev[1]) 133 134 dev[2].connect(ssid, psk="qwertyuiop", scan_freq="2412") 135 check_no_keyid(hapd, dev[2]) 136 137 with open(psk_file, 'w') as f: 138 f.write('00:00:00:00:00:00 secret passphrase\n') 139 f.write('02:00:00:00:00:00 very secret\n') 140 f.write('00:00:00:00:00:00 changed passphrase\n') 141 if "OK" not in hapd.request("RELOAD_WPA_PSK"): 142 raise Exception("RELOAD_WPA_PSK failed") 143 144 check_disconnect(dev, [False, True, False]) 145 146 with open(psk_file, 'w') as f: 147 f.write('00:00:00:00:00:00 secret passphrase\n') 148 f.write('keyid=foo 02:00:00:00:00:00 very secret\n') 149 f.write('keyid=bar 00:00:00:00:00:00 another passphrase for all STAs\n') 150 if "OK" not in hapd.request("RELOAD_WPA_PSK"): 151 raise Exception("RELOAD_WPA_PSK failed") 152 153 dev[0].connect(ssid, psk="very secret", scan_freq="2412") 154 check_keyid(hapd, dev[0], "foo") 155 156 dev[1].connect(ssid, psk="another passphrase for all STAs", 157 scan_freq="2412") 158 check_keyid(hapd, dev[1], "bar") 159 160 dev[2].connect(ssid, psk="qwertyuiop", scan_freq="2412") 161 check_no_keyid(hapd, dev[2]) 162 163 dev[0].wait_disconnected() 164 dev[0].connect(ssid, psk="secret passphrase", scan_freq="2412") 165 check_no_keyid(hapd, dev[0]) 166 167 with open(psk_file, 'w') as f: 168 f.write('# empty\n') 169 if "OK" not in hapd.request("RELOAD_WPA_PSK"): 170 raise Exception("RELOAD_WPA_PSK failed") 171 172 check_disconnect(dev, [True, True, False]) 173 174 with open(psk_file, 'w') as f: 175 f.write('broken\n') 176 if "FAIL" not in hapd.request("RELOAD_WPA_PSK"): 177 raise Exception("RELOAD_WPA_PSK succeeded with invalid file") 178 179@remote_compatible 180def test_ap_wpa2_psk_mem(dev, apdev): 181 """WPA2-PSK AP with passphrase only in memory""" 182 try: 183 _test_ap_wpa2_psk_mem(dev, apdev) 184 finally: 185 dev[0].request("SCAN_INTERVAL 5") 186 dev[1].request("SCAN_INTERVAL 5") 187 188def _test_ap_wpa2_psk_mem(dev, apdev): 189 ssid = "test-wpa2-psk" 190 passphrase = 'qwertyuiop' 191 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6' 192 params = hostapd.wpa2_params(ssid=ssid) 193 params['wpa_psk'] = psk 194 hapd = hostapd.add_ap(apdev[0], params) 195 196 dev[0].connect(ssid, mem_only_psk="1", scan_freq="2412", wait_connect=False) 197 dev[0].request("SCAN_INTERVAL 1") 198 ev = dev[0].wait_event(["CTRL-REQ-PSK_PASSPHRASE"], timeout=10) 199 if ev is None: 200 raise Exception("Request for PSK/passphrase timed out") 201 id = ev.split(':')[0].split('-')[-1] 202 dev[0].request("CTRL-RSP-PSK_PASSPHRASE-" + id + ':"' + passphrase + '"') 203 dev[0].wait_connected(timeout=10) 204 205 dev[1].connect(ssid, mem_only_psk="1", scan_freq="2412", wait_connect=False) 206 dev[1].request("SCAN_INTERVAL 1") 207 ev = dev[1].wait_event(["CTRL-REQ-PSK_PASSPHRASE"], timeout=10) 208 if ev is None: 209 raise Exception("Request for PSK/passphrase timed out(2)") 210 id = ev.split(':')[0].split('-')[-1] 211 dev[1].request("CTRL-RSP-PSK_PASSPHRASE-" + id + ':' + psk) 212 dev[1].wait_connected(timeout=10) 213 214@remote_compatible 215def test_ap_wpa2_ptk_rekey(dev, apdev): 216 """WPA2-PSK AP and PTK rekey enforced by station""" 217 ssid = "test-wpa2-psk" 218 passphrase = 'qwertyuiop' 219 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 220 hapd = hostapd.add_ap(apdev[0], params) 221 222 Wlantest.setup(hapd) 223 wt = Wlantest() 224 wt.flush() 225 wt.add_passphrase(passphrase) 226 227 dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412") 228 ev = dev[0].wait_event(["WPA: Key negotiation completed", 229 "CTRL-EVENT-DISCONNECTED"]) 230 if ev is None: 231 raise Exception("PTK rekey timed out") 232 if "CTRL-EVENT-DISCONNECTED" in ev: 233 raise Exception("Disconnect instead of rekey") 234 hwsim_utils.test_connectivity(dev[0], hapd) 235 236def test_ap_wpa2_ptk_rekey_blocked_ap(dev, apdev): 237 """WPA2-PSK AP and PTK rekey enforced by station and AP blocking it""" 238 ssid = "test-wpa2-psk" 239 passphrase = 'qwertyuiop' 240 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 241 params['wpa_deny_ptk0_rekey'] = "2" 242 hapd = hostapd.add_ap(apdev[0], params) 243 conf = hapd.request("GET_CONFIG").splitlines() 244 if "wpa_deny_ptk0_rekey=2" not in conf: 245 raise Exception("wpa_deny_ptk0_rekey value not in GET_CONFIG") 246 dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412") 247 ev = dev[0].wait_event(["WPA: Key negotiation completed", 248 "CTRL-EVENT-DISCONNECTED"]) 249 if ev is None: 250 raise Exception("PTK rekey timed out") 251 if "WPA: Key negotiation completed" in ev: 252 raise Exception("No disconnect, PTK rekey succeeded") 253 ev = dev[0].wait_event(["WPA: Key negotiation completed"], timeout=1.1) 254 if ev is None: 255 raise Exception("Reconnect too slow") 256 257def test_ap_wpa2_ptk_rekey_blocked_sta(dev, apdev): 258 """WPA2-PSK AP and PTK rekey enforced by station while also blocking it""" 259 ssid = "test-wpa2-psk" 260 passphrase = 'qwertyuiop' 261 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 262 hapd = hostapd.add_ap(apdev[0], params) 263 dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412", 264 wpa_deny_ptk0_rekey="2") 265 ev = dev[0].wait_event(["WPA: Key negotiation completed", 266 "CTRL-EVENT-DISCONNECTED"]) 267 if ev is None: 268 raise Exception("PTK rekey timed out") 269 if "WPA: Key negotiation completed" in ev: 270 raise Exception("No disconnect, PTK rekey succeeded") 271 ev = dev[0].wait_event(["WPA: Key negotiation completed"], timeout=1.1) 272 if ev is None: 273 raise Exception("Reconnect too slow") 274 275def test_ap_wpa2_ptk_rekey_anonce(dev, apdev): 276 """WPA2-PSK AP and PTK rekey enforced by station and ANonce change""" 277 ssid = "test-wpa2-psk" 278 passphrase = 'qwertyuiop' 279 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 280 hapd = hostapd.add_ap(apdev[0], params) 281 dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412") 282 dev[0].dump_monitor() 283 anonce1 = dev[0].request("GET anonce") 284 if "OK" not in dev[0].request("KEY_REQUEST 0 1"): 285 raise Exception("KEY_REQUEST failed") 286 ev = dev[0].wait_event(["WPA: Key negotiation completed"]) 287 if ev is None: 288 raise Exception("PTK rekey timed out") 289 anonce2 = dev[0].request("GET anonce") 290 if anonce1 == anonce2: 291 raise Exception("AP did not update ANonce in requested PTK rekeying") 292 hwsim_utils.test_connectivity(dev[0], hapd) 293 294@remote_compatible 295def test_ap_wpa2_ptk_rekey_ap(dev, apdev): 296 """WPA2-PSK AP and PTK rekey enforced by AP""" 297 ssid = "test-wpa2-psk" 298 passphrase = 'qwertyuiop' 299 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 300 params['wpa_ptk_rekey'] = '2' 301 hapd = hostapd.add_ap(apdev[0], params) 302 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 303 ev = dev[0].wait_event(["WPA: Key negotiation completed"]) 304 if ev is None: 305 raise Exception("PTK rekey timed out") 306 hwsim_utils.test_connectivity(dev[0], hapd) 307 308@remote_compatible 309def test_ap_wpa2_sha256_ptk_rekey(dev, apdev): 310 """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by station""" 311 ssid = "test-wpa2-psk" 312 passphrase = 'qwertyuiop' 313 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 314 params["wpa_key_mgmt"] = "WPA-PSK-SHA256" 315 hapd = hostapd.add_ap(apdev[0], params) 316 dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256", 317 wpa_ptk_rekey="1", scan_freq="2412") 318 ev = dev[0].wait_event(["WPA: Key negotiation completed"]) 319 if ev is None: 320 raise Exception("PTK rekey timed out") 321 hwsim_utils.test_connectivity(dev[0], hapd) 322 check_mib(dev[0], [("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"), 323 ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6")]) 324 325@remote_compatible 326def test_ap_wpa2_sha256_ptk_rekey_ap(dev, apdev): 327 """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by AP""" 328 ssid = "test-wpa2-psk" 329 passphrase = 'qwertyuiop' 330 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 331 params["wpa_key_mgmt"] = "WPA-PSK-SHA256" 332 params['wpa_ptk_rekey'] = '2' 333 hapd = hostapd.add_ap(apdev[0], params) 334 dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256", 335 scan_freq="2412") 336 ev = dev[0].wait_event(["WPA: Key negotiation completed"]) 337 if ev is None: 338 raise Exception("PTK rekey timed out") 339 hwsim_utils.test_connectivity(dev[0], hapd) 340 check_mib(dev[0], [("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"), 341 ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6")]) 342 343@remote_compatible 344def test_ap_wpa_ptk_rekey(dev, apdev): 345 """WPA-PSK/TKIP AP and PTK rekey enforced by station""" 346 skip_with_fips(dev[0]) 347 skip_without_tkip(dev[0]) 348 ssid = "test-wpa-psk" 349 passphrase = 'qwertyuiop' 350 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase) 351 hapd = hostapd.add_ap(apdev[0], params) 352 dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412") 353 if "[WPA-PSK-TKIP]" not in dev[0].request("SCAN_RESULTS"): 354 raise Exception("Scan results missing WPA element info") 355 ev = dev[0].wait_event(["WPA: Key negotiation completed"]) 356 if ev is None: 357 raise Exception("PTK rekey timed out") 358 hwsim_utils.test_connectivity(dev[0], hapd) 359 360@remote_compatible 361def test_ap_wpa_ptk_rekey_ap(dev, apdev): 362 """WPA-PSK/TKIP AP and PTK rekey enforced by AP""" 363 skip_with_fips(dev[0]) 364 skip_without_tkip(dev[0]) 365 ssid = "test-wpa-psk" 366 passphrase = 'qwertyuiop' 367 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase) 368 params['wpa_ptk_rekey'] = '2' 369 hapd = hostapd.add_ap(apdev[0], params) 370 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 371 ev = dev[0].wait_event(["WPA: Key negotiation completed"], timeout=10) 372 if ev is None: 373 raise Exception("PTK rekey timed out") 374 hwsim_utils.test_connectivity(dev[0], hapd) 375 376@remote_compatible 377def test_ap_wpa_ccmp(dev, apdev): 378 """WPA-PSK/CCMP""" 379 ssid = "test-wpa-psk" 380 passphrase = 'qwertyuiop' 381 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase) 382 params['wpa_pairwise'] = "CCMP" 383 hapd = hostapd.add_ap(apdev[0], params) 384 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 385 hapd.wait_sta() 386 hwsim_utils.test_connectivity(dev[0], hapd) 387 check_mib(dev[0], [("dot11RSNAConfigGroupCipherSize", "128"), 388 ("dot11RSNAGroupCipherRequested", "00-50-f2-4"), 389 ("dot11RSNAPairwiseCipherRequested", "00-50-f2-4"), 390 ("dot11RSNAAuthenticationSuiteRequested", "00-50-f2-2"), 391 ("dot11RSNAGroupCipherSelected", "00-50-f2-4"), 392 ("dot11RSNAPairwiseCipherSelected", "00-50-f2-4"), 393 ("dot11RSNAAuthenticationSuiteSelected", "00-50-f2-2"), 394 ("dot1xSuppSuppControlledPortStatus", "Authorized")]) 395 396def test_ap_wpa2_psk_file_errors(dev, apdev): 397 """WPA2-PSK AP with various PSK file error and success cases""" 398 addr0 = dev[0].own_addr() 399 addr1 = dev[1].own_addr() 400 addr2 = dev[2].own_addr() 401 ssid = "psk" 402 pskfile = "/tmp/ap_wpa2_psk_file_errors.psk_file" 403 try: 404 os.remove(pskfile) 405 except: 406 pass 407 408 params = {"ssid": ssid, "wpa": "2", "wpa_key_mgmt": "WPA-PSK", 409 "rsn_pairwise": "CCMP", "wpa_psk_file": pskfile} 410 411 try: 412 # missing PSK file 413 hapd = hostapd.add_ap(apdev[0], params, no_enable=True) 414 if "FAIL" not in hapd.request("ENABLE"): 415 raise Exception("Unexpected ENABLE success") 416 hapd.request("DISABLE") 417 418 # invalid MAC address 419 with open(pskfile, "w") as f: 420 f.write("\n") 421 f.write("foo\n") 422 if "FAIL" not in hapd.request("ENABLE"): 423 raise Exception("Unexpected ENABLE success") 424 hapd.request("DISABLE") 425 426 # no PSK on line 427 with open(pskfile, "w") as f: 428 f.write("00:11:22:33:44:55\n") 429 if "FAIL" not in hapd.request("ENABLE"): 430 raise Exception("Unexpected ENABLE success") 431 hapd.request("DISABLE") 432 433 # invalid PSK 434 with open(pskfile, "w") as f: 435 f.write("00:11:22:33:44:55 1234567\n") 436 if "FAIL" not in hapd.request("ENABLE"): 437 raise Exception("Unexpected ENABLE success") 438 hapd.request("DISABLE") 439 440 # empty token at the end of the line 441 with open(pskfile, "w") as f: 442 f.write("=\n") 443 if "FAIL" not in hapd.request("ENABLE"): 444 raise Exception("Unexpected ENABLE success") 445 hapd.request("DISABLE") 446 447 # valid PSK file 448 with open(pskfile, "w") as f: 449 f.write("00:11:22:33:44:55 12345678\n") 450 f.write(addr0 + " 123456789\n") 451 f.write(addr1 + " 123456789a\n") 452 f.write(addr2 + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\n") 453 if "FAIL" in hapd.request("ENABLE"): 454 raise Exception("Unexpected ENABLE failure") 455 456 dev[0].connect(ssid, psk="123456789", scan_freq="2412") 457 dev[1].connect(ssid, psk="123456789a", scan_freq="2412") 458 dev[2].connect(ssid, raw_psk="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", scan_freq="2412") 459 460 finally: 461 try: 462 os.remove(pskfile) 463 except: 464 pass 465 466@remote_compatible 467def test_ap_wpa2_psk_wildcard_ssid(dev, apdev): 468 """WPA2-PSK AP and wildcard SSID configuration""" 469 ssid = "test-wpa2-psk" 470 passphrase = 'qwertyuiop' 471 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6' 472 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 473 hapd = hostapd.add_ap(apdev[0], params) 474 dev[0].connect("", bssid=apdev[0]['bssid'], psk=passphrase, 475 scan_freq="2412") 476 dev[1].connect("", bssid=apdev[0]['bssid'], raw_psk=psk, scan_freq="2412") 477 478@remote_compatible 479def test_ap_wpa2_gtk_rekey(dev, apdev): 480 """WPA2-PSK AP and GTK rekey enforced by AP""" 481 ssid = "test-wpa2-psk" 482 passphrase = 'qwertyuiop' 483 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 484 params['wpa_group_rekey'] = '1' 485 hapd = hostapd.add_ap(apdev[0], params) 486 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 487 ev = dev[0].wait_event(["RSN: Group rekeying completed"], timeout=2) 488 if ev is None: 489 raise Exception("GTK rekey timed out") 490 hwsim_utils.test_connectivity(dev[0], hapd) 491 492def test_ap_wpa2_gtk_rekey_request(dev, apdev): 493 """WPA2-PSK AP and GTK rekey by AP request""" 494 ssid = "test-wpa2-psk" 495 passphrase = 'qwertyuiop' 496 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 497 hapd = hostapd.add_ap(apdev[0], params) 498 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 499 if "OK" not in hapd.request("REKEY_GTK"): 500 raise Exception("REKEY_GTK failed") 501 ev = dev[0].wait_event(["RSN: Group rekeying completed"], timeout=2) 502 if ev is None: 503 raise Exception("GTK rekey timed out") 504 hwsim_utils.test_connectivity(dev[0], hapd) 505 506def test_ap_wpa2_gtk_rekey_failure(dev, apdev): 507 """WPA2-PSK AP and GTK rekey failure""" 508 ssid = "test-wpa2-psk" 509 passphrase = 'qwertyuiop' 510 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 511 hapd = hostapd.add_ap(apdev[0], params) 512 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 513 with fail_test(hapd, 1, "wpa_group_config_group_keys"): 514 if "OK" not in hapd.request("REKEY_GTK"): 515 raise Exception("REKEY_GTK failed") 516 wait_fail_trigger(hapd, "GET_FAIL") 517 ev = dev[0].wait_event(["RSN: Group rekeying completed"], timeout=2) 518 if ev is None: 519 raise Exception("GTK rekey timed out") 520 dev[0].wait_disconnected() 521 522def test_ap_wpa2_gtk_rekey_request(dev, apdev): 523 """WPA2-PSK AP and GTK rekey request from multiple stations""" 524 ssid = "test-wpa2-psk" 525 passphrase = 'qwertyuiop' 526 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 527 hapd = hostapd.add_ap(apdev[0], params) 528 for i in range(3): 529 dev[i].connect(ssid, psk=passphrase, scan_freq="2412") 530 hapd.wait_sta() 531 for i in range(3): 532 if "OK" not in dev[i].request("KEY_REQUEST 0 0"): 533 raise Exception("KEY_REQUEST failed") 534 for i in range(3): 535 ev = dev[i].wait_event(["RSN: Group rekeying completed"], timeout=2) 536 if ev is None: 537 raise Exception("GTK rekey timed out") 538 time.sleep(1) 539 for i in range(3): 540 hwsim_utils.test_connectivity(dev[i], hapd) 541 542def test_ap_wpa2_gtk_rekey_fail_1_sta(dev, apdev): 543 """WPA2-PSK AP and GTK rekey failing with one STA""" 544 ssid = "test-wpa2-psk" 545 passphrase = 'qwertyuiop' 546 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 547 params['wpa_group_rekey'] = '5' 548 hapd = hostapd.add_ap(apdev[0], params) 549 550 dev[1].set("disable_eapol_g2_tx", "1") 551 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 552 dev[1].connect(ssid, psk=passphrase, scan_freq="2412") 553 dev[2].connect(ssid, psk=passphrase, scan_freq="2412") 554 555 ev = dev[0].wait_event(["RSN: Group rekeying completed"], timeout=7) 556 if ev is None: 557 raise Exception("GTK rekey timed out [0]") 558 ev = dev[2].wait_event(["RSN: Group rekeying completed"], timeout=1) 559 if ev is None: 560 raise Exception("GTK rekey timed out [2]") 561 562 disconnected = False 563 for i in range(10): 564 ev = dev[1].wait_event(["RSN: Group rekeying completed", 565 "CTRL-EVENT-DISCONNECTED"], timeout=10) 566 if ev is None: 567 raise Exception("GTK rekey timed out [1]") 568 if "CTRL-EVENT-DISCONNECTED" in ev: 569 if "reason=16" not in ev: 570 raise Exception("Unexpected reason for disconnection: " + ev) 571 disconnected = True 572 break 573 if not disconnected: 574 raise Exception("STA that did not send group msg 2/2 was not disconnected") 575 576 for i in [0, 2]: 577 ev = dev[i].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.1) 578 if ev is not None: 579 raise Exception("Unexpected disconnection [%d]" % i) 580 hwsim_utils.test_connectivity(dev[i], hapd) 581 582 dev[1].set("disable_eapol_g2_tx", "0") 583 dev[1].wait_connected() 584 ev = dev[1].wait_event(["RSN: Group rekeying completed"], timeout=10) 585 if ev is None: 586 raise Exception("GTK rekey timed out [1b]") 587 hwsim_utils.test_connectivity(dev[1], hapd) 588 589@remote_compatible 590def test_ap_wpa_gtk_rekey(dev, apdev): 591 """WPA-PSK/TKIP AP and GTK rekey enforced by AP""" 592 skip_with_fips(dev[0]) 593 skip_without_tkip(dev[0]) 594 ssid = "test-wpa-psk" 595 passphrase = 'qwertyuiop' 596 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase) 597 params['wpa_group_rekey'] = '1' 598 hapd = hostapd.add_ap(apdev[0], params) 599 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 600 ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2) 601 if ev is None: 602 raise Exception("GTK rekey timed out") 603 hwsim_utils.test_connectivity(dev[0], hapd) 604 605@remote_compatible 606def test_ap_wpa2_gmk_rekey(dev, apdev): 607 """WPA2-PSK AP and GMK and GTK rekey enforced by AP""" 608 ssid = "test-wpa2-psk" 609 passphrase = 'qwertyuiop' 610 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 611 params['wpa_group_rekey'] = '1' 612 params['wpa_gmk_rekey'] = '2' 613 hapd = hostapd.add_ap(apdev[0], params) 614 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 615 for i in range(0, 3): 616 ev = dev[0].wait_event(["RSN: Group rekeying completed"], timeout=2) 617 if ev is None: 618 raise Exception("GTK rekey timed out") 619 hwsim_utils.test_connectivity(dev[0], hapd) 620 621@remote_compatible 622def test_ap_wpa2_strict_rekey(dev, apdev): 623 """WPA2-PSK AP and strict GTK rekey enforced by AP""" 624 ssid = "test-wpa2-psk" 625 passphrase = 'qwertyuiop' 626 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 627 params['wpa_strict_rekey'] = '1' 628 hapd = hostapd.add_ap(apdev[0], params) 629 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 630 dev[1].connect(ssid, psk=passphrase, scan_freq="2412") 631 dev[1].request("DISCONNECT") 632 ev = dev[0].wait_event(["RSN: Group rekeying completed"], timeout=2) 633 if ev is None: 634 raise Exception("GTK rekey timed out") 635 hwsim_utils.test_connectivity(dev[0], hapd) 636 637@remote_compatible 638def test_ap_wpa2_bridge_fdb(dev, apdev): 639 """Bridge FDB entry removal""" 640 hapd = None 641 try: 642 ssid = "test-wpa2-psk" 643 passphrase = "12345678" 644 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 645 params['bridge'] = 'ap-br0' 646 hapd = hostapd.add_ap(apdev[0], params) 647 hapd.cmd_execute(['brctl', 'setfd', 'ap-br0', '0']) 648 hapd.cmd_execute(['ip', 'link', 'set', 'dev', 'ap-br0', 'up']) 649 dev[0].connect(ssid, psk=passphrase, scan_freq="2412", 650 bssid=apdev[0]['bssid']) 651 dev[1].connect(ssid, psk=passphrase, scan_freq="2412", 652 bssid=apdev[0]['bssid']) 653 hapd.wait_sta(wait_4way_hs=True) 654 hapd.wait_sta(wait_4way_hs=True) 655 addr0 = dev[0].p2p_interface_addr() 656 hwsim_utils.test_connectivity_sta(dev[0], dev[1]) 657 err, macs1 = hapd.cmd_execute(['brctl', 'showmacs', 'ap-br0']) 658 hapd.cmd_execute(['brctl', 'setageing', 'ap-br0', '1']) 659 dev[0].request("DISCONNECT") 660 dev[1].request("DISCONNECT") 661 time.sleep(1) 662 err, macs2 = hapd.cmd_execute(['brctl', 'showmacs', 'ap-br0']) 663 664 addr1 = dev[1].p2p_interface_addr() 665 if addr0 not in macs1 or addr1 not in macs1: 666 raise Exception("Bridge FDB entry missing") 667 if addr0 in macs2 or addr1 in macs2: 668 raise Exception("Bridge FDB entry was not removed") 669 finally: 670 hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', 'ap-br0', 671 'down']) 672 hostapd.cmd_execute(apdev[0], ['brctl', 'delbr', 'ap-br0']) 673 674@remote_compatible 675def test_ap_wpa2_already_in_bridge(dev, apdev): 676 """hostapd behavior with interface already in bridge""" 677 ifname = apdev[0]['ifname'] 678 br_ifname = 'ext-ap-br0' 679 try: 680 ssid = "test-wpa2-psk" 681 passphrase = "12345678" 682 hostapd.cmd_execute(apdev[0], ['brctl', 'addbr', br_ifname]) 683 hostapd.cmd_execute(apdev[0], ['brctl', 'setfd', br_ifname, '0']) 684 hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', br_ifname, 685 'up']) 686 hostapd.cmd_execute(apdev[0], ['iw', ifname, 'set', 'type', '__ap']) 687 hostapd.cmd_execute(apdev[0], ['brctl', 'addif', br_ifname, ifname]) 688 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 689 hapd = hostapd.add_ap(apdev[0], params) 690 if hapd.get_driver_status_field('brname') != br_ifname: 691 raise Exception("Bridge name not identified correctly") 692 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 693 finally: 694 hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', br_ifname, 695 'down']) 696 hostapd.cmd_execute(apdev[0], ['brctl', 'delif', br_ifname, ifname]) 697 hostapd.cmd_execute(apdev[0], ['iw', ifname, 'set', 'type', 'station']) 698 hostapd.cmd_execute(apdev[0], ['brctl', 'delbr', br_ifname]) 699 700@remote_compatible 701def test_ap_wpa2_in_different_bridge(dev, apdev): 702 """hostapd behavior with interface in different bridge""" 703 ifname = apdev[0]['ifname'] 704 br_ifname = 'ext-ap-br0' 705 try: 706 ssid = "test-wpa2-psk" 707 passphrase = "12345678" 708 hostapd.cmd_execute(apdev[0], ['brctl', 'addbr', br_ifname]) 709 hostapd.cmd_execute(apdev[0], ['brctl', 'setfd', br_ifname, '0']) 710 hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', br_ifname, 711 'up']) 712 hostapd.cmd_execute(apdev[0], ['iw', ifname, 'set', 'type', '__ap']) 713 hostapd.cmd_execute(apdev[0], ['brctl', 'addif', br_ifname, ifname]) 714 time.sleep(0.5) 715 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 716 params['bridge'] = 'ap-br0' 717 hapd = hostapd.add_ap(apdev[0], params) 718 hostapd.cmd_execute(apdev[0], ['brctl', 'setfd', 'ap-br0', '0']) 719 hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', 'ap-br0', 720 'up']) 721 brname = hapd.get_driver_status_field('brname') 722 if brname != 'ap-br0': 723 raise Exception("Incorrect bridge: " + brname) 724 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 725 hapd.wait_sta() 726 hwsim_utils.test_connectivity_iface(dev[0], hapd, "ap-br0") 727 if hapd.get_driver_status_field("added_bridge") != "1": 728 raise Exception("Unexpected added_bridge value") 729 if hapd.get_driver_status_field("added_if_into_bridge") != "1": 730 raise Exception("Unexpected added_if_into_bridge value") 731 dev[0].request("DISCONNECT") 732 hapd.disable() 733 finally: 734 hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', br_ifname, 735 'down']) 736 hostapd.cmd_execute(apdev[0], ['brctl', 'delif', br_ifname, ifname, 737 "2>", "/dev/null"], shell=True) 738 hostapd.cmd_execute(apdev[0], ['brctl', 'delbr', br_ifname]) 739 740@remote_compatible 741def test_ap_wpa2_ext_add_to_bridge(dev, apdev): 742 """hostapd behavior with interface added to bridge externally""" 743 ifname = apdev[0]['ifname'] 744 br_ifname = 'ext-ap-br0' 745 try: 746 ssid = "test-wpa2-psk" 747 passphrase = "12345678" 748 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 749 hapd = hostapd.add_ap(apdev[0], params) 750 751 hostapd.cmd_execute(apdev[0], ['brctl', 'addbr', br_ifname]) 752 hostapd.cmd_execute(apdev[0], ['brctl', 'setfd', br_ifname, '0']) 753 hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', br_ifname, 754 'up']) 755 hostapd.cmd_execute(apdev[0], ['brctl', 'addif', br_ifname, ifname]) 756 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 757 if hapd.get_driver_status_field('brname') != br_ifname: 758 raise Exception("Bridge name not identified correctly") 759 finally: 760 hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', br_ifname, 761 'down']) 762 hostapd.cmd_execute(apdev[0], ['brctl', 'delif', br_ifname, ifname]) 763 hostapd.cmd_execute(apdev[0], ['brctl', 'delbr', br_ifname]) 764 765def test_ap_wpa2_second_bss_bridge_exists(dev, apdev): 766 """hostapd behavior with second BSS bridge interface already existing""" 767 ifname = apdev[0]['ifname'] 768 ifname2 = apdev[0]['ifname'] + "b" 769 br_ifname = 'ext-ap-br0' 770 fname = '/tmp/hwsim-bss.conf' 771 try: 772 ssid1 = "test-wpa2-psk-1" 773 ssid2 = "test-wpa2-psk-2" 774 passphrase = "12345678" 775 hostapd.cmd_execute(apdev[0], ['brctl', 'addbr', br_ifname]) 776 hostapd.cmd_execute(apdev[0], ['brctl', 'setfd', br_ifname, '0']) 777 hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', br_ifname, 778 'up']) 779 params = hostapd.wpa2_params(ssid=ssid1, passphrase=passphrase) 780 params['driver_params'] = "control_port=0" 781 hapd = hostapd.add_ap(apdev[0], params) 782 783 with open(fname, 'w') as f: 784 f.write("driver=nl80211\n") 785 f.write("hw_mode=g\n") 786 f.write("channel=1\n") 787 f.write("ieee80211n=1\n") 788 f.write("interface=%s\n" % ifname2) 789 f.write("bridge=%s\n" % br_ifname) 790 f.write("bssid=02:00:00:00:03:01\n") 791 f.write("ctrl_interface=/var/run/hostapd\n") 792 f.write("ssid=%s\n" % ssid2) 793 f.write("wpa=2\n") 794 f.write("wpa_passphrase=%s\n" % passphrase) 795 f.write("wpa_key_mgmt=WPA-PSK\n") 796 f.write("rsn_pairwise=CCMP\n") 797 hostapd.add_bss(apdev[0], ifname2, fname) 798 799 dev[0].connect(ssid1, psk=passphrase, scan_freq="2412") 800 dev[1].connect(ssid2, psk=passphrase, scan_freq="2412") 801 finally: 802 try: 803 os.remove(fname) 804 except: 805 pass 806 hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', br_ifname, 807 'down']) 808 hostapd.cmd_execute(apdev[0], ['brctl', 'delif', br_ifname, ifname2]) 809 hostapd.cmd_execute(apdev[0], ['brctl', 'delbr', br_ifname]) 810 811def setup_psk_ext(dev, apdev, wpa_ptk_rekey=None): 812 ssid = "test-wpa2-psk" 813 passphrase = 'qwertyuiop' 814 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6' 815 params = hostapd.wpa2_params(ssid=ssid) 816 params['wpa_psk'] = psk 817 if wpa_ptk_rekey: 818 params['wpa_ptk_rekey'] = wpa_ptk_rekey 819 hapd = hostapd.add_ap(apdev, params) 820 hapd.request("SET ext_eapol_frame_io 1") 821 dev.request("SET ext_eapol_frame_io 1") 822 dev.connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False) 823 return hapd 824 825def ext_4way_hs(hapd, dev): 826 bssid = hapd.own_addr() 827 addr = dev.own_addr() 828 first = None 829 last = None 830 while True: 831 ev = hapd.wait_event(["EAPOL-TX", "AP-STA-CONNECTED"], timeout=15) 832 if ev is None: 833 raise Exception("Timeout on EAPOL-TX from hostapd") 834 if "AP-STA-CONNECTED" in ev: 835 dev.wait_connected(timeout=15) 836 break 837 if not first: 838 first = ev.split(' ')[2] 839 last = ev.split(' ')[2] 840 res = dev.request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 841 if "OK" not in res: 842 raise Exception("EAPOL_RX to wpa_supplicant failed") 843 ev = dev.wait_event(["EAPOL-TX", "CTRL-EVENT-CONNECTED"], timeout=15) 844 if ev is None: 845 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 846 if "CTRL-EVENT-CONNECTED" in ev: 847 break 848 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 849 if "OK" not in res: 850 raise Exception("EAPOL_RX to hostapd failed") 851 return first, last 852 853def test_ap_wpa2_psk_ext(dev, apdev): 854 """WPA2-PSK AP using external EAPOL I/O""" 855 hapd = setup_psk_ext(dev[0], apdev[0]) 856 ext_4way_hs(hapd, dev[0]) 857 858def test_ap_wpa2_psk_unexpected(dev, apdev): 859 """WPA2-PSK and supplicant receiving unexpected EAPOL-Key frames""" 860 hapd = setup_psk_ext(dev[0], apdev[0]) 861 first, last = ext_4way_hs(hapd, dev[0]) 862 863 # Not associated - Delay processing of received EAPOL frame (state=COMPLETED 864 # bssid=02:00:00:00:03:00) 865 other = "02:11:22:33:44:55" 866 res = dev[0].request("EAPOL_RX " + other + " " + first) 867 if "OK" not in res: 868 raise Exception("EAPOL_RX to wpa_supplicant failed") 869 870 # WPA: EAPOL-Key Replay Counter did not increase - dropping packet 871 bssid = hapd.own_addr() 872 res = dev[0].request("EAPOL_RX " + bssid + " " + last) 873 if "OK" not in res: 874 raise Exception("EAPOL_RX to wpa_supplicant failed") 875 876 # WPA: Invalid EAPOL-Key MIC - dropping packet 877 msg = last[0:18] + '01' + last[20:] 878 res = dev[0].request("EAPOL_RX " + bssid + " " + msg) 879 if "OK" not in res: 880 raise Exception("EAPOL_RX to wpa_supplicant failed") 881 882 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=12) 883 if ev is not None: 884 raise Exception("Unexpected disconnection") 885 886def test_ap_wpa2_psk_ext_retry_msg_3(dev, apdev): 887 """WPA2-PSK AP using external EAPOL I/O and retry for EAPOL-Key msg 3/4""" 888 hapd = setup_psk_ext(dev[0], apdev[0]) 889 bssid = apdev[0]['bssid'] 890 addr = dev[0].p2p_interface_addr() 891 892 # EAPOL-Key msg 1/4 893 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 894 if ev is None: 895 raise Exception("Timeout on EAPOL-TX from hostapd") 896 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 897 if "OK" not in res: 898 raise Exception("EAPOL_RX to wpa_supplicant failed") 899 900 # EAPOL-Key msg 2/4 901 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 902 if ev is None: 903 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 904 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 905 if "OK" not in res: 906 raise Exception("EAPOL_RX to hostapd failed") 907 908 # EAPOL-Key msg 3/4 909 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 910 if ev is None: 911 raise Exception("Timeout on EAPOL-TX from hostapd") 912 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 913 if "OK" not in res: 914 raise Exception("EAPOL_RX to wpa_supplicant failed") 915 916 # EAPOL-Key msg 4/4 917 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 918 if ev is None: 919 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 920 # Do not send to the AP 921 dev[0].wait_connected(timeout=15) 922 923 # EAPOL-Key msg 3/4 (retry) 924 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 925 if ev is None: 926 raise Exception("Timeout on EAPOL-TX from hostapd") 927 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 928 if "OK" not in res: 929 raise Exception("EAPOL_RX to wpa_supplicant failed") 930 931 # EAPOL-Key msg 4/4 932 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 933 if ev is None: 934 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 935 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 936 if "OK" not in res: 937 raise Exception("EAPOL_RX to hostapd failed") 938 939 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15) 940 if ev is None: 941 raise Exception("Timeout on AP-STA-CONNECTED from hostapd") 942 943 hwsim_utils.test_connectivity(dev[0], hapd) 944 945def test_ap_wpa2_psk_ext_retry_msg_3b(dev, apdev): 946 """WPA2-PSK AP using external EAPOL I/O and retry for EAPOL-Key msg 3/4 (b)""" 947 hapd = setup_psk_ext(dev[0], apdev[0]) 948 bssid = apdev[0]['bssid'] 949 addr = dev[0].p2p_interface_addr() 950 951 # EAPOL-Key msg 1/4 952 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 953 if ev is None: 954 raise Exception("Timeout on EAPOL-TX from hostapd") 955 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 956 if "OK" not in res: 957 raise Exception("EAPOL_RX to wpa_supplicant failed") 958 959 # EAPOL-Key msg 2/4 960 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 961 if ev is None: 962 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 963 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 964 if "OK" not in res: 965 raise Exception("EAPOL_RX to hostapd failed") 966 967 # EAPOL-Key msg 3/4 968 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 969 if ev is None: 970 raise Exception("Timeout on EAPOL-TX from hostapd") 971 # Do not send the first msg 3/4 to the STA yet; wait for retransmission 972 # from AP. 973 msg3_1 = ev 974 975 # EAPOL-Key msg 3/4 (retry) 976 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 977 if ev is None: 978 raise Exception("Timeout on EAPOL-TX from hostapd") 979 msg3_2 = ev 980 981 # Send the first msg 3/4 to STA 982 res = dev[0].request("EAPOL_RX " + bssid + " " + msg3_1.split(' ')[2]) 983 if "OK" not in res: 984 raise Exception("EAPOL_RX to wpa_supplicant failed") 985 986 # EAPOL-Key msg 4/4 987 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 988 if ev is None: 989 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 990 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 991 if "OK" not in res: 992 raise Exception("EAPOL_RX to hostapd failed") 993 dev[0].wait_connected(timeout=15) 994 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15) 995 if ev is None: 996 raise Exception("Timeout on AP-STA-CONNECTED from hostapd") 997 998 hwsim_utils.test_connectivity(dev[0], hapd) 999 1000 # Send the second msg 3/4 to STA 1001 res = dev[0].request("EAPOL_RX " + bssid + " " + msg3_2.split(' ')[2]) 1002 if "OK" not in res: 1003 raise Exception("EAPOL_RX to wpa_supplicant failed") 1004 # EAPOL-Key msg 4/4 1005 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1006 if ev is None: 1007 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1008 # Do not send the second msg 4/4 to the AP 1009 1010 hwsim_utils.test_connectivity(dev[0], hapd) 1011 1012def test_ap_wpa2_psk_ext_retry_msg_3c(dev, apdev): 1013 """WPA2-PSK AP using external EAPOL I/O and retry for EAPOL-Key msg 3/4 (c)""" 1014 hapd = setup_psk_ext(dev[0], apdev[0]) 1015 bssid = apdev[0]['bssid'] 1016 addr = dev[0].p2p_interface_addr() 1017 1018 # EAPOL-Key msg 1/4 1019 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1020 if ev is None: 1021 raise Exception("Timeout on EAPOL-TX from hostapd") 1022 msg1 = ev.split(' ')[2] 1023 res = dev[0].request("EAPOL_RX " + bssid + " " + msg1) 1024 if "OK" not in res: 1025 raise Exception("EAPOL_RX to wpa_supplicant failed") 1026 1027 # EAPOL-Key msg 2/4 1028 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1029 if ev is None: 1030 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1031 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 1032 if "OK" not in res: 1033 raise Exception("EAPOL_RX to hostapd failed") 1034 1035 # EAPOL-Key msg 3/4 1036 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1037 if ev is None: 1038 raise Exception("Timeout on EAPOL-TX from hostapd") 1039 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 1040 if "OK" not in res: 1041 raise Exception("EAPOL_RX to wpa_supplicant failed") 1042 1043 # EAPOL-Key msg 4/4 1044 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1045 if ev is None: 1046 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1047 msg4 = ev.split(' ')[2] 1048 # Do not send msg 4/4 to hostapd to trigger retry 1049 1050 # STA believes everything is ready 1051 dev[0].wait_connected() 1052 1053 # EAPOL-Key msg 3/4 (retry) 1054 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1055 if ev is None: 1056 raise Exception("Timeout on EAPOL-TX from hostapd") 1057 msg3 = ev.split(' ')[2] 1058 1059 # Send a forged msg 1/4 to STA (update replay counter) 1060 msg1b = msg1[0:18] + msg3[18:34] + msg1[34:] 1061 # and replace nonce (this results in "WPA: ANonce from message 1 of 1062 # 4-Way Handshake differs from 3 of 4-Way Handshake - drop packet" when 1063 # wpa_supplicant processed msg 3/4 afterwards) 1064 #msg1b = msg1[0:18] + msg3[18:34] + 32*"ff" + msg1[98:] 1065 res = dev[0].request("EAPOL_RX " + bssid + " " + msg1b) 1066 if "OK" not in res: 1067 raise Exception("EAPOL_RX to wpa_supplicant failed") 1068 # EAPOL-Key msg 2/4 1069 ev = dev[0].wait_event(["EAPOL-TX"], timeout=1) 1070 if ev is None: 1071 # wpa_supplicant seems to have ignored the forged message. This means 1072 # the attack would fail. 1073 logger.info("wpa_supplicant ignored forged EAPOL-Key msg 1/4") 1074 return 1075 # Do not send msg 2/4 to hostapd 1076 1077 # Send previously received msg 3/4 to STA 1078 res = dev[0].request("EAPOL_RX " + bssid + " " + msg3) 1079 if "OK" not in res: 1080 raise Exception("EAPOL_RX to wpa_supplicant failed") 1081 1082 # EAPOL-Key msg 4/4 1083 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1084 if ev is None: 1085 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1086 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 1087 if "OK" not in res: 1088 raise Exception("EAPOL_RX to hostapd failed") 1089 1090 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15) 1091 if ev is None: 1092 raise Exception("Timeout on AP-STA-CONNECTED from hostapd") 1093 1094 hwsim_utils.test_connectivity(dev[0], hapd) 1095 1096def test_ap_wpa2_psk_ext_retry_msg_3d(dev, apdev): 1097 """WPA2-PSK AP using external EAPOL I/O and retry for EAPOL-Key msg 3/4 (d)""" 1098 hapd = setup_psk_ext(dev[0], apdev[0]) 1099 bssid = apdev[0]['bssid'] 1100 addr = dev[0].p2p_interface_addr() 1101 1102 # EAPOL-Key msg 1/4 1103 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1104 if ev is None: 1105 raise Exception("Timeout on EAPOL-TX from hostapd") 1106 msg1 = ev.split(' ')[2] 1107 res = dev[0].request("EAPOL_RX " + bssid + " " + msg1) 1108 if "OK" not in res: 1109 raise Exception("EAPOL_RX to wpa_supplicant failed") 1110 1111 # EAPOL-Key msg 2/4 1112 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1113 if ev is None: 1114 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1115 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 1116 if "OK" not in res: 1117 raise Exception("EAPOL_RX to hostapd failed") 1118 1119 # EAPOL-Key msg 3/4 1120 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1121 if ev is None: 1122 raise Exception("Timeout on EAPOL-TX from hostapd") 1123 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 1124 if "OK" not in res: 1125 raise Exception("EAPOL_RX to wpa_supplicant failed") 1126 1127 # EAPOL-Key msg 4/4 1128 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1129 if ev is None: 1130 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1131 msg4 = ev.split(' ')[2] 1132 # Do not send msg 4/4 to hostapd to trigger retry 1133 1134 # STA believes everything is ready 1135 dev[0].wait_connected() 1136 1137 # EAPOL-Key msg 3/4 (retry) 1138 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1139 if ev is None: 1140 raise Exception("Timeout on EAPOL-TX from hostapd") 1141 msg3 = ev.split(' ')[2] 1142 1143 # Send a forged msg 1/4 to STA (update replay counter) 1144 msg1b = msg1[0:18] + msg3[18:34] + msg1[34:] 1145 res = dev[0].request("EAPOL_RX " + bssid + " " + msg1b) 1146 if "OK" not in res: 1147 raise Exception("EAPOL_RX to wpa_supplicant failed") 1148 # EAPOL-Key msg 2/4 1149 ev = dev[0].wait_event(["EAPOL-TX"], timeout=1) 1150 if ev is None: 1151 # wpa_supplicant seems to have ignored the forged message. This means 1152 # the attack would fail. 1153 logger.info("wpa_supplicant ignored forged EAPOL-Key msg 1/4") 1154 return 1155 # Do not send msg 2/4 to hostapd 1156 1157 # EAPOL-Key msg 3/4 (retry 2) 1158 # New one needed to get the correct Replay Counter value 1159 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1160 if ev is None: 1161 raise Exception("Timeout on EAPOL-TX from hostapd") 1162 msg3 = ev.split(' ')[2] 1163 1164 # Send msg 3/4 to STA 1165 res = dev[0].request("EAPOL_RX " + bssid + " " + msg3) 1166 if "OK" not in res: 1167 raise Exception("EAPOL_RX to wpa_supplicant failed") 1168 1169 # EAPOL-Key msg 4/4 1170 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1171 if ev is None: 1172 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1173 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 1174 if "OK" not in res: 1175 raise Exception("EAPOL_RX to hostapd failed") 1176 1177 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15) 1178 if ev is None: 1179 raise Exception("Timeout on AP-STA-CONNECTED from hostapd") 1180 1181 hwsim_utils.test_connectivity(dev[0], hapd) 1182 1183def test_ap_wpa2_psk_ext_retry_msg_3e(dev, apdev): 1184 """WPA2-PSK AP using external EAPOL I/O and retry for EAPOL-Key msg 3/4 (e)""" 1185 hapd = setup_psk_ext(dev[0], apdev[0]) 1186 bssid = apdev[0]['bssid'] 1187 addr = dev[0].p2p_interface_addr() 1188 1189 # EAPOL-Key msg 1/4 1190 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1191 if ev is None: 1192 raise Exception("Timeout on EAPOL-TX from hostapd") 1193 msg1 = ev.split(' ')[2] 1194 res = dev[0].request("EAPOL_RX " + bssid + " " + msg1) 1195 if "OK" not in res: 1196 raise Exception("EAPOL_RX to wpa_supplicant failed") 1197 1198 # EAPOL-Key msg 2/4 1199 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1200 if ev is None: 1201 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1202 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 1203 if "OK" not in res: 1204 raise Exception("EAPOL_RX to hostapd failed") 1205 1206 # EAPOL-Key msg 3/4 1207 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1208 if ev is None: 1209 raise Exception("Timeout on EAPOL-TX from hostapd") 1210 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 1211 if "OK" not in res: 1212 raise Exception("EAPOL_RX to wpa_supplicant failed") 1213 1214 # EAPOL-Key msg 4/4 1215 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1216 if ev is None: 1217 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1218 msg4 = ev.split(' ')[2] 1219 # Do not send msg 4/4 to hostapd to trigger retry 1220 1221 # STA believes everything is ready 1222 dev[0].wait_connected() 1223 1224 # EAPOL-Key msg 3/4 (retry) 1225 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1226 if ev is None: 1227 raise Exception("Timeout on EAPOL-TX from hostapd") 1228 msg3 = ev.split(' ')[2] 1229 1230 # Send a forged msg 1/4 to STA (update replay counter and replace ANonce) 1231 msg1b = msg1[0:18] + msg3[18:34] + 32*"ff" + msg1[98:] 1232 res = dev[0].request("EAPOL_RX " + bssid + " " + msg1b) 1233 if "OK" not in res: 1234 raise Exception("EAPOL_RX to wpa_supplicant failed") 1235 # EAPOL-Key msg 2/4 1236 ev = dev[0].wait_event(["EAPOL-TX"], timeout=1) 1237 if ev is None: 1238 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1239 # Do not send msg 2/4 to hostapd 1240 1241 # Send a forged msg 1/4 to STA (back to previously used ANonce) 1242 msg1b = msg1[0:18] + msg3[18:34] + msg1[34:] 1243 res = dev[0].request("EAPOL_RX " + bssid + " " + msg1b) 1244 if "OK" not in res: 1245 raise Exception("EAPOL_RX to wpa_supplicant failed") 1246 # EAPOL-Key msg 2/4 1247 ev = dev[0].wait_event(["EAPOL-TX"], timeout=1) 1248 if ev is None: 1249 # wpa_supplicant seems to have ignored the forged message. This means 1250 # the attack would fail. 1251 logger.info("wpa_supplicant ignored forged EAPOL-Key msg 1/4") 1252 return 1253 # Do not send msg 2/4 to hostapd 1254 1255 # EAPOL-Key msg 3/4 (retry 2) 1256 # New one needed to get the correct Replay Counter value 1257 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1258 if ev is None: 1259 raise Exception("Timeout on EAPOL-TX from hostapd") 1260 msg3 = ev.split(' ')[2] 1261 1262 # Send msg 3/4 to STA 1263 res = dev[0].request("EAPOL_RX " + bssid + " " + msg3) 1264 if "OK" not in res: 1265 raise Exception("EAPOL_RX to wpa_supplicant failed") 1266 1267 # EAPOL-Key msg 4/4 1268 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1269 if ev is None: 1270 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1271 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 1272 if "OK" not in res: 1273 raise Exception("EAPOL_RX to hostapd failed") 1274 1275 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15) 1276 if ev is None: 1277 raise Exception("Timeout on AP-STA-CONNECTED from hostapd") 1278 1279 hwsim_utils.test_connectivity(dev[0], hapd) 1280 1281def test_ap_wpa2_psk_ext_delayed_ptk_rekey(dev, apdev): 1282 """WPA2-PSK AP using external EAPOL I/O and delayed PTK rekey exchange""" 1283 hapd = setup_psk_ext(dev[0], apdev[0], wpa_ptk_rekey="3") 1284 bssid = apdev[0]['bssid'] 1285 addr = dev[0].p2p_interface_addr() 1286 1287 # EAPOL-Key msg 1/4 1288 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1289 if ev is None: 1290 raise Exception("Timeout on EAPOL-TX from hostapd") 1291 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 1292 if "OK" not in res: 1293 raise Exception("EAPOL_RX to wpa_supplicant failed") 1294 1295 # EAPOL-Key msg 2/4 1296 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1297 if ev is None: 1298 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1299 msg2 = ev.split(' ')[2] 1300 # Do not send this to the AP 1301 1302 # EAPOL-Key msg 1/4 (retry) 1303 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1304 if ev is None: 1305 raise Exception("Timeout on EAPOL-TX from hostapd") 1306 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 1307 if "OK" not in res: 1308 raise Exception("EAPOL_RX to wpa_supplicant failed") 1309 1310 # EAPOL-Key msg 2/4 1311 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1312 if ev is None: 1313 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1314 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 1315 if "OK" not in res: 1316 raise Exception("EAPOL_RX to hostapd failed") 1317 1318 # EAPOL-Key msg 3/4 1319 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1320 if ev is None: 1321 raise Exception("Timeout on EAPOL-TX from hostapd") 1322 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 1323 if "OK" not in res: 1324 raise Exception("EAPOL_RX to wpa_supplicant failed") 1325 1326 # EAPOL-Key msg 4/4 1327 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1328 if ev is None: 1329 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1330 msg4 = ev.split(' ')[2] 1331 # Do not send msg 4/4 to AP 1332 1333 # EAPOL-Key msg 3/4 (retry) 1334 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1335 if ev is None: 1336 raise Exception("Timeout on EAPOL-TX from hostapd") 1337 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 1338 if "OK" not in res: 1339 raise Exception("EAPOL_RX to wpa_supplicant failed") 1340 1341 # EAPOL-Key msg 4/4 1342 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 1343 if ev is None: 1344 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 1345 msg4b = ev.split(' ')[2] 1346 # Do not send msg 4/4 to AP 1347 1348 # Send the previous EAPOL-Key msg 4/4 to AP 1349 res = hapd.request("EAPOL_RX " + addr + " " + msg4) 1350 if "OK" not in res: 1351 raise Exception("EAPOL_RX to hostapd failed") 1352 1353 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15) 1354 if ev is None: 1355 raise Exception("Timeout on AP-STA-CONNECTED from hostapd") 1356 1357 # Wait for PTK rekeying to be initialized 1358 # EAPOL-Key msg 1/4 1359 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1360 if ev is None: 1361 raise Exception("Timeout on EAPOL-TX from hostapd") 1362 1363 # EAPOL-Key msg 2/4 from the previous 4-way handshake 1364 # hostapd is expected to ignore this due to unexpected Replay Counter 1365 res = hapd.request("EAPOL_RX " + addr + " " + msg2) 1366 if "OK" not in res: 1367 raise Exception("EAPOL_RX to hostapd failed") 1368 1369 # EAPOL-Key msg 3/4 (actually, this ends up being retransmitted 1/4) 1370 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1371 if ev is None: 1372 raise Exception("Timeout on EAPOL-TX from hostapd") 1373 keyinfo = ev.split(' ')[2][10:14] 1374 if keyinfo != "028a": 1375 raise Exception("Unexpected key info when expected msg 1/4:" + keyinfo) 1376 1377 # EAPOL-Key msg 4/4 from the previous 4-way handshake 1378 # hostapd is expected to ignore this due to unexpected Replay Counter 1379 res = hapd.request("EAPOL_RX " + addr + " " + msg4b) 1380 if "OK" not in res: 1381 raise Exception("EAPOL_RX to hostapd failed") 1382 1383 # Check if any more EAPOL-Key frames are seen. If the second 4-way handshake 1384 # was accepted, there would be no more EAPOL-Key frames. If the Replay 1385 # Counters were rejected, there would be a retransmitted msg 1/4 here. 1386 ev = hapd.wait_event(["EAPOL-TX"], timeout=1.1) 1387 if ev is None: 1388 raise Exception("Did not see EAPOL-TX from hostapd in the end (expected msg 1/4)") 1389 keyinfo = ev.split(' ')[2][10:14] 1390 if keyinfo != "028a": 1391 raise Exception("Unexpected key info when expected msg 1/4:" + keyinfo) 1392 1393def parse_eapol(data): 1394 (version, type, length) = struct.unpack('>BBH', data[0:4]) 1395 payload = data[4:] 1396 if length > len(payload): 1397 raise Exception("Invalid EAPOL length") 1398 if length < len(payload): 1399 payload = payload[0:length] 1400 eapol = {} 1401 eapol['version'] = version 1402 eapol['type'] = type 1403 eapol['length'] = length 1404 eapol['payload'] = payload 1405 if type == 3: 1406 # EAPOL-Key 1407 (eapol['descr_type'],) = struct.unpack('B', payload[0:1]) 1408 payload = payload[1:] 1409 if eapol['descr_type'] == 2 or eapol['descr_type'] == 254: 1410 # RSN EAPOL-Key 1411 (key_info, key_len) = struct.unpack('>HH', payload[0:4]) 1412 eapol['rsn_key_info'] = key_info 1413 eapol['rsn_key_len'] = key_len 1414 eapol['rsn_replay_counter'] = payload[4:12] 1415 eapol['rsn_key_nonce'] = payload[12:44] 1416 eapol['rsn_key_iv'] = payload[44:60] 1417 eapol['rsn_key_rsc'] = payload[60:68] 1418 eapol['rsn_key_id'] = payload[68:76] 1419 eapol['rsn_key_mic'] = payload[76:92] 1420 payload = payload[92:] 1421 (eapol['rsn_key_data_len'],) = struct.unpack('>H', payload[0:2]) 1422 payload = payload[2:] 1423 eapol['rsn_key_data'] = payload 1424 return eapol 1425 1426def build_eapol(msg): 1427 data = struct.pack(">BBH", msg['version'], msg['type'], msg['length']) 1428 if msg['type'] == 3: 1429 data += struct.pack('>BHH', msg['descr_type'], msg['rsn_key_info'], 1430 msg['rsn_key_len']) 1431 data += msg['rsn_replay_counter'] 1432 data += msg['rsn_key_nonce'] 1433 data += msg['rsn_key_iv'] 1434 data += msg['rsn_key_rsc'] 1435 data += msg['rsn_key_id'] 1436 data += msg['rsn_key_mic'] 1437 data += struct.pack('>H', msg['rsn_key_data_len']) 1438 data += msg['rsn_key_data'] 1439 else: 1440 data += msg['payload'] 1441 return data 1442 1443def sha1_prf(key, label, data, outlen): 1444 res = b'' 1445 counter = 0 1446 while outlen > 0: 1447 m = hmac.new(key, label.encode(), hashlib.sha1) 1448 m.update(struct.pack('B', 0)) 1449 m.update(data) 1450 m.update(struct.pack('B', counter)) 1451 counter += 1 1452 hash = m.digest() 1453 if outlen > len(hash): 1454 res += hash 1455 outlen -= len(hash) 1456 else: 1457 res += hash[0:outlen] 1458 outlen = 0 1459 return res 1460 1461def pmk_to_ptk(pmk, addr1, addr2, nonce1, nonce2): 1462 if addr1 < addr2: 1463 data = binascii.unhexlify(addr1.replace(':', '')) + binascii.unhexlify(addr2.replace(':', '')) 1464 else: 1465 data = binascii.unhexlify(addr2.replace(':', '')) + binascii.unhexlify(addr1.replace(':', '')) 1466 if nonce1 < nonce2: 1467 data += nonce1 + nonce2 1468 else: 1469 data += nonce2 + nonce1 1470 label = "Pairwise key expansion" 1471 ptk = sha1_prf(pmk, label, data, 48) 1472 kck = ptk[0:16] 1473 kek = ptk[16:32] 1474 return (ptk, kck, kek) 1475 1476def eapol_key_mic(kck, msg): 1477 msg['rsn_key_mic'] = binascii.unhexlify('00000000000000000000000000000000') 1478 data = build_eapol(msg) 1479 m = hmac.new(kck, data, hashlib.sha1) 1480 msg['rsn_key_mic'] = m.digest()[0:16] 1481 1482def rsn_eapol_key_set(msg, key_info, key_len, nonce, data): 1483 msg['rsn_key_info'] = key_info 1484 msg['rsn_key_len'] = key_len 1485 if nonce: 1486 msg['rsn_key_nonce'] = nonce 1487 else: 1488 msg['rsn_key_nonce'] = binascii.unhexlify('0000000000000000000000000000000000000000000000000000000000000000') 1489 if data: 1490 msg['rsn_key_data_len'] = len(data) 1491 msg['rsn_key_data'] = data 1492 msg['length'] = 95 + len(data) 1493 else: 1494 msg['rsn_key_data_len'] = 0 1495 msg['rsn_key_data'] = b'' 1496 msg['length'] = 95 1497 1498def recv_eapol(hapd): 1499 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 1500 if ev is None: 1501 raise Exception("Timeout on EAPOL-TX from hostapd") 1502 eapol = binascii.unhexlify(ev.split(' ')[2]) 1503 return parse_eapol(eapol) 1504 1505def send_eapol(hapd, addr, data): 1506 res = hapd.request("EAPOL_RX " + addr + " " + binascii.hexlify(data).decode()) 1507 if "OK" not in res: 1508 raise Exception("EAPOL_RX to hostapd failed") 1509 1510def reply_eapol(info, hapd, addr, msg, key_info, nonce, data, kck): 1511 logger.info("Send EAPOL-Key msg " + info) 1512 rsn_eapol_key_set(msg, key_info, 0, nonce, data) 1513 eapol_key_mic(kck, msg) 1514 send_eapol(hapd, addr, build_eapol(msg)) 1515 1516def eapol_test(apdev, dev, wpa2=True, ieee80211w=0): 1517 bssid = apdev['bssid'] 1518 if wpa2: 1519 ssid = "test-wpa2-psk" 1520 else: 1521 ssid = "test-wpa-psk" 1522 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6' 1523 pmk = binascii.unhexlify(psk) 1524 if wpa2: 1525 params = hostapd.wpa2_params(ssid=ssid) 1526 else: 1527 params = hostapd.wpa_params(ssid=ssid) 1528 params['wpa_psk'] = psk 1529 params['ieee80211w'] = str(ieee80211w) 1530 hapd = hostapd.add_ap(apdev, params) 1531 hapd.request("SET ext_eapol_frame_io 1") 1532 dev.request("SET ext_eapol_frame_io 1") 1533 dev.connect(ssid, raw_psk=psk, scan_freq="2412", wait_connect=False, 1534 ieee80211w=str(ieee80211w)) 1535 addr = dev.p2p_interface_addr() 1536 if wpa2: 1537 if ieee80211w == 2: 1538 rsne = binascii.unhexlify('30140100000fac040100000fac040100000fac02cc00') 1539 else: 1540 rsne = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00') 1541 else: 1542 rsne = binascii.unhexlify('dd160050f20101000050f20201000050f20201000050f202') 1543 snonce = binascii.unhexlify('1111111111111111111111111111111111111111111111111111111111111111') 1544 return (bssid, ssid, hapd, snonce, pmk, addr, rsne) 1545 1546@remote_compatible 1547def test_ap_wpa2_psk_ext_eapol(dev, apdev): 1548 """WPA2-PSK AP using external EAPOL supplicant""" 1549 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 1550 1551 msg = recv_eapol(hapd) 1552 anonce = msg['rsn_key_nonce'] 1553 logger.info("Replay same data back") 1554 send_eapol(hapd, addr, build_eapol(msg)) 1555 1556 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 1557 1558 logger.info("Truncated Key Data in EAPOL-Key msg 2/4") 1559 rsn_eapol_key_set(msg, 0x0101, 0, snonce, rsne) 1560 msg['length'] = 95 + 22 - 1 1561 send_eapol(hapd, addr, build_eapol(msg)) 1562 1563 reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, rsne, kck) 1564 1565 msg = recv_eapol(hapd) 1566 if anonce != msg['rsn_key_nonce']: 1567 raise Exception("ANonce changed") 1568 logger.info("Replay same data back") 1569 send_eapol(hapd, addr, build_eapol(msg)) 1570 1571 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) 1572 hapd.wait_sta(timeout=15) 1573 dev[0].request("DISCONNECT") 1574 1575@remote_compatible 1576def test_ap_wpa2_psk_ext_eapol_retry1(dev, apdev): 1577 """WPA2 4-way handshake with EAPOL-Key 1/4 retransmitted""" 1578 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 1579 1580 msg1 = recv_eapol(hapd) 1581 anonce = msg1['rsn_key_nonce'] 1582 1583 msg2 = recv_eapol(hapd) 1584 if anonce != msg2['rsn_key_nonce']: 1585 raise Exception("ANonce changed") 1586 1587 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 1588 1589 logger.info("Send EAPOL-Key msg 2/4") 1590 msg = msg2 1591 rsn_eapol_key_set(msg, 0x010a, 0, snonce, rsne) 1592 eapol_key_mic(kck, msg) 1593 send_eapol(hapd, addr, build_eapol(msg)) 1594 1595 msg = recv_eapol(hapd) 1596 if anonce != msg['rsn_key_nonce']: 1597 raise Exception("ANonce changed") 1598 1599 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) 1600 hapd.wait_sta(timeout=15) 1601 dev[0].request("DISCONNECT") 1602 1603@remote_compatible 1604def test_ap_wpa2_psk_ext_eapol_retry1b(dev, apdev): 1605 """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted""" 1606 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 1607 1608 msg1 = recv_eapol(hapd) 1609 anonce = msg1['rsn_key_nonce'] 1610 msg2 = recv_eapol(hapd) 1611 if anonce != msg2['rsn_key_nonce']: 1612 raise Exception("ANonce changed") 1613 1614 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 1615 reply_eapol("2/4 (a)", hapd, addr, msg1, 0x010a, snonce, rsne, kck) 1616 reply_eapol("2/4 (b)", hapd, addr, msg2, 0x010a, snonce, rsne, kck) 1617 1618 msg = recv_eapol(hapd) 1619 if anonce != msg['rsn_key_nonce']: 1620 raise Exception("ANonce changed") 1621 1622 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) 1623 hapd.wait_sta(timeout=15) 1624 dev[0].request("DISCONNECT") 1625 1626@remote_compatible 1627def test_ap_wpa2_psk_ext_eapol_retry1c(dev, apdev): 1628 """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted and SNonce changing""" 1629 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 1630 1631 msg1 = recv_eapol(hapd) 1632 anonce = msg1['rsn_key_nonce'] 1633 1634 msg2 = recv_eapol(hapd) 1635 if anonce != msg2['rsn_key_nonce']: 1636 raise Exception("ANonce changed") 1637 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 1638 reply_eapol("2/4 (a)", hapd, addr, msg1, 0x010a, snonce, rsne, kck) 1639 1640 snonce2 = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 1641 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce2, anonce) 1642 reply_eapol("2/4 (b)", hapd, addr, msg2, 0x010a, snonce2, rsne, kck) 1643 1644 msg = recv_eapol(hapd) 1645 if anonce != msg['rsn_key_nonce']: 1646 raise Exception("ANonce changed") 1647 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) 1648 hapd.wait_sta(timeout=15) 1649 dev[0].request("DISCONNECT") 1650 1651@remote_compatible 1652def test_ap_wpa2_psk_ext_eapol_retry1d(dev, apdev): 1653 """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted and SNonce changing and older used""" 1654 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 1655 1656 msg1 = recv_eapol(hapd) 1657 anonce = msg1['rsn_key_nonce'] 1658 msg2 = recv_eapol(hapd) 1659 if anonce != msg2['rsn_key_nonce']: 1660 raise Exception("ANonce changed") 1661 1662 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 1663 reply_eapol("2/4 (a)", hapd, addr, msg1, 0x010a, snonce, rsne, kck) 1664 1665 snonce2 = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 1666 (ptk2, kck2, kek2) = pmk_to_ptk(pmk, addr, bssid, snonce2, anonce) 1667 1668 reply_eapol("2/4 (b)", hapd, addr, msg2, 0x010a, snonce2, rsne, kck2) 1669 msg = recv_eapol(hapd) 1670 if anonce != msg['rsn_key_nonce']: 1671 raise Exception("ANonce changed") 1672 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) 1673 hapd.wait_sta(timeout=15) 1674 dev[0].request("DISCONNECT") 1675 1676@remote_compatible 1677def test_ap_wpa2_psk_ext_eapol_type_diff(dev, apdev): 1678 """WPA2 4-way handshake using external EAPOL supplicant""" 1679 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 1680 1681 msg = recv_eapol(hapd) 1682 anonce = msg['rsn_key_nonce'] 1683 1684 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 1685 1686 # Incorrect descriptor type (frame dropped) 1687 msg['descr_type'] = 253 1688 rsn_eapol_key_set(msg, 0x010a, 0, snonce, rsne) 1689 eapol_key_mic(kck, msg) 1690 send_eapol(hapd, addr, build_eapol(msg)) 1691 1692 # Incorrect descriptor type, but with a workaround (frame processed) 1693 msg['descr_type'] = 254 1694 rsn_eapol_key_set(msg, 0x010a, 0, snonce, rsne) 1695 eapol_key_mic(kck, msg) 1696 send_eapol(hapd, addr, build_eapol(msg)) 1697 1698 msg = recv_eapol(hapd) 1699 if anonce != msg['rsn_key_nonce']: 1700 raise Exception("ANonce changed") 1701 logger.info("Replay same data back") 1702 send_eapol(hapd, addr, build_eapol(msg)) 1703 1704 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) 1705 hapd.wait_sta(timeout=15) 1706 dev[0].request("DISCONNECT") 1707 1708@remote_compatible 1709def test_ap_wpa_psk_ext_eapol(dev, apdev): 1710 """WPA2-PSK AP using external EAPOL supplicant""" 1711 skip_without_tkip(dev[0]) 1712 (bssid, ssid, hapd, snonce, pmk, addr, wpae) = eapol_test(apdev[0], dev[0], 1713 wpa2=False) 1714 1715 msg = recv_eapol(hapd) 1716 anonce = msg['rsn_key_nonce'] 1717 logger.info("Replay same data back") 1718 send_eapol(hapd, addr, build_eapol(msg)) 1719 logger.info("Too short data") 1720 send_eapol(hapd, addr, build_eapol(msg)[0:98]) 1721 1722 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 1723 msg['descr_type'] = 2 1724 reply_eapol("2/4(invalid type)", hapd, addr, msg, 0x010a, snonce, wpae, kck) 1725 msg['descr_type'] = 254 1726 reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, wpae, kck) 1727 1728 msg = recv_eapol(hapd) 1729 if anonce != msg['rsn_key_nonce']: 1730 raise Exception("ANonce changed") 1731 logger.info("Replay same data back") 1732 send_eapol(hapd, addr, build_eapol(msg)) 1733 1734 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) 1735 hapd.wait_sta(timeout=15) 1736 dev[0].request("DISCONNECT") 1737 1738@remote_compatible 1739def test_ap_wpa2_psk_ext_eapol_key_info(dev, apdev): 1740 """WPA2-PSK 4-way handshake with strange key info values""" 1741 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 1742 1743 msg = recv_eapol(hapd) 1744 anonce = msg['rsn_key_nonce'] 1745 1746 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 1747 rsn_eapol_key_set(msg, 0x0000, 0, snonce, rsne) 1748 send_eapol(hapd, addr, build_eapol(msg)) 1749 rsn_eapol_key_set(msg, 0xffff, 0, snonce, rsne) 1750 send_eapol(hapd, addr, build_eapol(msg)) 1751 # SMK M1 1752 rsn_eapol_key_set(msg, 0x2802, 0, snonce, rsne) 1753 send_eapol(hapd, addr, build_eapol(msg)) 1754 # SMK M3 1755 rsn_eapol_key_set(msg, 0x2002, 0, snonce, rsne) 1756 send_eapol(hapd, addr, build_eapol(msg)) 1757 # Request 1758 rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne) 1759 send_eapol(hapd, addr, build_eapol(msg)) 1760 # Request 1761 rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne) 1762 tmp_kck = binascii.unhexlify('00000000000000000000000000000000') 1763 eapol_key_mic(tmp_kck, msg) 1764 send_eapol(hapd, addr, build_eapol(msg)) 1765 1766 reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, rsne, kck) 1767 1768 msg = recv_eapol(hapd) 1769 if anonce != msg['rsn_key_nonce']: 1770 raise Exception("ANonce changed") 1771 1772 # Request (valic MIC) 1773 rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne) 1774 eapol_key_mic(kck, msg) 1775 send_eapol(hapd, addr, build_eapol(msg)) 1776 # Request (valid MIC, replayed counter) 1777 rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne) 1778 eapol_key_mic(kck, msg) 1779 send_eapol(hapd, addr, build_eapol(msg)) 1780 # EAPOL-Key msg 4/4 with incorrectly encrypred Key Data field 1781 hapd.note("RSN: AES unwrap failed - could not decrypt EAPOL-Key key data") 1782 key_data = 24*b'1' 1783 rsn_eapol_key_set(msg, 0x130a, 0, snonce, key_data) 1784 send_eapol(hapd, addr, build_eapol(msg)) 1785 # EAPOL-Key msg 4/4 claimed to be encrypred with RC4 1786 hapd.note("WPA: did not use HMAC-SHA1-AES with CCMP/GCMP") 1787 rsn_eapol_key_set(msg, 0x1309, 0, snonce, key_data) 1788 send_eapol(hapd, addr, build_eapol(msg)) 1789 1790 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) 1791 hapd.wait_sta(timeout=15) 1792 dev[0].request("DISCONNECT") 1793 1794def build_eapol_key_1_4(anonce, replay_counter=1, key_data=b'', key_len=16): 1795 msg = {} 1796 msg['version'] = 2 1797 msg['type'] = 3 1798 msg['length'] = 95 + len(key_data) 1799 1800 msg['descr_type'] = 2 1801 msg['rsn_key_info'] = 0x8a 1802 msg['rsn_key_len'] = key_len 1803 msg['rsn_replay_counter'] = struct.pack('>Q', replay_counter) 1804 msg['rsn_key_nonce'] = anonce 1805 msg['rsn_key_iv'] = binascii.unhexlify('00000000000000000000000000000000') 1806 msg['rsn_key_rsc'] = binascii.unhexlify('0000000000000000') 1807 msg['rsn_key_id'] = binascii.unhexlify('0000000000000000') 1808 msg['rsn_key_mic'] = binascii.unhexlify('00000000000000000000000000000000') 1809 msg['rsn_key_data_len'] = len(key_data) 1810 msg['rsn_key_data'] = key_data 1811 return msg 1812 1813def build_eapol_key_3_4(anonce, kck, key_data, replay_counter=2, 1814 key_info=0x13ca, extra_len=0, descr_type=2, key_len=16): 1815 msg = {} 1816 msg['version'] = 2 1817 msg['type'] = 3 1818 msg['length'] = 95 + len(key_data) + extra_len 1819 1820 msg['descr_type'] = descr_type 1821 msg['rsn_key_info'] = key_info 1822 msg['rsn_key_len'] = key_len 1823 msg['rsn_replay_counter'] = struct.pack('>Q', replay_counter) 1824 msg['rsn_key_nonce'] = anonce 1825 msg['rsn_key_iv'] = binascii.unhexlify('00000000000000000000000000000000') 1826 msg['rsn_key_rsc'] = binascii.unhexlify('0000000000000000') 1827 msg['rsn_key_id'] = binascii.unhexlify('0000000000000000') 1828 msg['rsn_key_data_len'] = len(key_data) 1829 msg['rsn_key_data'] = key_data 1830 eapol_key_mic(kck, msg) 1831 return msg 1832 1833def aes_wrap(kek, plain): 1834 n = len(plain) // 8 1835 a = 0xa6a6a6a6a6a6a6a6 1836 enc = AES.new(kek, AES.MODE_ECB).encrypt 1837 r = [plain[i * 8:(i + 1) * 8] for i in range(0, n)] 1838 for j in range(6): 1839 for i in range(1, n + 1): 1840 b = enc(struct.pack('>Q', a) + r[i - 1]) 1841 a = struct.unpack('>Q', b[:8])[0] ^ (n * j + i) 1842 r[i - 1] = b[8:] 1843 return struct.pack('>Q', a) + b''.join(r) 1844 1845def pad_key_data(plain): 1846 pad_len = len(plain) % 8 1847 if pad_len: 1848 pad_len = 8 - pad_len 1849 plain += b'\xdd' 1850 pad_len -= 1 1851 plain += pad_len * b'\x00' 1852 return plain 1853 1854def test_ap_wpa2_psk_supp_proto(dev, apdev): 1855 """WPA2-PSK 4-way handshake protocol testing for supplicant""" 1856 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 1857 1858 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 1859 msg = recv_eapol(hapd) 1860 dev[0].dump_monitor() 1861 1862 # Build own EAPOL-Key msg 1/4 1863 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 1864 counter = 1 1865 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 1866 counter += 1 1867 send_eapol(dev[0], bssid, build_eapol(msg)) 1868 msg = recv_eapol(dev[0]) 1869 snonce = msg['rsn_key_nonce'] 1870 1871 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 1872 1873 logger.debug("Invalid AES wrap data length 0") 1874 dev[0].dump_monitor() 1875 msg = build_eapol_key_3_4(anonce, kck, b'', replay_counter=counter) 1876 counter += 1 1877 send_eapol(dev[0], bssid, build_eapol(msg)) 1878 ev = dev[0].wait_event(["WPA: Unsupported AES-WRAP len 0"]) 1879 if ev is None: 1880 raise Exception("Unsupported AES-WRAP len 0 not reported") 1881 1882 logger.debug("Invalid AES wrap data length 1") 1883 dev[0].dump_monitor() 1884 msg = build_eapol_key_3_4(anonce, kck, b'1', replay_counter=counter) 1885 counter += 1 1886 send_eapol(dev[0], bssid, build_eapol(msg)) 1887 ev = dev[0].wait_event(["WPA: Unsupported AES-WRAP len 1"]) 1888 if ev is None: 1889 raise Exception("Unsupported AES-WRAP len 1 not reported") 1890 1891 logger.debug("Invalid AES wrap data length 9") 1892 dev[0].dump_monitor() 1893 msg = build_eapol_key_3_4(anonce, kck, b'123456789', replay_counter=counter) 1894 counter += 1 1895 send_eapol(dev[0], bssid, build_eapol(msg)) 1896 ev = dev[0].wait_event(["WPA: Unsupported AES-WRAP len 9"]) 1897 if ev is None: 1898 raise Exception("Unsupported AES-WRAP len 9 not reported") 1899 1900 logger.debug("Invalid AES wrap data payload") 1901 dev[0].dump_monitor() 1902 msg = build_eapol_key_3_4(anonce, kck, b'12345678', replay_counter=counter) 1903 # do not increment counter to test replay protection 1904 send_eapol(dev[0], bssid, build_eapol(msg)) 1905 ev = dev[0].wait_event(["WPA: AES unwrap failed"]) 1906 if ev is None: 1907 raise Exception("AES unwrap failure not reported") 1908 1909 logger.debug("Replay Count not increasing") 1910 dev[0].dump_monitor() 1911 msg = build_eapol_key_3_4(anonce, kck, b'12345678', replay_counter=counter) 1912 counter += 1 1913 send_eapol(dev[0], bssid, build_eapol(msg)) 1914 ev = dev[0].wait_event(["WPA: EAPOL-Key Replay Counter did not increase"]) 1915 if ev is None: 1916 raise Exception("Replay Counter replay not reported") 1917 1918 logger.debug("Missing Ack bit in key info") 1919 dev[0].dump_monitor() 1920 msg = build_eapol_key_3_4(anonce, kck, b'12345678', replay_counter=counter, 1921 key_info=0x134a) 1922 counter += 1 1923 send_eapol(dev[0], bssid, build_eapol(msg)) 1924 ev = dev[0].wait_event(["WPA: No Ack bit in key_info"]) 1925 if ev is None: 1926 raise Exception("Missing Ack bit not reported") 1927 1928 logger.debug("Unexpected Request bit in key info") 1929 dev[0].dump_monitor() 1930 msg = build_eapol_key_3_4(anonce, kck, b'12345678', replay_counter=counter, 1931 key_info=0x1bca) 1932 counter += 1 1933 send_eapol(dev[0], bssid, build_eapol(msg)) 1934 ev = dev[0].wait_event(["WPA: EAPOL-Key with Request bit"]) 1935 if ev is None: 1936 raise Exception("Request bit not reported") 1937 1938 logger.debug("Unsupported key descriptor version 0") 1939 dev[0].dump_monitor() 1940 msg = build_eapol_key_3_4(anonce, kck, b'0123456789abcdef', 1941 replay_counter=counter, key_info=0x13c8) 1942 counter += 1 1943 send_eapol(dev[0], bssid, build_eapol(msg)) 1944 ev = dev[0].wait_event(["RSN: Unsupported EAPOL-Key descriptor version 0"]) 1945 if ev is None: 1946 raise Exception("Unsupported EAPOL-Key descriptor version 0 not reported") 1947 1948 logger.debug("Key descriptor version 1 not allowed with CCMP") 1949 dev[0].dump_monitor() 1950 msg = build_eapol_key_3_4(anonce, kck, b'0123456789abcdef', 1951 replay_counter=counter, key_info=0x13c9) 1952 counter += 1 1953 send_eapol(dev[0], bssid, build_eapol(msg)) 1954 ev = dev[0].wait_event(["RSN: EAPOL-Key descriptor version 1 not allowed without TKIP as the pairwise cipher"]) 1955 if ev is None: 1956 raise Exception("Not allowed EAPOL-Key descriptor version not reported") 1957 1958 logger.debug("Invalid AES wrap payload with key descriptor version 2") 1959 dev[0].dump_monitor() 1960 msg = build_eapol_key_3_4(anonce, kck, b'0123456789abcdef', 1961 replay_counter=counter, key_info=0x13ca) 1962 counter += 1 1963 send_eapol(dev[0], bssid, build_eapol(msg)) 1964 ev = dev[0].wait_event(["WPA: AES unwrap failed"]) 1965 if ev is None: 1966 raise Exception("AES unwrap failure not reported") 1967 1968 logger.debug("Key descriptor version 3 workaround") 1969 dev[0].dump_monitor() 1970 msg = build_eapol_key_3_4(anonce, kck, b'0123456789abcdef', 1971 replay_counter=counter, key_info=0x13cb) 1972 counter += 1 1973 send_eapol(dev[0], bssid, build_eapol(msg)) 1974 ev = dev[0].wait_event(["RSN: CCMP is used, but EAPOL-Key descriptor version (3) is not 2"]) 1975 if ev is None: 1976 raise Exception("CCMP key descriptor mismatch not reported") 1977 ev = dev[0].wait_event(["RSN: Interoperability workaround"]) 1978 if ev is None: 1979 raise Exception("AES-128-CMAC workaround not reported") 1980 ev = dev[0].wait_event(["WPA: Invalid EAPOL-Key MIC - dropping packet"]) 1981 if ev is None: 1982 raise Exception("MIC failure with AES-128-CMAC workaround not reported") 1983 1984 logger.debug("Unsupported key descriptor version 4") 1985 dev[0].dump_monitor() 1986 msg = build_eapol_key_3_4(anonce, kck, b'0123456789abcdef', 1987 replay_counter=counter, key_info=0x13cc) 1988 counter += 1 1989 send_eapol(dev[0], bssid, build_eapol(msg)) 1990 ev = dev[0].wait_event(["RSN: Unsupported EAPOL-Key descriptor version 4"]) 1991 if ev is None: 1992 raise Exception("Unsupported EAPOL-Key descriptor version 4 not reported") 1993 1994 logger.debug("Unsupported key descriptor version 7") 1995 dev[0].dump_monitor() 1996 msg = build_eapol_key_3_4(anonce, kck, b'0123456789abcdef', 1997 replay_counter=counter, key_info=0x13cf) 1998 counter += 1 1999 send_eapol(dev[0], bssid, build_eapol(msg)) 2000 ev = dev[0].wait_event(["RSN: Unsupported EAPOL-Key descriptor version 7"]) 2001 if ev is None: 2002 raise Exception("Unsupported EAPOL-Key descriptor version 7 not reported") 2003 2004 logger.debug("Too short EAPOL header length") 2005 dev[0].dump_monitor() 2006 msg = build_eapol_key_3_4(anonce, kck, b'12345678', replay_counter=counter, 2007 extra_len=-1) 2008 counter += 1 2009 send_eapol(dev[0], bssid, build_eapol(msg)) 2010 ev = dev[0].wait_event(["WPA: Invalid EAPOL-Key frame - key_data overflow (8 > 7)"]) 2011 if ev is None: 2012 raise Exception("Key data overflow not reported") 2013 2014 logger.debug("Too long EAPOL header length") 2015 msg = build_eapol_key_3_4(anonce, kck, b'12345678', replay_counter=counter, 2016 extra_len=1) 2017 counter += 1 2018 send_eapol(dev[0], bssid, build_eapol(msg)) 2019 2020 logger.debug("Unsupported descriptor type 0") 2021 msg = build_eapol_key_3_4(anonce, kck, b'12345678', replay_counter=counter, 2022 descr_type=0) 2023 counter += 1 2024 send_eapol(dev[0], bssid, build_eapol(msg)) 2025 2026 logger.debug("WPA descriptor type 0") 2027 msg = build_eapol_key_3_4(anonce, kck, b'12345678', replay_counter=counter, 2028 descr_type=254) 2029 counter += 1 2030 send_eapol(dev[0], bssid, build_eapol(msg)) 2031 2032 logger.debug("Non-zero key index for pairwise key") 2033 dev[0].dump_monitor() 2034 wrapped = aes_wrap(kek, 16*b'z') 2035 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter, 2036 key_info=0x13ea) 2037 counter += 1 2038 send_eapol(dev[0], bssid, build_eapol(msg)) 2039 ev = dev[0].wait_event(["RSN: Ignored EAPOL-Key (Pairwise) with non-zero key index"]) 2040 if ev is None: 2041 raise Exception("Non-zero key index not reported") 2042 2043 logger.debug("Invalid Key Data plaintext payload --> disconnect") 2044 dev[0].dump_monitor() 2045 wrapped = aes_wrap(kek, 16*b'z') 2046 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2047 counter += 1 2048 send_eapol(dev[0], bssid, build_eapol(msg)) 2049 dev[0].wait_disconnected(timeout=1) 2050 dev[0].request("DISCONNECT") 2051 2052def test_ap_wpa2_psk_supp_proto_no_ie(dev, apdev): 2053 """WPA2-PSK supplicant protocol testing: IE not included""" 2054 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2055 2056 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2057 msg = recv_eapol(hapd) 2058 dev[0].dump_monitor() 2059 2060 # Build own EAPOL-Key msg 1/4 2061 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2062 counter = 1 2063 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2064 counter += 1 2065 send_eapol(dev[0], bssid, build_eapol(msg)) 2066 msg = recv_eapol(dev[0]) 2067 snonce = msg['rsn_key_nonce'] 2068 2069 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2070 2071 logger.debug("No IEs in msg 3/4 --> disconnect") 2072 dev[0].dump_monitor() 2073 wrapped = aes_wrap(kek, 16*b'\x00') 2074 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2075 counter += 1 2076 send_eapol(dev[0], bssid, build_eapol(msg)) 2077 dev[0].wait_disconnected(timeout=1) 2078 dev[0].request("DISCONNECT") 2079 2080def test_ap_wpa2_psk_supp_proto_ie_mismatch(dev, apdev): 2081 """WPA2-PSK supplicant protocol testing: IE mismatch""" 2082 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2083 2084 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2085 msg = recv_eapol(hapd) 2086 dev[0].dump_monitor() 2087 2088 # Build own EAPOL-Key msg 1/4 2089 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2090 counter = 1 2091 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2092 counter += 1 2093 send_eapol(dev[0], bssid, build_eapol(msg)) 2094 msg = recv_eapol(dev[0]) 2095 snonce = msg['rsn_key_nonce'] 2096 2097 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2098 2099 logger.debug("Msg 3/4 with mismatching IE") 2100 dev[0].dump_monitor() 2101 wrapped = aes_wrap(kek, pad_key_data(binascii.unhexlify('30060100000fac04dd16000fac010100dc11188831bf4aa4a8678d2b41498618'))) 2102 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2103 counter += 1 2104 send_eapol(dev[0], bssid, build_eapol(msg)) 2105 dev[0].wait_disconnected(timeout=1) 2106 2107def test_ap_wpa2_psk_supp_proto_ok(dev, apdev): 2108 """WPA2-PSK supplicant protocol testing: success""" 2109 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2110 2111 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2112 msg = recv_eapol(hapd) 2113 dev[0].dump_monitor() 2114 2115 # Build own EAPOL-Key msg 1/4 2116 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2117 counter = 1 2118 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2119 counter += 1 2120 send_eapol(dev[0], bssid, build_eapol(msg)) 2121 msg = recv_eapol(dev[0]) 2122 snonce = msg['rsn_key_nonce'] 2123 2124 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2125 2126 logger.debug("Valid EAPOL-Key msg 3/4") 2127 dev[0].dump_monitor() 2128 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010100dc11188831bf4aa4a8678d2b41498618') 2129 wrapped = aes_wrap(kek, pad_key_data(plain)) 2130 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2131 counter += 1 2132 send_eapol(dev[0], bssid, build_eapol(msg)) 2133 dev[0].wait_connected(timeout=1) 2134 dev[0].request("DISCONNECT") 2135 2136def test_ap_wpa2_psk_supp_proto_no_gtk(dev, apdev): 2137 """WPA2-PSK supplicant protocol testing: no GTK""" 2138 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2139 2140 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2141 msg = recv_eapol(hapd) 2142 dev[0].dump_monitor() 2143 2144 # Build own EAPOL-Key msg 1/4 2145 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2146 counter = 1 2147 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2148 counter += 1 2149 send_eapol(dev[0], bssid, build_eapol(msg)) 2150 msg = recv_eapol(dev[0]) 2151 snonce = msg['rsn_key_nonce'] 2152 2153 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2154 2155 logger.debug("EAPOL-Key msg 3/4 without GTK KDE") 2156 dev[0].dump_monitor() 2157 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00') 2158 wrapped = aes_wrap(kek, pad_key_data(plain)) 2159 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2160 counter += 1 2161 send_eapol(dev[0], bssid, build_eapol(msg)) 2162 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=0.1) 2163 if ev is not None: 2164 raise Exception("Unexpected connection completion reported") 2165 dev[0].request("DISCONNECT") 2166 2167def test_ap_wpa2_psk_supp_proto_anonce_change(dev, apdev): 2168 """WPA2-PSK supplicant protocol testing: ANonce change""" 2169 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2170 2171 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2172 msg = recv_eapol(hapd) 2173 dev[0].dump_monitor() 2174 2175 # Build own EAPOL-Key msg 1/4 2176 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2177 counter = 1 2178 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2179 counter += 1 2180 send_eapol(dev[0], bssid, build_eapol(msg)) 2181 msg = recv_eapol(dev[0]) 2182 snonce = msg['rsn_key_nonce'] 2183 2184 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2185 2186 logger.debug("Valid EAPOL-Key msg 3/4") 2187 dev[0].dump_monitor() 2188 anonce2 = binascii.unhexlify('3333333333333333333333333333333333333333333333333333333333333333') 2189 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010100dc11188831bf4aa4a8678d2b41498618') 2190 wrapped = aes_wrap(kek, pad_key_data(plain)) 2191 msg = build_eapol_key_3_4(anonce2, kck, wrapped, replay_counter=counter) 2192 counter += 1 2193 send_eapol(dev[0], bssid, build_eapol(msg)) 2194 ev = dev[0].wait_event(["WPA: ANonce from message 1 of 4-Way Handshake differs from 3 of 4-Way Handshake"]) 2195 if ev is None: 2196 raise Exception("ANonce change not reported") 2197 dev[0].request("DISCONNECT") 2198 2199def test_ap_wpa2_psk_supp_proto_unexpected_group_msg(dev, apdev): 2200 """WPA2-PSK supplicant protocol testing: unexpected group message""" 2201 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2202 2203 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2204 msg = recv_eapol(hapd) 2205 dev[0].dump_monitor() 2206 2207 # Build own EAPOL-Key msg 1/4 2208 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2209 counter = 1 2210 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2211 counter += 1 2212 send_eapol(dev[0], bssid, build_eapol(msg)) 2213 msg = recv_eapol(dev[0]) 2214 snonce = msg['rsn_key_nonce'] 2215 2216 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2217 2218 logger.debug("Group key 1/2 instead of msg 3/4") 2219 dev[0].dump_monitor() 2220 wrapped = aes_wrap(kek, binascii.unhexlify('dd16000fac010100dc11188831bf4aa4a8678d2b41498618')) 2221 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter, 2222 key_info=0x13c2) 2223 counter += 1 2224 send_eapol(dev[0], bssid, build_eapol(msg)) 2225 ev = dev[0].wait_event(["RSN: Group Key Handshake started prior to completion of 4-way handshake"]) 2226 if ev is None: 2227 raise Exception("Unexpected group key message not reported") 2228 dev[0].wait_disconnected(timeout=1) 2229 dev[0].request("DISCONNECT") 2230 2231@remote_compatible 2232def test_ap_wpa2_psk_supp_proto_msg_1_invalid_kde(dev, apdev): 2233 """WPA2-PSK supplicant protocol testing: invalid KDE in msg 1/4""" 2234 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2235 2236 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2237 msg = recv_eapol(hapd) 2238 dev[0].dump_monitor() 2239 2240 # Build own EAPOL-Key msg 1/4 with invalid KDE 2241 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2242 counter = 1 2243 msg = build_eapol_key_1_4(anonce, replay_counter=counter, 2244 key_data=binascii.unhexlify('5555')) 2245 counter += 1 2246 send_eapol(dev[0], bssid, build_eapol(msg)) 2247 time.sleep(0.1) 2248 dev[0].request("DISCONNECT") 2249 2250def test_ap_wpa2_psk_supp_proto_wrong_pairwise_key_len(dev, apdev): 2251 """WPA2-PSK supplicant protocol testing: wrong pairwise key length""" 2252 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2253 2254 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2255 msg = recv_eapol(hapd) 2256 dev[0].dump_monitor() 2257 2258 # Build own EAPOL-Key msg 1/4 2259 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2260 counter = 1 2261 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2262 counter += 1 2263 send_eapol(dev[0], bssid, build_eapol(msg)) 2264 msg = recv_eapol(dev[0]) 2265 snonce = msg['rsn_key_nonce'] 2266 2267 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2268 2269 logger.debug("Valid EAPOL-Key msg 3/4") 2270 dev[0].dump_monitor() 2271 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010100dc11188831bf4aa4a8678d2b41498618') 2272 wrapped = aes_wrap(kek, pad_key_data(plain)) 2273 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter, 2274 key_len=15) 2275 counter += 1 2276 send_eapol(dev[0], bssid, build_eapol(msg)) 2277 ev = dev[0].wait_event(["WPA: Invalid CCMP key length 15"]) 2278 if ev is None: 2279 raise Exception("Invalid CCMP key length not reported") 2280 dev[0].wait_disconnected(timeout=1) 2281 dev[0].request("DISCONNECT") 2282 2283def test_ap_wpa2_psk_supp_proto_wrong_group_key_len(dev, apdev): 2284 """WPA2-PSK supplicant protocol testing: wrong group key length""" 2285 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2286 2287 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2288 msg = recv_eapol(hapd) 2289 dev[0].dump_monitor() 2290 2291 # Build own EAPOL-Key msg 1/4 2292 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2293 counter = 1 2294 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2295 counter += 1 2296 send_eapol(dev[0], bssid, build_eapol(msg)) 2297 msg = recv_eapol(dev[0]) 2298 snonce = msg['rsn_key_nonce'] 2299 2300 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2301 2302 logger.debug("Valid EAPOL-Key msg 3/4") 2303 dev[0].dump_monitor() 2304 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd15000fac010100dc11188831bf4aa4a8678d2b414986') 2305 wrapped = aes_wrap(kek, pad_key_data(plain)) 2306 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2307 counter += 1 2308 send_eapol(dev[0], bssid, build_eapol(msg)) 2309 ev = dev[0].wait_event(["WPA: Unsupported CCMP Group Cipher key length 15"]) 2310 if ev is None: 2311 raise Exception("Invalid CCMP key length not reported") 2312 dev[0].wait_disconnected(timeout=1) 2313 dev[0].request("DISCONNECT") 2314 2315def test_ap_wpa2_psk_supp_proto_gtk_tx_bit_workaround(dev, apdev): 2316 """WPA2-PSK supplicant protocol testing: GTK TX bit workaround""" 2317 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2318 2319 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2320 msg = recv_eapol(hapd) 2321 dev[0].dump_monitor() 2322 2323 # Build own EAPOL-Key msg 1/4 2324 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2325 counter = 1 2326 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2327 counter += 1 2328 send_eapol(dev[0], bssid, build_eapol(msg)) 2329 msg = recv_eapol(dev[0]) 2330 snonce = msg['rsn_key_nonce'] 2331 2332 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2333 2334 logger.debug("Valid EAPOL-Key msg 3/4") 2335 dev[0].dump_monitor() 2336 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010500dc11188831bf4aa4a8678d2b41498618') 2337 wrapped = aes_wrap(kek, pad_key_data(plain)) 2338 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2339 counter += 1 2340 send_eapol(dev[0], bssid, build_eapol(msg)) 2341 ev = dev[0].wait_event(["WPA: Tx bit set for GTK, but pairwise keys are used - ignore Tx bit"]) 2342 if ev is None: 2343 raise Exception("GTK Tx bit workaround not reported") 2344 dev[0].wait_connected(timeout=1) 2345 dev[0].request("DISCONNECT") 2346 2347def test_ap_wpa2_psk_supp_proto_gtk_keyidx_0_and_3(dev, apdev): 2348 """WPA2-PSK supplicant protocol testing: GTK key index 0 and 3""" 2349 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2350 2351 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2352 msg = recv_eapol(hapd) 2353 dev[0].dump_monitor() 2354 2355 # Build own EAPOL-Key msg 1/4 2356 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2357 counter = 1 2358 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2359 counter += 1 2360 send_eapol(dev[0], bssid, build_eapol(msg)) 2361 msg = recv_eapol(dev[0]) 2362 snonce = msg['rsn_key_nonce'] 2363 2364 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2365 2366 logger.debug("Valid EAPOL-Key msg 3/4 (GTK keyidx 0)") 2367 dev[0].dump_monitor() 2368 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010000dc11188831bf4aa4a8678d2b41498618') 2369 wrapped = aes_wrap(kek, pad_key_data(plain)) 2370 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2371 counter += 1 2372 send_eapol(dev[0], bssid, build_eapol(msg)) 2373 dev[0].wait_connected(timeout=1) 2374 2375 logger.debug("Valid EAPOL-Key group msg 1/2 (GTK keyidx 3)") 2376 dev[0].dump_monitor() 2377 plain = binascii.unhexlify('dd16000fac010300dc11188831bf4aa4a8678d2b41498618') 2378 wrapped = aes_wrap(kek, pad_key_data(plain)) 2379 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter, 2380 key_info=0x13c2) 2381 counter += 1 2382 send_eapol(dev[0], bssid, build_eapol(msg)) 2383 msg = recv_eapol(dev[0]) 2384 ev = dev[0].wait_event(["RSN: Group rekeying completed"]) 2385 if ev is None: 2386 raise Exception("GTK rekeing not reported") 2387 2388 logger.debug("Unencrypted GTK KDE in group msg 1/2") 2389 dev[0].dump_monitor() 2390 plain = binascii.unhexlify('dd16000fac010300dc11188831bf4aa4a8678d2b41498618') 2391 msg = build_eapol_key_3_4(anonce, kck, plain, replay_counter=counter, 2392 key_info=0x03c2) 2393 counter += 1 2394 send_eapol(dev[0], bssid, build_eapol(msg)) 2395 ev = dev[0].wait_event(["RSN: GTK KDE in unencrypted key data"]) 2396 if ev is None: 2397 raise Exception("Unencrypted GTK KDE not reported") 2398 dev[0].wait_disconnected(timeout=1) 2399 dev[0].request("DISCONNECT") 2400 2401def test_ap_wpa2_psk_supp_proto_no_gtk_in_group_msg(dev, apdev): 2402 """WPA2-PSK supplicant protocol testing: GTK KDE missing from group msg""" 2403 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2404 2405 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2406 msg = recv_eapol(hapd) 2407 dev[0].dump_monitor() 2408 2409 # Build own EAPOL-Key msg 1/4 2410 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2411 counter = 1 2412 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2413 counter += 1 2414 send_eapol(dev[0], bssid, build_eapol(msg)) 2415 msg = recv_eapol(dev[0]) 2416 snonce = msg['rsn_key_nonce'] 2417 2418 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2419 2420 logger.debug("Valid EAPOL-Key msg 3/4 (GTK keyidx 0)") 2421 dev[0].dump_monitor() 2422 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010000dc11188831bf4aa4a8678d2b41498618') 2423 wrapped = aes_wrap(kek, pad_key_data(plain)) 2424 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2425 counter += 1 2426 send_eapol(dev[0], bssid, build_eapol(msg)) 2427 dev[0].wait_connected(timeout=1) 2428 2429 logger.debug("No GTK KDE in EAPOL-Key group msg 1/2") 2430 dev[0].dump_monitor() 2431 plain = binascii.unhexlify('dd00dd00dd00dd00dd00dd00dd00dd00') 2432 wrapped = aes_wrap(kek, pad_key_data(plain)) 2433 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter, 2434 key_info=0x13c2) 2435 counter += 1 2436 send_eapol(dev[0], bssid, build_eapol(msg)) 2437 ev = dev[0].wait_event(["RSN: No GTK KDE in Group Key msg 1/2"]) 2438 if ev is None: 2439 raise Exception("Missing GTK KDE not reported") 2440 dev[0].wait_disconnected(timeout=1) 2441 dev[0].request("DISCONNECT") 2442 2443def test_ap_wpa2_psk_supp_proto_too_long_gtk_in_group_msg(dev, apdev): 2444 """WPA2-PSK supplicant protocol testing: too long GTK KDE in group msg""" 2445 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2446 2447 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2448 msg = recv_eapol(hapd) 2449 dev[0].dump_monitor() 2450 2451 # Build own EAPOL-Key msg 1/4 2452 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2453 counter = 1 2454 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2455 counter += 1 2456 send_eapol(dev[0], bssid, build_eapol(msg)) 2457 msg = recv_eapol(dev[0]) 2458 snonce = msg['rsn_key_nonce'] 2459 2460 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2461 2462 logger.debug("Valid EAPOL-Key msg 3/4 (GTK keyidx 0)") 2463 dev[0].dump_monitor() 2464 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010000dc11188831bf4aa4a8678d2b41498618') 2465 wrapped = aes_wrap(kek, pad_key_data(plain)) 2466 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2467 counter += 1 2468 send_eapol(dev[0], bssid, build_eapol(msg)) 2469 dev[0].wait_connected(timeout=1) 2470 2471 logger.debug("EAPOL-Key group msg 1/2 with too long GTK KDE") 2472 dev[0].dump_monitor() 2473 plain = binascii.unhexlify('dd27000fac010100ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff') 2474 wrapped = aes_wrap(kek, pad_key_data(plain)) 2475 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter, 2476 key_info=0x13c2) 2477 counter += 1 2478 send_eapol(dev[0], bssid, build_eapol(msg)) 2479 ev = dev[0].wait_event(["WPA: Unsupported CCMP Group Cipher key length 33", 2480 "RSN: Too long GTK in GTK KDE (len=33)"]) 2481 if ev is None: 2482 raise Exception("Too long GTK KDE not reported") 2483 dev[0].wait_disconnected(timeout=1) 2484 dev[0].request("DISCONNECT") 2485 2486def test_ap_wpa2_psk_supp_proto_too_long_gtk_kde(dev, apdev): 2487 """WPA2-PSK supplicant protocol testing: too long GTK KDE""" 2488 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2489 2490 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2491 msg = recv_eapol(hapd) 2492 dev[0].dump_monitor() 2493 2494 # Build own EAPOL-Key msg 1/4 2495 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2496 counter = 1 2497 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2498 counter += 1 2499 send_eapol(dev[0], bssid, build_eapol(msg)) 2500 msg = recv_eapol(dev[0]) 2501 snonce = msg['rsn_key_nonce'] 2502 2503 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2504 2505 logger.debug("EAPOL-Key msg 3/4 with too short GTK KDE") 2506 dev[0].dump_monitor() 2507 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd27000fac010100ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff') 2508 wrapped = aes_wrap(kek, pad_key_data(plain)) 2509 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2510 counter += 1 2511 send_eapol(dev[0], bssid, build_eapol(msg)) 2512 dev[0].wait_disconnected(timeout=1) 2513 dev[0].request("DISCONNECT") 2514 2515def test_ap_wpa2_psk_supp_proto_gtk_not_encrypted(dev, apdev): 2516 """WPA2-PSK supplicant protocol testing: GTK KDE not encrypted""" 2517 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0]) 2518 2519 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2520 msg = recv_eapol(hapd) 2521 dev[0].dump_monitor() 2522 2523 # Build own EAPOL-Key msg 1/4 2524 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2525 counter = 1 2526 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2527 counter += 1 2528 send_eapol(dev[0], bssid, build_eapol(msg)) 2529 msg = recv_eapol(dev[0]) 2530 snonce = msg['rsn_key_nonce'] 2531 2532 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2533 2534 logger.debug("Valid EAPOL-Key msg 3/4") 2535 dev[0].dump_monitor() 2536 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010100dc11188831bf4aa4a8678d2b41498618') 2537 msg = build_eapol_key_3_4(anonce, kck, plain, replay_counter=counter, 2538 key_info=0x03ca) 2539 counter += 1 2540 send_eapol(dev[0], bssid, build_eapol(msg)) 2541 ev = dev[0].wait_event(["WPA: GTK IE in unencrypted key data"]) 2542 if ev is None: 2543 raise Exception("Unencrypted GTK KDE not reported") 2544 dev[0].wait_disconnected(timeout=1) 2545 dev[0].request("DISCONNECT") 2546 2547def run_psk_supp_proto_pmf2(dev, apdev, igtk_kde=None, fail=False): 2548 (bssid, ssid, hapd, snonce, pmk, addr, rsne) = eapol_test(apdev[0], dev[0], 2549 ieee80211w=2) 2550 2551 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated 2552 msg = recv_eapol(hapd) 2553 dev[0].dump_monitor() 2554 2555 # Build own EAPOL-Key msg 1/4 2556 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222') 2557 counter = 1 2558 msg = build_eapol_key_1_4(anonce, replay_counter=counter) 2559 counter += 1 2560 send_eapol(dev[0], bssid, build_eapol(msg)) 2561 msg = recv_eapol(dev[0]) 2562 snonce = msg['rsn_key_nonce'] 2563 2564 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce) 2565 2566 logger.debug("EAPOL-Key msg 3/4") 2567 dev[0].dump_monitor() 2568 gtk_kde = binascii.unhexlify('dd16000fac010100dc11188831bf4aa4a8678d2b41498618') 2569 plain = rsne + gtk_kde 2570 if igtk_kde: 2571 plain += igtk_kde 2572 wrapped = aes_wrap(kek, pad_key_data(plain)) 2573 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter) 2574 counter += 1 2575 send_eapol(dev[0], bssid, build_eapol(msg)) 2576 if fail: 2577 dev[0].wait_disconnected(timeout=1) 2578 return 2579 2580 dev[0].wait_connected(timeout=1) 2581 2582 # Verify that an unprotected broadcast Deauthentication frame is ignored 2583 bssid = binascii.unhexlify(hapd.own_addr().replace(':', '')) 2584 sock = start_monitor(apdev[1]["ifname"]) 2585 radiotap = radiotap_build() 2586 frame = binascii.unhexlify("c0003a01") 2587 frame += 6*b'\xff' + bssid + bssid 2588 frame += binascii.unhexlify("1000" + "0300") 2589 sock.send(radiotap + frame) 2590 # And same with incorrect BIP protection 2591 for keyid in ["0400", "0500", "0600", "0004", "0005", "0006", "ffff"]: 2592 frame2 = frame + binascii.unhexlify("4c10" + keyid + "010000000000c0e5ca5f2b3b4de9") 2593 sock.send(radiotap + frame2) 2594 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.5) 2595 if ev is not None: 2596 raise Exception("Unexpected disconnection") 2597 dev[0].request("DISCONNECT") 2598 2599def run_psk_supp_proto_pmf(dev, apdev, igtk_kde=None, fail=False): 2600 try: 2601 run_psk_supp_proto_pmf2(dev, apdev, igtk_kde=igtk_kde, fail=fail) 2602 finally: 2603 stop_monitor(apdev[1]["ifname"]) 2604 2605def test_ap_wpa2_psk_supp_proto_no_igtk(dev, apdev): 2606 """WPA2-PSK supplicant protocol testing: no IGTK KDE""" 2607 run_psk_supp_proto_pmf(dev, apdev, igtk_kde=None) 2608 2609def test_ap_wpa2_psk_supp_proto_igtk_ok(dev, apdev): 2610 """WPA2-PSK supplicant protocol testing: valid IGTK KDE""" 2611 igtk_kde = binascii.unhexlify('dd1c' + '000fac09' + '0400' + 6*'00' + 16*'77') 2612 run_psk_supp_proto_pmf(dev, apdev, igtk_kde=igtk_kde) 2613 2614def test_ap_wpa2_psk_supp_proto_igtk_keyid_swap(dev, apdev): 2615 """WPA2-PSK supplicant protocol testing: swapped IGTK KeyID""" 2616 igtk_kde = binascii.unhexlify('dd1c' + '000fac09' + '0004' + 6*'00' + 16*'77') 2617 run_psk_supp_proto_pmf(dev, apdev, igtk_kde=igtk_kde) 2618 2619def test_ap_wpa2_psk_supp_proto_igtk_keyid_too_large(dev, apdev): 2620 """WPA2-PSK supplicant protocol testing: too large IGTK KeyID""" 2621 igtk_kde = binascii.unhexlify('dd1c' + '000fac09' + 'ffff' + 6*'00' + 16*'77') 2622 run_psk_supp_proto_pmf(dev, apdev, igtk_kde=igtk_kde, fail=True) 2623 2624def test_ap_wpa2_psk_supp_proto_igtk_keyid_unexpected(dev, apdev): 2625 """WPA2-PSK supplicant protocol testing: unexpected IGTK KeyID""" 2626 igtk_kde = binascii.unhexlify('dd1c' + '000fac09' + '0006' + 6*'00' + 16*'77') 2627 run_psk_supp_proto_pmf(dev, apdev, igtk_kde=igtk_kde, fail=True) 2628 2629def find_wpas_process(dev): 2630 ifname = dev.ifname 2631 err, data = dev.cmd_execute(['ps', 'ax']) 2632 for l in data.splitlines(): 2633 if "wpa_supplicant" not in l: 2634 continue 2635 if "-i" + ifname not in l: 2636 continue 2637 return int(l.strip().split(' ')[0]) 2638 raise Exception("Could not find wpa_supplicant process") 2639 2640def read_process_memory(pid, key=None): 2641 buf = [] 2642 logger.info("Reading process memory (pid=%d)" % pid) 2643 with open('/proc/%d/maps' % pid, 'r') as maps, \ 2644 open('/proc/%d/mem' % pid, 'rb') as mem: 2645 for l in maps.readlines(): 2646 m = re.match(r'([0-9a-f]+)-([0-9a-f]+) ([-r][-w][-x][-p])', l) 2647 if not m: 2648 continue 2649 start = int(m.group(1), 16) 2650 end = int(m.group(2), 16) 2651 perm = m.group(3) 2652 if start > 0xffffffffffff: 2653 continue 2654 if end < start: 2655 continue 2656 if not perm.startswith('rw'): 2657 continue 2658 for name in ["[heap]", "[stack]"]: 2659 if name in l: 2660 logger.info("%s 0x%x-0x%x is at %d-%d" % (name, start, end, len(buf), len(buf) + (end - start))) 2661 2662 if end - start >= 256 * 1024 * 1024: 2663 logger.info("Large memory block of >= 256MiB, assuming ASAN shadow memory") 2664 continue 2665 2666 try: 2667 mem.seek(start) 2668 data = mem.read(end - start) 2669 except OSError as e: 2670 logger.info("Could not read mem: start=%d end=%d: %s" % (start, end, str(e))) 2671 continue 2672 buf.append(data) 2673 if key and key in data: 2674 logger.info("Key found in " + l) 2675 logger.info("Total process memory read: %d bytes" % len(buf)) 2676 return b''.join(buf) 2677 2678def verify_not_present(buf, key, fname, keyname): 2679 pos = buf.find(key) 2680 if pos < 0: 2681 return 2682 2683 prefix = 2048 if pos > 2048 else pos 2684 with open(fname + keyname, 'wb') as f: 2685 f.write(buf[pos - prefix:pos + 2048]) 2686 raise Exception(keyname + " found after disassociation") 2687 2688def get_key_locations(buf, key, keyname): 2689 count = 0 2690 pos = 0 2691 while True: 2692 pos = buf.find(key, pos) 2693 if pos < 0: 2694 break 2695 logger.info("Found %s at %d" % (keyname, pos)) 2696 context = 128 2697 start = pos - context if pos > context else 0 2698 before = binascii.hexlify(buf[start:pos]) 2699 context += len(key) 2700 end = pos + context if pos < len(buf) - context else len(buf) - context 2701 after = binascii.hexlify(buf[pos + len(key):end]) 2702 logger.debug("Memory context %d-%d: %s|%s|%s" % (start, end, before, binascii.hexlify(key), after)) 2703 count += 1 2704 pos += len(key) 2705 return count 2706 2707def test_wpa2_psk_key_lifetime_in_memory(dev, apdev, params): 2708 """WPA2-PSK and PSK/PTK lifetime in memory""" 2709 ssid = "test-wpa2-psk" 2710 passphrase = 'qwertyuiop' 2711 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6' 2712 pmk = binascii.unhexlify(psk) 2713 p = hostapd.wpa2_params(ssid=ssid) 2714 p['wpa_psk'] = psk 2715 hapd = hostapd.add_ap(apdev[0], p) 2716 2717 pid = find_wpas_process(dev[0]) 2718 2719 id = dev[0].connect(ssid, raw_psk=psk, scan_freq="2412", 2720 only_add_network=True) 2721 2722 logger.info("Checking keys in memory after network profile configuration") 2723 buf = read_process_memory(pid, pmk) 2724 get_key_locations(buf, pmk, "PMK") 2725 2726 dev[0].request("REMOVE_NETWORK all") 2727 logger.info("Checking keys in memory after network profile removal") 2728 buf = read_process_memory(pid, pmk) 2729 get_key_locations(buf, pmk, "PMK") 2730 2731 id = dev[0].connect(ssid, psk=passphrase, scan_freq="2412", 2732 only_add_network=True) 2733 2734 logger.info("Checking keys in memory before connection") 2735 buf = read_process_memory(pid, pmk) 2736 get_key_locations(buf, pmk, "PMK") 2737 2738 dev[0].connect_network(id, timeout=20) 2739 # The decrypted copy of GTK is freed only after the CTRL-EVENT-CONNECTED 2740 # event has been delivered, so verify that wpa_supplicant has returned to 2741 # eloop before reading process memory. 2742 time.sleep(1) 2743 dev[0].ping() 2744 2745 buf = read_process_memory(pid, pmk) 2746 2747 dev[0].request("DISCONNECT") 2748 dev[0].wait_disconnected() 2749 2750 dev[0].relog() 2751 ptk = None 2752 gtk = None 2753 with open(os.path.join(params['logdir'], 'log0'), 'r') as f: 2754 for l in f.readlines(): 2755 if "WPA: PTK - hexdump" in l: 2756 val = l.strip().split(':')[3].replace(' ', '') 2757 ptk = binascii.unhexlify(val) 2758 if "WPA: Group Key - hexdump" in l: 2759 val = l.strip().split(':')[3].replace(' ', '') 2760 gtk = binascii.unhexlify(val) 2761 if not pmk or not ptk or not gtk: 2762 raise Exception("Could not find keys from debug log") 2763 if len(gtk) != 16: 2764 raise Exception("Unexpected GTK length") 2765 2766 kck = ptk[0:16] 2767 kek = ptk[16:32] 2768 tk = ptk[32:48] 2769 2770 logger.info("Checking keys in memory while associated") 2771 get_key_locations(buf, pmk, "PMK") 2772 if pmk not in buf: 2773 raise HwsimSkip("PMK not found while associated") 2774 if kck not in buf: 2775 raise Exception("KCK not found while associated") 2776 if kek not in buf: 2777 raise Exception("KEK not found while associated") 2778 #if tk in buf: 2779 # raise Exception("TK found from memory") 2780 2781 logger.info("Checking keys in memory after disassociation") 2782 buf = read_process_memory(pid, pmk) 2783 get_key_locations(buf, pmk, "PMK") 2784 2785 # Note: PMK/PSK is still present in network configuration 2786 2787 fname = os.path.join(params['logdir'], 2788 'wpa2_psk_key_lifetime_in_memory.memctx-') 2789 verify_not_present(buf, kck, fname, "KCK") 2790 verify_not_present(buf, kek, fname, "KEK") 2791 verify_not_present(buf, tk, fname, "TK") 2792 if gtk in buf: 2793 get_key_locations(buf, gtk, "GTK") 2794 verify_not_present(buf, gtk, fname, "GTK") 2795 2796 dev[0].request("REMOVE_NETWORK all") 2797 2798 logger.info("Checking keys in memory after network profile removal") 2799 buf = read_process_memory(pid, pmk) 2800 get_key_locations(buf, pmk, "PMK") 2801 2802 verify_not_present(buf, pmk, fname, "PMK") 2803 verify_not_present(buf, kck, fname, "KCK") 2804 verify_not_present(buf, kek, fname, "KEK") 2805 verify_not_present(buf, tk, fname, "TK") 2806 verify_not_present(buf, gtk, fname, "GTK") 2807 2808@remote_compatible 2809def test_ap_wpa2_psk_wep(dev, apdev): 2810 """WPA2-PSK AP and WEP enabled""" 2811 ssid = "test-wpa2-psk" 2812 passphrase = 'qwertyuiop' 2813 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 2814 hapd = hostapd.add_ap(apdev[0], params) 2815 try: 2816 hapd.set('wep_key0', '"hello"') 2817 raise Exception("WEP key accepted to WPA2 network") 2818 except Exception: 2819 pass 2820 2821def test_ap_wpa2_psk_wpas_in_bridge(dev, apdev): 2822 """WPA2-PSK AP and wpas interface in a bridge""" 2823 br_ifname = 'sta-br0' 2824 ifname = 'wlan5' 2825 try: 2826 _test_ap_wpa2_psk_wpas_in_bridge(dev, apdev) 2827 finally: 2828 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down']) 2829 subprocess.call(['brctl', 'delif', br_ifname, ifname]) 2830 subprocess.call(['brctl', 'delbr', br_ifname]) 2831 subprocess.call(['iw', ifname, 'set', '4addr', 'off']) 2832 2833def _test_ap_wpa2_psk_wpas_in_bridge(dev, apdev): 2834 ssid = "test-wpa2-psk" 2835 passphrase = 'qwertyuiop' 2836 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 2837 hapd = hostapd.add_ap(apdev[0], params) 2838 2839 br_ifname = 'sta-br0' 2840 ifname = 'wlan5' 2841 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 2842 subprocess.call(['brctl', 'addbr', br_ifname]) 2843 subprocess.call(['brctl', 'setfd', br_ifname, '0']) 2844 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up']) 2845 subprocess.call(['iw', ifname, 'set', '4addr', 'on']) 2846 subprocess.check_call(['brctl', 'addif', br_ifname, ifname]) 2847 wpas.interface_add(ifname, br_ifname=br_ifname) 2848 wpas.dump_monitor() 2849 2850 wpas.connect(ssid, psk=passphrase, scan_freq="2412") 2851 wpas.dump_monitor() 2852 2853@remote_compatible 2854def test_ap_wpa2_psk_ifdown(dev, apdev): 2855 """AP with open mode and external ifconfig down""" 2856 ssid = "test-wpa2-psk" 2857 passphrase = 'qwertyuiop' 2858 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 2859 hapd = hostapd.add_ap(apdev[0], params) 2860 bssid = apdev[0]['bssid'] 2861 2862 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 2863 hapd.cmd_execute(['ip', 'link', 'set', 'dev', apdev[0]['ifname'], 'down']) 2864 ev = hapd.wait_event(["INTERFACE-DISABLED"], timeout=10) 2865 if ev is None: 2866 raise Exception("No INTERFACE-DISABLED event") 2867 # this wait tests beacon loss detection in mac80211 2868 dev[0].wait_disconnected() 2869 hapd.cmd_execute(['ip', 'link', 'set', 'dev', apdev[0]['ifname'], 'up']) 2870 ev = hapd.wait_event(["INTERFACE-ENABLED"], timeout=10) 2871 if ev is None: 2872 raise Exception("No INTERFACE-ENABLED event") 2873 dev[0].wait_connected() 2874 hapd.wait_sta() 2875 hwsim_utils.test_connectivity(dev[0], hapd) 2876 2877def test_ap_wpa2_psk_drop_first_msg_4(dev, apdev): 2878 """WPA2-PSK and first EAPOL-Key msg 4/4 dropped""" 2879 hapd = setup_psk_ext(dev[0], apdev[0]) 2880 bssid = apdev[0]['bssid'] 2881 addr = dev[0].own_addr() 2882 2883 # EAPOL-Key msg 1/4 2884 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 2885 if ev is None: 2886 raise Exception("Timeout on EAPOL-TX from hostapd") 2887 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 2888 if "OK" not in res: 2889 raise Exception("EAPOL_RX to wpa_supplicant failed") 2890 2891 # EAPOL-Key msg 2/4 2892 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 2893 if ev is None: 2894 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 2895 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 2896 if "OK" not in res: 2897 raise Exception("EAPOL_RX to hostapd failed") 2898 2899 # EAPOL-Key msg 3/4 2900 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 2901 if ev is None: 2902 raise Exception("Timeout on EAPOL-TX from hostapd") 2903 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 2904 if "OK" not in res: 2905 raise Exception("EAPOL_RX to wpa_supplicant failed") 2906 2907 # EAPOL-Key msg 4/4 2908 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 2909 if ev is None: 2910 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 2911 logger.info("Drop the first EAPOL-Key msg 4/4") 2912 2913 # wpa_supplicant believes now that 4-way handshake succeeded; hostapd 2914 # doesn't. Use normal EAPOL TX/RX to handle retries. 2915 hapd.request("SET ext_eapol_frame_io 0") 2916 dev[0].request("SET ext_eapol_frame_io 0") 2917 dev[0].wait_connected() 2918 2919 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15) 2920 if ev is None: 2921 raise Exception("Timeout on AP-STA-CONNECTED from hostapd") 2922 2923 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.1) 2924 if ev is not None: 2925 logger.info("Disconnection detected") 2926 # The EAPOL-Key retries are supposed to allow the connection to be 2927 # established without having to reassociate. However, this does not 2928 # currently work since mac80211 ends up encrypting EAPOL-Key msg 4/4 2929 # after the pairwise key has been configured and AP will drop those and 2930 # disconnect the station after reaching retransmission limit. Connection 2931 # is then established after reassociation. Once that behavior has been 2932 # optimized to prevent EAPOL-Key frame encryption for retransmission 2933 # case, this exception can be uncommented here. 2934 #raise Exception("Unexpected disconnection") 2935 2936@remote_compatible 2937def test_ap_wpa2_psk_disable_enable(dev, apdev): 2938 """WPA2-PSK AP getting disabled and re-enabled""" 2939 ssid = "test-wpa2-psk" 2940 passphrase = 'qwertyuiop' 2941 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6' 2942 params = hostapd.wpa2_params(ssid=ssid) 2943 params['wpa_psk'] = psk 2944 hapd = hostapd.add_ap(apdev[0], params) 2945 dev[0].connect(ssid, raw_psk=psk, scan_freq="2412") 2946 2947 for i in range(2): 2948 hapd.request("DISABLE") 2949 dev[0].wait_disconnected() 2950 hapd.request("ENABLE") 2951 dev[0].wait_connected() 2952 hapd.wait_sta() 2953 hwsim_utils.test_connectivity(dev[0], hapd) 2954 2955@remote_compatible 2956def test_ap_wpa2_psk_incorrect_passphrase(dev, apdev): 2957 """WPA2-PSK AP and station using incorrect passphrase""" 2958 ssid = "test-wpa2-psk" 2959 passphrase = 'qwertyuiop' 2960 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 2961 hapd = hostapd.add_ap(apdev[0], params) 2962 dev[0].connect(ssid, psk="incorrect passphrase", scan_freq="2412", 2963 wait_connect=False) 2964 ev = hapd.wait_event(["AP-STA-POSSIBLE-PSK-MISMATCH"], timeout=10) 2965 if ev is None: 2966 raise Exception("No AP-STA-POSSIBLE-PSK-MISMATCH reported") 2967 dev[0].dump_monitor() 2968 2969 hapd.disable() 2970 hapd.set("wpa_passphrase", "incorrect passphrase") 2971 hapd.enable() 2972 2973 dev[0].wait_connected(timeout=20) 2974 2975@remote_compatible 2976def test_ap_wpa_ie_parsing(dev, apdev): 2977 """WPA IE parsing""" 2978 skip_with_fips(dev[0]) 2979 skip_without_tkip(dev[0]) 2980 ssid = "test-wpa-psk" 2981 passphrase = 'qwertyuiop' 2982 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase) 2983 hapd = hostapd.add_ap(apdev[0], params) 2984 id = dev[0].connect(ssid, psk=passphrase, scan_freq="2412", 2985 only_add_network=True) 2986 2987 tests = ["dd040050f201", 2988 "dd050050f20101", 2989 "dd060050f2010100", 2990 "dd060050f2010001", 2991 "dd070050f201010000", 2992 "dd080050f20101000050", 2993 "dd090050f20101000050f2", 2994 "dd0a0050f20101000050f202", 2995 "dd0b0050f20101000050f20201", 2996 "dd0c0050f20101000050f2020100", 2997 "dd0c0050f20101000050f2020000", 2998 "dd0c0050f20101000050f202ffff", 2999 "dd0d0050f20101000050f202010000", 3000 "dd0e0050f20101000050f20201000050", 3001 "dd0f0050f20101000050f20201000050f2", 3002 "dd100050f20101000050f20201000050f202", 3003 "dd110050f20101000050f20201000050f20201", 3004 "dd120050f20101000050f20201000050f2020100", 3005 "dd120050f20101000050f20201000050f2020000", 3006 "dd120050f20101000050f20201000050f202ffff", 3007 "dd130050f20101000050f20201000050f202010000", 3008 "dd140050f20101000050f20201000050f20201000050", 3009 "dd150050f20101000050f20201000050f20201000050f2"] 3010 for t in tests: 3011 try: 3012 if "OK" not in dev[0].request("VENDOR_ELEM_ADD 13 " + t): 3013 raise Exception("VENDOR_ELEM_ADD failed") 3014 dev[0].select_network(id) 3015 ev = dev[0].wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=10) 3016 if ev is None: 3017 raise Exception("Association rejection not reported") 3018 dev[0].request("DISCONNECT") 3019 dev[0].dump_monitor() 3020 finally: 3021 dev[0].request("VENDOR_ELEM_REMOVE 13 *") 3022 3023 tests = ["dd170050f20101000050f20201000050f20201000050f202ff", 3024 "dd180050f20101000050f20201000050f20201000050f202ffff", 3025 "dd190050f20101000050f20201000050f20201000050f202ffffff"] 3026 for t in tests: 3027 try: 3028 if "OK" not in dev[0].request("VENDOR_ELEM_ADD 13 " + t): 3029 raise Exception("VENDOR_ELEM_ADD failed") 3030 dev[0].select_network(id) 3031 ev = dev[0].wait_event(['CTRL-EVENT-CONNECTED', 3032 'WPA: 4-Way Handshake failed'], timeout=10) 3033 if ev is None: 3034 raise Exception("Association failed unexpectedly") 3035 dev[0].request("DISCONNECT") 3036 dev[0].dump_monitor() 3037 finally: 3038 dev[0].request("VENDOR_ELEM_REMOVE 13 *") 3039 3040@remote_compatible 3041def test_ap_wpa2_psk_no_random(dev, apdev): 3042 """WPA2-PSK AP and no random numbers available""" 3043 ssid = "test-wpa2-psk" 3044 passphrase = 'qwertyuiop' 3045 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6' 3046 params = hostapd.wpa2_params(ssid=ssid) 3047 params['wpa_psk'] = psk 3048 hapd = hostapd.add_ap(apdev[0], params) 3049 with fail_test(hapd, 1, "wpa_gmk_to_gtk"): 3050 id = dev[0].connect(ssid, raw_psk=psk, scan_freq="2412", 3051 wait_connect=False) 3052 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=15) 3053 if ev is None: 3054 raise Exception("Disconnection event not reported") 3055 dev[0].request("DISCONNECT") 3056 dev[0].select_network(id, freq=2412) 3057 dev[0].wait_connected() 3058 3059@remote_compatible 3060def test_rsn_ie_proto_psk_sta(dev, apdev): 3061 """RSN element protocol testing for PSK cases on STA side""" 3062 bssid = apdev[0]['bssid'] 3063 ssid = "test-wpa2-psk" 3064 passphrase = 'qwertyuiop' 3065 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3066 # This is the RSN element used normally by hostapd 3067 params['own_ie_override'] = '30140100000fac040100000fac040100000fac020c00' 3068 hapd = hostapd.add_ap(apdev[0], params) 3069 if "FAIL" not in hapd.request("SET own_ie_override qwerty"): 3070 raise Exception("Invalid own_ie_override value accepted") 3071 id = dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3072 3073 tests = [('No RSN Capabilities field', 3074 '30120100000fac040100000fac040100000fac02'), 3075 ('Reserved RSN Capabilities bits set', 3076 '30140100000fac040100000fac040100000fac023cff'), 3077 ('Truncated RSN Capabilities field', 3078 '30130100000fac040100000fac040100000fac023c'), 3079 ('Extra pairwise cipher suite (unsupported)', 3080 '30180100000fac040200ffffffff000fac040100000fac020c00'), 3081 ('Extra AKM suite (unsupported)', 3082 '30180100000fac040100000fac040200ffffffff000fac020c00'), 3083 ('PMKIDCount field included', 3084 '30160100000fac040100000fac040100000fac020c000000'), 3085 ('Truncated PMKIDCount field', 3086 '30150100000fac040100000fac040100000fac020c0000'), 3087 ('Unexpected Group Management Cipher Suite with PMF disabled', 3088 '301a0100000fac040100000fac040100000fac020c000000000fac06'), 3089 ('Extra octet after defined fields (future extensibility)', 3090 '301b0100000fac040100000fac040100000fac020c000000000fac0600')] 3091 for txt, ie in tests: 3092 dev[0].request("DISCONNECT") 3093 dev[0].wait_disconnected() 3094 dev[0].dump_monitor() 3095 dev[0].request("NOTE " + txt) 3096 logger.info(txt) 3097 hapd.disable() 3098 hapd.set('own_ie_override', ie) 3099 hapd.enable() 3100 dev[0].request("BSS_FLUSH 0") 3101 dev[0].scan_for_bss(bssid, 2412, force_scan=True, only_new=True) 3102 dev[0].select_network(id, freq=2412) 3103 dev[0].wait_connected() 3104 3105@remote_compatible 3106def test_ap_cli_order(dev, apdev): 3107 """hostapd configuration parameter SET ordering""" 3108 ssid = "test-rsn-setup" 3109 passphrase = 'zzzzzzzz' 3110 3111 hapd = hostapd.add_ap(apdev[0], {}, no_enable=True) 3112 hapd.set('ssid', ssid) 3113 hapd.set('wpa_passphrase', passphrase) 3114 hapd.set('rsn_pairwise', 'CCMP') 3115 hapd.set('wpa_key_mgmt', 'WPA-PSK') 3116 hapd.set('wpa', '2') 3117 hapd.enable() 3118 cfg = hapd.get_config() 3119 if cfg['group_cipher'] != 'CCMP': 3120 raise Exception("Unexpected group_cipher: " + cfg['group_cipher']) 3121 if cfg['rsn_pairwise_cipher'] != 'CCMP': 3122 raise Exception("Unexpected rsn_pairwise_cipher: " + cfg['rsn_pairwise_cipher']) 3123 3124 ev = hapd.wait_event(["AP-ENABLED", "AP-DISABLED"], timeout=30) 3125 if ev is None: 3126 raise Exception("AP startup timed out") 3127 if "AP-ENABLED" not in ev: 3128 raise Exception("AP startup failed") 3129 3130 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3131 3132def set_test_assoc_ie(dev, ie): 3133 if "OK" not in dev.request("TEST_ASSOC_IE " + ie): 3134 raise Exception("Could not set TEST_ASSOC_IE") 3135 3136@remote_compatible 3137def test_ap_wpa2_psk_assoc_rsn(dev, apdev): 3138 """WPA2-PSK AP and association request RSN IE differences""" 3139 ssid = "test-wpa2-psk" 3140 passphrase = 'qwertyuiop' 3141 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3142 hapd = hostapd.add_ap(apdev[0], params) 3143 3144 tests = [("Normal wpa_supplicant assoc req RSN IE", 3145 "30140100000fac040100000fac040100000fac020000"), 3146 ("RSN IE without RSN Capabilities", 3147 "30120100000fac040100000fac040100000fac02")] 3148 for title, ie in tests: 3149 logger.info(title) 3150 set_test_assoc_ie(dev[0], ie) 3151 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3152 dev[0].request("REMOVE_NETWORK all") 3153 dev[0].wait_disconnected() 3154 3155 tests = [("WPA IE instead of RSN IE and only RSN enabled on AP", 3156 "dd160050f20101000050f20201000050f20201000050f202", 40), 3157 ("Empty RSN IE", "3000", 40), 3158 ("RSN IE with truncated Version", "300101", 40), 3159 ("RSN IE with only Version", "30020100", 43)] 3160 for title, ie, status in tests: 3161 logger.info(title) 3162 set_test_assoc_ie(dev[0], ie) 3163 dev[0].connect(ssid, psk=passphrase, scan_freq="2412", 3164 wait_connect=False) 3165 ev = dev[0].wait_event(["CTRL-EVENT-ASSOC-REJECT"]) 3166 if ev is None: 3167 raise Exception("Association rejection not reported") 3168 if "status_code=" + str(status) not in ev: 3169 raise Exception("Unexpected status code: " + ev) 3170 dev[0].request("REMOVE_NETWORK all") 3171 dev[0].dump_monitor() 3172 3173def test_ap_wpa2_psk_ft_workaround(dev, apdev): 3174 """WPA2-PSK+FT AP and workaround for incorrect STA behavior""" 3175 ssid = "test-wpa2-psk-ft" 3176 passphrase = 'qwertyuiop' 3177 3178 params = {"wpa": "2", 3179 "wpa_key_mgmt": "FT-PSK WPA-PSK", 3180 "rsn_pairwise": "CCMP", 3181 "ssid": ssid, 3182 "wpa_passphrase": passphrase} 3183 params["mobility_domain"] = "a1b2" 3184 params["r0_key_lifetime"] = "10000" 3185 params["pmk_r1_push"] = "1" 3186 params["reassociation_deadline"] = "1000" 3187 params['nas_identifier'] = "nas1.w1.fi" 3188 params['r1_key_holder'] = "000102030405" 3189 hapd = hostapd.add_ap(apdev[0], params) 3190 3191 # Include both WPA-PSK and FT-PSK AKMs in Association Request frame 3192 set_test_assoc_ie(dev[0], 3193 "30180100000fac040100000fac040200000fac02000fac040000") 3194 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3195 dev[0].request("REMOVE_NETWORK all") 3196 dev[0].wait_disconnected() 3197 3198def test_ap_wpa2_psk_assoc_rsn_pmkid(dev, apdev): 3199 """WPA2-PSK AP and association request RSN IE with PMKID""" 3200 ssid = "test-wpa2-psk" 3201 passphrase = 'qwertyuiop' 3202 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3203 hapd = hostapd.add_ap(apdev[0], params) 3204 3205 set_test_assoc_ie(dev[0], "30260100000fac040100000fac040100000fac0200000100" + 16*'00') 3206 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3207 dev[0].request("REMOVE_NETWORK all") 3208 dev[0].wait_disconnected() 3209 3210def test_ap_wpa_psk_rsn_pairwise(dev, apdev): 3211 """WPA-PSK AP and only rsn_pairwise set""" 3212 skip_without_tkip(dev[0]) 3213 params = {"ssid": "wpapsk", "wpa": "1", "wpa_key_mgmt": "WPA-PSK", 3214 "rsn_pairwise": "TKIP", "wpa_passphrase": "1234567890"} 3215 hapd = hostapd.add_ap(apdev[0], params) 3216 dev[0].connect("wpapsk", psk="1234567890", proto="WPA", pairwise="TKIP", 3217 scan_freq="2412") 3218 3219def test_ap_wpa2_eapol_retry_limit(dev, apdev): 3220 """WPA2-PSK EAPOL-Key retry limit configuration""" 3221 ssid = "test-wpa2-psk" 3222 passphrase = 'qwertyuiop' 3223 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3224 params['wpa_ptk_rekey'] = '2' 3225 params['wpa_group_update_count'] = '1' 3226 params['wpa_pairwise_update_count'] = '1' 3227 hapd = hostapd.add_ap(apdev[0], params) 3228 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3229 ev = dev[0].wait_event(["WPA: Key negotiation completed"]) 3230 if ev is None: 3231 raise Exception("PTK rekey timed out") 3232 3233 if "FAIL" not in hapd.request("SET wpa_group_update_count 0"): 3234 raise Exception("Invalid wpa_group_update_count value accepted") 3235 if "FAIL" not in hapd.request("SET wpa_pairwise_update_count 0"): 3236 raise Exception("Invalid wpa_pairwise_update_count value accepted") 3237 3238def test_ap_wpa2_disable_eapol_retry(dev, apdev): 3239 """WPA2-PSK disable EAPOL-Key retry""" 3240 ssid = "test-wpa2-psk" 3241 passphrase = 'qwertyuiop' 3242 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3243 params['wpa_disable_eapol_key_retries'] = '1' 3244 hapd = hostapd.add_ap(apdev[0], params) 3245 bssid = apdev[0]['bssid'] 3246 3247 logger.info("Verify working 4-way handshake without retries") 3248 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3249 dev[0].request("REMOVE_NETWORK all") 3250 dev[0].wait_disconnected() 3251 dev[0].dump_monitor() 3252 addr = dev[0].own_addr() 3253 3254 logger.info("Verify no retransmission of message 3/4") 3255 hapd.request("SET ext_eapol_frame_io 1") 3256 dev[0].request("SET ext_eapol_frame_io 1") 3257 dev[0].connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False) 3258 3259 ev = hapd.wait_event(["EAPOL-TX"], timeout=5) 3260 if ev is None: 3261 raise Exception("Timeout on EAPOL-TX (M1) from hostapd") 3262 ev = hapd.wait_event(["EAPOL-TX"], timeout=5) 3263 if ev is None: 3264 raise Exception("Timeout on EAPOL-TX (M1 retry) from hostapd") 3265 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 3266 if "OK" not in res: 3267 raise Exception("EAPOL_RX (M1) to wpa_supplicant failed") 3268 ev = dev[0].wait_event(["EAPOL-TX"], timeout=5) 3269 if ev is None: 3270 raise Exception("Timeout on EAPOL-TX (M2) from wpa_supplicant") 3271 dev[0].dump_monitor() 3272 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 3273 if "OK" not in res: 3274 raise Exception("EAPOL_RX (M2) to hostapd failed") 3275 3276 ev = hapd.wait_event(["EAPOL-TX"], timeout=5) 3277 if ev is None: 3278 raise Exception("Timeout on EAPOL-TX (M3) from hostapd") 3279 ev = hapd.wait_event(["EAPOL-TX"], timeout=2) 3280 if ev is not None: 3281 raise Exception("Unexpected EAPOL-TX M3 retry from hostapd") 3282 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=3) 3283 if ev is None: 3284 raise Exception("Disconnection not reported") 3285 dev[0].request("REMOVE_NETWORK all") 3286 dev[0].dump_monitor() 3287 3288def test_ap_wpa2_disable_eapol_retry_group(dev, apdev): 3289 """WPA2-PSK disable EAPOL-Key retry for group handshake""" 3290 ssid = "test-wpa2-psk" 3291 passphrase = 'qwertyuiop' 3292 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3293 params['wpa_disable_eapol_key_retries'] = '1' 3294 params['wpa_strict_rekey'] = '1' 3295 hapd = hostapd.add_ap(apdev[0], params) 3296 bssid = apdev[0]['bssid'] 3297 3298 id = dev[1].connect(ssid, psk=passphrase, scan_freq="2412") 3299 hapd.wait_sta() 3300 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3301 hapd.wait_sta() 3302 dev[0].dump_monitor() 3303 addr = dev[0].own_addr() 3304 3305 dev[1].request("DISCONNECT") 3306 dev[1].wait_disconnected() 3307 ev = dev[0].wait_event(["RSN: Group rekeying completed"], timeout=2) 3308 if ev is None: 3309 raise Exception("GTK rekey timed out") 3310 dev[1].request("RECONNECT") 3311 dev[1].wait_connected() 3312 hapd.wait_sta() 3313 dev[0].dump_monitor() 3314 3315 hapd.request("SET ext_eapol_frame_io 1") 3316 dev[0].request("SET ext_eapol_frame_io 1") 3317 dev[1].request("DISCONNECT") 3318 3319 ev = hapd.wait_event(["EAPOL-TX"], timeout=5) 3320 if ev is None: 3321 raise Exception("Timeout on EAPOL-TX (group M1) from hostapd") 3322 ev = hapd.wait_event(["EAPOL-TX"], timeout=2) 3323 if ev is not None: 3324 raise Exception("Unexpected EAPOL-TX group M1 retry from hostapd") 3325 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=3) 3326 if ev is None: 3327 raise Exception("Disconnection not reported") 3328 dev[0].request("REMOVE_NETWORK all") 3329 dev[0].dump_monitor() 3330 3331def test_ap_wpa2_psk_mic_0(dev, apdev): 3332 """WPA2-PSK/TKIP and MIC=0 in EAPOL-Key msg 3/4""" 3333 skip_without_tkip(dev[0]) 3334 bssid = apdev[0]['bssid'] 3335 ssid = "test-wpa2-psk" 3336 passphrase = 'qwertyuiop' 3337 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3338 params['rsn_pairwise'] = "TKIP" 3339 hapd = hostapd.add_ap(apdev[0], params) 3340 hapd.request("SET ext_eapol_frame_io 1") 3341 dev[0].request("SET ext_eapol_frame_io 1") 3342 dev[0].connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False) 3343 addr = dev[0].own_addr() 3344 3345 # EAPOL-Key msg 1/4 3346 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 3347 if ev is None: 3348 raise Exception("Timeout on EAPOL-TX from hostapd") 3349 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2]) 3350 if "OK" not in res: 3351 raise Exception("EAPOL_RX to wpa_supplicant failed") 3352 3353 # EAPOL-Key msg 2/4 3354 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 3355 if ev is None: 3356 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 3357 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2]) 3358 if "OK" not in res: 3359 raise Exception("EAPOL_RX to hostapd failed") 3360 dev[0].dump_monitor() 3361 3362 # EAPOL-Key msg 3/4 3363 ev = hapd.wait_event(["EAPOL-TX"], timeout=15) 3364 if ev is None: 3365 raise Exception("Timeout on EAPOL-TX from hostapd") 3366 msg3 = ev.split(' ')[2] 3367 res = dev[0].request("EAPOL_RX " + bssid + " " + msg3) 3368 if "OK" not in res: 3369 raise Exception("EAPOL_RX to wpa_supplicant failed") 3370 3371 # EAPOL-Key msg 4/4 3372 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15) 3373 if ev is None: 3374 raise Exception("Timeout on EAPOL-TX from wpa_supplicant") 3375 # Do not send to the AP 3376 3377 # EAPOL-Key msg 3/4 with MIC=0 and modifications 3378 eapol_hdr = msg3[0:8] 3379 key_type = msg3[8:10] 3380 key_info = msg3[10:14] 3381 key_length = msg3[14:18] 3382 replay_counter = msg3[18:34] 3383 key_nonce = msg3[34:98] 3384 key_iv = msg3[98:130] 3385 key_rsc = msg3[130:146] 3386 key_id = msg3[146:162] 3387 key_mic = msg3[162:194] 3388 key_data_len = msg3[194:198] 3389 key_data = msg3[198:] 3390 3391 msg3b = eapol_hdr + key_type 3392 msg3b += "12c9" # Clear MIC bit from key_info (originally 13c9) 3393 msg3b += key_length 3394 msg3b += '0000000000000003' 3395 msg3b += key_nonce + key_iv + key_rsc + key_id 3396 msg3b += 32*'0' # Clear MIC value 3397 msg3b += key_data_len + key_data 3398 dev[0].dump_monitor() 3399 res = dev[0].request("EAPOL_RX " + bssid + " " + msg3b) 3400 if "OK" not in res: 3401 raise Exception("EAPOL_RX to wpa_supplicant failed") 3402 ev = dev[0].wait_event(["EAPOL-TX", "WPA: Ignore EAPOL-Key"], timeout=2) 3403 if ev is None: 3404 raise Exception("No event from wpa_supplicant") 3405 if "EAPOL-TX" in ev: 3406 raise Exception("Unexpected EAPOL-Key message from wpa_supplicant") 3407 dev[0].request("DISCONNECT") 3408 3409def test_ap_wpa2_psk_local_error(dev, apdev): 3410 """WPA2-PSK and local error cases on supplicant""" 3411 ssid = "test-wpa2-psk" 3412 passphrase = 'qwertyuiop' 3413 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3414 params["wpa_key_mgmt"] = "WPA-PSK WPA-PSK-SHA256" 3415 hapd = hostapd.add_ap(apdev[0], params) 3416 3417 with fail_test(dev[0], 1, "sha1_prf;wpa_pmk_to_ptk"): 3418 id = dev[0].connect(ssid, key_mgmt="WPA-PSK", psk=passphrase, 3419 scan_freq="2412", wait_connect=False) 3420 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=5) 3421 if ev is None: 3422 raise Exception("Disconnection event not reported") 3423 dev[0].request("REMOVE_NETWORK all") 3424 dev[0].dump_monitor() 3425 3426 with fail_test(dev[0], 1, "sha256_prf_bits;wpa_pmk_to_ptk"): 3427 id = dev[0].connect(ssid, key_mgmt="WPA-PSK-SHA256", psk=passphrase, 3428 scan_freq="2412", wait_connect=False) 3429 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=5) 3430 if ev is None: 3431 raise Exception("Disconnection event not reported") 3432 dev[0].request("REMOVE_NETWORK all") 3433 dev[0].dump_monitor() 3434 3435def test_ap_wpa2_psk_inject_assoc(dev, apdev, params): 3436 """WPA2-PSK AP and Authentication and Association Request frame injection""" 3437 prefix = "ap_wpa2_psk_inject_assoc" 3438 ifname = apdev[0]["ifname"] 3439 cap = os.path.join(params['logdir'], prefix + "." + ifname + ".pcap") 3440 3441 ssid = "test" 3442 params = hostapd.wpa2_params(ssid=ssid, passphrase="12345678") 3443 params["wpa_key_mgmt"] = "WPA-PSK" 3444 hapd = hostapd.add_ap(apdev[0], params) 3445 with WlantestCapture(ifname, cap): 3446 bssid = hapd.own_addr().replace(':', '') 3447 3448 hapd.request("SET ext_mgmt_frame_handling 1") 3449 addr = "021122334455" 3450 auth = "b0003a01" + bssid + addr + bssid + '1000000001000000' 3451 res = hapd.request("MGMT_RX_PROCESS freq=2412 datarate=0 ssi_signal=-30 frame=%s" % auth) 3452 if "OK" not in res: 3453 raise Exception("MGMT_RX_PROCESS failed") 3454 ev = hapd.wait_event(["MGMT-TX-STATUS"], timeout=5) 3455 if ev is None: 3456 raise Exception("No TX status seen") 3457 ev = ev.replace("ok=0", "ok=1") 3458 cmd = "MGMT_TX_STATUS_PROCESS %s" % (" ".join(ev.split(' ')[1:4])) 3459 if "OK" not in hapd.request(cmd): 3460 raise Exception("MGMT_TX_STATUS_PROCESS failed") 3461 3462 assoc = "00003a01" + bssid + addr + bssid + '2000' + '31040500' + '000474657374' + '010802040b160c121824' + '30140100000fac040100000fac040100000fac020000' 3463 res = hapd.request("MGMT_RX_PROCESS freq=2412 datarate=0 ssi_signal=-30 frame=%s" % assoc) 3464 if "OK" not in res: 3465 raise Exception("MGMT_RX_PROCESS failed") 3466 ev = hapd.wait_event(["MGMT-TX-STATUS"], timeout=5) 3467 if ev is None: 3468 raise Exception("No TX status seen") 3469 ev = ev.replace("ok=0", "ok=1") 3470 cmd = "MGMT_TX_STATUS_PROCESS %s" % (" ".join(ev.split(' ')[1:4])) 3471 if "OK" not in hapd.request(cmd): 3472 raise Exception("MGMT_TX_STATUS_PROCESS failed") 3473 hapd.request("SET ext_mgmt_frame_handling 0") 3474 3475 dev[0].connect(ssid, psk="12345678", scan_freq="2412") 3476 hapd.wait_sta() 3477 hwsim_utils.test_connectivity(dev[0], hapd) 3478 time.sleep(1) 3479 hwsim_utils.test_connectivity(dev[0], hapd) 3480 time.sleep(0.5) 3481 3482 # Check for Layer 2 Update frame and unexpected frames from the station 3483 # that did not fully complete authentication. 3484 res = run_tshark(cap, "basicxid.llc.xid.format == 0x81", 3485 ["eth.src"], wait=False) 3486 real_sta_seen = False 3487 unexpected_sta_seen = False 3488 real_addr = dev[0].own_addr() 3489 for l in res.splitlines(): 3490 if l == real_addr: 3491 real_sta_seen = True 3492 else: 3493 unexpected_sta_seen = True 3494 if unexpected_sta_seen: 3495 raise Exception("Layer 2 Update frame from unexpected STA seen") 3496 if not real_sta_seen: 3497 raise Exception("Layer 2 Update frame from real STA not seen") 3498 3499 res = run_tshark(cap, "eth.src == 02:11:22:33:44:55", ["eth.src"], 3500 wait=False) 3501 if len(res) > 0: 3502 raise Exception("Unexpected frame from unauthorized STA seen") 3503 3504def test_ap_wpa2_psk_no_control_port(dev, apdev): 3505 """WPA2-PSK AP without nl80211 control port""" 3506 ssid = "test-wpa2-psk" 3507 passphrase = 'qwertyuiop' 3508 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3509 params['driver_params'] = "control_port=0" 3510 hapd = hostapd.add_ap(apdev[0], params) 3511 3512 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 3513 wpas.interface_add("wlan5", drv_params="control_port=0") 3514 wpas.connect(ssid, psk=passphrase, scan_freq="2412") 3515 hapd.wait_sta() 3516 hwsim_utils.test_connectivity(wpas, hapd) 3517 if "OK" not in wpas.request("KEY_REQUEST 0 1"): 3518 raise Exception("KEY_REQUEST failed") 3519 ev = wpas.wait_event(["WPA: Key negotiation completed"]) 3520 if ev is None: 3521 raise Exception("PTK rekey timed out") 3522 hapd.wait_ptkinitdone(wpas.own_addr()) 3523 hwsim_utils.test_connectivity(wpas, hapd) 3524 wpas.request("DISCONNECT") 3525 wpas.wait_disconnected() 3526 wpas.dump_monitor() 3527 3528def test_ap_wpa2_psk_ap_control_port(dev, apdev): 3529 """WPA2-PSK AP with nl80211 control port in AP mode""" 3530 run_ap_wpa2_psk_ap_control_port(dev, apdev, ctrl_val=1) 3531 3532def test_ap_wpa2_psk_ap_control_port_disabled(dev, apdev): 3533 """WPA2-PSK AP with nl80211 control port in AP mode disabled""" 3534 run_ap_wpa2_psk_ap_control_port(dev, apdev, ctrl_val=0) 3535 3536def run_ap_wpa2_psk_ap_control_port(dev, apdev, ctrl_val): 3537 ssid = "test-wpa2-psk" 3538 passphrase = 'qwertyuiop' 3539 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3540 params['driver_params'] = "control_port_ap=%d" % ctrl_val 3541 hapd = hostapd.add_ap(apdev[0], params) 3542 3543 flags = hapd.request("DRIVER_FLAGS").splitlines()[1:] 3544 flags2 = hapd.request("DRIVER_FLAGS2").splitlines()[1:] 3545 logger.info("AP driver flags: " + str(flags)) 3546 logger.info("AP driver flags2: " + str(flags2)) 3547 if 'CONTROL_PORT' not in flags or 'CONTROL_PORT_RX' not in flags2: 3548 raise HwsimSkip("No AP driver support for CONTROL_PORT") 3549 3550 flags = dev[0].request("DRIVER_FLAGS").splitlines()[1:] 3551 flags2 = dev[0].request("DRIVER_FLAGS2").splitlines()[1:] 3552 logger.info("STA driver flags: " + str(flags)) 3553 logger.info("STA driver flags2: " + str(flags2)) 3554 if 'CONTROL_PORT' not in flags or 'CONTROL_PORT_RX' not in flags2: 3555 raise HwsimSkip("No STA driver support for CONTROL_PORT") 3556 3557 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3558 hapd.wait_sta() 3559 hwsim_utils.test_connectivity(dev[0], hapd) 3560 if "OK" not in dev[0].request("KEY_REQUEST 0 1"): 3561 raise Exception("KEY_REQUEST failed") 3562 ev = dev[0].wait_event(["WPA: Key negotiation completed"]) 3563 if ev is None: 3564 raise Exception("PTK rekey timed out") 3565 hapd.wait_ptkinitdone(dev[0].own_addr()) 3566 hwsim_utils.test_connectivity(dev[0], hapd) 3567 3568def test_ap_wpa2_psk_rsne_mismatch_ap(dev, apdev): 3569 """RSNE mismatch in EAPOL-Key msg 3/4""" 3570 ie = "30140100000fac040100000fac040100000fac020c80" 3571 run_ap_wpa2_psk_rsne_mismatch_ap(dev, apdev, ie) 3572 3573def test_ap_wpa2_psk_rsne_mismatch_ap2(dev, apdev): 3574 """RSNE mismatch in EAPOL-Key msg 3/4""" 3575 ie = "30150100000fac040100000fac040100000fac020c0000" 3576 run_ap_wpa2_psk_rsne_mismatch_ap(dev, apdev, ie) 3577 3578def test_ap_wpa2_psk_rsne_mismatch_ap3(dev, apdev): 3579 """RSNE mismatch in EAPOL-Key msg 3/4""" 3580 run_ap_wpa2_psk_rsne_mismatch_ap(dev, apdev, "") 3581 3582def run_ap_wpa2_psk_rsne_mismatch_ap(dev, apdev, rsne): 3583 params = hostapd.wpa2_params(ssid="psk", passphrase="12345678") 3584 params['rsne_override_eapol'] = rsne 3585 hapd = hostapd.add_ap(apdev[0], params) 3586 3587 dev[0].connect("psk", psk="12345678", scan_freq="2412", wait_connect=False) 3588 ev = dev[0].wait_event(["Associated with"], timeout=10) 3589 if ev is None: 3590 raise Exception("No indication of association seen") 3591 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED", 3592 "CTRL-EVENT-DISCONNECTED"], timeout=5) 3593 dev[0].request("REMOVE_NETWORK all") 3594 if ev is None: 3595 raise Exception("No disconnection seen") 3596 if "CTRL-EVENT-DISCONNECTED" not in ev: 3597 raise Exception("Unexpected connection") 3598 if "reason=17 locally_generated=1" not in ev: 3599 raise Exception("Unexpected disconnection reason: " + ev) 3600 3601def test_ap_wpa2_psk_rsnxe_mismatch_ap(dev, apdev): 3602 """RSNXE mismatch in EAPOL-Key msg 3/4""" 3603 params = hostapd.wpa2_params(ssid="psk", passphrase="12345678") 3604 params['rsnxe_override_eapol'] = "F40100" 3605 hapd = hostapd.add_ap(apdev[0], params) 3606 3607 dev[0].connect("psk", psk="12345678", scan_freq="2412", wait_connect=False) 3608 ev = dev[0].wait_event(["Associated with"], timeout=10) 3609 if ev is None: 3610 raise Exception("No indication of association seen") 3611 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED", 3612 "CTRL-EVENT-DISCONNECTED"], timeout=5) 3613 dev[0].request("REMOVE_NETWORK all") 3614 if ev is None: 3615 raise Exception("No disconnection seen") 3616 if "CTRL-EVENT-DISCONNECTED" not in ev: 3617 raise Exception("Unexpected connection") 3618 if "reason=17 locally_generated=1" not in ev: 3619 raise Exception("Unexpected disconnection reason: " + ev) 3620 3621def test_ap_wpa2_psk_ext_key_id_ptk_rekey_ap0(dev, apdev): 3622 """WPA2-PSK AP and PTK rekey by AP (disabled on STA)""" 3623 run_ap_wpa2_psk_ext_key_id_ptk_rekey_ap(dev, apdev, 1, 0) 3624 3625def test_ap_wpa2_psk_ext_key_id_ptk_rekey_ap1(dev, apdev): 3626 """WPA2-PSK AP and PTK rekey by AP (start with Key ID 0)""" 3627 run_ap_wpa2_psk_ext_key_id_ptk_rekey_ap(dev, apdev, 1, 1) 3628 3629def test_ap_wpa2_psk_ext_key_id_ptk_rekey_ap2(dev, apdev): 3630 """WPA2-PSK AP and PTK rekey by AP (start with Key ID 1)""" 3631 run_ap_wpa2_psk_ext_key_id_ptk_rekey_ap(dev, apdev, 2, 1) 3632 3633def run_ap_wpa2_psk_ext_key_id_ptk_rekey_ap(dev, apdev, ap_ext_key_id, 3634 sta_ext_key_id): 3635 check_ext_key_id_capa(dev[0]) 3636 ssid = "test-wpa2-psk" 3637 passphrase = 'qwertyuiop' 3638 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3639 params['wpa_ptk_rekey'] = '2' 3640 params['extended_key_id'] = str(ap_ext_key_id) 3641 hapd = hostapd.add_ap(apdev[0], params) 3642 check_ext_key_id_capa(hapd) 3643 try: 3644 dev[0].set("extended_key_id", str(sta_ext_key_id)) 3645 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3646 idx = int(dev[0].request("GET last_tk_key_idx")) 3647 expect_idx = 1 if ap_ext_key_id == 2 and sta_ext_key_id else 0 3648 if idx != expect_idx: 3649 raise Exception("Unexpected Key ID for the first TK: %d (expected %d)" % (idx, expect_idx)) 3650 ev = dev[0].wait_event(["WPA: Key negotiation completed"]) 3651 if ev is None: 3652 raise Exception("PTK rekey timed out") 3653 idx = int(dev[0].request("GET last_tk_key_idx")) 3654 expect_idx = 1 if ap_ext_key_id == 1 and sta_ext_key_id else 0 3655 if idx != expect_idx: 3656 raise Exception("Unexpected Key ID for the second TK: %d (expected %d)" % (idx, expect_idx)) 3657 hwsim_utils.test_connectivity(dev[0], hapd) 3658 finally: 3659 dev[0].set("extended_key_id", "0") 3660 3661def test_ap_wpa2_psk_ext_key_id_ptk_rekey_sta0(dev, apdev): 3662 """Extended Key ID and PTK rekey by station (Ext Key ID disabled on AP)""" 3663 run_ap_wpa2_psk_ext_key_id_ptk_rekey_sta(dev, apdev, 0) 3664 3665def test_ap_wpa2_psk_ext_key_id_ptk_rekey_sta1(dev, apdev): 3666 """Extended Key ID and PTK rekey by station (start with Key ID 0)""" 3667 run_ap_wpa2_psk_ext_key_id_ptk_rekey_sta(dev, apdev, 1) 3668 3669def test_ap_wpa2_psk_ext_key_id_ptk_rekey_sta2(dev, apdev): 3670 """Extended Key ID and PTK rekey by station (start with Key ID 1)""" 3671 run_ap_wpa2_psk_ext_key_id_ptk_rekey_sta(dev, apdev, 2) 3672 3673def run_ap_wpa2_psk_ext_key_id_ptk_rekey_sta(dev, apdev, ext_key_id): 3674 check_ext_key_id_capa(dev[0]) 3675 ssid = "test-wpa2-psk" 3676 passphrase = 'qwertyuiop' 3677 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3678 params['extended_key_id'] = str(ext_key_id) 3679 hapd = hostapd.add_ap(apdev[0], params) 3680 check_ext_key_id_capa(hapd) 3681 3682 Wlantest.setup(hapd) 3683 wt = Wlantest() 3684 wt.flush() 3685 wt.add_passphrase(passphrase) 3686 3687 try: 3688 dev[0].set("extended_key_id", "1") 3689 dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", 3690 scan_freq="2412") 3691 idx = int(dev[0].request("GET last_tk_key_idx")) 3692 expect_idx = 1 if ext_key_id == 2 else 0 3693 if idx != expect_idx: 3694 raise Exception("Unexpected Key ID for the first TK: %d (expected %d)" % (idx, expect_idx)) 3695 ev = dev[0].wait_event(["WPA: Key negotiation completed", 3696 "CTRL-EVENT-DISCONNECTED"]) 3697 if ev is None: 3698 raise Exception("PTK rekey timed out") 3699 if "CTRL-EVENT-DISCONNECTED" in ev: 3700 raise Exception("Disconnect instead of rekey") 3701 idx = int(dev[0].request("GET last_tk_key_idx")) 3702 expect_idx = 1 if ext_key_id == 1 else 0 3703 if idx != expect_idx: 3704 raise Exception("Unexpected Key ID for the second TK: %d (expected %d)" % (idx, expect_idx)) 3705 hwsim_utils.test_connectivity(dev[0], hapd) 3706 finally: 3707 dev[0].set("extended_key_id", "0") 3708 3709def test_ap_wpa2_psk_4addr(dev, apdev): 3710 """WPA2-PSK and STA using 4addr mode""" 3711 br_ifname = 'sta-br0' 3712 ssid = "test-wpa2-psk" 3713 passphrase = 'qwertyuiop' 3714 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3715 hapd = hostapd.add_ap(apdev[0], params) 3716 dev[0].connect(ssid, psk=passphrase, scan_freq="2412", 3717 enable_4addr_mode="1") 3718 3719 # Verify that the station interface can be added into a bridge. 3720 ifname = dev[0].ifname 3721 try: 3722 subprocess.check_call(['brctl', 'addbr', br_ifname]) 3723 subprocess.check_call(['ip', 'link', 'set', 'dev', br_ifname, 'up']) 3724 subprocess.check_call(['brctl', 'addif', br_ifname, ifname]) 3725 cmd = subprocess.Popen(['brctl', 'show'], stdout=subprocess.PIPE) 3726 res = cmd.stdout.read().decode() 3727 finally: 3728 subprocess.call(['brctl', 'delif', br_ifname, ifname]) 3729 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down']) 3730 subprocess.call(['brctl', 'delbr', br_ifname]) 3731 3732 found = False 3733 for s in res.splitlines(): 3734 vals = s.split() 3735 if br_ifname in vals and ifname in vals: 3736 found = True 3737 if not found: 3738 raise Exception("Station interface was not seen in the bridge") 3739 3740def test_rsn_eapol_m1_extra(dev, apdev): 3741 """Extra element and KDE in EAPOL-Key msg 1/4""" 3742 ssid = "test-rsn" 3743 passphrase = 'qwertyuiop' 3744 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3745 # Add a reserved element and KDE into EAPOL-Key msg 1/4 3746 params['eapol_m1_elements'] = '02051122334455' + 'dd05000facff11' 3747 hapd = hostapd.add_ap(apdev[0], params) 3748 3749 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3750 3751def test_rsn_eapol_m3_extra(dev, apdev): 3752 """Extra element and KDE in EAPOL-Key msg 3/4""" 3753 ssid = "test-rsn" 3754 passphrase = 'qwertyuiop' 3755 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3756 # Add a reserved element and KDE into EAPOL-Key msg 3/4 3757 params['eapol_m3_elements'] = '02051122334455' + 'dd05000facff11' 3758 hapd = hostapd.add_ap(apdev[0], params) 3759 3760 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3761 3762def test_rsn_eapol_m3_no_encrypt(dev, apdev): 3763 """EAPOL-Key msg 3/4 Key Data field not encrypted""" 3764 ssid = "test-rsn" 3765 passphrase = 'qwertyuiop' 3766 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3767 # Add a reserved element and KDE into EAPOL-Key msg 3/4 3768 params['eapol_m3_no_encrypt'] = '1' 3769 hapd = hostapd.add_ap(apdev[0], params) 3770 3771 dev[0].connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False) 3772 ev = dev[0].wait_event(["WPA: GTK IE in unencrypted key data"], timeout=10) 3773 if ev is None: 3774 raise Exception("Unencrypted GTK KDE not rejected") 3775 dev[0].request("DISCONNECT") 3776 dev[0].wait_disconnected() 3777 3778def test_rsn_eapol_m2_extra(dev, apdev): 3779 """Extra element and KDE in EAPOL-Key msg 2/4""" 3780 ssid = "test-rsn" 3781 passphrase = 'qwertyuiop' 3782 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3783 hapd = hostapd.add_ap(apdev[0], params) 3784 3785 # Add a reserved element and KDE into EAPOL-Key msg 2/4 3786 elems = '02051122334455' + 'dd05000facff11' 3787 if "OK" not in dev[0].request("TEST_EAPOL_M2_ELEMS " + elems): 3788 raise Exception("Failed to add test elements") 3789 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3790 hapd.wait_sta() 3791 3792def test_rsn_eapol_m4_extra(dev, apdev): 3793 """Extra element and KDE in EAPOL-Key msg 4/4""" 3794 ssid = "test-rsn" 3795 passphrase = 'qwertyuiop' 3796 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3797 hapd = hostapd.add_ap(apdev[0], params) 3798 3799 # Add a reserved element and KDE into EAPOL-Key msg 4/4 3800 elems = '02051122334455' + 'dd05000facff11' 3801 if "OK" not in dev[0].request("TEST_EAPOL_M4_ELEMS " + elems): 3802 raise Exception("Failed to add test elements") 3803 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3804 hapd.wait_sta() 3805 3806def test_rsn_eapol_m2_encrypt(dev, apdev): 3807 """Encrypted Key Data field in EAPOL-Key msg 2/4""" 3808 ssid = "test-rsn" 3809 passphrase = 'qwertyuiop' 3810 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3811 hapd = hostapd.add_ap(apdev[0], params) 3812 3813 # Add a reserved element and KDE into EAPOL-Key msg 2/4 and request the 3814 # Key Data field to be encrypted. 3815 elems = '02051122334455' + 'dd05000facff11' 3816 if "OK" not in dev[0].request("TEST_EAPOL_M2_ELEMS " + elems): 3817 raise Exception("Failed to add test elements") 3818 dev[0].set("encrypt_eapol_m2", "1") 3819 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3820 hapd.wait_sta() 3821 3822def test_rsn_eapol_m4_encrypt(dev, apdev): 3823 """Encrypted Key Data field in EAPOL-Key msg 4/4""" 3824 ssid = "test-rsn" 3825 passphrase = 'qwertyuiop' 3826 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 3827 hapd = hostapd.add_ap(apdev[0], params) 3828 3829 # Add a reserved element and KDE into EAPOL-Key msg 4/4 and request the 3830 # Key Data field to be encrypted. 3831 elems = '02051122334455' + 'dd05000facff11' 3832 if "OK" not in dev[0].request("TEST_EAPOL_M4_ELEMS " + elems): 3833 raise Exception("Failed to add test elements") 3834 dev[0].set("encrypt_eapol_m4", "1") 3835 dev[0].connect(ssid, psk=passphrase, scan_freq="2412") 3836 hapd.wait_sta() 3837