test_ap_psk.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  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. import logging
  7. logger = logging.getLogger()
  8. import os
  9. import subprocess
  10. import time
  11. import hostapd
  12. import hwsim_utils
  13. def check_mib(dev, vals):
  14. mib = dev.get_mib()
  15. for v in vals:
  16. if mib[v[0]] != v[1]:
  17. raise Exception("Unexpected {} = {} (expected {})".format(v[0], mib[v[0]], v[1]))
  18. def test_ap_wpa2_psk(dev, apdev):
  19. """WPA2-PSK AP with PSK instead of passphrase"""
  20. ssid = "test-wpa2-psk"
  21. passphrase = 'qwertyuiop'
  22. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  23. params = hostapd.wpa2_params(ssid=ssid)
  24. params['wpa_psk'] = psk
  25. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  26. key_mgmt = hapd.get_config()['key_mgmt']
  27. if key_mgmt.split(' ')[0] != "WPA-PSK":
  28. raise Exception("Unexpected GET_CONFIG(key_mgmt): " + key_mgmt)
  29. dev[0].connect(ssid, raw_psk=psk, scan_freq="2412")
  30. dev[1].connect(ssid, psk=passphrase, scan_freq="2412")
  31. sig = dev[0].request("SIGNAL_POLL").splitlines()
  32. pkt = dev[0].request("PKTCNT_POLL").splitlines()
  33. if "FREQUENCY=2412" not in sig:
  34. raise Exception("Unexpected SIGNAL_POLL value: " + str(sig))
  35. if "TXBAD=0" not in pkt:
  36. raise Exception("Unexpected TXBAD value: " + str(pkt))
  37. def test_ap_wpa2_psk_file(dev, apdev):
  38. """WPA2-PSK AP with PSK from a file"""
  39. ssid = "test-wpa2-psk"
  40. passphrase = 'qwertyuiop'
  41. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  42. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  43. params['wpa_psk_file'] = 'hostapd.wpa_psk'
  44. hostapd.add_ap(apdev[0]['ifname'], params)
  45. dev[1].connect(ssid, psk="very secret", scan_freq="2412", wait_connect=False)
  46. dev[2].connect(ssid, raw_psk=psk, scan_freq="2412")
  47. dev[2].request("REMOVE_NETWORK all")
  48. dev[0].connect(ssid, psk="very secret", scan_freq="2412")
  49. dev[0].request("REMOVE_NETWORK all")
  50. dev[2].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412")
  51. dev[0].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412")
  52. ev = dev[1].wait_event(["WPA: 4-Way Handshake failed"], timeout=10)
  53. if ev is None:
  54. raise Exception("Timed out while waiting for failure report")
  55. dev[1].request("REMOVE_NETWORK all")
  56. def test_ap_wpa2_ptk_rekey(dev, apdev):
  57. """WPA2-PSK AP and PTK rekey enforced by station"""
  58. ssid = "test-wpa2-psk"
  59. passphrase = 'qwertyuiop'
  60. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  61. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  62. dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
  63. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  64. if ev is None:
  65. raise Exception("PTK rekey timed out")
  66. hwsim_utils.test_connectivity(dev[0], hapd)
  67. def test_ap_wpa2_ptk_rekey_ap(dev, apdev):
  68. """WPA2-PSK AP and PTK rekey enforced by AP"""
  69. ssid = "test-wpa2-psk"
  70. passphrase = 'qwertyuiop'
  71. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  72. params['wpa_ptk_rekey'] = '2'
  73. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  74. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  75. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  76. if ev is None:
  77. raise Exception("PTK rekey timed out")
  78. hwsim_utils.test_connectivity(dev[0], hapd)
  79. def test_ap_wpa2_sha256_ptk_rekey(dev, apdev):
  80. """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by station"""
  81. ssid = "test-wpa2-psk"
  82. passphrase = 'qwertyuiop'
  83. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  84. params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
  85. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  86. dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
  87. wpa_ptk_rekey="1", scan_freq="2412")
  88. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  89. if ev is None:
  90. raise Exception("PTK rekey timed out")
  91. hwsim_utils.test_connectivity(dev[0], hapd)
  92. check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"),
  93. ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ])
  94. def test_ap_wpa2_sha256_ptk_rekey_ap(dev, apdev):
  95. """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by AP"""
  96. ssid = "test-wpa2-psk"
  97. passphrase = 'qwertyuiop'
  98. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  99. params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
  100. params['wpa_ptk_rekey'] = '2'
  101. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  102. dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
  103. scan_freq="2412")
  104. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  105. if ev is None:
  106. raise Exception("PTK rekey timed out")
  107. hwsim_utils.test_connectivity(dev[0], hapd)
  108. check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"),
  109. ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ])
  110. def test_ap_wpa_ptk_rekey(dev, apdev):
  111. """WPA-PSK/TKIP AP and PTK rekey enforced by station"""
  112. ssid = "test-wpa-psk"
  113. passphrase = 'qwertyuiop'
  114. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  115. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  116. dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
  117. if "[WPA-PSK-TKIP]" not in dev[0].request("SCAN_RESULTS"):
  118. raise Exception("Scan results missing WPA element info")
  119. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  120. if ev is None:
  121. raise Exception("PTK rekey timed out")
  122. hwsim_utils.test_connectivity(dev[0], hapd)
  123. def test_ap_wpa_ptk_rekey_ap(dev, apdev):
  124. """WPA-PSK/TKIP AP and PTK rekey enforced by AP"""
  125. ssid = "test-wpa-psk"
  126. passphrase = 'qwertyuiop'
  127. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  128. params['wpa_ptk_rekey'] = '2'
  129. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  130. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  131. ev = dev[0].wait_event(["WPA: Key negotiation completed"], timeout=10)
  132. if ev is None:
  133. raise Exception("PTK rekey timed out")
  134. hwsim_utils.test_connectivity(dev[0], hapd)
  135. def test_ap_wpa_ccmp(dev, apdev):
  136. """WPA-PSK/CCMP"""
  137. ssid = "test-wpa-psk"
  138. passphrase = 'qwertyuiop'
  139. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  140. params['wpa_pairwise'] = "CCMP"
  141. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  142. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  143. hwsim_utils.test_connectivity(dev[0], hapd)
  144. check_mib(dev[0], [ ("dot11RSNAConfigGroupCipherSize", "128"),
  145. ("dot11RSNAGroupCipherRequested", "00-50-f2-4"),
  146. ("dot11RSNAPairwiseCipherRequested", "00-50-f2-4"),
  147. ("dot11RSNAAuthenticationSuiteRequested", "00-50-f2-2"),
  148. ("dot11RSNAGroupCipherSelected", "00-50-f2-4"),
  149. ("dot11RSNAPairwiseCipherSelected", "00-50-f2-4"),
  150. ("dot11RSNAAuthenticationSuiteSelected", "00-50-f2-2"),
  151. ("dot1xSuppSuppControlledPortStatus", "Authorized") ])
  152. def test_ap_wpa2_psk_file(dev, apdev):
  153. """WPA2-PSK AP with various PSK file error and success cases"""
  154. addr0 = dev[0].p2p_dev_addr()
  155. addr1 = dev[1].p2p_dev_addr()
  156. addr2 = dev[2].p2p_dev_addr()
  157. ssid = "psk"
  158. pskfile = "/tmp/ap_wpa2_psk_file_errors.psk_file"
  159. try:
  160. os.remove(pskfile)
  161. except:
  162. pass
  163. params = { "ssid": ssid, "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
  164. "rsn_pairwise": "CCMP", "wpa_psk_file": pskfile }
  165. try:
  166. # missing PSK file
  167. hapd = hostapd.add_ap(apdev[0]['ifname'], params, no_enable=True)
  168. if "FAIL" not in hapd.request("ENABLE"):
  169. raise Exception("Unexpected ENABLE success")
  170. hapd.request("DISABLE")
  171. # invalid MAC address
  172. with open(pskfile, "w") as f:
  173. f.write("\n")
  174. f.write("foo\n")
  175. if "FAIL" not in hapd.request("ENABLE"):
  176. raise Exception("Unexpected ENABLE success")
  177. hapd.request("DISABLE")
  178. # no PSK on line
  179. with open(pskfile, "w") as f:
  180. f.write("00:11:22:33:44:55\n")
  181. if "FAIL" not in hapd.request("ENABLE"):
  182. raise Exception("Unexpected ENABLE success")
  183. hapd.request("DISABLE")
  184. # invalid PSK
  185. with open(pskfile, "w") as f:
  186. f.write("00:11:22:33:44:55 1234567\n")
  187. if "FAIL" not in hapd.request("ENABLE"):
  188. raise Exception("Unexpected ENABLE success")
  189. hapd.request("DISABLE")
  190. # valid PSK file
  191. with open(pskfile, "w") as f:
  192. f.write("00:11:22:33:44:55 12345678\n")
  193. f.write(addr0 + " 123456789\n")
  194. f.write(addr1 + " 123456789a\n")
  195. f.write(addr2 + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\n")
  196. if "FAIL" in hapd.request("ENABLE"):
  197. raise Exception("Unexpected ENABLE failure")
  198. dev[0].connect(ssid, psk="123456789", scan_freq="2412")
  199. dev[1].connect(ssid, psk="123456789a", scan_freq="2412")
  200. dev[2].connect(ssid, raw_psk="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", scan_freq="2412")
  201. finally:
  202. try:
  203. os.remove(pskfile)
  204. except:
  205. pass
  206. def test_ap_wpa2_psk_wildcard_ssid(dev, apdev):
  207. """WPA2-PSK AP and wildcard SSID configuration"""
  208. ssid = "test-wpa2-psk"
  209. passphrase = 'qwertyuiop'
  210. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  211. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  212. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  213. dev[0].connect("", bssid=apdev[0]['bssid'], psk=passphrase,
  214. scan_freq="2412")
  215. dev[1].connect("", bssid=apdev[0]['bssid'], raw_psk=psk, scan_freq="2412")
  216. def test_ap_wpa2_gtk_rekey(dev, apdev):
  217. """WPA2-PSK AP and GTK rekey enforced by AP"""
  218. ssid = "test-wpa2-psk"
  219. passphrase = 'qwertyuiop'
  220. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  221. params['wpa_group_rekey'] = '1'
  222. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  223. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  224. ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
  225. if ev is None:
  226. raise Exception("GTK rekey timed out")
  227. hwsim_utils.test_connectivity(dev[0], hapd)
  228. def test_ap_wpa_gtk_rekey(dev, apdev):
  229. """WPA-PSK/TKIP AP and GTK rekey enforced by AP"""
  230. ssid = "test-wpa-psk"
  231. passphrase = 'qwertyuiop'
  232. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  233. params['wpa_group_rekey'] = '1'
  234. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  235. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  236. ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
  237. if ev is None:
  238. raise Exception("GTK rekey timed out")
  239. hwsim_utils.test_connectivity(dev[0], hapd)
  240. def test_ap_wpa2_gmk_rekey(dev, apdev):
  241. """WPA2-PSK AP and GMK and GTK rekey enforced by AP"""
  242. ssid = "test-wpa2-psk"
  243. passphrase = 'qwertyuiop'
  244. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  245. params['wpa_group_rekey'] = '1'
  246. params['wpa_gmk_rekey'] = '2'
  247. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  248. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  249. for i in range(0, 3):
  250. ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
  251. if ev is None:
  252. raise Exception("GTK rekey timed out")
  253. hwsim_utils.test_connectivity(dev[0], hapd)
  254. def test_ap_wpa2_strict_rekey(dev, apdev):
  255. """WPA2-PSK AP and strict GTK rekey enforced by AP"""
  256. ssid = "test-wpa2-psk"
  257. passphrase = 'qwertyuiop'
  258. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  259. params['wpa_strict_rekey'] = '1'
  260. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  261. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  262. dev[1].connect(ssid, psk=passphrase, scan_freq="2412")
  263. dev[1].request("DISCONNECT")
  264. ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
  265. if ev is None:
  266. raise Exception("GTK rekey timed out")
  267. hwsim_utils.test_connectivity(dev[0], hapd)
  268. def test_ap_wpa2_bridge_fdb(dev, apdev):
  269. """Bridge FDB entry removal"""
  270. try:
  271. ssid = "test-wpa2-psk"
  272. passphrase = "12345678"
  273. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  274. params['bridge'] = 'ap-br0'
  275. hostapd.add_ap(apdev[0]['ifname'], params)
  276. subprocess.call(['sudo', 'brctl', 'setfd', 'ap-br0', '0'])
  277. subprocess.call(['sudo', 'ip', 'link', 'set', 'dev', 'ap-br0', 'up'])
  278. dev[0].connect(ssid, psk=passphrase, scan_freq="2412",
  279. bssid=apdev[0]['bssid'])
  280. dev[1].connect(ssid, psk=passphrase, scan_freq="2412",
  281. bssid=apdev[0]['bssid'])
  282. addr0 = dev[0].p2p_interface_addr()
  283. hwsim_utils.test_connectivity_sta(dev[0], dev[1])
  284. cmd = subprocess.Popen(['brctl', 'showmacs', 'ap-br0'],
  285. stdout=subprocess.PIPE)
  286. macs1 = cmd.stdout.read()
  287. dev[0].request("DISCONNECT")
  288. dev[1].request("DISCONNECT")
  289. time.sleep(1)
  290. cmd = subprocess.Popen(['brctl', 'showmacs', 'ap-br0'],
  291. stdout=subprocess.PIPE)
  292. macs2 = cmd.stdout.read()
  293. addr1 = dev[1].p2p_interface_addr()
  294. if addr0 not in macs1 or addr1 not in macs1:
  295. raise Exception("Bridge FDB entry missing")
  296. if addr0 in macs2 or addr1 in macs2:
  297. raise Exception("Bridge FDB entry was not removed")
  298. finally:
  299. subprocess.call(['sudo', 'ip', 'link', 'set', 'dev', 'ap-br0', 'down'])
  300. subprocess.call(['sudo', 'brctl', 'delbr', 'ap-br0'])
  301. def test_ap_wpa2_already_in_bridge(dev, apdev):
  302. """hostapd behavior with interface already in bridge"""
  303. ifname = apdev[0]['ifname']
  304. br_ifname = 'ext-ap-br0'
  305. try:
  306. ssid = "test-wpa2-psk"
  307. passphrase = "12345678"
  308. subprocess.call(['brctl', 'addbr', br_ifname])
  309. subprocess.call(['brctl', 'setfd', br_ifname, '0'])
  310. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
  311. subprocess.call(['iw', ifname, 'set', 'type', '__ap'])
  312. subprocess.call(['brctl', 'addif', br_ifname, ifname])
  313. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  314. hapd = hostapd.add_ap(ifname, params)
  315. if hapd.get_driver_status_field('brname') != br_ifname:
  316. raise Exception("Bridge name not identified correctly")
  317. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  318. finally:
  319. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
  320. subprocess.call(['brctl', 'delif', br_ifname, ifname])
  321. subprocess.call(['iw', ifname, 'set', 'type', 'station'])
  322. subprocess.call(['brctl', 'delbr', br_ifname])
  323. def test_ap_wpa2_ext_add_to_bridge(dev, apdev):
  324. """hostapd behavior with interface added to bridge externally"""
  325. ifname = apdev[0]['ifname']
  326. br_ifname = 'ext-ap-br0'
  327. try:
  328. ssid = "test-wpa2-psk"
  329. passphrase = "12345678"
  330. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  331. hapd = hostapd.add_ap(ifname, params)
  332. subprocess.call(['brctl', 'addbr', br_ifname])
  333. subprocess.call(['brctl', 'setfd', br_ifname, '0'])
  334. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
  335. subprocess.call(['brctl', 'addif', br_ifname, ifname])
  336. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  337. if hapd.get_driver_status_field('brname') != br_ifname:
  338. raise Exception("Bridge name not identified correctly")
  339. finally:
  340. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
  341. subprocess.call(['brctl', 'delif', br_ifname, ifname])
  342. subprocess.call(['brctl', 'delbr', br_ifname])
  343. def test_ap_wpa2_psk_ext(dev, apdev):
  344. """WPA2-PSK AP using external EAPOL I/O"""
  345. bssid = apdev[0]['bssid']
  346. ssid = "test-wpa2-psk"
  347. passphrase = 'qwertyuiop'
  348. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  349. params = hostapd.wpa2_params(ssid=ssid)
  350. params['wpa_psk'] = psk
  351. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  352. hapd.request("SET ext_eapol_frame_io 1")
  353. dev[0].request("SET ext_eapol_frame_io 1")
  354. dev[0].connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False)
  355. addr = dev[0].p2p_interface_addr()
  356. while True:
  357. ev = hapd.wait_event(["EAPOL-TX", "AP-STA-CONNECTED"], timeout=15)
  358. if ev is None:
  359. raise Exception("Timeout on EAPOL-TX from hostapd")
  360. if "AP-STA-CONNECTED" in ev:
  361. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
  362. if ev is None:
  363. raise Exception("Timeout on connection event from wpa_supplicant")
  364. break
  365. res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
  366. if "OK" not in res:
  367. raise Exception("EAPOL_RX to wpa_supplicant failed")
  368. ev = dev[0].wait_event(["EAPOL-TX", "CTRL-EVENT-CONNECTED"], timeout=15)
  369. if ev is None:
  370. raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
  371. if "CTRL-EVENT-CONNECTED" in ev:
  372. break
  373. res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
  374. if "OK" not in res:
  375. raise Exception("EAPOL_RX to hostapd failed")