]> git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_ap_psk.py
tests: Use cmd_execute() for ip link set up/down commands
[thirdparty/hostap.git] / tests / hwsim / test_ap_psk.py
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
7 import binascii
8 from Crypto.Cipher import AES
9 import hashlib
10 import hmac
11 import logging
12 logger = logging.getLogger()
13 import os
14 import re
15 import struct
16 import subprocess
17 import time
18
19 import hostapd
20 from utils import HwsimSkip, fail_test, skip_with_fips
21 import hwsim_utils
22 from wpasupplicant import WpaSupplicant
23
24 def check_mib(dev, vals):
25 mib = dev.get_mib()
26 for v in vals:
27 if mib[v[0]] != v[1]:
28 raise Exception("Unexpected {} = {} (expected {})".format(v[0], mib[v[0]], v[1]))
29
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], 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")
43
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))
50
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], 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)
67 if ev is None:
68 raise Exception("Timed out while waiting for failure report")
69 dev[1].request("REMOVE_NETWORK all")
70
71 def test_ap_wpa2_psk_mem(dev, apdev):
72 """WPA2-PSK AP with passphrase only in memory"""
73 try:
74 _test_ap_wpa2_psk_mem(dev, apdev)
75 finally:
76 dev[0].request("SCAN_INTERVAL 5")
77 dev[1].request("SCAN_INTERVAL 5")
78
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], params)
86
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)
90 if ev is None:
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)
95
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)
99 if ev is None:
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)
104
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], 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"])
113 if ev is None:
114 raise Exception("PTK rekey timed out")
115 hwsim_utils.test_connectivity(dev[0], hapd)
116
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], params)
124 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
125 ev = dev[0].wait_event(["WPA: Key negotiation completed"])
126 if ev is None:
127 raise Exception("PTK rekey timed out")
128 hwsim_utils.test_connectivity(dev[0], hapd)
129
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], 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"])
140 if ev is None:
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") ])
145
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], params)
154 dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
155 scan_freq="2412")
156 ev = dev[0].wait_event(["WPA: Key negotiation completed"])
157 if ev is None:
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") ])
162
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], 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"])
174 if ev is None:
175 raise Exception("PTK rekey timed out")
176 hwsim_utils.test_connectivity(dev[0], hapd)
177
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], params)
186 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
187 ev = dev[0].wait_event(["WPA: Key negotiation completed"], timeout=10)
188 if ev is None:
189 raise Exception("PTK rekey timed out")
190 hwsim_utils.test_connectivity(dev[0], hapd)
191
192 def test_ap_wpa_ccmp(dev, apdev):
193 """WPA-PSK/CCMP"""
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], 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") ])
209
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()
215 ssid = "psk"
216 pskfile = "/tmp/ap_wpa2_psk_file_errors.psk_file"
217 try:
218 os.remove(pskfile)
219 except:
220 pass
221
222 params = { "ssid": ssid, "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
223 "rsn_pairwise": "CCMP", "wpa_psk_file": pskfile }
224
225 try:
226 # missing PSK file
227 hapd = hostapd.add_ap(apdev[0], params, no_enable=True)
228 if "FAIL" not in hapd.request("ENABLE"):
229 raise Exception("Unexpected ENABLE success")
230 hapd.request("DISABLE")
231
232 # invalid MAC address
233 with open(pskfile, "w") as f:
234 f.write("\n")
235 f.write("foo\n")
236 if "FAIL" not in hapd.request("ENABLE"):
237 raise Exception("Unexpected ENABLE success")
238 hapd.request("DISABLE")
239
240 # no PSK on line
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")
246
247 # invalid PSK
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")
253
254 # valid PSK file
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")
262
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")
266
267 finally:
268 try:
269 os.remove(pskfile)
270 except:
271 pass
272
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], params)
280 dev[0].connect("", bssid=apdev[0]['bssid'], psk=passphrase,
281 scan_freq="2412")
282 dev[1].connect("", bssid=apdev[0]['bssid'], raw_psk=psk, scan_freq="2412")
283
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], params)
291 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
292 ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
293 if ev is None:
294 raise Exception("GTK rekey timed out")
295 hwsim_utils.test_connectivity(dev[0], hapd)
296
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], params)
305 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
306 ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
307 if ev is None:
308 raise Exception("GTK rekey timed out")
309 hwsim_utils.test_connectivity(dev[0], hapd)
310
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], 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)
322 if ev is None:
323 raise Exception("GTK rekey timed out")
324 hwsim_utils.test_connectivity(dev[0], hapd)
325
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], 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)
337 if ev is None:
338 raise Exception("GTK rekey timed out")
339 hwsim_utils.test_connectivity(dev[0], hapd)
340
341 def test_ap_wpa2_bridge_fdb(dev, apdev):
342 """Bridge FDB entry removal"""
343 try:
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], 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")
363 time.sleep(1)
364 cmd = subprocess.Popen(['brctl', 'showmacs', 'ap-br0'],
365 stdout=subprocess.PIPE)
366 macs2 = cmd.stdout.read()
367
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")
373 finally:
374 subprocess.call(['ip', 'link', 'set', 'dev', 'ap-br0', 'down'])
375 subprocess.call(['brctl', 'delbr', 'ap-br0'])
376
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'
381 try:
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(apdev[0], 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")
394 finally:
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])
399
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'
404 try:
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])
412 time.sleep(0.5)
413 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
414 params['bridge'] = 'ap-br0'
415 hapd = hostapd.add_ap(apdev[0], 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")
428 hapd.disable()
429 finally:
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])
434
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'
439 try:
440 ssid = "test-wpa2-psk"
441 passphrase = "12345678"
442 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
443 hapd = hostapd.add_ap(apdev[0], params)
444
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")
452 finally:
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])
456
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], 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()
470 while True:
471 ev = hapd.wait_event(["EAPOL-TX", "AP-STA-CONNECTED"], timeout=15)
472 if ev is None:
473 raise Exception("Timeout on EAPOL-TX from hostapd")
474 if "AP-STA-CONNECTED" in ev:
475 dev[0].wait_connected(timeout=15)
476 break
477 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
478 if "OK" not in res:
479 raise Exception("EAPOL_RX to wpa_supplicant failed")
480 ev = dev[0].wait_event(["EAPOL-TX", "CTRL-EVENT-CONNECTED"], timeout=15)
481 if ev is None:
482 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
483 if "CTRL-EVENT-CONNECTED" in ev:
484 break
485 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
486 if "OK" not in res:
487 raise Exception("EAPOL_RX to hostapd failed")
488
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], 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()
502
503 # EAPOL-Key msg 1/4
504 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
505 if ev is None:
506 raise Exception("Timeout on EAPOL-TX from hostapd")
507 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
508 if "OK" not in res:
509 raise Exception("EAPOL_RX to wpa_supplicant failed")
510
511 # EAPOL-Key msg 2/4
512 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
513 if ev is None:
514 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
515 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
516 if "OK" not in res:
517 raise Exception("EAPOL_RX to hostapd failed")
518
519 # EAPOL-Key msg 3/4
520 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
521 if ev is None:
522 raise Exception("Timeout on EAPOL-TX from hostapd")
523 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
524 if "OK" not in res:
525 raise Exception("EAPOL_RX to wpa_supplicant failed")
526
527 # EAPOL-Key msg 4/4
528 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
529 if ev is None:
530 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
531 # Do not send to the AP
532 dev[0].wait_connected(timeout=15)
533
534 # EAPOL-Key msg 3/4 (retry)
535 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
536 if ev is None:
537 raise Exception("Timeout on EAPOL-TX from hostapd")
538 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
539 if "OK" not in res:
540 raise Exception("EAPOL_RX to wpa_supplicant failed")
541
542 # EAPOL-Key msg 4/4
543 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
544 if ev is None:
545 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
546 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
547 if "OK" not in res:
548 raise Exception("EAPOL_RX to hostapd failed")
549
550 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15)
551 if ev is None:
552 raise Exception("Timeout on AP-STA-CONNECTED from hostapd")
553
554 hwsim_utils.test_connectivity(dev[0], hapd)
555
556 def parse_eapol(data):
557 (version, type, length) = struct.unpack('>BBH', data[0:4])
558 payload = data[4:]
559 if length > len(payload):
560 raise Exception("Invalid EAPOL length")
561 if length < len(payload):
562 payload = payload[0:length]
563 eapol = {}
564 eapol['version'] = version
565 eapol['type'] = type
566 eapol['length'] = length
567 eapol['payload'] = payload
568 if type == 3:
569 # EAPOL-Key
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:
573 # RSN EAPOL-Key
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
587 return eapol
588
589 def build_eapol(msg):
590 data = struct.pack(">BBH", msg['version'], msg['type'], msg['length'])
591 if msg['type'] == 3:
592 data += struct.pack('>BHH', msg['descr_type'], msg['rsn_key_info'],
593 msg['rsn_key_len'])
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']
602 else:
603 data += msg['payload']
604 return data
605
606 def sha1_prf(key, label, data, outlen):
607 res = ''
608 counter = 0
609 while outlen > 0:
610 m = hmac.new(key, label, hashlib.sha1)
611 m.update(struct.pack('B', 0))
612 m.update(data)
613 m.update(struct.pack('B', counter))
614 counter += 1
615 hash = m.digest()
616 if outlen > len(hash):
617 res += hash
618 outlen -= len(hash)
619 else:
620 res += hash[0:outlen]
621 outlen = 0
622 return res
623
624 def pmk_to_ptk(pmk, addr1, addr2, nonce1, nonce2):
625 if addr1 < addr2:
626 data = binascii.unhexlify(addr1.replace(':','')) + binascii.unhexlify(addr2.replace(':',''))
627 else:
628 data = binascii.unhexlify(addr2.replace(':','')) + binascii.unhexlify(addr1.replace(':',''))
629 if nonce1 < nonce2:
630 data += nonce1 + nonce2
631 else:
632 data += nonce2 + nonce1
633 label = "Pairwise key expansion"
634 ptk = sha1_prf(pmk, label, data, 48)
635 kck = ptk[0:16]
636 kek = ptk[16:32]
637 return (ptk, kck, kek)
638
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]
644
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
648 if nonce:
649 msg['rsn_key_nonce'] = nonce
650 else:
651 msg['rsn_key_nonce'] = binascii.unhexlify('0000000000000000000000000000000000000000000000000000000000000000')
652 if data:
653 msg['rsn_key_data_len'] = len(data)
654 msg['rsn_key_data'] = data
655 msg['length'] = 95 + len(data)
656 else:
657 msg['rsn_key_data_len'] = 0
658 msg['rsn_key_data'] = ''
659 msg['length'] = 95
660
661 def recv_eapol(hapd):
662 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
663 if ev is None:
664 raise Exception("Timeout on EAPOL-TX from hostapd")
665 eapol = binascii.unhexlify(ev.split(' ')[2])
666 return parse_eapol(eapol)
667
668 def send_eapol(hapd, addr, data):
669 res = hapd.request("EAPOL_RX " + addr + " " + binascii.hexlify(data))
670 if "OK" not in res:
671 raise Exception("EAPOL_RX to hostapd failed")
672
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))
678
679 def hapd_connected(hapd):
680 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15)
681 if ev is None:
682 raise Exception("Timeout on AP-STA-CONNECTED from hostapd")
683
684 def eapol_test(apdev, dev, wpa2=True):
685 bssid = apdev['bssid']
686 if wpa2:
687 ssid = "test-wpa2-psk"
688 else:
689 ssid = "test-wpa-psk"
690 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
691 pmk = binascii.unhexlify(psk)
692 if wpa2:
693 params = hostapd.wpa2_params(ssid=ssid)
694 else:
695 params = hostapd.wpa_params(ssid=ssid)
696 params['wpa_psk'] = psk
697 hapd = hostapd.add_ap(apdev, 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()
702 if wpa2:
703 rsne = binascii.unhexlify('30140100000fac040100000fac040100000fac020000')
704 else:
705 rsne = binascii.unhexlify('dd160050f20101000050f20201000050f20201000050f202')
706 snonce = binascii.unhexlify('1111111111111111111111111111111111111111111111111111111111111111')
707 return (bssid,ssid,hapd,snonce,pmk,addr,rsne)
708
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])
712
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))
717
718 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
719
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))
724
725 reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, rsne, kck)
726
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))
732
733 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
734 hapd_connected(hapd)
735
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])
739
740 msg1 = recv_eapol(hapd)
741 anonce = msg1['rsn_key_nonce']
742
743 msg2 = recv_eapol(hapd)
744 if anonce != msg2['rsn_key_nonce']:
745 raise Exception("ANonce changed")
746
747 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
748
749 logger.info("Send EAPOL-Key msg 2/4")
750 msg = msg2
751 rsn_eapol_key_set(msg, 0x010a, 0, snonce, rsne)
752 eapol_key_mic(kck, msg)
753 send_eapol(hapd, addr, build_eapol(msg))
754
755 msg = recv_eapol(hapd)
756 if anonce != msg['rsn_key_nonce']:
757 raise Exception("ANonce changed")
758
759 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
760 hapd_connected(hapd)
761
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])
765
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")
771
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)
775
776 msg = recv_eapol(hapd)
777 if anonce != msg['rsn_key_nonce']:
778 raise Exception("ANonce changed")
779
780 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
781 hapd_connected(hapd)
782
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])
786
787 msg1 = recv_eapol(hapd)
788 anonce = msg1['rsn_key_nonce']
789
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)
795
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)
799
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)
804 hapd_connected(hapd)
805
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])
809
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")
815
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)
818
819 snonce2 = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
820 (ptk2, kck2, kek2) = pmk_to_ptk(pmk, addr, bssid, snonce2, anonce)
821
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)
827 hapd_connected(hapd)
828
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])
832
833 msg = recv_eapol(hapd)
834 anonce = msg['rsn_key_nonce']
835
836 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
837
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))
843
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))
849
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))
855
856 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
857 hapd_connected(hapd)
858
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],
862 wpa2=False)
863
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])
870
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)
876
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))
882
883 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
884 hapd_connected(hapd)
885
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])
889
890 msg = recv_eapol(hapd)
891 anonce = msg['rsn_key_nonce']
892
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))
898 # SMK M1
899 rsn_eapol_key_set(msg, 0x2802, 0, snonce, rsne)
900 send_eapol(hapd, addr, build_eapol(msg))
901 # SMK M3
902 rsn_eapol_key_set(msg, 0x2002, 0, snonce, rsne)
903 send_eapol(hapd, addr, build_eapol(msg))
904 # Request
905 rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne)
906 send_eapol(hapd, addr, build_eapol(msg))
907 # Request
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))
912
913 reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, rsne, kck)
914
915 msg = recv_eapol(hapd)
916 if anonce != msg['rsn_key_nonce']:
917 raise Exception("ANonce changed")
918
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))
927
928 reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
929 hapd_connected(hapd)
930
931 def build_eapol_key_1_4(anonce, replay_counter=1, key_data='', key_len=16):
932 msg = {}
933 msg['version'] = 2
934 msg['type'] = 3
935 msg['length'] = 95 + len(key_data)
936
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
948 return msg
949
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):
952 msg = {}
953 msg['version'] = 2
954 msg['type'] = 3
955 msg['length'] = 95 + len(key_data) + extra_len
956
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)
968 return msg
969
970 def aes_wrap(kek, plain):
971 n = len(plain) / 8
972 a = 0xa6a6a6a6a6a6a6a6
973 enc = AES.new(kek).encrypt
974 r = [plain[i * 8:(i + 1) * 8] for i in range(0, n)]
975 for j in range(6):
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)
979 r[i - 1] =b[8:]
980 return struct.pack('>Q', a) + ''.join(r)
981
982 def pad_key_data(plain):
983 pad_len = len(plain) % 8
984 if pad_len:
985 pad_len = 8 - pad_len
986 plain += '\xdd'
987 pad_len -= 1
988 plain += pad_len * '\0'
989 return plain
990
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])
994
995 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
996 msg = recv_eapol(hapd)
997 dev[0].dump_monitor()
998
999 # Build own EAPOL-Key msg 1/4
1000 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1001 counter = 1
1002 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1003 counter += 1
1004 send_eapol(dev[0], addr, build_eapol(msg))
1005 msg = recv_eapol(dev[0])
1006 snonce = msg['rsn_key_nonce']
1007
1008 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1009
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)
1013 counter += 1
1014 send_eapol(dev[0], addr, build_eapol(msg))
1015 ev = dev[0].wait_event(["WPA: Unsupported AES-WRAP len 0"])
1016 if ev is None:
1017 raise Exception("Unsupported AES-WRAP len 0 not reported")
1018
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)
1022 counter += 1
1023 send_eapol(dev[0], addr, build_eapol(msg))
1024 ev = dev[0].wait_event(["WPA: Unsupported AES-WRAP len 1"])
1025 if ev is None:
1026 raise Exception("Unsupported AES-WRAP len 1 not reported")
1027
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)
1031 counter += 1
1032 send_eapol(dev[0], addr, build_eapol(msg))
1033 ev = dev[0].wait_event(["WPA: Unsupported AES-WRAP len 9"])
1034 if ev is None:
1035 raise Exception("Unsupported AES-WRAP len 9 not reported")
1036
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"])
1043 if ev is None:
1044 raise Exception("AES unwrap failure not reported")
1045
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)
1049 counter += 1
1050 send_eapol(dev[0], addr, build_eapol(msg))
1051 ev = dev[0].wait_event(["WPA: EAPOL-Key Replay Counter did not increase"])
1052 if ev is None:
1053 raise Exception("Replay Counter replay not reported")
1054
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,
1058 key_info=0x134a)
1059 counter += 1
1060 send_eapol(dev[0], addr, build_eapol(msg))
1061 ev = dev[0].wait_event(["WPA: No Ack bit in key_info"])
1062 if ev is None:
1063 raise Exception("Missing Ack bit not reported")
1064
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,
1068 key_info=0x1bca)
1069 counter += 1
1070 send_eapol(dev[0], addr, build_eapol(msg))
1071 ev = dev[0].wait_event(["WPA: EAPOL-Key with Request bit"])
1072 if ev is None:
1073 raise Exception("Request bit not reported")
1074
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)
1079 counter += 1
1080 send_eapol(dev[0], addr, build_eapol(msg))
1081 ev = dev[0].wait_event(["WPA: Unsupported EAPOL-Key descriptor version 0"])
1082 if ev is None:
1083 raise Exception("Unsupported EAPOL-Key descriptor version 0 not reported")
1084
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)
1089 counter += 1
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"])
1092 if ev is None:
1093 raise Exception("Not allowed EAPOL-Key descriptor version not reported")
1094
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)
1099 counter += 1
1100 send_eapol(dev[0], addr, build_eapol(msg))
1101 ev = dev[0].wait_event(["WPA: AES unwrap failed"])
1102 if ev is None:
1103 raise Exception("AES unwrap failure not reported")
1104
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)
1109 counter += 1
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"])
1112 if ev is None:
1113 raise Exception("CCMP key descriptor mismatch not reported")
1114 ev = dev[0].wait_event(["WPA: Interoperability workaround"])
1115 if ev is None:
1116 raise Exception("AES-128-CMAC workaround not reported")
1117 ev = dev[0].wait_event(["WPA: Invalid EAPOL-Key MIC - dropping packet"])
1118 if ev is None:
1119 raise Exception("MIC failure with AES-128-CMAC workaround not reported")
1120
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)
1125 counter += 1
1126 send_eapol(dev[0], addr, build_eapol(msg))
1127 ev = dev[0].wait_event(["WPA: Unsupported EAPOL-Key descriptor version 4"])
1128 if ev is None:
1129 raise Exception("Unsupported EAPOL-Key descriptor version 4 not reported")
1130
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)
1135 counter += 1
1136 send_eapol(dev[0], addr, build_eapol(msg))
1137 ev = dev[0].wait_event(["WPA: Unsupported EAPOL-Key descriptor version 7"])
1138 if ev is None:
1139 raise Exception("Unsupported EAPOL-Key descriptor version 7 not reported")
1140
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,
1144 extra_len=-1)
1145 counter += 1
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)"])
1148 if ev is None:
1149 raise Exception("Key data overflow not reported")
1150
1151 logger.debug("Too long EAPOL header length")
1152 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter,
1153 extra_len=1)
1154 counter += 1
1155 send_eapol(dev[0], addr, build_eapol(msg))
1156
1157 logger.debug("Unsupported descriptor type 0")
1158 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter,
1159 descr_type=0)
1160 counter += 1
1161 send_eapol(dev[0], addr, build_eapol(msg))
1162
1163 logger.debug("WPA descriptor type 0")
1164 msg = build_eapol_key_3_4(anonce, kck, '12345678', replay_counter=counter,
1165 descr_type=254)
1166 counter += 1
1167 send_eapol(dev[0], addr, build_eapol(msg))
1168
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,
1173 key_info=0x13ea)
1174 counter += 1
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"])
1177 if ev is None:
1178 raise Exception("Non-zero key index not reported")
1179
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)
1184 counter += 1
1185 send_eapol(dev[0], addr, build_eapol(msg))
1186 dev[0].wait_disconnected(timeout=1)
1187
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])
1191
1192 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1193 msg = recv_eapol(hapd)
1194 dev[0].dump_monitor()
1195
1196 # Build own EAPOL-Key msg 1/4
1197 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1198 counter = 1
1199 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1200 counter += 1
1201 send_eapol(dev[0], addr, build_eapol(msg))
1202 msg = recv_eapol(dev[0])
1203 snonce = msg['rsn_key_nonce']
1204
1205 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1206
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)
1211 counter += 1
1212 send_eapol(dev[0], addr, build_eapol(msg))
1213 dev[0].wait_disconnected(timeout=1)
1214
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])
1218
1219 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1220 msg = recv_eapol(hapd)
1221 dev[0].dump_monitor()
1222
1223 # Build own EAPOL-Key msg 1/4
1224 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1225 counter = 1
1226 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1227 counter += 1
1228 send_eapol(dev[0], addr, build_eapol(msg))
1229 msg = recv_eapol(dev[0])
1230 snonce = msg['rsn_key_nonce']
1231
1232 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1233
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)
1238 counter += 1
1239 send_eapol(dev[0], addr, build_eapol(msg))
1240 dev[0].wait_disconnected(timeout=1)
1241
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])
1245
1246 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1247 msg = recv_eapol(hapd)
1248 dev[0].dump_monitor()
1249
1250 # Build own EAPOL-Key msg 1/4
1251 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1252 counter = 1
1253 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1254 counter += 1
1255 send_eapol(dev[0], addr, build_eapol(msg))
1256 msg = recv_eapol(dev[0])
1257 snonce = msg['rsn_key_nonce']
1258
1259 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1260
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)
1266 counter += 1
1267 send_eapol(dev[0], addr, build_eapol(msg))
1268 dev[0].wait_connected(timeout=1)
1269
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])
1273
1274 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1275 msg = recv_eapol(hapd)
1276 dev[0].dump_monitor()
1277
1278 # Build own EAPOL-Key msg 1/4
1279 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1280 counter = 1
1281 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1282 counter += 1
1283 send_eapol(dev[0], addr, build_eapol(msg))
1284 msg = recv_eapol(dev[0])
1285 snonce = msg['rsn_key_nonce']
1286
1287 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1288
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)
1294 counter += 1
1295 send_eapol(dev[0], addr, build_eapol(msg))
1296 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=0.1)
1297 if ev is not None:
1298 raise Exception("Unexpected connection completion reported")
1299
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])
1303
1304 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1305 msg = recv_eapol(hapd)
1306 dev[0].dump_monitor()
1307
1308 # Build own EAPOL-Key msg 1/4
1309 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1310 counter = 1
1311 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1312 counter += 1
1313 send_eapol(dev[0], addr, build_eapol(msg))
1314 msg = recv_eapol(dev[0])
1315 snonce = msg['rsn_key_nonce']
1316
1317 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1318
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)
1325 counter += 1
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"])
1328 if ev is None:
1329 raise Exception("ANonce change not reported")
1330
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])
1334
1335 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1336 msg = recv_eapol(hapd)
1337 dev[0].dump_monitor()
1338
1339 # Build own EAPOL-Key msg 1/4
1340 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1341 counter = 1
1342 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1343 counter += 1
1344 send_eapol(dev[0], addr, build_eapol(msg))
1345 msg = recv_eapol(dev[0])
1346 snonce = msg['rsn_key_nonce']
1347
1348 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1349
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,
1354 key_info=0x13c2)
1355 counter += 1
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"])
1358 if ev is None:
1359 raise Exception("Unexpected group key message not reported")
1360 dev[0].wait_disconnected(timeout=1)
1361
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])
1365
1366 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1367 msg = recv_eapol(hapd)
1368 dev[0].dump_monitor()
1369
1370 # Build own EAPOL-Key msg 1/4 with invalid KDE
1371 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1372 counter = 1
1373 msg = build_eapol_key_1_4(anonce, replay_counter=counter,
1374 key_data=binascii.unhexlify('5555'))
1375 counter += 1
1376 send_eapol(dev[0], addr, build_eapol(msg))
1377 dev[0].wait_disconnected(timeout=1)
1378
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])
1382
1383 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1384 msg = recv_eapol(hapd)
1385 dev[0].dump_monitor()
1386
1387 # Build own EAPOL-Key msg 1/4
1388 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1389 counter = 1
1390 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1391 counter += 1
1392 send_eapol(dev[0], addr, build_eapol(msg))
1393 msg = recv_eapol(dev[0])
1394 snonce = msg['rsn_key_nonce']
1395
1396 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1397
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,
1403 key_len=15)
1404 counter += 1
1405 send_eapol(dev[0], addr, build_eapol(msg))
1406 ev = dev[0].wait_event(["WPA: Invalid CCMP key length 15"])
1407 if ev is None:
1408 raise Exception("Invalid CCMP key length not reported")
1409 dev[0].wait_disconnected(timeout=1)
1410
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])
1414
1415 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1416 msg = recv_eapol(hapd)
1417 dev[0].dump_monitor()
1418
1419 # Build own EAPOL-Key msg 1/4
1420 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1421 counter = 1
1422 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1423 counter += 1
1424 send_eapol(dev[0], addr, build_eapol(msg))
1425 msg = recv_eapol(dev[0])
1426 snonce = msg['rsn_key_nonce']
1427
1428 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1429
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)
1435 counter += 1
1436 send_eapol(dev[0], addr, build_eapol(msg))
1437 ev = dev[0].wait_event(["WPA: Unsupported CCMP Group Cipher key length 15"])
1438 if ev is None:
1439 raise Exception("Invalid CCMP key length not reported")
1440 dev[0].wait_disconnected(timeout=1)
1441
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])
1445
1446 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1447 msg = recv_eapol(hapd)
1448 dev[0].dump_monitor()
1449
1450 # Build own EAPOL-Key msg 1/4
1451 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1452 counter = 1
1453 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1454 counter += 1
1455 send_eapol(dev[0], addr, build_eapol(msg))
1456 msg = recv_eapol(dev[0])
1457 snonce = msg['rsn_key_nonce']
1458
1459 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1460
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)
1466 counter += 1
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"])
1469 if ev is None:
1470 raise Exception("GTK Tx bit workaround not reported")
1471 dev[0].wait_connected(timeout=1)
1472
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])
1476
1477 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1478 msg = recv_eapol(hapd)
1479 dev[0].dump_monitor()
1480
1481 # Build own EAPOL-Key msg 1/4
1482 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1483 counter = 1
1484 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1485 counter += 1
1486 send_eapol(dev[0], addr, build_eapol(msg))
1487 msg = recv_eapol(dev[0])
1488 snonce = msg['rsn_key_nonce']
1489
1490 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1491
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)
1497 counter += 1
1498 send_eapol(dev[0], addr, build_eapol(msg))
1499 dev[0].wait_connected(timeout=1)
1500
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,
1506 key_info=0x13c2)
1507 counter += 1
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"])
1511 if ev is None:
1512 raise Exception("GTK rekeing not reported")
1513
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,
1518 key_info=0x03c2)
1519 counter += 1
1520 send_eapol(dev[0], addr, build_eapol(msg))
1521 ev = dev[0].wait_event(["WPA: GTK IE in unencrypted key data"])
1522 if ev is None:
1523 raise Exception("Unencrypted GTK KDE not reported")
1524 dev[0].wait_disconnected(timeout=1)
1525
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])
1529
1530 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1531 msg = recv_eapol(hapd)
1532 dev[0].dump_monitor()
1533
1534 # Build own EAPOL-Key msg 1/4
1535 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1536 counter = 1
1537 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1538 counter += 1
1539 send_eapol(dev[0], addr, build_eapol(msg))
1540 msg = recv_eapol(dev[0])
1541 snonce = msg['rsn_key_nonce']
1542
1543 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1544
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)
1550 counter += 1
1551 send_eapol(dev[0], addr, build_eapol(msg))
1552 dev[0].wait_connected(timeout=1)
1553
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,
1559 key_info=0x13c2)
1560 counter += 1
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"])
1563 if ev is None:
1564 raise Exception("Missing GTK KDE not reported")
1565 dev[0].wait_disconnected(timeout=1)
1566
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])
1570
1571 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1572 msg = recv_eapol(hapd)
1573 dev[0].dump_monitor()
1574
1575 # Build own EAPOL-Key msg 1/4
1576 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1577 counter = 1
1578 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1579 counter += 1
1580 send_eapol(dev[0], addr, build_eapol(msg))
1581 msg = recv_eapol(dev[0])
1582 snonce = msg['rsn_key_nonce']
1583
1584 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1585
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)
1591 counter += 1
1592 send_eapol(dev[0], addr, build_eapol(msg))
1593 dev[0].wait_connected(timeout=1)
1594
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,
1600 key_info=0x13c2)
1601 counter += 1
1602 send_eapol(dev[0], addr, build_eapol(msg))
1603 ev = dev[0].wait_event(["WPA: Unsupported CCMP Group Cipher key length 33"])
1604 if ev is None:
1605 raise Exception("Too long GTK KDE not reported")
1606 dev[0].wait_disconnected(timeout=1)
1607
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])
1611
1612 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1613 msg = recv_eapol(hapd)
1614 dev[0].dump_monitor()
1615
1616 # Build own EAPOL-Key msg 1/4
1617 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1618 counter = 1
1619 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1620 counter += 1
1621 send_eapol(dev[0], addr, build_eapol(msg))
1622 msg = recv_eapol(dev[0])
1623 snonce = msg['rsn_key_nonce']
1624
1625 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1626
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)
1632 counter += 1
1633 send_eapol(dev[0], addr, build_eapol(msg))
1634 dev[0].wait_disconnected(timeout=1)
1635
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])
1639
1640 # Wait for EAPOL-Key msg 1/4 from hostapd to determine when associated
1641 msg = recv_eapol(hapd)
1642 dev[0].dump_monitor()
1643
1644 # Build own EAPOL-Key msg 1/4
1645 anonce = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
1646 counter = 1
1647 msg = build_eapol_key_1_4(anonce, replay_counter=counter)
1648 counter += 1
1649 send_eapol(dev[0], addr, build_eapol(msg))
1650 msg = recv_eapol(dev[0])
1651 snonce = msg['rsn_key_nonce']
1652
1653 (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
1654
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,
1659 key_info=0x03ca)
1660 counter += 1
1661 send_eapol(dev[0], addr, build_eapol(msg))
1662 ev = dev[0].wait_event(["WPA: GTK IE in unencrypted key data"])
1663 if ev is None:
1664 raise Exception("Unencrypted GTK KDE not reported")
1665 dev[0].wait_disconnected(timeout=1)
1666
1667 def find_wpas_process(dev):
1668 ifname = dev.ifname
1669 err, data = dev.cmd_execute(['ps', 'ax'])
1670 for l in data.splitlines():
1671 if "wpa_supplicant" not in l:
1672 continue
1673 if "-i" + ifname not in l:
1674 continue
1675 return int(l.strip().split(' ')[0])
1676 raise Exception("Could not find wpa_supplicant process")
1677
1678 def read_process_memory(pid, key=None):
1679 buf = bytes()
1680 logger.info("Reading process memory (pid=%d)" % pid)
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)
1685 if not m:
1686 continue
1687 start = int(m.group(1), 16)
1688 end = int(m.group(2), 16)
1689 perm = m.group(3)
1690 if start > 0xffffffffffff:
1691 continue
1692 if end < start:
1693 continue
1694 if not perm.startswith('rw'):
1695 continue
1696 for name in [ "[heap]", "[stack]" ]:
1697 if name in l:
1698 logger.info("%s 0x%x-0x%x is at %d-%d" % (name, start, end, len(buf), len(buf) + (end - start)))
1699 mem.seek(start)
1700 data = mem.read(end - start)
1701 buf += data
1702 if key and key in data:
1703 logger.info("Key found in " + l)
1704 logger.info("Total process memory read: %d bytes" % len(buf))
1705 return buf
1706
1707 def verify_not_present(buf, key, fname, keyname):
1708 pos = buf.find(key)
1709 if pos < 0:
1710 return
1711
1712 prefix = 2048 if pos > 2048 else pos
1713 with open(fname + keyname, 'w') as f:
1714 f.write(buf[pos - prefix:pos + 2048])
1715 raise Exception(keyname + " found after disassociation")
1716
1717 def get_key_locations(buf, key, keyname):
1718 count = 0
1719 pos = 0
1720 while True:
1721 pos = buf.find(key, pos)
1722 if pos < 0:
1723 break
1724 logger.info("Found %s at %d" % (keyname, pos))
1725 context = 128;
1726 start = pos - context if pos > context else 0
1727 before = binascii.hexlify(buf[start:pos])
1728 context += len(key)
1729 end = pos + context if pos < len(buf) - context else len(buf) - context
1730 after = binascii.hexlify(buf[pos + len(key):end])
1731 logger.debug("Memory context %d-%d: %s|%s|%s" % (start, end, before, binascii.hexlify(key), after))
1732 count += 1
1733 pos += len(key)
1734 return count
1735
1736 def test_wpa2_psk_key_lifetime_in_memory(dev, apdev, params):
1737 """WPA2-PSK and PSK/PTK lifetime in memory"""
1738 ssid = "test-wpa2-psk"
1739 passphrase = 'qwertyuiop'
1740 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
1741 pmk = binascii.unhexlify(psk)
1742 p = hostapd.wpa2_params(ssid=ssid)
1743 p['wpa_psk'] = psk
1744 hapd = hostapd.add_ap(apdev[0], p)
1745
1746 pid = find_wpas_process(dev[0])
1747
1748 id = dev[0].connect(ssid, raw_psk=psk, scan_freq="2412",
1749 only_add_network=True)
1750
1751 logger.info("Checking keys in memory after network profile configuration")
1752 buf = read_process_memory(pid, pmk)
1753 get_key_locations(buf, pmk, "PMK")
1754
1755 dev[0].request("REMOVE_NETWORK all")
1756 logger.info("Checking keys in memory after network profile removal")
1757 buf = read_process_memory(pid, pmk)
1758 get_key_locations(buf, pmk, "PMK")
1759
1760 id = dev[0].connect(ssid, psk=passphrase, scan_freq="2412",
1761 only_add_network=True)
1762
1763 logger.info("Checking keys in memory before connection")
1764 buf = read_process_memory(pid, pmk)
1765 get_key_locations(buf, pmk, "PMK")
1766
1767 dev[0].connect_network(id, timeout=20)
1768 # The decrypted copy of GTK is freed only after the CTRL-EVENT-CONNECTED
1769 # event has been delivered, so verify that wpa_supplicant has returned to
1770 # eloop before reading process memory.
1771 time.sleep(1)
1772 dev[0].ping()
1773
1774 buf = read_process_memory(pid, pmk)
1775
1776 dev[0].request("DISCONNECT")
1777 dev[0].wait_disconnected()
1778
1779 dev[0].relog()
1780 ptk = None
1781 gtk = None
1782 with open(os.path.join(params['logdir'], 'log0'), 'r') as f:
1783 for l in f.readlines():
1784 if "WPA: PTK - hexdump" in l:
1785 val = l.strip().split(':')[3].replace(' ', '')
1786 ptk = binascii.unhexlify(val)
1787 if "WPA: Group Key - hexdump" in l:
1788 val = l.strip().split(':')[3].replace(' ', '')
1789 gtk = binascii.unhexlify(val)
1790 if not pmk or not ptk or not gtk:
1791 raise Exception("Could not find keys from debug log")
1792 if len(gtk) != 16:
1793 raise Exception("Unexpected GTK length")
1794
1795 kck = ptk[0:16]
1796 kek = ptk[16:32]
1797 tk = ptk[32:48]
1798
1799 logger.info("Checking keys in memory while associated")
1800 get_key_locations(buf, pmk, "PMK")
1801 if pmk not in buf:
1802 raise HwsimSkip("PMK not found while associated")
1803 if kck not in buf:
1804 raise Exception("KCK not found while associated")
1805 if kek not in buf:
1806 raise Exception("KEK not found while associated")
1807 if tk in buf:
1808 raise Exception("TK found from memory")
1809 if gtk in buf:
1810 get_key_locations(buf, gtk, "GTK")
1811 raise Exception("GTK found from memory")
1812
1813 logger.info("Checking keys in memory after disassociation")
1814 buf = read_process_memory(pid, pmk)
1815 get_key_locations(buf, pmk, "PMK")
1816
1817 # Note: PMK/PSK is still present in network configuration
1818
1819 fname = os.path.join(params['logdir'],
1820 'wpa2_psk_key_lifetime_in_memory.memctx-')
1821 verify_not_present(buf, kck, fname, "KCK")
1822 verify_not_present(buf, kek, fname, "KEK")
1823 verify_not_present(buf, tk, fname, "TK")
1824 verify_not_present(buf, gtk, fname, "GTK")
1825
1826 dev[0].request("REMOVE_NETWORK all")
1827
1828 logger.info("Checking keys in memory after network profile removal")
1829 buf = read_process_memory(pid, pmk)
1830 get_key_locations(buf, pmk, "PMK")
1831
1832 verify_not_present(buf, pmk, fname, "PMK")
1833 verify_not_present(buf, kck, fname, "KCK")
1834 verify_not_present(buf, kek, fname, "KEK")
1835 verify_not_present(buf, tk, fname, "TK")
1836 verify_not_present(buf, gtk, fname, "GTK")
1837
1838 def test_ap_wpa2_psk_wep(dev, apdev):
1839 """WPA2-PSK AP and WEP enabled"""
1840 ssid = "test-wpa2-psk"
1841 passphrase = 'qwertyuiop'
1842 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
1843 hapd = hostapd.add_ap(apdev[0], params)
1844 try:
1845 hapd.set('wep_key0', '"hello"')
1846 raise Exception("WEP key accepted to WPA2 network")
1847 except Exception:
1848 pass
1849
1850 def test_ap_wpa2_psk_wpas_in_bridge(dev, apdev):
1851 """WPA2-PSK AP and wpas interface in a bridge"""
1852 br_ifname='sta-br0'
1853 ifname='wlan5'
1854 try:
1855 _test_ap_wpa2_psk_wpas_in_bridge(dev, apdev)
1856 finally:
1857 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
1858 subprocess.call(['brctl', 'delif', br_ifname, ifname])
1859 subprocess.call(['brctl', 'delbr', br_ifname])
1860 subprocess.call(['iw', ifname, 'set', '4addr', 'off'])
1861
1862 def _test_ap_wpa2_psk_wpas_in_bridge(dev, apdev):
1863 ssid = "test-wpa2-psk"
1864 passphrase = 'qwertyuiop'
1865 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
1866 hapd = hostapd.add_ap(apdev[0], params)
1867
1868 br_ifname='sta-br0'
1869 ifname='wlan5'
1870 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1871 subprocess.call(['brctl', 'addbr', br_ifname])
1872 subprocess.call(['brctl', 'setfd', br_ifname, '0'])
1873 subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
1874 subprocess.call(['iw', ifname, 'set', '4addr', 'on'])
1875 subprocess.check_call(['brctl', 'addif', br_ifname, ifname])
1876 wpas.interface_add(ifname, br_ifname=br_ifname)
1877 wpas.dump_monitor()
1878
1879 wpas.connect(ssid, psk=passphrase, scan_freq="2412")
1880 wpas.dump_monitor()
1881
1882 def test_ap_wpa2_psk_ifdown(dev, apdev):
1883 """AP with open mode and external ifconfig down"""
1884 ssid = "test-wpa2-psk"
1885 passphrase = 'qwertyuiop'
1886 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
1887 hapd = hostapd.add_ap(apdev[0], params)
1888 bssid = apdev[0]['bssid']
1889
1890 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
1891 hapd.cmd_execute(['ip', 'link', 'set', 'dev', apdev[0]['ifname'], 'down'])
1892 ev = hapd.wait_event(["INTERFACE-DISABLED"], timeout=10)
1893 if ev is None:
1894 raise Exception("No INTERFACE-DISABLED event")
1895 # this wait tests beacon loss detection in mac80211
1896 dev[0].wait_disconnected()
1897 hapd.cmd_execute(['ip', 'link', 'set', 'dev', apdev[0]['ifname'], 'up'])
1898 ev = hapd.wait_event(["INTERFACE-ENABLED"], timeout=10)
1899 if ev is None:
1900 raise Exception("No INTERFACE-ENABLED event")
1901 dev[0].wait_connected()
1902 hwsim_utils.test_connectivity(dev[0], hapd)
1903
1904 def test_ap_wpa2_psk_drop_first_msg_4(dev, apdev):
1905 """WPA2-PSK and first EAPOL-Key msg 4/4 dropped"""
1906 bssid = apdev[0]['bssid']
1907 ssid = "test-wpa2-psk"
1908 passphrase = 'qwertyuiop'
1909 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
1910 params = hostapd.wpa2_params(ssid=ssid)
1911 params['wpa_psk'] = psk
1912 hapd = hostapd.add_ap(apdev[0], params)
1913 hapd.request("SET ext_eapol_frame_io 1")
1914 dev[0].request("SET ext_eapol_frame_io 1")
1915 dev[0].connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False)
1916 addr = dev[0].own_addr()
1917
1918 # EAPOL-Key msg 1/4
1919 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
1920 if ev is None:
1921 raise Exception("Timeout on EAPOL-TX from hostapd")
1922 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
1923 if "OK" not in res:
1924 raise Exception("EAPOL_RX to wpa_supplicant failed")
1925
1926 # EAPOL-Key msg 2/4
1927 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
1928 if ev is None:
1929 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
1930 res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
1931 if "OK" not in res:
1932 raise Exception("EAPOL_RX to hostapd failed")
1933
1934 # EAPOL-Key msg 3/4
1935 ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
1936 if ev is None:
1937 raise Exception("Timeout on EAPOL-TX from hostapd")
1938 res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
1939 if "OK" not in res:
1940 raise Exception("EAPOL_RX to wpa_supplicant failed")
1941
1942 # EAPOL-Key msg 4/4
1943 ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
1944 if ev is None:
1945 raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
1946 logger.info("Drop the first EAPOL-Key msg 4/4")
1947
1948 # wpa_supplicant believes now that 4-way handshake succeeded; hostapd
1949 # doesn't. Use normal EAPOL TX/RX to handle retries.
1950 hapd.request("SET ext_eapol_frame_io 0")
1951 dev[0].request("SET ext_eapol_frame_io 0")
1952 dev[0].wait_connected()
1953
1954 ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15)
1955 if ev is None:
1956 raise Exception("Timeout on AP-STA-CONNECTED from hostapd")
1957
1958 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.1)
1959 if ev is not None:
1960 logger.info("Disconnection detected")
1961 # The EAPOL-Key retries are supposed to allow the connection to be
1962 # established without having to reassociate. However, this does not
1963 # currently work since mac80211 ends up encrypting EAPOL-Key msg 4/4
1964 # after the pairwise key has been configured and AP will drop those and
1965 # disconnect the station after reaching retransmission limit. Connection
1966 # is then established after reassociation. Once that behavior has been
1967 # optimized to prevent EAPOL-Key frame encryption for retransmission
1968 # case, this exception can be uncommented here.
1969 #raise Exception("Unexpected disconnection")
1970
1971 def test_ap_wpa2_psk_disable_enable(dev, apdev):
1972 """WPA2-PSK AP getting disabled and re-enabled"""
1973 ssid = "test-wpa2-psk"
1974 passphrase = 'qwertyuiop'
1975 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
1976 params = hostapd.wpa2_params(ssid=ssid)
1977 params['wpa_psk'] = psk
1978 hapd = hostapd.add_ap(apdev[0], params)
1979 dev[0].connect(ssid, raw_psk=psk, scan_freq="2412")
1980
1981 for i in range(2):
1982 hapd.request("DISABLE")
1983 dev[0].wait_disconnected()
1984 hapd.request("ENABLE")
1985 dev[0].wait_connected()
1986 hwsim_utils.test_connectivity(dev[0], hapd)
1987
1988 def test_ap_wpa2_psk_incorrect_passphrase(dev, apdev):
1989 """WPA2-PSK AP and station using incorrect passphrase"""
1990 ssid = "test-wpa2-psk"
1991 passphrase = 'qwertyuiop'
1992 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
1993 hapd = hostapd.add_ap(apdev[0], params)
1994 dev[0].connect(ssid, psk="incorrect passphrase", scan_freq="2412",
1995 wait_connect=False)
1996 ev = hapd.wait_event(["AP-STA-POSSIBLE-PSK-MISMATCH"], timeout=10)
1997 if ev is None:
1998 raise Exception("No AP-STA-POSSIBLE-PSK-MISMATCH reported")
1999 dev[0].dump_monitor()
2000
2001 hapd.disable()
2002 hapd.set("wpa_passphrase", "incorrect passphrase")
2003 hapd.enable()
2004
2005 dev[0].wait_connected(timeout=20)
2006
2007 def test_ap_wpa_ie_parsing(dev, apdev):
2008 """WPA IE parsing"""
2009 skip_with_fips(dev[0])
2010 ssid = "test-wpa-psk"
2011 passphrase = 'qwertyuiop'
2012 params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
2013 hapd = hostapd.add_ap(apdev[0], params)
2014 id = dev[0].connect(ssid, psk=passphrase, scan_freq="2412",
2015 only_add_network=True)
2016
2017 tests = [ "dd040050f201",
2018 "dd050050f20101",
2019 "dd060050f2010100",
2020 "dd060050f2010001",
2021 "dd070050f201010000",
2022 "dd080050f20101000050",
2023 "dd090050f20101000050f2",
2024 "dd0a0050f20101000050f202",
2025 "dd0b0050f20101000050f20201",
2026 "dd0c0050f20101000050f2020100",
2027 "dd0c0050f20101000050f2020000",
2028 "dd0c0050f20101000050f202ffff",
2029 "dd0d0050f20101000050f202010000",
2030 "dd0e0050f20101000050f20201000050",
2031 "dd0f0050f20101000050f20201000050f2",
2032 "dd100050f20101000050f20201000050f202",
2033 "dd110050f20101000050f20201000050f20201",
2034 "dd120050f20101000050f20201000050f2020100",
2035 "dd120050f20101000050f20201000050f2020000",
2036 "dd120050f20101000050f20201000050f202ffff",
2037 "dd130050f20101000050f20201000050f202010000",
2038 "dd140050f20101000050f20201000050f20201000050",
2039 "dd150050f20101000050f20201000050f20201000050f2" ]
2040 for t in tests:
2041 try:
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 ev = dev[0].wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=10)
2046 if ev is None:
2047 raise Exception("Association rejection not reported")
2048 dev[0].request("DISCONNECT")
2049 dev[0].dump_monitor()
2050 finally:
2051 dev[0].request("VENDOR_ELEM_REMOVE 13 *")
2052
2053 tests = [ "dd170050f20101000050f20201000050f20201000050f202ff",
2054 "dd180050f20101000050f20201000050f20201000050f202ffff",
2055 "dd190050f20101000050f20201000050f20201000050f202ffffff" ]
2056 for t in tests:
2057 try:
2058 if "OK" not in dev[0].request("VENDOR_ELEM_ADD 13 " + t):
2059 raise Exception("VENDOR_ELEM_ADD failed")
2060 dev[0].select_network(id)
2061 dev[0].wait_connected()
2062 dev[0].request("DISCONNECT")
2063 dev[0].dump_monitor()
2064 finally:
2065 dev[0].request("VENDOR_ELEM_REMOVE 13 *")
2066
2067 def test_ap_wpa2_psk_no_random(dev, apdev):
2068 """WPA2-PSK AP and no random numbers available"""
2069 ssid = "test-wpa2-psk"
2070 passphrase = 'qwertyuiop'
2071 psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
2072 params = hostapd.wpa2_params(ssid=ssid)
2073 params['wpa_psk'] = psk
2074 hapd = hostapd.add_ap(apdev[0], params)
2075 with fail_test(hapd, 1, "wpa_gmk_to_gtk"):
2076 id = dev[0].connect(ssid, raw_psk=psk, scan_freq="2412",
2077 wait_connect=False)
2078 ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=15)
2079 if ev is None:
2080 raise Exception("Disconnection event not reported")
2081 dev[0].request("DISCONNECT")
2082 dev[0].select_network(id, freq=2412)
2083 dev[0].wait_connected()
2084
2085 def test_rsn_ie_proto_psk_sta(dev, apdev):
2086 """RSN element protocol testing for PSK cases on STA side"""
2087 bssid = apdev[0]['bssid']
2088 ssid = "test-wpa2-psk"
2089 passphrase = 'qwertyuiop'
2090 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
2091 # This is the RSN element used normally by hostapd
2092 params['own_ie_override'] = '30140100000fac040100000fac040100000fac020c00'
2093 hapd = hostapd.add_ap(apdev[0], params)
2094 if "FAIL" not in hapd.request("SET own_ie_override qwerty"):
2095 raise Exception("Invalid own_ie_override value accepted")
2096 id = dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
2097
2098 tests = [ ('No RSN Capabilities field',
2099 '30120100000fac040100000fac040100000fac02'),
2100 ('Reserved RSN Capabilities bits set',
2101 '30140100000fac040100000fac040100000fac023cff'),
2102 ('Extra pairwise cipher suite (unsupported)',
2103 '30180100000fac040200ffffffff000fac040100000fac020c00'),
2104 ('Extra AKM suite (unsupported)',
2105 '30180100000fac040100000fac040200ffffffff000fac020c00'),
2106 ('PMKIDCount field included',
2107 '30160100000fac040100000fac040100000fac020c000000'),
2108 ('Unexpected Group Management Cipher Suite with PMF disabled',
2109 '301a0100000fac040100000fac040100000fac020c000000000fac06'),
2110 ('Extra octet after defined fields (future extensibility)',
2111 '301b0100000fac040100000fac040100000fac020c000000000fac0600') ]
2112 for txt,ie in tests:
2113 dev[0].request("DISCONNECT")
2114 dev[0].wait_disconnected()
2115 logger.info(txt)
2116 hapd.disable()
2117 hapd.set('own_ie_override', ie)
2118 hapd.enable()
2119 dev[0].request("BSS_FLUSH 0")
2120 dev[0].scan_for_bss(bssid, 2412, force_scan=True, only_new=True)
2121 dev[0].select_network(id, freq=2412)
2122 dev[0].wait_connected()
2123
2124 def test_ap_cli_order(dev, apdev):
2125 ssid = "test-rsn-setup"
2126 passphrase = 'zzzzzzzz'
2127
2128 hapd = hostapd.add_ap(apdev[0], {}, no_enable=True)
2129 hapd.set('ssid', ssid)
2130 hapd.set('wpa_passphrase', passphrase)
2131 hapd.set('rsn_pairwise', 'CCMP')
2132 hapd.set('wpa_key_mgmt', 'WPA-PSK')
2133 hapd.set('wpa', '2')
2134 hapd.enable()
2135 cfg = hapd.get_config()
2136 if cfg['group_cipher'] != 'CCMP':
2137 raise Exception("Unexpected group_cipher: " + cfg['group_cipher'])
2138 if cfg['rsn_pairwise_cipher'] != 'CCMP':
2139 raise Exception("Unexpected rsn_pairwise_cipher: " + cfg['rsn_pairwise_cipher'])
2140
2141 ev = hapd.wait_event(["AP-ENABLED", "AP-DISABLED"], timeout=30)
2142 if ev is None:
2143 raise Exception("AP startup timed out")
2144 if "AP-ENABLED" not in ev:
2145 raise Exception("AP startup failed")
2146
2147 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
2148
2149 def set_test_assoc_ie(dev, ie):
2150 if "OK" not in dev.request("TEST_ASSOC_IE " + ie):
2151 raise Exception("Could not set TEST_ASSOC_IE")
2152
2153 def test_ap_wpa2_psk_assoc_rsn(dev, apdev):
2154 """WPA2-PSK AP and association request RSN IE differences"""
2155 ssid = "test-wpa2-psk"
2156 passphrase = 'qwertyuiop'
2157 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
2158 hapd = hostapd.add_ap(apdev[0], params)
2159
2160 tests = [ ("Normal wpa_supplicant assoc req RSN IE",
2161 "30140100000fac040100000fac040100000fac020000"),
2162 ("RSN IE without RSN Capabilities",
2163 "30120100000fac040100000fac040100000fac02") ]
2164 for title, ie in tests:
2165 logger.info(title)
2166 set_test_assoc_ie(dev[0], ie)
2167 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
2168 dev[0].request("REMOVE_NETWORK all")
2169 dev[0].wait_disconnected()
2170
2171 tests = [ ("WPA IE instead of RSN IE and only RSN enabled on AP",
2172 "dd160050f20101000050f20201000050f20201000050f202", 40),
2173 ("Empty RSN IE", "3000", 40),
2174 ("RSN IE with truncated Version", "300101", 40),
2175 ("RSN IE with only Version", "30020100", 43) ]
2176 for title, ie, status in tests:
2177 logger.info(title)
2178 set_test_assoc_ie(dev[0], ie)
2179 dev[0].connect(ssid, psk=passphrase, scan_freq="2412",
2180 wait_connect=False)
2181 ev = dev[0].wait_event(["CTRL-EVENT-ASSOC-REJECT"])
2182 if ev is None:
2183 raise Exception("Association rejection not reported")
2184 if "status_code=" + str(status) not in ev:
2185 raise Exception("Unexpected status code: " + ev)
2186 dev[0].request("REMOVE_NETWORK all")
2187 dev[0].dump_monitor()