2 # Copyright (c) 2014, Qualcomm Atheros, Inc.
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
8 from Crypto.Cipher import AES
12 logger = logging.getLogger()
20 from utils import HwsimSkip, fail_test, skip_with_fips
22 from wpasupplicant import WpaSupplicant
24 def check_mib(dev, vals):
28 raise Exception("Unexpected {} = {} (expected {})".format(v[0], mib[v[0]], v[1]))
30 def test_ap_wpa2_psk(dev, apdev):
31 """WPA2-PSK AP with PSK instead of passphrase"""
32 ssid = "test-wpa2-psk"
33 passphrase = 'qwertyuiop'
34 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
35 params = hostapd.wpa2_params(ssid=ssid)
36 params['wpa_psk'] = psk
37 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
38 key_mgmt = hapd.get_config()['key_mgmt']
39 if key_mgmt.split(' ')[0] != "WPA-PSK":
40 raise Exception("Unexpected GET_CONFIG(key_mgmt): " + key_mgmt)
41 dev[0].connect(ssid, raw_psk=psk, scan_freq="2412")
42 dev[1].connect(ssid, psk=passphrase, scan_freq="2412")
44 sig = dev[0].request("SIGNAL_POLL").splitlines()
45 pkt = dev[0].request("PKTCNT_POLL").splitlines()
46 if "FREQUENCY=2412" not in sig:
47 raise Exception("Unexpected SIGNAL_POLL value: " + str(sig))
48 if "TXBAD=0" not in pkt:
49 raise Exception("Unexpected TXBAD value: " + str(pkt))
51 def test_ap_wpa2_psk_file(dev, apdev):
52 """WPA2-PSK AP with PSK from a file"""
53 ssid = "test-wpa2-psk"
54 passphrase = 'qwertyuiop'
55 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
56 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
57 params['wpa_psk_file'] = 'hostapd.wpa_psk'
58 hostapd.add_ap(apdev[0]['ifname'], params)
59 dev[1].connect(ssid, psk="very secret", scan_freq="2412", wait_connect=False)
60 dev[2].connect(ssid, raw_psk=psk, scan_freq="2412")
61 dev[2].request("REMOVE_NETWORK all")
62 dev[0].connect(ssid, psk="very secret", scan_freq="2412")
63 dev[0].request("REMOVE_NETWORK all")
64 dev[2].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412")
65 dev[0].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412")
66 ev = dev[1].wait_event(["WPA: 4-Way Handshake failed"], timeout=10)
68 raise Exception("Timed out while waiting for failure report")
69 dev[1].request("REMOVE_NETWORK all")
71 def test_ap_wpa2_psk_mem(dev, apdev):
72 """WPA2-PSK AP with passphrase only in memory"""
74 _test_ap_wpa2_psk_mem(dev, apdev)
76 dev[0].request("SCAN_INTERVAL 5")
77 dev[1].request("SCAN_INTERVAL 5")
79 def _test_ap_wpa2_psk_mem(dev, apdev):
80 ssid = "test-wpa2-psk"
81 passphrase = 'qwertyuiop'
82 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
83 params = hostapd.wpa2_params(ssid=ssid)
84 params['wpa_psk'] = psk
85 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
87 dev[0].connect(ssid, mem_only_psk="1", scan_freq="2412", wait_connect=False)
88 dev[0].request("SCAN_INTERVAL 1")
89 ev = dev[0].wait_event(["CTRL-REQ-PSK_PASSPHRASE"], timeout=10)
91 raise Exception("Request for PSK/passphrase timed out")
92 id = ev.split(':')[0].split('-')[-1]
93 dev[0].request("CTRL-RSP-PSK_PASSPHRASE-" + id + ':"' + passphrase + '"')
94 dev[0].wait_connected(timeout=10)
96 dev[1].connect(ssid, mem_only_psk="1", scan_freq="2412", wait_connect=False)
97 dev[1].request("SCAN_INTERVAL 1")
98 ev = dev[1].wait_event(["CTRL-REQ-PSK_PASSPHRASE"], timeout=10)
100 raise Exception("Request for PSK/passphrase timed out(2)")
101 id = ev.split(':')[0].split('-')[-1]
102 dev[1].request("CTRL-RSP-PSK_PASSPHRASE-" + id + ':' + psk)
103 dev[1].wait_connected(timeout=10)
105 def test_ap_wpa2_ptk_rekey(dev, apdev):
106 """WPA2-PSK AP and PTK rekey enforced by station"""
107 ssid = "test-wpa2-psk"
108 passphrase = 'qwertyuiop'
109 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
110 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
111 dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
112 ev = dev[0].wait_event(["WPA: Key negotiation completed"])
114 raise Exception("PTK rekey timed out")
115 hwsim_utils.test_connectivity(dev[0], hapd)
117 def test_ap_wpa2_ptk_rekey_ap(dev, apdev):
118 """WPA2-PSK AP and PTK rekey enforced by AP"""
119 ssid = "test-wpa2-psk"
120 passphrase = 'qwertyuiop'
121 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
122 params['wpa_ptk_rekey'] = '2'
123 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
124 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
125 ev = dev[0].wait_event(["WPA: Key negotiation completed"])
127 raise Exception("PTK rekey timed out")
128 hwsim_utils.test_connectivity(dev[0], hapd)
130 def test_ap_wpa2_sha256_ptk_rekey(dev, apdev):
131 """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by station"""
132 ssid = "test-wpa2-psk"
133 passphrase = 'qwertyuiop'
134 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
135 params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
136 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
137 dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
138 wpa_ptk_rekey="1", scan_freq="2412")
139 ev = dev[0].wait_event(["WPA: Key negotiation completed"])
141 raise Exception("PTK rekey timed out")
142 hwsim_utils.test_connectivity(dev[0], hapd)
143 check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"),
144 ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ])
146 def test_ap_wpa2_sha256_ptk_rekey_ap(dev, apdev):
147 """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by AP"""
148 ssid = "test-wpa2-psk"
149 passphrase = 'qwertyuiop'
150 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
151 params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
152 params['wpa_ptk_rekey'] = '2'
153 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
154 dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
156 ev = dev[0].wait_event(["WPA: Key negotiation completed"])
158 raise Exception("PTK rekey timed out")
159 hwsim_utils.test_connectivity(dev[0], hapd)
160 check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"),
161 ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ])
163 def test_ap_wpa_ptk_rekey(dev, apdev):
164 """WPA-PSK/TKIP AP and PTK rekey enforced by station"""
165 skip_with_fips(dev[0])
166 ssid = "test-wpa-psk"
167 passphrase = 'qwertyuiop'
168 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
169 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
170 dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
171 if "[WPA-PSK-TKIP]" not in dev[0].request("SCAN_RESULTS"):
172 raise Exception("Scan results missing WPA element info")
173 ev = dev[0].wait_event(["WPA: Key negotiation completed"])
175 raise Exception("PTK rekey timed out")
176 hwsim_utils.test_connectivity(dev[0], hapd)
178 def test_ap_wpa_ptk_rekey_ap(dev, apdev):
179 """WPA-PSK/TKIP AP and PTK rekey enforced by AP"""
180 skip_with_fips(dev[0])
181 ssid = "test-wpa-psk"
182 passphrase = 'qwertyuiop'
183 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
184 params['wpa_ptk_rekey'] = '2'
185 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
186 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
187 ev = dev[0].wait_event(["WPA: Key negotiation completed"], timeout=10)
189 raise Exception("PTK rekey timed out")
190 hwsim_utils.test_connectivity(dev[0], hapd)
192 def test_ap_wpa_ccmp(dev, apdev):
194 ssid = "test-wpa-psk"
195 passphrase = 'qwertyuiop'
196 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
197 params['wpa_pairwise'] = "CCMP"
198 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
199 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
200 hwsim_utils.test_connectivity(dev[0], hapd)
201 check_mib(dev[0], [ ("dot11RSNAConfigGroupCipherSize", "128"),
202 ("dot11RSNAGroupCipherRequested", "00-50-f2-4"),
203 ("dot11RSNAPairwiseCipherRequested", "00-50-f2-4"),
204 ("dot11RSNAAuthenticationSuiteRequested", "00-50-f2-2"),
205 ("dot11RSNAGroupCipherSelected", "00-50-f2-4"),
206 ("dot11RSNAPairwiseCipherSelected", "00-50-f2-4"),
207 ("dot11RSNAAuthenticationSuiteSelected", "00-50-f2-2"),
208 ("dot1xSuppSuppControlledPortStatus", "Authorized") ])
210 def test_ap_wpa2_psk_file(dev, apdev):
211 """WPA2-PSK AP with various PSK file error and success cases"""
212 addr0 = dev[0].own_addr()
213 addr1 = dev[1].own_addr()
214 addr2 = dev[2].own_addr()
216 pskfile = "/tmp/ap_wpa2_psk_file_errors.psk_file"
222 params = { "ssid": ssid, "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
223 "rsn_pairwise": "CCMP", "wpa_psk_file": pskfile }
227 hapd = hostapd.add_ap(apdev[0]['ifname'], params, no_enable=True)
228 if "FAIL" not in hapd.request("ENABLE"):
229 raise Exception("Unexpected ENABLE success")
230 hapd.request("DISABLE")
232 # invalid MAC address
233 with open(pskfile, "w") as f:
236 if "FAIL" not in hapd.request("ENABLE"):
237 raise Exception("Unexpected ENABLE success")
238 hapd.request("DISABLE")
241 with open(pskfile, "w") as f:
242 f.write("00:11:22:33:44:55\n")
243 if "FAIL" not in hapd.request("ENABLE"):
244 raise Exception("Unexpected ENABLE success")
245 hapd.request("DISABLE")
248 with open(pskfile, "w") as f:
249 f.write("00:11:22:33:44:55 1234567\n")
250 if "FAIL" not in hapd.request("ENABLE"):
251 raise Exception("Unexpected ENABLE success")
252 hapd.request("DISABLE")
255 with open(pskfile, "w") as f:
256 f.write("00:11:22:33:44:55 12345678\n")
257 f.write(addr0 + " 123456789\n")
258 f.write(addr1 + " 123456789a\n")
259 f.write(addr2 + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\n")
260 if "FAIL" in hapd.request("ENABLE"):
261 raise Exception("Unexpected ENABLE failure")
263 dev[0].connect(ssid, psk="123456789", scan_freq="2412")
264 dev[1].connect(ssid, psk="123456789a", scan_freq="2412")
265 dev[2].connect(ssid, raw_psk="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", scan_freq="2412")
273 def test_ap_wpa2_psk_wildcard_ssid(dev, apdev):
274 """WPA2-PSK AP and wildcard SSID configuration"""
275 ssid = "test-wpa2-psk"
276 passphrase = 'qwertyuiop'
277 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
278 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
279 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
280 dev[0].connect("", bssid=apdev[0]['bssid'], psk=passphrase,
282 dev[1].connect("", bssid=apdev[0]['bssid'], raw_psk=psk, scan_freq="2412")
284 def test_ap_wpa2_gtk_rekey(dev, apdev):
285 """WPA2-PSK AP and GTK rekey enforced by AP"""
286 ssid = "test-wpa2-psk"
287 passphrase = 'qwertyuiop'
288 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
289 params['wpa_group_rekey'] = '1'
290 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
291 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
292 ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
294 raise Exception("GTK rekey timed out")
295 hwsim_utils.test_connectivity(dev[0], hapd)
297 def test_ap_wpa_gtk_rekey(dev, apdev):
298 """WPA-PSK/TKIP AP and GTK rekey enforced by AP"""
299 skip_with_fips(dev[0])
300 ssid = "test-wpa-psk"
301 passphrase = 'qwertyuiop'
302 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
303 params['wpa_group_rekey'] = '1'
304 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
305 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
306 ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
308 raise Exception("GTK rekey timed out")
309 hwsim_utils.test_connectivity(dev[0], hapd)
311 def test_ap_wpa2_gmk_rekey(dev, apdev):
312 """WPA2-PSK AP and GMK and GTK rekey enforced by AP"""
313 ssid = "test-wpa2-psk"
314 passphrase = 'qwertyuiop'
315 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
316 params['wpa_group_rekey'] = '1'
317 params['wpa_gmk_rekey'] = '2'
318 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
319 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
320 for i in range(0, 3):
321 ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
323 raise Exception("GTK rekey timed out")
324 hwsim_utils.test_connectivity(dev[0], hapd)
326 def test_ap_wpa2_strict_rekey(dev, apdev):
327 """WPA2-PSK AP and strict GTK rekey enforced by AP"""
328 ssid = "test-wpa2-psk"
329 passphrase = 'qwertyuiop'
330 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
331 params['wpa_strict_rekey'] = '1'
332 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
333 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
334 dev[1].connect(ssid, psk=passphrase, scan_freq="2412")
335 dev[1].request("DISCONNECT")
336 ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
338 raise Exception("GTK rekey timed out")
339 hwsim_utils.test_connectivity(dev[0], hapd)
341 def test_ap_wpa2_bridge_fdb(dev, apdev):
342 """Bridge FDB entry removal"""
344 ssid = "test-wpa2-psk"
345 passphrase = "12345678"
346 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
347 params['bridge'] = 'ap-br0'
348 hostapd.add_ap(apdev[0]['ifname'], params)
349 subprocess.call(['brctl', 'setfd', 'ap-br0', '0'])
350 subprocess.call(['ip', 'link', 'set', 'dev', 'ap-br0', 'up'])
351 dev[0].connect(ssid, psk=passphrase, scan_freq="2412",
352 bssid=apdev[0]['bssid'])
353 dev[1].connect(ssid, psk=passphrase, scan_freq="2412",
354 bssid=apdev[0]['bssid'])
355 addr0 = dev[0].p2p_interface_addr()
356 hwsim_utils.test_connectivity_sta(dev[0], dev[1])
357 cmd = subprocess.Popen(['brctl', 'showmacs', 'ap-br0'],
358 stdout=subprocess.PIPE)
359 macs1 = cmd.stdout.read()
360 cmd = subprocess.call(['brctl', 'setageing', 'ap-br0', '1'])
361 dev[0].request("DISCONNECT")
362 dev[1].request("DISCONNECT")
364 cmd = subprocess.Popen(['brctl', 'showmacs', 'ap-br0'],
365 stdout=subprocess.PIPE)
366 macs2 = cmd.stdout.read()
368 addr1 = dev[1].p2p_interface_addr()
369 if addr0 not in macs1 or addr1 not in macs1:
370 raise Exception("Bridge FDB entry missing")
371 if addr0 in macs2 or addr1 in macs2:
372 raise Exception("Bridge FDB entry was not removed")
374 subprocess.call(['ip', 'link', 'set', 'dev', 'ap-br0', 'down'])
375 subprocess.call(['brctl', 'delbr', 'ap-br0'])
377 def test_ap_wpa2_already_in_bridge(dev, apdev):
378 """hostapd behavior with interface already in bridge"""
379 ifname = apdev[0]['ifname']
380 br_ifname = 'ext-ap-br0'
382 ssid = "test-wpa2-psk"
383 passphrase = "12345678"
384 subprocess.call(['brctl', 'addbr', br_ifname])
385 subprocess.call(['brctl', 'setfd', br_ifname, '0'])
386 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
387 subprocess.call(['iw', ifname, 'set', 'type', '__ap'])
388 subprocess.call(['brctl', 'addif', br_ifname, ifname])
389 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
390 hapd = hostapd.add_ap(ifname, params)
391 if hapd.get_driver_status_field('brname') != br_ifname:
392 raise Exception("Bridge name not identified correctly")
393 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
395 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
396 subprocess.call(['brctl', 'delif', br_ifname, ifname])
397 subprocess.call(['iw', ifname, 'set', 'type', 'station'])
398 subprocess.call(['brctl', 'delbr', br_ifname])
400 def test_ap_wpa2_in_different_bridge(dev, apdev):
401 """hostapd behavior with interface in different bridge"""
402 ifname = apdev[0]['ifname']
403 br_ifname = 'ext-ap-br0'
405 ssid = "test-wpa2-psk"
406 passphrase = "12345678"
407 subprocess.call(['brctl', 'addbr', br_ifname])
408 subprocess.call(['brctl', 'setfd', br_ifname, '0'])
409 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
410 subprocess.call(['iw', ifname, 'set', 'type', '__ap'])
411 subprocess.call(['brctl', 'addif', br_ifname, ifname])
413 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
414 params['bridge'] = 'ap-br0'
415 hapd = hostapd.add_ap(ifname, params)
416 subprocess.call(['brctl', 'setfd', 'ap-br0', '0'])
417 subprocess.call(['ip', 'link', 'set', 'dev', 'ap-br0', 'up'])
418 brname = hapd.get_driver_status_field('brname')
419 if brname != 'ap-br0':
420 raise Exception("Incorrect bridge: " + brname)
421 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
422 hwsim_utils.test_connectivity_iface(dev[0], hapd, "ap-br0")
423 if hapd.get_driver_status_field("added_bridge") != "1":
424 raise Exception("Unexpected added_bridge value")
425 if hapd.get_driver_status_field("added_if_into_bridge") != "1":
426 raise Exception("Unexpected added_if_into_bridge value")
427 dev[0].request("DISCONNECT")
430 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
431 subprocess.call(['brctl', 'delif', br_ifname, ifname],
432 stderr=open('/dev/null', 'w'))
433 subprocess.call(['brctl', 'delbr', br_ifname])
435 def test_ap_wpa2_ext_add_to_bridge(dev, apdev):
436 """hostapd behavior with interface added to bridge externally"""
437 ifname = apdev[0]['ifname']
438 br_ifname = 'ext-ap-br0'
440 ssid = "test-wpa2-psk"
441 passphrase = "12345678"
442 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
443 hapd = hostapd.add_ap(ifname, params)
445 subprocess.call(['brctl', 'addbr', br_ifname])
446 subprocess.call(['brctl', 'setfd', br_ifname, '0'])
447 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
448 subprocess.call(['brctl', 'addif', br_ifname, ifname])
449 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
450 if hapd.get_driver_status_field('brname') != br_ifname:
451 raise Exception("Bridge name not identified correctly")
453 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
454 subprocess.call(['brctl', 'delif', br_ifname, ifname])
455 subprocess.call(['brctl', 'delbr', br_ifname])
457 def test_ap_wpa2_psk_ext(dev, apdev):
458 """WPA2-PSK AP using external EAPOL I/O"""
459 bssid = apdev[0]['bssid']
460 ssid = "test-wpa2-psk"
461 passphrase = 'qwertyuiop'
462 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
463 params = hostapd.wpa2_params(ssid=ssid)
464 params['wpa_psk'] = psk
465 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
466 hapd.request("SET ext_eapol_frame_io 1")
467 dev[0].request("SET ext_eapol_frame_io 1")
468 dev[0].connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False)
469 addr = dev[0].p2p_interface_addr()
471 ev = hapd.wait_event(["EAPOL-TX", "AP-STA-CONNECTED"], timeout=15)
473 raise Exception("Timeout on EAPOL-TX from hostapd")
474 if "AP-STA-CONNECTED" in ev:
475 dev[0].wait_connected(timeout=15)
477 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
479 raise Exception("EAPOL_RX to wpa_supplicant failed")
480 ev = dev[0].wait_event(["EAPOL-TX", "CTRL-EVENT-CONNECTED"], timeout=15)
482 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
483 if "CTRL-EVENT-CONNECTED" in ev:
485 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
487 raise Exception("EAPOL_RX to hostapd failed")
489 def test_ap_wpa2_psk_ext_retry_msg_3(dev, apdev):
490 """WPA2-PSK AP using external EAPOL I/O and retry for EAPOL-Key msg 3/4"""
491 bssid = apdev[0]['bssid']
492 ssid = "test-wpa2-psk"
493 passphrase = 'qwertyuiop'
494 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
495 params = hostapd.wpa2_params(ssid=ssid)
496 params['wpa_psk'] = psk
497 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
498 hapd.request("SET ext_eapol_frame_io 1")
499 dev[0].request("SET ext_eapol_frame_io 1")
500 dev[0].connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False)
501 addr = dev[0].p2p_interface_addr()
504 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
506 raise Exception("Timeout on EAPOL-TX from hostapd")
507 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
509 raise Exception("EAPOL_RX to wpa_supplicant failed")
512 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
514 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
515 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
517 raise Exception("EAPOL_RX to hostapd failed")
520 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
522 raise Exception("Timeout on EAPOL-TX from hostapd")
523 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
525 raise Exception("EAPOL_RX to wpa_supplicant failed")
528 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
530 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
531 # Do not send to the AP
532 dev[0].wait_connected(timeout=15)
534 # EAPOL-Key msg 3/4 (retry)
535 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
537 raise Exception("Timeout on EAPOL-TX from hostapd")
538 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
540 raise Exception("EAPOL_RX to wpa_supplicant failed")
543 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
545 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
546 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
548 raise Exception("EAPOL_RX to hostapd failed")
550 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15)
552 raise Exception("Timeout on AP-STA-CONNECTED from hostapd")
554 hwsim_utils.test_connectivity(dev[0], hapd)
556 def parse_eapol(data):
557 (version, type, length) = struct.unpack('>BBH', data[0:4])
559 if length > len(payload):
560 raise Exception("Invalid EAPOL length")
561 if length < len(payload):
562 payload = payload[0:length]
564 eapol['version'] = version
566 eapol['length'] = length
567 eapol['payload'] = payload
570 (eapol['descr_type'],) = struct.unpack('B', payload[0:1])
571 payload = payload[1:]
572 if eapol['descr_type'] == 2 or eapol['descr_type'] == 254:
574 (key_info, key_len) = struct.unpack('>HH', payload[0:4])
575 eapol['rsn_key_info'] = key_info
576 eapol['rsn_key_len'] = key_len
577 eapol['rsn_replay_counter'] = payload[4:12]
578 eapol['rsn_key_nonce'] = payload[12:44]
579 eapol['rsn_key_iv'] = payload[44:60]
580 eapol['rsn_key_rsc'] = payload[60:68]
581 eapol['rsn_key_id'] = payload[68:76]
582 eapol['rsn_key_mic'] = payload[76:92]
583 payload = payload[92:]
584 (eapol['rsn_key_data_len'],) = struct.unpack('>H', payload[0:2])
585 payload = payload[2:]
586 eapol['rsn_key_data'] = payload
589 def build_eapol(msg):
590 data = struct.pack(">BBH", msg['version'], msg['type'], msg['length'])
592 data += struct.pack('>BHH', msg['descr_type'], msg['rsn_key_info'],
594 data += msg['rsn_replay_counter']
595 data += msg['rsn_key_nonce']
596 data += msg['rsn_key_iv']
597 data += msg['rsn_key_rsc']
598 data += msg['rsn_key_id']
599 data += msg['rsn_key_mic']
600 data += struct.pack('>H', msg['rsn_key_data_len'])
601 data += msg['rsn_key_data']
603 data += msg['payload']
606 def sha1_prf(key, label, data, outlen):
610 m = hmac.new(key, label, hashlib.sha1)
611 m.update(struct.pack('B', 0))
613 m.update(struct.pack('B', counter))
616 if outlen > len(hash):
620 res += hash[0:outlen]
624 def pmk_to_ptk(pmk, addr1, addr2, nonce1, nonce2):
626 data = binascii.unhexlify(addr1.replace(':','')) + binascii.unhexlify(addr2.replace(':',''))
628 data = binascii.unhexlify(addr2.replace(':','')) + binascii.unhexlify(addr1.replace(':',''))
630 data += nonce1 + nonce2
632 data += nonce2 + nonce1
633 label = "Pairwise key expansion"
634 ptk = sha1_prf(pmk, label, data, 48)
637 return (ptk, kck, kek)
639 def eapol_key_mic(kck, msg):
640 msg['rsn_key_mic'] = binascii.unhexlify('00000000000000000000000000000000')
641 data = build_eapol(msg)
642 m = hmac.new(kck, data, hashlib.sha1)
643 msg['rsn_key_mic'] = m.digest()[0:16]
645 def rsn_eapol_key_set(msg, key_info, key_len, nonce, data):
646 msg['rsn_key_info'] = key_info
647 msg['rsn_key_len'] = key_len
649 msg['rsn_key_nonce'] = nonce
651 msg['rsn_key_nonce'] = binascii.unhexlify('0000000000000000000000000000000000000000000000000000000000000000')
653 msg['rsn_key_data_len'] = len(data)
654 msg['rsn_key_data'] = data
655 msg['length'] = 95 + len(data)
657 msg['rsn_key_data_len'] = 0
658 msg['rsn_key_data'] = ''
661 def recv_eapol(hapd):
662 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
664 raise Exception("Timeout on EAPOL-TX from hostapd")
665 eapol = binascii.unhexlify(ev.split(' ')[2])
666 return parse_eapol(eapol)
668 def send_eapol(hapd, addr, data):
669 res = hapd.request("EAPOL_RX " + addr + " " + binascii.hexlify(data))
671 raise Exception("EAPOL_RX to hostapd failed")
673 def reply_eapol(info, hapd, addr, msg, key_info, nonce, data, kck):
674 logger.info("Send EAPOL-Key msg " + info)
675 rsn_eapol_key_set(msg, key_info, 0, nonce, data)
676 eapol_key_mic(kck, msg)
677 send_eapol(hapd, addr, build_eapol(msg))
679 def hapd_connected(hapd):
680 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15)
682 raise Exception("Timeout on AP-STA-CONNECTED from hostapd")
684 def eapol_test(apdev, dev, wpa2=True):
685 bssid = apdev['bssid']
687 ssid = "test-wpa2-psk"
689 ssid = "test-wpa-psk"
690 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
691 pmk = binascii.unhexlify(psk)
693 params = hostapd.wpa2_params(ssid=ssid)
695 params = hostapd.wpa_params(ssid=ssid)
696 params['wpa_psk'] = psk
697 hapd = hostapd.add_ap(apdev['ifname'], params)
698 hapd.request("SET ext_eapol_frame_io 1")
699 dev.request("SET ext_eapol_frame_io 1")
700 dev.connect(ssid, raw_psk=psk, scan_freq="2412", wait_connect=False)
701 addr = dev.p2p_interface_addr()
703 rsne = binascii.unhexlify('30140100000fac040100000fac040100000fac020000')
705 rsne = binascii.unhexlify('dd160050f20101000050f20201000050f20201000050f202')
706 snonce = binascii.unhexlify('1111111111111111111111111111111111111111111111111111111111111111')
707 return (bssid,ssid,hapd,snonce,pmk,addr,rsne)
709 def test_ap_wpa2_psk_ext_eapol(dev, apdev):
710 """WPA2-PSK AP using external EAPOL supplicant"""
711 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
713 msg = recv_eapol(hapd)
714 anonce = msg['rsn_key_nonce']
715 logger.info("Replay same data back")
716 send_eapol(hapd, addr, build_eapol(msg))
718 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
720 logger.info("Truncated Key Data in EAPOL-Key msg 2/4")
721 rsn_eapol_key_set(msg, 0x0101, 0, snonce, rsne)
722 msg['length'] = 95 + 22 - 1
723 send_eapol(hapd, addr, build_eapol(msg))
725 reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, rsne, kck)
727 msg = recv_eapol(hapd)
728 if anonce != msg['rsn_key_nonce']:
729 raise Exception("ANonce changed")
730 logger.info("Replay same data back")
731 send_eapol(hapd, addr, build_eapol(msg))
733 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
736 def test_ap_wpa2_psk_ext_eapol_retry1(dev, apdev):
737 """WPA2 4-way handshake with EAPOL-Key 1/4 retransmitted"""
738 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
740 msg1 = recv_eapol(hapd)
741 anonce = msg1['rsn_key_nonce']
743 msg2 = recv_eapol(hapd)
744 if anonce != msg2['rsn_key_nonce']:
745 raise Exception("ANonce changed")
747 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
749 logger.info("Send EAPOL-Key msg 2/4")
751 rsn_eapol_key_set(msg, 0x010a, 0, snonce, rsne)
752 eapol_key_mic(kck, msg)
753 send_eapol(hapd, addr, build_eapol(msg))
755 msg = recv_eapol(hapd)
756 if anonce != msg['rsn_key_nonce']:
757 raise Exception("ANonce changed")
759 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
762 def test_ap_wpa2_psk_ext_eapol_retry1b(dev, apdev):
763 """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted"""
764 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
766 msg1 = recv_eapol(hapd)
767 anonce = msg1['rsn_key_nonce']
768 msg2 = recv_eapol(hapd)
769 if anonce != msg2['rsn_key_nonce']:
770 raise Exception("ANonce changed")
772 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
773 reply_eapol("2/4 (a)", hapd, addr, msg1, 0x010a, snonce, rsne, kck)
774 reply_eapol("2/4 (b)", hapd, addr, msg2, 0x010a, snonce, rsne, kck)
776 msg = recv_eapol(hapd)
777 if anonce != msg['rsn_key_nonce']:
778 raise Exception("ANonce changed")
780 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
783 def test_ap_wpa2_psk_ext_eapol_retry1c(dev, apdev):
784 """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted and SNonce changing"""
785 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
787 msg1 = recv_eapol(hapd)
788 anonce = msg1['rsn_key_nonce']
790 msg2 = recv_eapol(hapd)
791 if anonce != msg2['rsn_key_nonce']:
792 raise Exception("ANonce changed")
793 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
794 reply_eapol("2/4 (a)", hapd, addr, msg1, 0x010a, snonce, rsne, kck)
796 snonce2 = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
797 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce2, anonce)
798 reply_eapol("2/4 (b)", hapd, addr, msg2, 0x010a, snonce2, rsne, kck)
800 msg = recv_eapol(hapd)
801 if anonce != msg['rsn_key_nonce']:
802 raise Exception("ANonce changed")
803 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
806 def test_ap_wpa2_psk_ext_eapol_retry1d(dev, apdev):
807 """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted and SNonce changing and older used"""
808 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
810 msg1 = recv_eapol(hapd)
811 anonce = msg1['rsn_key_nonce']
812 msg2 = recv_eapol(hapd)
813 if anonce != msg2['rsn_key_nonce']:
814 raise Exception("ANonce changed")
816 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
817 reply_eapol("2/4 (a)", hapd, addr, msg1, 0x010a, snonce, rsne, kck)
819 snonce2 = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
820 (ptk2, kck2, kek2) = pmk_to_ptk(pmk, addr, bssid, snonce2, anonce)
822 reply_eapol("2/4 (b)", hapd, addr, msg2, 0x010a, snonce2, rsne, kck2)
823 msg = recv_eapol(hapd)
824 if anonce != msg['rsn_key_nonce']:
825 raise Exception("ANonce changed")
826 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
829 def test_ap_wpa2_psk_ext_eapol_type_diff(dev, apdev):
830 """WPA2 4-way handshake using external EAPOL supplicant"""
831 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
833 msg = recv_eapol(hapd)
834 anonce = msg['rsn_key_nonce']
836 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
838 # Incorrect descriptor type (frame dropped)
839 msg['descr_type'] = 253
840 rsn_eapol_key_set(msg, 0x010a, 0, snonce, rsne)
841 eapol_key_mic(kck, msg)
842 send_eapol(hapd, addr, build_eapol(msg))
844 # Incorrect descriptor type, but with a workaround (frame processed)
845 msg['descr_type'] = 254
846 rsn_eapol_key_set(msg, 0x010a, 0, snonce, rsne)
847 eapol_key_mic(kck, msg)
848 send_eapol(hapd, addr, build_eapol(msg))
850 msg = recv_eapol(hapd)
851 if anonce != msg['rsn_key_nonce']:
852 raise Exception("ANonce changed")
853 logger.info("Replay same data back")
854 send_eapol(hapd, addr, build_eapol(msg))
856 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
859 def test_ap_wpa_psk_ext_eapol(dev, apdev):
860 """WPA2-PSK AP using external EAPOL supplicant"""
861 (bssid,ssid,hapd,snonce,pmk,addr,wpae) = eapol_test(apdev[0], dev[0],
864 msg = recv_eapol(hapd)
865 anonce = msg['rsn_key_nonce']
866 logger.info("Replay same data back")
867 send_eapol(hapd, addr, build_eapol(msg))
868 logger.info("Too short data")
869 send_eapol(hapd, addr, build_eapol(msg)[0:98])
871 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
872 msg['descr_type'] = 2
873 reply_eapol("2/4(invalid type)", hapd, addr, msg, 0x010a, snonce, wpae, kck)
874 msg['descr_type'] = 254
875 reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, wpae, kck)
877 msg = recv_eapol(hapd)
878 if anonce != msg['rsn_key_nonce']:
879 raise Exception("ANonce changed")
880 logger.info("Replay same data back")
881 send_eapol(hapd, addr, build_eapol(msg))
883 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
886 def test_ap_wpa2_psk_ext_eapol_key_info(dev, apdev):
887 """WPA2-PSK 4-way handshake with strange key info values"""
888 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
890 msg = recv_eapol(hapd)
891 anonce = msg['rsn_key_nonce']
893 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
894 rsn_eapol_key_set(msg, 0x0000, 0, snonce, rsne)
895 send_eapol(hapd, addr, build_eapol(msg))
896 rsn_eapol_key_set(msg, 0xffff, 0, snonce, rsne)
897 send_eapol(hapd, addr, build_eapol(msg))
899 rsn_eapol_key_set(msg, 0x2802, 0, snonce, rsne)
900 send_eapol(hapd, addr, build_eapol(msg))
902 rsn_eapol_key_set(msg, 0x2002, 0, snonce, rsne)
903 send_eapol(hapd, addr, build_eapol(msg))
905 rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne)
906 send_eapol(hapd, addr, build_eapol(msg))
908 rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne)
909 tmp_kck = binascii.unhexlify('00000000000000000000000000000000')
910 eapol_key_mic(tmp_kck, msg)
911 send_eapol(hapd, addr, build_eapol(msg))
913 reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, rsne, kck)
915 msg = recv_eapol(hapd)
916 if anonce != msg['rsn_key_nonce']:
917 raise Exception("ANonce changed")
919 # Request (valic MIC)
920 rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne)
921 eapol_key_mic(kck, msg)
922 send_eapol(hapd, addr, build_eapol(msg))
923 # Request (valid MIC, replayed counter)
924 rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne)
925 eapol_key_mic(kck, msg)
926 send_eapol(hapd, addr, build_eapol(msg))
928 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
931 def build_eapol_key_1_4(anonce, replay_counter=1, key_data='', key_len=16):
935 msg['length'] = 95 + len(key_data)
937 msg['descr_type'] = 2
938 msg['rsn_key_info'] = 0x8a
939 msg['rsn_key_len'] = key_len
940 msg['rsn_replay_counter'] = struct.pack('>Q', replay_counter)
941 msg['rsn_key_nonce'] = anonce
942 msg['rsn_key_iv'] = binascii.unhexlify('00000000000000000000000000000000')
943 msg['rsn_key_rsc'] = binascii.unhexlify('0000000000000000')
944 msg['rsn_key_id'] = binascii.unhexlify('0000000000000000')
945 msg['rsn_key_mic'] = binascii.unhexlify('00000000000000000000000000000000')
946 msg['rsn_key_data_len'] = len(key_data)
947 msg['rsn_key_data'] = key_data
950 def build_eapol_key_3_4(anonce, kck, key_data, replay_counter=2,
951 key_info=0x13ca, extra_len=0, descr_type=2, key_len=16):
955 msg['length'] = 95 + len(key_data) + extra_len
957 msg['descr_type'] = descr_type
958 msg['rsn_key_info'] = key_info
959 msg['rsn_key_len'] = key_len
960 msg['rsn_replay_counter'] = struct.pack('>Q', replay_counter)
961 msg['rsn_key_nonce'] = anonce
962 msg['rsn_key_iv'] = binascii.unhexlify('00000000000000000000000000000000')
963 msg['rsn_key_rsc'] = binascii.unhexlify('0000000000000000')
964 msg['rsn_key_id'] = binascii.unhexlify('0000000000000000')
965 msg['rsn_key_data_len'] = len(key_data)
966 msg['rsn_key_data'] = key_data
967 eapol_key_mic(kck, msg)
970 def aes_wrap(kek, plain):
972 a = 0xa6a6a6a6a6a6a6a6
973 enc = AES.new(kek).encrypt
974 r = [plain[i * 8:(i + 1) * 8] for i in range(0, n)]
976 for i in range(1, n + 1):
977 b = enc(struct.pack('>Q', a) + r[i - 1])
978 a = struct.unpack('>Q', b[:8])[0] ^ (n * j + i)
980 return struct.pack('>Q', a) + ''.join(r)
982 def pad_key_data(plain):
983 pad_len = len(plain) % 8
985 pad_len = 8 - pad_len
988 plain += pad_len * '\0'
991 def test_ap_wpa2_psk_supp_proto(dev, apdev):
992 """WPA2-PSK 4-way handshake protocol testing for supplicant"""
993 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
995 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
996 msg = recv_eapol(hapd)
997 dev[0].dump_monitor()
999 # Build own EAPOL-Key msg 1/4
1000 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1002 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1004 send_eapol(dev[0], addr, build_eapol(msg))
1005 msg = recv_eapol(dev[0])
1006 snonce = msg['rsn_key_nonce']
1008 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1010 logger.debug("Invalid AES wrap data length 0")
1011 dev[0].dump_monitor()
1012 msg = build_eapol_key_3_4(anonce, kck, '', replay_counter=counter)
1014 send_eapol(dev[0], addr, build_eapol(msg))
1015 ev = dev[0].wait_event(["WPA: Unsupported AES-WRAP len 0"])
1017 raise Exception("Unsupported AES-WRAP len 0 not reported")
1019 logger.debug("Invalid AES wrap data length 1")
1020 dev[0].dump_monitor()
1021 msg = build_eapol_key_3_4(anonce, kck, '1', replay_counter=counter)
1023 send_eapol(dev[0], addr, build_eapol(msg))
1024 ev = dev[0].wait_event(["WPA: Unsupported AES-WRAP len 1"])
1026 raise Exception("Unsupported AES-WRAP len 1 not reported")
1028 logger.debug("Invalid AES wrap data length 9")
1029 dev[0].dump_monitor()
1030 msg = build_eapol_key_3_4(anonce, kck, '123456789', replay_counter=counter)
1032 send_eapol(dev[0], addr, build_eapol(msg))
1033 ev = dev[0].wait_event(["WPA: Unsupported AES-WRAP len 9"])
1035 raise Exception("Unsupported AES-WRAP len 9 not reported")
1037 logger.debug("Invalid AES wrap data payload")
1038 dev[0].dump_monitor()
1039 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter)
1040 # do not increment counter to test replay protection
1041 send_eapol(dev[0], addr, build_eapol(msg))
1042 ev = dev[0].wait_event(["WPA: AES unwrap failed"])
1044 raise Exception("AES unwrap failure not reported")
1046 logger.debug("Replay Count not increasing")
1047 dev[0].dump_monitor()
1048 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter)
1050 send_eapol(dev[0], addr, build_eapol(msg))
1051 ev = dev[0].wait_event(["WPA: EAPOL-Key Replay Counter did not increase"])
1053 raise Exception("Replay Counter replay not reported")
1055 logger.debug("Missing Ack bit in key info")
1056 dev[0].dump_monitor()
1057 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter,
1060 send_eapol(dev[0], addr, build_eapol(msg))
1061 ev = dev[0].wait_event(["WPA: No Ack bit in key_info"])
1063 raise Exception("Missing Ack bit not reported")
1065 logger.debug("Unexpected Request bit in key info")
1066 dev[0].dump_monitor()
1067 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter,
1070 send_eapol(dev[0], addr, build_eapol(msg))
1071 ev = dev[0].wait_event(["WPA: EAPOL-Key with Request bit"])
1073 raise Exception("Request bit not reported")
1075 logger.debug("Unsupported key descriptor version 0")
1076 dev[0].dump_monitor()
1077 msg = build_eapol_key_3_4(anonce, kck, '0123456789abcdef',
1078 replay_counter=counter, key_info=0x13c8)
1080 send_eapol(dev[0], addr, build_eapol(msg))
1081 ev = dev[0].wait_event(["WPA: Unsupported EAPOL-Key descriptor version 0"])
1083 raise Exception("Unsupported EAPOL-Key descriptor version 0 not reported")
1085 logger.debug("Key descriptor version 1 not allowed with CCMP")
1086 dev[0].dump_monitor()
1087 msg = build_eapol_key_3_4(anonce, kck, '0123456789abcdef',
1088 replay_counter=counter, key_info=0x13c9)
1090 send_eapol(dev[0], addr, build_eapol(msg))
1091 ev = dev[0].wait_event(["WPA: CCMP is used, but EAPOL-Key descriptor version (1) is not 2"])
1093 raise Exception("Not allowed EAPOL-Key descriptor version not reported")
1095 logger.debug("Invalid AES wrap payload with key descriptor version 2")
1096 dev[0].dump_monitor()
1097 msg = build_eapol_key_3_4(anonce, kck, '0123456789abcdef',
1098 replay_counter=counter, key_info=0x13ca)
1100 send_eapol(dev[0], addr, build_eapol(msg))
1101 ev = dev[0].wait_event(["WPA: AES unwrap failed"])
1103 raise Exception("AES unwrap failure not reported")
1105 logger.debug("Key descriptor version 3 workaround")
1106 dev[0].dump_monitor()
1107 msg = build_eapol_key_3_4(anonce, kck, '0123456789abcdef',
1108 replay_counter=counter, key_info=0x13cb)
1110 send_eapol(dev[0], addr, build_eapol(msg))
1111 ev = dev[0].wait_event(["WPA: CCMP is used, but EAPOL-Key descriptor version (3) is not 2"])
1113 raise Exception("CCMP key descriptor mismatch not reported")
1114 ev = dev[0].wait_event(["WPA: Interoperability workaround"])
1116 raise Exception("AES-128-CMAC workaround not reported")
1117 ev = dev[0].wait_event(["WPA: Invalid EAPOL-Key MIC - dropping packet"])
1119 raise Exception("MIC failure with AES-128-CMAC workaround not reported")
1121 logger.debug("Unsupported key descriptor version 4")
1122 dev[0].dump_monitor()
1123 msg = build_eapol_key_3_4(anonce, kck, '0123456789abcdef',
1124 replay_counter=counter, key_info=0x13cc)
1126 send_eapol(dev[0], addr, build_eapol(msg))
1127 ev = dev[0].wait_event(["WPA: Unsupported EAPOL-Key descriptor version 4"])
1129 raise Exception("Unsupported EAPOL-Key descriptor version 4 not reported")
1131 logger.debug("Unsupported key descriptor version 7")
1132 dev[0].dump_monitor()
1133 msg = build_eapol_key_3_4(anonce, kck, '0123456789abcdef',
1134 replay_counter=counter, key_info=0x13cf)
1136 send_eapol(dev[0], addr, build_eapol(msg))
1137 ev = dev[0].wait_event(["WPA: Unsupported EAPOL-Key descriptor version 7"])
1139 raise Exception("Unsupported EAPOL-Key descriptor version 7 not reported")
1141 logger.debug("Too short EAPOL header length")
1142 dev[0].dump_monitor()
1143 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter,
1146 send_eapol(dev[0], addr, build_eapol(msg))
1147 ev = dev[0].wait_event(["WPA: Invalid EAPOL-Key frame - key_data overflow (8 > 7)"])
1149 raise Exception("Key data overflow not reported")
1151 logger.debug("Too long EAPOL header length")
1152 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter,
1155 send_eapol(dev[0], addr, build_eapol(msg))
1157 logger.debug("Unsupported descriptor type 0")
1158 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter,
1161 send_eapol(dev[0], addr, build_eapol(msg))
1163 logger.debug("WPA descriptor type 0")
1164 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter,
1167 send_eapol(dev[0], addr, build_eapol(msg))
1169 logger.debug("Non-zero key index for pairwise key")
1170 dev[0].dump_monitor()
1171 wrapped = aes_wrap(kek, 16*'z')
1172 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter,
1175 send_eapol(dev[0], addr, build_eapol(msg))
1176 ev = dev[0].wait_event(["WPA: Ignored EAPOL-Key (Pairwise) with non-zero key index"])
1178 raise Exception("Non-zero key index not reported")
1180 logger.debug("Invalid Key Data plaintext payload --> disconnect")
1181 dev[0].dump_monitor()
1182 wrapped = aes_wrap(kek, 16*'z')
1183 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1185 send_eapol(dev[0], addr, build_eapol(msg))
1186 dev[0].wait_disconnected(timeout=1)
1188 def test_ap_wpa2_psk_supp_proto_no_ie(dev, apdev):
1189 """WPA2-PSK supplicant protocol testing: IE not included"""
1190 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1192 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1193 msg = recv_eapol(hapd)
1194 dev[0].dump_monitor()
1196 # Build own EAPOL-Key msg 1/4
1197 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1199 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1201 send_eapol(dev[0], addr, build_eapol(msg))
1202 msg = recv_eapol(dev[0])
1203 snonce = msg['rsn_key_nonce']
1205 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1207 logger.debug("No IEs in msg 3/4 --> disconnect")
1208 dev[0].dump_monitor()
1209 wrapped = aes_wrap(kek, 16*'\0')
1210 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1212 send_eapol(dev[0], addr, build_eapol(msg))
1213 dev[0].wait_disconnected(timeout=1)
1215 def test_ap_wpa2_psk_supp_proto_ie_mismatch(dev, apdev):
1216 """WPA2-PSK supplicant protocol testing: IE mismatch"""
1217 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1219 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1220 msg = recv_eapol(hapd)
1221 dev[0].dump_monitor()
1223 # Build own EAPOL-Key msg 1/4
1224 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1226 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1228 send_eapol(dev[0], addr, build_eapol(msg))
1229 msg = recv_eapol(dev[0])
1230 snonce = msg['rsn_key_nonce']
1232 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1234 logger.debug("Msg 3/4 with mismatching IE")
1235 dev[0].dump_monitor()
1236 wrapped = aes_wrap(kek, pad_key_data(binascii.unhexlify('30060100000fac04dd16000fac010100dc11188831bf4aa4a8678d2b41498618')))
1237 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1239 send_eapol(dev[0], addr, build_eapol(msg))
1240 dev[0].wait_disconnected(timeout=1)
1242 def test_ap_wpa2_psk_supp_proto_ok(dev, apdev):
1243 """WPA2-PSK supplicant protocol testing: success"""
1244 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1246 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1247 msg = recv_eapol(hapd)
1248 dev[0].dump_monitor()
1250 # Build own EAPOL-Key msg 1/4
1251 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1253 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1255 send_eapol(dev[0], addr, build_eapol(msg))
1256 msg = recv_eapol(dev[0])
1257 snonce = msg['rsn_key_nonce']
1259 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1261 logger.debug("Valid EAPOL-Key msg 3/4")
1262 dev[0].dump_monitor()
1263 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010100dc11188831bf4aa4a8678d2b41498618')
1264 wrapped = aes_wrap(kek, pad_key_data(plain))
1265 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1267 send_eapol(dev[0], addr, build_eapol(msg))
1268 dev[0].wait_connected(timeout=1)
1270 def test_ap_wpa2_psk_supp_proto_no_gtk(dev, apdev):
1271 """WPA2-PSK supplicant protocol testing: no GTK"""
1272 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1274 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1275 msg = recv_eapol(hapd)
1276 dev[0].dump_monitor()
1278 # Build own EAPOL-Key msg 1/4
1279 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1281 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1283 send_eapol(dev[0], addr, build_eapol(msg))
1284 msg = recv_eapol(dev[0])
1285 snonce = msg['rsn_key_nonce']
1287 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1289 logger.debug("EAPOL-Key msg 3/4 without GTK KDE")
1290 dev[0].dump_monitor()
1291 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00')
1292 wrapped = aes_wrap(kek, pad_key_data(plain))
1293 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1295 send_eapol(dev[0], addr, build_eapol(msg))
1296 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=0.1)
1298 raise Exception("Unexpected connection completion reported")
1300 def test_ap_wpa2_psk_supp_proto_anonce_change(dev, apdev):
1301 """WPA2-PSK supplicant protocol testing: ANonce change"""
1302 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1304 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1305 msg = recv_eapol(hapd)
1306 dev[0].dump_monitor()
1308 # Build own EAPOL-Key msg 1/4
1309 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1311 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1313 send_eapol(dev[0], addr, build_eapol(msg))
1314 msg = recv_eapol(dev[0])
1315 snonce = msg['rsn_key_nonce']
1317 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1319 logger.debug("Valid EAPOL-Key msg 3/4")
1320 dev[0].dump_monitor()
1321 anonce2 = binascii.unhexlify('3333333333333333333333333333333333333333333333333333333333333333')
1322 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010100dc11188831bf4aa4a8678d2b41498618')
1323 wrapped = aes_wrap(kek, pad_key_data(plain))
1324 msg = build_eapol_key_3_4(anonce2, kck, wrapped, replay_counter=counter)
1326 send_eapol(dev[0], addr, build_eapol(msg))
1327 ev = dev[0].wait_event(["WPA: ANonce from message 1 of 4-Way Handshake differs from 3 of 4-Way Handshake"])
1329 raise Exception("ANonce change not reported")
1331 def test_ap_wpa2_psk_supp_proto_unexpected_group_msg(dev, apdev):
1332 """WPA2-PSK supplicant protocol testing: unexpected group message"""
1333 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1335 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1336 msg = recv_eapol(hapd)
1337 dev[0].dump_monitor()
1339 # Build own EAPOL-Key msg 1/4
1340 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1342 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1344 send_eapol(dev[0], addr, build_eapol(msg))
1345 msg = recv_eapol(dev[0])
1346 snonce = msg['rsn_key_nonce']
1348 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1350 logger.debug("Group key 1/2 instead of msg 3/4")
1351 dev[0].dump_monitor()
1352 wrapped = aes_wrap(kek, binascii.unhexlify('dd16000fac010100dc11188831bf4aa4a8678d2b41498618'))
1353 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter,
1356 send_eapol(dev[0], addr, build_eapol(msg))
1357 ev = dev[0].wait_event(["WPA: Group Key Handshake started prior to completion of 4-way handshake"])
1359 raise Exception("Unexpected group key message not reported")
1360 dev[0].wait_disconnected(timeout=1)
1362 def test_ap_wpa2_psk_supp_proto_msg_1_invalid_kde(dev, apdev):
1363 """WPA2-PSK supplicant protocol testing: invalid KDE in msg 1/4"""
1364 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1366 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1367 msg = recv_eapol(hapd)
1368 dev[0].dump_monitor()
1370 # Build own EAPOL-Key msg 1/4 with invalid KDE
1371 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1373 msg = build_eapol_key_1_4(anonce, replay_counter=counter,
1374 key_data=binascii.unhexlify('5555'))
1376 send_eapol(dev[0], addr, build_eapol(msg))
1377 dev[0].wait_disconnected(timeout=1)
1379 def test_ap_wpa2_psk_supp_proto_wrong_pairwise_key_len(dev, apdev):
1380 """WPA2-PSK supplicant protocol testing: wrong pairwise key length"""
1381 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1383 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1384 msg = recv_eapol(hapd)
1385 dev[0].dump_monitor()
1387 # Build own EAPOL-Key msg 1/4
1388 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1390 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1392 send_eapol(dev[0], addr, build_eapol(msg))
1393 msg = recv_eapol(dev[0])
1394 snonce = msg['rsn_key_nonce']
1396 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1398 logger.debug("Valid EAPOL-Key msg 3/4")
1399 dev[0].dump_monitor()
1400 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010100dc11188831bf4aa4a8678d2b41498618')
1401 wrapped = aes_wrap(kek, pad_key_data(plain))
1402 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter,
1405 send_eapol(dev[0], addr, build_eapol(msg))
1406 ev = dev[0].wait_event(["WPA: Invalid CCMP key length 15"])
1408 raise Exception("Invalid CCMP key length not reported")
1409 dev[0].wait_disconnected(timeout=1)
1411 def test_ap_wpa2_psk_supp_proto_wrong_group_key_len(dev, apdev):
1412 """WPA2-PSK supplicant protocol testing: wrong group key length"""
1413 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1415 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1416 msg = recv_eapol(hapd)
1417 dev[0].dump_monitor()
1419 # Build own EAPOL-Key msg 1/4
1420 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1422 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1424 send_eapol(dev[0], addr, build_eapol(msg))
1425 msg = recv_eapol(dev[0])
1426 snonce = msg['rsn_key_nonce']
1428 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1430 logger.debug("Valid EAPOL-Key msg 3/4")
1431 dev[0].dump_monitor()
1432 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd15000fac010100dc11188831bf4aa4a8678d2b414986')
1433 wrapped = aes_wrap(kek, pad_key_data(plain))
1434 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1436 send_eapol(dev[0], addr, build_eapol(msg))
1437 ev = dev[0].wait_event(["WPA: Unsupported CCMP Group Cipher key length 15"])
1439 raise Exception("Invalid CCMP key length not reported")
1440 dev[0].wait_disconnected(timeout=1)
1442 def test_ap_wpa2_psk_supp_proto_gtk_tx_bit_workaround(dev, apdev):
1443 """WPA2-PSK supplicant protocol testing: GTK TX bit workaround"""
1444 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1446 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1447 msg = recv_eapol(hapd)
1448 dev[0].dump_monitor()
1450 # Build own EAPOL-Key msg 1/4
1451 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1453 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1455 send_eapol(dev[0], addr, build_eapol(msg))
1456 msg = recv_eapol(dev[0])
1457 snonce = msg['rsn_key_nonce']
1459 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1461 logger.debug("Valid EAPOL-Key msg 3/4")
1462 dev[0].dump_monitor()
1463 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010500dc11188831bf4aa4a8678d2b41498618')
1464 wrapped = aes_wrap(kek, pad_key_data(plain))
1465 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1467 send_eapol(dev[0], addr, build_eapol(msg))
1468 ev = dev[0].wait_event(["WPA: Tx bit set for GTK, but pairwise keys are used - ignore Tx bit"])
1470 raise Exception("GTK Tx bit workaround not reported")
1471 dev[0].wait_connected(timeout=1)
1473 def test_ap_wpa2_psk_supp_proto_gtk_keyidx_0_and_3(dev, apdev):
1474 """WPA2-PSK supplicant protocol testing: GTK key index 0 and 3"""
1475 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1477 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1478 msg = recv_eapol(hapd)
1479 dev[0].dump_monitor()
1481 # Build own EAPOL-Key msg 1/4
1482 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1484 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1486 send_eapol(dev[0], addr, build_eapol(msg))
1487 msg = recv_eapol(dev[0])
1488 snonce = msg['rsn_key_nonce']
1490 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1492 logger.debug("Valid EAPOL-Key msg 3/4 (GTK keyidx 0)")
1493 dev[0].dump_monitor()
1494 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010000dc11188831bf4aa4a8678d2b41498618')
1495 wrapped = aes_wrap(kek, pad_key_data(plain))
1496 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1498 send_eapol(dev[0], addr, build_eapol(msg))
1499 dev[0].wait_connected(timeout=1)
1501 logger.debug("Valid EAPOL-Key group msg 1/2 (GTK keyidx 3)")
1502 dev[0].dump_monitor()
1503 plain = binascii.unhexlify('dd16000fac010300dc11188831bf4aa4a8678d2b41498618')
1504 wrapped = aes_wrap(kek, pad_key_data(plain))
1505 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter,
1508 send_eapol(dev[0], addr, build_eapol(msg))
1509 msg = recv_eapol(dev[0])
1510 ev = dev[0].wait_event(["WPA: Group rekeying completed"])
1512 raise Exception("GTK rekeing not reported")
1514 logger.debug("Unencrypted GTK KDE in group msg 1/2")
1515 dev[0].dump_monitor()
1516 plain = binascii.unhexlify('dd16000fac010300dc11188831bf4aa4a8678d2b41498618')
1517 msg = build_eapol_key_3_4(anonce, kck, plain, replay_counter=counter,
1520 send_eapol(dev[0], addr, build_eapol(msg))
1521 ev = dev[0].wait_event(["WPA: GTK IE in unencrypted key data"])
1523 raise Exception("Unencrypted GTK KDE not reported")
1524 dev[0].wait_disconnected(timeout=1)
1526 def test_ap_wpa2_psk_supp_proto_no_gtk_in_group_msg(dev, apdev):
1527 """WPA2-PSK supplicant protocol testing: GTK KDE missing from group msg"""
1528 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1530 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1531 msg = recv_eapol(hapd)
1532 dev[0].dump_monitor()
1534 # Build own EAPOL-Key msg 1/4
1535 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1537 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1539 send_eapol(dev[0], addr, build_eapol(msg))
1540 msg = recv_eapol(dev[0])
1541 snonce = msg['rsn_key_nonce']
1543 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1545 logger.debug("Valid EAPOL-Key msg 3/4 (GTK keyidx 0)")
1546 dev[0].dump_monitor()
1547 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010000dc11188831bf4aa4a8678d2b41498618')
1548 wrapped = aes_wrap(kek, pad_key_data(plain))
1549 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1551 send_eapol(dev[0], addr, build_eapol(msg))
1552 dev[0].wait_connected(timeout=1)
1554 logger.debug("No GTK KDE in EAPOL-Key group msg 1/2")
1555 dev[0].dump_monitor()
1556 plain = binascii.unhexlify('dd00dd00dd00dd00dd00dd00dd00dd00')
1557 wrapped = aes_wrap(kek, pad_key_data(plain))
1558 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter,
1561 send_eapol(dev[0], addr, build_eapol(msg))
1562 ev = dev[0].wait_event(["WPA: No GTK IE in Group Key msg 1/2"])
1564 raise Exception("Missing GTK KDE not reported")
1565 dev[0].wait_disconnected(timeout=1)
1567 def test_ap_wpa2_psk_supp_proto_too_long_gtk_in_group_msg(dev, apdev):
1568 """WPA2-PSK supplicant protocol testing: too long GTK KDE in group msg"""
1569 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1571 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1572 msg = recv_eapol(hapd)
1573 dev[0].dump_monitor()
1575 # Build own EAPOL-Key msg 1/4
1576 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1578 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1580 send_eapol(dev[0], addr, build_eapol(msg))
1581 msg = recv_eapol(dev[0])
1582 snonce = msg['rsn_key_nonce']
1584 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1586 logger.debug("Valid EAPOL-Key msg 3/4 (GTK keyidx 0)")
1587 dev[0].dump_monitor()
1588 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010000dc11188831bf4aa4a8678d2b41498618')
1589 wrapped = aes_wrap(kek, pad_key_data(plain))
1590 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1592 send_eapol(dev[0], addr, build_eapol(msg))
1593 dev[0].wait_connected(timeout=1)
1595 logger.debug("EAPOL-Key group msg 1/2 with too long GTK KDE")
1596 dev[0].dump_monitor()
1597 plain = binascii.unhexlify('dd27000fac010100ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff')
1598 wrapped = aes_wrap(kek, pad_key_data(plain))
1599 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter,
1602 send_eapol(dev[0], addr, build_eapol(msg))
1603 ev = dev[0].wait_event(["WPA: Unsupported CCMP Group Cipher key length 33"])
1605 raise Exception("Too long GTK KDE not reported")
1606 dev[0].wait_disconnected(timeout=1)
1608 def test_ap_wpa2_psk_supp_proto_too_long_gtk_kde(dev, apdev):
1609 """WPA2-PSK supplicant protocol testing: too long GTK KDE"""
1610 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1612 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1613 msg = recv_eapol(hapd)
1614 dev[0].dump_monitor()
1616 # Build own EAPOL-Key msg 1/4
1617 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1619 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1621 send_eapol(dev[0], addr, build_eapol(msg))
1622 msg = recv_eapol(dev[0])
1623 snonce = msg['rsn_key_nonce']
1625 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1627 logger.debug("EAPOL-Key msg 3/4 with too short GTK KDE")
1628 dev[0].dump_monitor()
1629 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd27000fac010100ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff')
1630 wrapped = aes_wrap(kek, pad_key_data(plain))
1631 msg = build_eapol_key_3_4(anonce, kck, wrapped, replay_counter=counter)
1633 send_eapol(dev[0], addr, build_eapol(msg))
1634 dev[0].wait_disconnected(timeout=1)
1636 def test_ap_wpa2_psk_supp_proto_gtk_not_encrypted(dev, apdev):
1637 """WPA2-PSK supplicant protocol testing: GTK KDE not encrypted"""
1638 (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
1640 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1641 msg = recv_eapol(hapd)
1642 dev[0].dump_monitor()
1644 # Build own EAPOL-Key msg 1/4
1645 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1647 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1649 send_eapol(dev[0], addr, build_eapol(msg))
1650 msg = recv_eapol(dev[0])
1651 snonce = msg['rsn_key_nonce']
1653 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1655 logger.debug("Valid EAPOL-Key msg 3/4")
1656 dev[0].dump_monitor()
1657 plain = binascii.unhexlify('30140100000fac040100000fac040100000fac020c00dd16000fac010100dc11188831bf4aa4a8678d2b41498618')
1658 msg = build_eapol_key_3_4(anonce, kck, plain, replay_counter=counter,
1661 send_eapol(dev[0], addr, build_eapol(msg))
1662 ev = dev[0].wait_event(["WPA: GTK IE in unencrypted key data"])
1664 raise Exception("Unencrypted GTK KDE not reported")
1665 dev[0].wait_disconnected(timeout=1)
1667 def find_wpas_process(dev):
1669 cmd = subprocess.Popen(['ps', 'ax'], stdout=subprocess.PIPE)
1670 (data,err) = cmd.communicate()
1671 for l in data.splitlines():
1672 if "wpa_supplicant" not in l:
1674 if "-i" + ifname not in l:
1676 return int(l.strip().split(' ')[0])
1677 raise Exception("Could not find wpa_supplicant process")
1679 def read_process_memory(pid, key=None):
1681 with open('/proc/%d/maps' % pid, 'r') as maps, \
1682 open('/proc/%d/mem' % pid, 'r') as mem:
1683 for l in maps.readlines():
1684 m = re.match(r'([0-9a-f]+)-([0-9a-f]+) ([-r][-w][-x][-p])', l)
1687 start = int(m.group(1), 16)
1688 end = int(m.group(2), 16)
1690 if start > 0xffffffffffff:
1694 if not perm.startswith('rw'):
1697 data = mem.read(end - start)
1699 if key and key in data:
1700 logger.info("Key found in " + l)
1703 def verify_not_present(buf, key, fname, keyname):
1708 prefix = 2048 if pos > 2048 else pos
1709 with open(fname + keyname, 'w') as f:
1710 f.write(buf[pos - prefix:pos + 2048])
1711 raise Exception(keyname + " found after disassociation")
1713 def get_key_locations(buf, key, keyname):
1717 pos = buf.find(key, pos)
1720 logger.info("Found %s at %d" % (keyname, pos))
1725 def test_wpa2_psk_key_lifetime_in_memory(dev, apdev, params):
1726 """WPA2-PSK and PSK/PTK lifetime in memory"""
1727 ssid = "test-wpa2-psk"
1728 passphrase = 'qwertyuiop'
1729 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
1730 pmk = binascii.unhexlify(psk)
1731 p = hostapd.wpa2_params(ssid=ssid)
1733 hapd = hostapd.add_ap(apdev[0]['ifname'], p)
1735 pid = find_wpas_process(dev[0])
1737 id = dev[0].connect(ssid, raw_psk=psk, scan_freq="2412",
1738 only_add_network=True)
1740 logger.info("Checking keys in memory after network profile configuration")
1741 buf = read_process_memory(pid, pmk)
1742 get_key_locations(buf, pmk, "PMK")
1744 dev[0].request("REMOVE_NETWORK all")
1745 logger.info("Checking keys in memory after network profile removal")
1746 buf = read_process_memory(pid, pmk)
1747 get_key_locations(buf, pmk, "PMK")
1749 id = dev[0].connect(ssid, psk=passphrase, scan_freq="2412",
1750 only_add_network=True)
1752 logger.info("Checking keys in memory before connection")
1753 buf = read_process_memory(pid, pmk)
1754 get_key_locations(buf, pmk, "PMK")
1756 dev[0].connect_network(id, timeout=20)
1759 buf = read_process_memory(pid, pmk)
1761 dev[0].request("DISCONNECT")
1762 dev[0].wait_disconnected()
1767 with open(os.path.join(params['logdir'], 'log0'), 'r') as f:
1768 for l in f.readlines():
1769 if "WPA: PTK - hexdump" in l:
1770 val = l.strip().split(':')[3].replace(' ', '')
1771 ptk = binascii.unhexlify(val)
1772 if "WPA: Group Key - hexdump" in l:
1773 val = l.strip().split(':')[3].replace(' ', '')
1774 gtk = binascii.unhexlify(val)
1775 if not pmk or not ptk or not gtk:
1776 raise Exception("Could not find keys from debug log")
1778 raise Exception("Unexpected GTK length")
1784 logger.info("Checking keys in memory while associated")
1785 get_key_locations(buf, pmk, "PMK")
1787 raise HwsimSkip("PMK not found while associated")
1789 raise Exception("KCK not found while associated")
1791 raise Exception("KEK not found while associated")
1793 raise Exception("TK found from memory")
1795 raise Exception("GTK found from memory")
1797 logger.info("Checking keys in memory after disassociation")
1798 buf = read_process_memory(pid, pmk)
1799 get_key_locations(buf, pmk, "PMK")
1801 # Note: PMK/PSK is still present in network configuration
1803 fname = os.path.join(params['logdir'],
1804 'wpa2_psk_key_lifetime_in_memory.memctx-')
1805 verify_not_present(buf, kck, fname, "KCK")
1806 verify_not_present(buf, kek, fname, "KEK")
1807 verify_not_present(buf, tk, fname, "TK")
1808 verify_not_present(buf, gtk, fname, "GTK")
1810 dev[0].request("REMOVE_NETWORK all")
1812 logger.info("Checking keys in memory after network profile removal")
1813 buf = read_process_memory(pid, pmk)
1814 get_key_locations(buf, pmk, "PMK")
1816 verify_not_present(buf, pmk, fname, "PMK")
1817 verify_not_present(buf, kck, fname, "KCK")
1818 verify_not_present(buf, kek, fname, "KEK")
1819 verify_not_present(buf, tk, fname, "TK")
1820 verify_not_present(buf, gtk, fname, "GTK")
1822 def test_ap_wpa2_psk_wep(dev, apdev):
1823 """WPA2-PSK AP and WEP enabled"""
1824 ssid = "test-wpa2-psk"
1825 passphrase = 'qwertyuiop'
1826 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
1827 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
1829 hapd.set('wep_key0', '"hello"')
1830 raise Exception("WEP key accepted to WPA2 network")
1834 def test_ap_wpa2_psk_wpas_in_bridge(dev, apdev):
1835 """WPA2-PSK AP and wpas interface in a bridge"""
1839 _test_ap_wpa2_psk_wpas_in_bridge(dev, apdev)
1841 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
1842 subprocess.call(['brctl', 'delif', br_ifname, ifname])
1843 subprocess.call(['brctl', 'delbr', br_ifname])
1844 subprocess.call(['iw', ifname, 'set', '4addr', 'off'])
1846 def _test_ap_wpa2_psk_wpas_in_bridge(dev, apdev):
1847 ssid = "test-wpa2-psk"
1848 passphrase = 'qwertyuiop'
1849 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
1850 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
1854 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1855 subprocess.call(['brctl', 'addbr', br_ifname])
1856 subprocess.call(['brctl', 'setfd', br_ifname, '0'])
1857 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
1858 subprocess.call(['iw', ifname, 'set', '4addr', 'on'])
1859 subprocess.check_call(['brctl', 'addif', br_ifname, ifname])
1860 wpas.interface_add(ifname, br_ifname=br_ifname)
1863 wpas.connect(ssid, psk=passphrase, scan_freq="2412")
1866 def test_ap_wpa2_psk_ifdown(dev, apdev):
1867 """AP with open mode and external ifconfig down"""
1868 ssid = "test-wpa2-psk"
1869 passphrase = 'qwertyuiop'
1870 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
1871 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
1872 bssid = apdev[0]['bssid']
1874 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
1875 subprocess.call(['ip', 'link', 'set', 'dev', apdev[0]['ifname'], 'down'])
1876 ev = hapd.wait_event(["INTERFACE-DISABLED"], timeout=10)
1878 raise Exception("No INTERFACE-DISABLED event")
1879 # this wait tests beacon loss detection in mac80211
1880 dev[0].wait_disconnected()
1881 subprocess.call(['ip', 'link', 'set', 'dev', apdev[0]['ifname'], 'up'])
1882 ev = hapd.wait_event(["INTERFACE-ENABLED"], timeout=10)
1884 raise Exception("No INTERFACE-ENABLED event")
1885 dev[0].wait_connected()
1886 hwsim_utils.test_connectivity(dev[0], hapd)
1888 def test_ap_wpa2_psk_drop_first_msg_4(dev, apdev):
1889 """WPA2-PSK and first EAPOL-Key msg 4/4 dropped"""
1890 bssid = apdev[0]['bssid']
1891 ssid = "test-wpa2-psk"
1892 passphrase = 'qwertyuiop'
1893 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
1894 params = hostapd.wpa2_params(ssid=ssid)
1895 params['wpa_psk'] = psk
1896 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
1897 hapd.request("SET ext_eapol_frame_io 1")
1898 dev[0].request("SET ext_eapol_frame_io 1")
1899 dev[0].connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False)
1900 addr = dev[0].own_addr()
1903 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
1905 raise Exception("Timeout on EAPOL-TX from hostapd")
1906 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
1908 raise Exception("EAPOL_RX to wpa_supplicant failed")
1911 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
1913 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
1914 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
1916 raise Exception("EAPOL_RX to hostapd failed")
1919 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
1921 raise Exception("Timeout on EAPOL-TX from hostapd")
1922 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
1924 raise Exception("EAPOL_RX to wpa_supplicant failed")
1927 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
1929 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
1930 logger.info("Drop the first EAPOL-Key msg 4/4")
1932 # wpa_supplicant believes now that 4-way handshake succeeded; hostapd
1933 # doesn't. Use normal EAPOL TX/RX to handle retries.
1934 hapd.request("SET ext_eapol_frame_io 0")
1935 dev[0].request("SET ext_eapol_frame_io 0")
1936 dev[0].wait_connected()
1938 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15)
1940 raise Exception("Timeout on AP-STA-CONNECTED from hostapd")
1942 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.1)
1944 logger.info("Disconnection detected")
1945 # The EAPOL-Key retries are supposed to allow the connection to be
1946 # established without having to reassociate. However, this does not
1947 # currently work since mac80211 ends up encrypting EAPOL-Key msg 4/4
1948 # after the pairwise key has been configured and AP will drop those and
1949 # disconnect the station after reaching retransmission limit. Connection
1950 # is then established after reassociation. Once that behavior has been
1951 # optimized to prevent EAPOL-Key frame encryption for retransmission
1952 # case, this exception can be uncommented here.
1953 #raise Exception("Unexpected disconnection")
1955 def test_ap_wpa2_psk_disable_enable(dev, apdev):
1956 """WPA2-PSK AP getting disabled and re-enabled"""
1957 ssid = "test-wpa2-psk"
1958 passphrase = 'qwertyuiop'
1959 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
1960 params = hostapd.wpa2_params(ssid=ssid)
1961 params['wpa_psk'] = psk
1962 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
1963 dev[0].connect(ssid, raw_psk=psk, scan_freq="2412")
1966 hapd.request("DISABLE")
1967 dev[0].wait_disconnected()
1968 hapd.request("ENABLE")
1969 dev[0].wait_connected()
1970 hwsim_utils.test_connectivity(dev[0], hapd)
1972 def test_ap_wpa2_psk_incorrect_passphrase(dev, apdev):
1973 """WPA2-PSK AP and station using incorrect passphrase"""
1974 ssid = "test-wpa2-psk"
1975 passphrase = 'qwertyuiop'
1976 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
1977 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
1978 dev[0].connect(ssid, psk="incorrect passphrase", scan_freq="2412",
1980 ev = hapd.wait_event(["AP-STA-POSSIBLE-PSK-MISMATCH"], timeout=10)
1982 raise Exception("No AP-STA-POSSIBLE-PSK-MISMATCH reported")
1983 dev[0].dump_monitor()
1986 hapd.set("wpa_passphrase", "incorrect passphrase")
1989 dev[0].wait_connected(timeout=20)
1991 def test_ap_wpa_ie_parsing(dev, apdev):
1992 """WPA IE parsing"""
1993 skip_with_fips(dev[0])
1994 ssid = "test-wpa-psk"
1995 passphrase = 'qwertyuiop'
1996 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
1997 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
1998 id = dev[0].connect(ssid, psk=passphrase, scan_freq="2412",
1999 only_add_network=True)
2001 tests = [ "dd040050f201",
2005 "dd070050f201010000",
2006 "dd080050f20101000050",
2007 "dd090050f20101000050f2",
2008 "dd0a0050f20101000050f202",
2009 "dd0b0050f20101000050f20201",
2010 "dd0c0050f20101000050f2020100",
2011 "dd0c0050f20101000050f2020000",
2012 "dd0c0050f20101000050f202ffff",
2013 "dd0d0050f20101000050f202010000",
2014 "dd0e0050f20101000050f20201000050",
2015 "dd0f0050f20101000050f20201000050f2",
2016 "dd100050f20101000050f20201000050f202",
2017 "dd110050f20101000050f20201000050f20201",
2018 "dd120050f20101000050f20201000050f2020100",
2019 "dd120050f20101000050f20201000050f2020000",
2020 "dd120050f20101000050f20201000050f202ffff",
2021 "dd130050f20101000050f20201000050f202010000",
2022 "dd140050f20101000050f20201000050f20201000050",
2023 "dd150050f20101000050f20201000050f20201000050f2" ]
2026 if "OK" not in dev[0].request("VENDOR_ELEM_ADD 13 " + t):
2027 raise Exception("VENDOR_ELEM_ADD failed")
2028 dev[0].select_network(id)
2029 ev = dev[0].wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=10)
2031 raise Exception("Association rejection not reported")
2032 dev[0].request("DISCONNECT")
2033 dev[0].dump_monitor()
2035 dev[0].request("VENDOR_ELEM_REMOVE 13 *")
2037 tests = [ "dd170050f20101000050f20201000050f20201000050f202ff",
2038 "dd180050f20101000050f20201000050f20201000050f202ffff",
2039 "dd190050f20101000050f20201000050f20201000050f202ffffff" ]
2042 if "OK" not in dev[0].request("VENDOR_ELEM_ADD 13 " + t):
2043 raise Exception("VENDOR_ELEM_ADD failed")
2044 dev[0].select_network(id)
2045 dev[0].wait_connected()
2046 dev[0].request("DISCONNECT")
2047 dev[0].dump_monitor()
2049 dev[0].request("VENDOR_ELEM_REMOVE 13 *")
2051 def test_ap_wpa2_psk_no_random(dev, apdev):
2052 """WPA2-PSK AP and no random numbers available"""
2053 ssid = "test-wpa2-psk"
2054 passphrase = 'qwertyuiop'
2055 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
2056 params = hostapd.wpa2_params(ssid=ssid)
2057 params['wpa_psk'] = psk
2058 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
2059 with fail_test(hapd, 1, "wpa_gmk_to_gtk"):
2060 id = dev[0].connect(ssid, raw_psk=psk, scan_freq="2412",
2062 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=15)
2064 raise Exception("Disconnection event not reported")
2065 dev[0].request("DISCONNECT")
2066 dev[0].select_network(id, freq=2412)
2067 dev[0].wait_connected()
2069 def test_rsn_ie_proto_psk_sta(dev, apdev):
2070 """RSN element protocol testing for PSK cases on STA side"""
2071 bssid = apdev[0]['bssid']
2072 ssid = "test-wpa2-psk"
2073 passphrase = 'qwertyuiop'
2074 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
2075 # This is the RSN element used normally by hostapd
2076 params['own_ie_override'] = '30140100000fac040100000fac040100000fac020c00'
2077 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
2078 if "FAIL" not in hapd.request("SET own_ie_override qwerty"):
2079 raise Exception("Invalid own_ie_override value accepted")
2080 id = dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
2082 tests = [ ('No RSN Capabilities field',
2083 '30120100000fac040100000fac040100000fac02'),
2084 ('Reserved RSN Capabilities bits set',
2085 '30140100000fac040100000fac040100000fac023cff'),
2086 ('Extra pairwise cipher suite (unsupported)',
2087 '30180100000fac040200ffffffff000fac040100000fac020c00'),
2088 ('Extra AKM suite (unsupported)',
2089 '30180100000fac040100000fac040200ffffffff000fac020c00'),
2090 ('PMKIDCount field included',
2091 '30160100000fac040100000fac040100000fac020c000000'),
2092 ('Unexpected Group Management Cipher Suite with PMF disabled',
2093 '301a0100000fac040100000fac040100000fac020c000000000fac06'),
2094 ('Extra octet after defined fields (future extensibility)',
2095 '301b0100000fac040100000fac040100000fac020c000000000fac0600') ]
2096 for txt,ie in tests:
2097 dev[0].request("DISCONNECT")
2098 dev[0].wait_disconnected()
2101 hapd.set('own_ie_override', ie)
2103 dev[0].request("BSS_FLUSH 0")
2104 dev[0].scan_for_bss(bssid, 2412, force_scan=True, only_new=True)
2105 dev[0].select_network(id, freq=2412)
2106 dev[0].wait_connected()
2108 def test_ap_cli_order(dev, apdev):
2109 ssid = "test-rsn-setup"
2110 passphrase = 'zzzzzzzz'
2111 ifname = apdev[0]['ifname']
2113 hapd_global = hostapd.HostapdGlobal()
2114 hapd_global.remove(ifname)
2115 hapd_global.add(ifname)
2117 hapd = hostapd.Hostapd(ifname)
2119 hapd.set('ssid', ssid)
2120 hapd.set('wpa_passphrase', passphrase)
2121 hapd.set('rsn_pairwise', 'CCMP')
2122 hapd.set('wpa_key_mgmt', 'WPA-PSK')
2123 hapd.set('wpa', '2')
2125 cfg = hapd.get_config()
2126 if cfg['group_cipher'] != 'CCMP':
2127 raise Exception("Unexpected group_cipher: " + cfg['group_cipher'])
2128 if cfg['rsn_pairwise_cipher'] != 'CCMP':
2129 raise Exception("Unexpected rsn_pairwise_cipher: " + cfg['rsn_pairwise_cipher'])
2131 ev = hapd.wait_event(["AP-ENABLED", "AP-DISABLED"], timeout=30)
2133 raise Exception("AP startup timed out")
2134 if "AP-ENABLED" not in ev:
2135 raise Exception("AP startup failed")
2137 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")