test_ap_eap.py 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # WPA2-Enterprise tests
  5. # Copyright (c) 2013-2014, Jouni Malinen <j@w1.fi>
  6. #
  7. # This software may be distributed under the terms of the BSD license.
  8. # See README for more details.
  9. import time
  10. import subprocess
  11. import logging
  12. logger = logging.getLogger()
  13. import os.path
  14. import hwsim_utils
  15. import hostapd
  16. def eap_connect(dev, ap, method, identity,
  17. sha256=False, expect_failure=False, local_error_report=False,
  18. **kwargs):
  19. hapd = hostapd.Hostapd(ap['ifname'])
  20. id = dev.connect("test-wpa2-eap", key_mgmt="WPA-EAP WPA-EAP-SHA256",
  21. eap=method, identity=identity,
  22. wait_connect=False, scan_freq="2412", ieee80211w="1",
  23. **kwargs)
  24. eap_check_auth(dev, method, True, sha256=sha256,
  25. expect_failure=expect_failure,
  26. local_error_report=local_error_report)
  27. if expect_failure:
  28. return id
  29. ev = hapd.wait_event([ "AP-STA-CONNECTED" ], timeout=5)
  30. if ev is None:
  31. raise Exception("No connection event received from hostapd")
  32. return id
  33. def eap_check_auth(dev, method, initial, rsn=True, sha256=False,
  34. expect_failure=False, local_error_report=False):
  35. ev = dev.wait_event(["CTRL-EVENT-EAP-STARTED"], timeout=10)
  36. if ev is None:
  37. raise Exception("Association and EAP start timed out")
  38. ev = dev.wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=10)
  39. if ev is None:
  40. raise Exception("EAP method selection timed out")
  41. if method not in ev:
  42. raise Exception("Unexpected EAP method")
  43. if expect_failure:
  44. ev = dev.wait_event(["CTRL-EVENT-EAP-FAILURE"])
  45. if ev is None:
  46. raise Exception("EAP failure timed out")
  47. ev = dev.wait_event(["CTRL-EVENT-DISCONNECTED"])
  48. if ev is None:
  49. raise Exception("Disconnection timed out")
  50. if not local_error_report:
  51. if "reason=23" not in ev:
  52. raise Exception("Proper reason code for disconnection not reported")
  53. return
  54. ev = dev.wait_event(["CTRL-EVENT-EAP-SUCCESS"], timeout=10)
  55. if ev is None:
  56. raise Exception("EAP success timed out")
  57. if initial:
  58. ev = dev.wait_event(["CTRL-EVENT-CONNECTED"], timeout=10)
  59. else:
  60. ev = dev.wait_event(["WPA: Key negotiation completed"], timeout=10)
  61. if ev is None:
  62. raise Exception("Association with the AP timed out")
  63. status = dev.get_status()
  64. if status["wpa_state"] != "COMPLETED":
  65. raise Exception("Connection not completed")
  66. if status["suppPortStatus"] != "Authorized":
  67. raise Exception("Port not authorized")
  68. if method not in status["selectedMethod"]:
  69. raise Exception("Incorrect EAP method status")
  70. if sha256:
  71. e = "WPA2-EAP-SHA256"
  72. elif rsn:
  73. e = "WPA2/IEEE 802.1X/EAP"
  74. else:
  75. e = "WPA/IEEE 802.1X/EAP"
  76. if status["key_mgmt"] != e:
  77. raise Exception("Unexpected key_mgmt status: " + status["key_mgmt"])
  78. def eap_reauth(dev, method, rsn=True, sha256=False):
  79. dev.request("REAUTHENTICATE")
  80. eap_check_auth(dev, method, False, rsn=rsn, sha256=sha256)
  81. def test_ap_wpa2_eap_sim(dev, apdev):
  82. """WPA2-Enterprise connection using EAP-SIM"""
  83. if not os.path.exists("/tmp/hlr_auc_gw.sock"):
  84. logger.info("No hlr_auc_gw available");
  85. return "skip"
  86. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  87. hostapd.add_ap(apdev[0]['ifname'], params)
  88. eap_connect(dev[0], apdev[0], "SIM", "1232010000000000",
  89. password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581")
  90. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  91. eap_reauth(dev[0], "SIM")
  92. logger.info("Negative test with incorrect key")
  93. dev[0].request("REMOVE_NETWORK all")
  94. eap_connect(dev[0], apdev[0], "SIM", "1232010000000000",
  95. password="ffdca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581",
  96. expect_failure=True)
  97. def test_ap_wpa2_eap_aka(dev, apdev):
  98. """WPA2-Enterprise connection using EAP-AKA"""
  99. if not os.path.exists("/tmp/hlr_auc_gw.sock"):
  100. logger.info("No hlr_auc_gw available");
  101. return "skip"
  102. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  103. hostapd.add_ap(apdev[0]['ifname'], params)
  104. eap_connect(dev[0], apdev[0], "AKA", "0232010000000000",
  105. password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123")
  106. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  107. eap_reauth(dev[0], "AKA")
  108. logger.info("Negative test with incorrect key")
  109. dev[0].request("REMOVE_NETWORK all")
  110. eap_connect(dev[0], apdev[0], "AKA", "0232010000000000",
  111. password="ffdca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123",
  112. expect_failure=True)
  113. def test_ap_wpa2_eap_aka_prime(dev, apdev):
  114. """WPA2-Enterprise connection using EAP-AKA'"""
  115. if not os.path.exists("/tmp/hlr_auc_gw.sock"):
  116. logger.info("No hlr_auc_gw available");
  117. return "skip"
  118. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  119. hostapd.add_ap(apdev[0]['ifname'], params)
  120. eap_connect(dev[0], apdev[0], "AKA'", "6555444333222111",
  121. password="5122250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123")
  122. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  123. eap_reauth(dev[0], "AKA'")
  124. logger.info("Negative test with incorrect key")
  125. dev[0].request("REMOVE_NETWORK all")
  126. eap_connect(dev[0], apdev[0], "AKA'", "6555444333222111",
  127. password="ff22250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123",
  128. expect_failure=True)
  129. def test_ap_wpa2_eap_ttls_pap(dev, apdev):
  130. """WPA2-Enterprise connection using EAP-TTLS/PAP"""
  131. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  132. hostapd.add_ap(apdev[0]['ifname'], params)
  133. eap_connect(dev[0], apdev[0], "TTLS", "pap user",
  134. anonymous_identity="ttls", password="password",
  135. ca_cert="auth_serv/ca.pem", phase2="auth=PAP",
  136. subject_match="/C=FI/O=w1.fi/CN=server.w1.fi",
  137. altsubject_match="EMAIL:noone@example.com;DNS:server.w1.fi;URI:http://example.com/")
  138. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  139. eap_reauth(dev[0], "TTLS")
  140. def test_ap_wpa2_eap_ttls_chap(dev, apdev):
  141. """WPA2-Enterprise connection using EAP-TTLS/CHAP"""
  142. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  143. hostapd.add_ap(apdev[0]['ifname'], params)
  144. eap_connect(dev[0], apdev[0], "TTLS", "chap user",
  145. anonymous_identity="ttls", password="password",
  146. ca_cert="auth_serv/ca.der", phase2="auth=CHAP")
  147. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  148. eap_reauth(dev[0], "TTLS")
  149. def test_ap_wpa2_eap_ttls_mschap(dev, apdev):
  150. """WPA2-Enterprise connection using EAP-TTLS/MSCHAP"""
  151. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  152. hostapd.add_ap(apdev[0]['ifname'], params)
  153. eap_connect(dev[0], apdev[0], "TTLS", "mschap user",
  154. anonymous_identity="ttls", password="password",
  155. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAP",
  156. domain_suffix_match="server.w1.fi")
  157. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  158. eap_reauth(dev[0], "TTLS")
  159. dev[0].request("REMOVE_NETWORK all")
  160. eap_connect(dev[0], apdev[0], "TTLS", "mschap user",
  161. anonymous_identity="ttls", password="password",
  162. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAP",
  163. fragment_size="200")
  164. def test_ap_wpa2_eap_ttls_mschapv2(dev, apdev):
  165. """WPA2-Enterprise connection using EAP-TTLS/MSCHAPv2"""
  166. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  167. hostapd.add_ap(apdev[0]['ifname'], params)
  168. hapd = hostapd.Hostapd(apdev[0]['ifname'])
  169. eap_connect(dev[0], apdev[0], "TTLS", "DOMAIN\mschapv2 user",
  170. anonymous_identity="ttls", password="password",
  171. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2",
  172. domain_suffix_match="w1.fi")
  173. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  174. sta1 = hapd.get_sta(dev[0].p2p_interface_addr())
  175. eapol1 = hapd.get_sta(dev[0].p2p_interface_addr(), info="eapol")
  176. eap_reauth(dev[0], "TTLS")
  177. sta2 = hapd.get_sta(dev[0].p2p_interface_addr())
  178. eapol2 = hapd.get_sta(dev[0].p2p_interface_addr(), info="eapol")
  179. if int(sta2['dot1xAuthEapolFramesRx']) <= int(sta1['dot1xAuthEapolFramesRx']):
  180. raise Exception("dot1xAuthEapolFramesRx did not increase")
  181. if int(eapol2['authAuthEapStartsWhileAuthenticated']) < 1:
  182. raise Exception("authAuthEapStartsWhileAuthenticated did not increase")
  183. if int(eapol2['backendAuthSuccesses']) <= int(eapol1['backendAuthSuccesses']):
  184. raise Exception("backendAuthSuccesses did not increase")
  185. logger.info("Password as hash value")
  186. dev[0].request("REMOVE_NETWORK all")
  187. eap_connect(dev[0], apdev[0], "TTLS", "DOMAIN\mschapv2 user",
  188. anonymous_identity="ttls",
  189. password_hex="hash:8846f7eaee8fb117ad06bdd830b7586c",
  190. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2")
  191. logger.info("Negative test with incorrect password")
  192. dev[0].request("REMOVE_NETWORK all")
  193. eap_connect(dev[0], apdev[0], "TTLS", "DOMAIN\mschapv2 user",
  194. anonymous_identity="ttls", password="password1",
  195. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2",
  196. expect_failure=True)
  197. def test_ap_wpa2_eap_ttls_mschapv2_utf8(dev, apdev):
  198. """WPA2-Enterprise connection using EAP-TTLS/MSCHAPv2 and UTF-8 password"""
  199. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  200. hostapd.add_ap(apdev[0]['ifname'], params)
  201. hapd = hostapd.Hostapd(apdev[0]['ifname'])
  202. eap_connect(dev[0], apdev[0], "TTLS", "utf8-user-hash",
  203. anonymous_identity="ttls", password="secret-åäö-€-password",
  204. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2")
  205. eap_connect(dev[1], apdev[0], "TTLS", "utf8-user",
  206. anonymous_identity="ttls",
  207. password_hex="hash:bd5844fad2489992da7fe8c5a01559cf",
  208. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2")
  209. def test_ap_wpa2_eap_ttls_eap_gtc(dev, apdev):
  210. """WPA2-Enterprise connection using EAP-TTLS/EAP-GTC"""
  211. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  212. hostapd.add_ap(apdev[0]['ifname'], params)
  213. eap_connect(dev[0], apdev[0], "TTLS", "user",
  214. anonymous_identity="ttls", password="password",
  215. ca_cert="auth_serv/ca.pem", phase2="autheap=GTC")
  216. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  217. eap_reauth(dev[0], "TTLS")
  218. def test_ap_wpa2_eap_ttls_eap_md5(dev, apdev):
  219. """WPA2-Enterprise connection using EAP-TTLS/EAP-MD5"""
  220. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  221. hostapd.add_ap(apdev[0]['ifname'], params)
  222. eap_connect(dev[0], apdev[0], "TTLS", "user",
  223. anonymous_identity="ttls", password="password",
  224. ca_cert="auth_serv/ca.pem", phase2="autheap=MD5")
  225. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  226. eap_reauth(dev[0], "TTLS")
  227. def test_ap_wpa2_eap_ttls_eap_mschapv2(dev, apdev):
  228. """WPA2-Enterprise connection using EAP-TTLS/EAP-MSCHAPv2"""
  229. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  230. hostapd.add_ap(apdev[0]['ifname'], params)
  231. eap_connect(dev[0], apdev[0], "TTLS", "user",
  232. anonymous_identity="ttls", password="password",
  233. ca_cert="auth_serv/ca.pem", phase2="autheap=MSCHAPV2")
  234. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  235. eap_reauth(dev[0], "TTLS")
  236. logger.info("Negative test with incorrect password")
  237. dev[0].request("REMOVE_NETWORK all")
  238. eap_connect(dev[0], apdev[0], "TTLS", "user",
  239. anonymous_identity="ttls", password="password1",
  240. ca_cert="auth_serv/ca.pem", phase2="autheap=MSCHAPV2",
  241. expect_failure=True)
  242. def test_ap_wpa2_eap_peap_eap_mschapv2(dev, apdev):
  243. """WPA2-Enterprise connection using EAP-PEAP/EAP-MSCHAPv2"""
  244. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  245. hostapd.add_ap(apdev[0]['ifname'], params)
  246. eap_connect(dev[0], apdev[0], "PEAP", "user",
  247. anonymous_identity="peap", password="password",
  248. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2")
  249. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  250. eap_reauth(dev[0], "PEAP")
  251. dev[0].request("REMOVE_NETWORK all")
  252. eap_connect(dev[0], apdev[0], "PEAP", "user",
  253. anonymous_identity="peap", password="password",
  254. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2",
  255. fragment_size="200")
  256. logger.info("Password as hash value")
  257. dev[0].request("REMOVE_NETWORK all")
  258. eap_connect(dev[0], apdev[0], "PEAP", "user",
  259. anonymous_identity="peap",
  260. password_hex="hash:8846f7eaee8fb117ad06bdd830b7586c",
  261. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2")
  262. logger.info("Negative test with incorrect password")
  263. dev[0].request("REMOVE_NETWORK all")
  264. eap_connect(dev[0], apdev[0], "PEAP", "user",
  265. anonymous_identity="peap", password="password1",
  266. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2",
  267. expect_failure=True)
  268. def test_ap_wpa2_eap_peap_crypto_binding(dev, apdev):
  269. """WPA2-Enterprise connection using EAP-PEAPv0/EAP-MSCHAPv2 and crypto binding"""
  270. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  271. hostapd.add_ap(apdev[0]['ifname'], params)
  272. eap_connect(dev[0], apdev[0], "PEAP", "user", password="password",
  273. ca_cert="auth_serv/ca.pem",
  274. phase1="peapver=0 crypto_binding=2",
  275. phase2="auth=MSCHAPV2")
  276. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  277. eap_reauth(dev[0], "PEAP")
  278. def test_ap_wpa2_eap_peap_eap_tls(dev, apdev):
  279. """WPA2-Enterprise connection using EAP-PEAP/EAP-TLS"""
  280. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  281. hostapd.add_ap(apdev[0]['ifname'], params)
  282. eap_connect(dev[0], apdev[0], "PEAP", "cert user",
  283. ca_cert="auth_serv/ca.pem", phase2="auth=TLS",
  284. ca_cert2="auth_serv/ca.pem",
  285. client_cert2="auth_serv/user.pem",
  286. private_key2="auth_serv/user.key")
  287. eap_reauth(dev[0], "PEAP")
  288. def test_ap_wpa2_eap_tls(dev, apdev):
  289. """WPA2-Enterprise connection using EAP-TLS"""
  290. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  291. hostapd.add_ap(apdev[0]['ifname'], params)
  292. eap_connect(dev[0], apdev[0], "TLS", "tls user", ca_cert="auth_serv/ca.pem",
  293. client_cert="auth_serv/user.pem",
  294. private_key="auth_serv/user.key")
  295. eap_reauth(dev[0], "TLS")
  296. def test_ap_wpa2_eap_tls_pkcs12(dev, apdev):
  297. """WPA2-Enterprise connection using EAP-TLS and PKCS#12"""
  298. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  299. hostapd.add_ap(apdev[0]['ifname'], params)
  300. eap_connect(dev[0], apdev[0], "TLS", "tls user", ca_cert="auth_serv/ca.pem",
  301. private_key="auth_serv/user.pkcs12",
  302. private_key_passwd="whatever")
  303. dev[0].request("REMOVE_NETWORK all")
  304. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TLS",
  305. identity="tls user",
  306. ca_cert="auth_serv/ca.pem",
  307. private_key="auth_serv/user.pkcs12",
  308. wait_connect=False, scan_freq="2412")
  309. ev = dev[0].wait_event(["CTRL-REQ-PASSPHRASE"])
  310. if ev is None:
  311. raise Exception("Request for private key passphrase timed out")
  312. id = ev.split(':')[0].split('-')[-1]
  313. dev[0].request("CTRL-RSP-PASSPHRASE-" + id + ":whatever")
  314. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=10)
  315. if ev is None:
  316. raise Exception("Connection timed out")
  317. def test_ap_wpa2_eap_tls_neg_incorrect_trust_root(dev, apdev):
  318. """WPA2-Enterprise negative test - incorrect trust root"""
  319. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  320. hostapd.add_ap(apdev[0]['ifname'], params)
  321. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS",
  322. identity="DOMAIN\mschapv2 user", anonymous_identity="ttls",
  323. password="password", phase2="auth=MSCHAPV2",
  324. ca_cert="auth_serv/ca-incorrect.pem",
  325. wait_connect=False, scan_freq="2412")
  326. ev = dev[0].wait_event(["CTRL-EVENT-EAP-STARTED"], timeout=10)
  327. if ev is None:
  328. raise Exception("Association and EAP start timed out")
  329. ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=10)
  330. if ev is None:
  331. raise Exception("EAP method selection timed out")
  332. if "TTLS" not in ev:
  333. raise Exception("Unexpected EAP method")
  334. ev = dev[0].wait_event(["CTRL-EVENT-EAP-TLS-CERT-ERROR",
  335. "CTRL-EVENT-EAP-SUCCESS",
  336. "CTRL-EVENT-EAP-FAILURE",
  337. "CTRL-EVENT-CONNECTED",
  338. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  339. if ev is None:
  340. raise Exception("EAP result timed out")
  341. if "CTRL-EVENT-EAP-TLS-CERT-ERROR" not in ev:
  342. raise Exception("TLS certificate error not reported")
  343. ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS",
  344. "CTRL-EVENT-EAP-FAILURE",
  345. "CTRL-EVENT-CONNECTED",
  346. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  347. if ev is None:
  348. raise Exception("EAP result(2) timed out")
  349. if "CTRL-EVENT-EAP-FAILURE" not in ev:
  350. raise Exception("EAP failure not reported")
  351. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
  352. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  353. if ev is None:
  354. raise Exception("EAP result(3) timed out")
  355. if "CTRL-EVENT-DISCONNECTED" not in ev:
  356. raise Exception("Disconnection not reported")
  357. ev = dev[0].wait_event(["CTRL-EVENT-SSID-TEMP-DISABLED"], timeout=10)
  358. if ev is None:
  359. raise Exception("Network block disabling not reported")
  360. def test_ap_wpa2_eap_tls_neg_suffix_match(dev, apdev):
  361. """WPA2-Enterprise negative test - domain suffix mismatch"""
  362. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  363. hostapd.add_ap(apdev[0]['ifname'], params)
  364. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS",
  365. identity="DOMAIN\mschapv2 user", anonymous_identity="ttls",
  366. password="password", phase2="auth=MSCHAPV2",
  367. ca_cert="auth_serv/ca.pem",
  368. domain_suffix_match="incorrect.example.com",
  369. wait_connect=False, scan_freq="2412")
  370. ev = dev[0].wait_event(["CTRL-EVENT-EAP-STARTED"], timeout=10)
  371. if ev is None:
  372. raise Exception("Association and EAP start timed out")
  373. ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=10)
  374. if ev is None:
  375. raise Exception("EAP method selection timed out")
  376. if "TTLS" not in ev:
  377. raise Exception("Unexpected EAP method")
  378. ev = dev[0].wait_event(["CTRL-EVENT-EAP-TLS-CERT-ERROR",
  379. "CTRL-EVENT-EAP-SUCCESS",
  380. "CTRL-EVENT-EAP-FAILURE",
  381. "CTRL-EVENT-CONNECTED",
  382. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  383. if ev is None:
  384. raise Exception("EAP result timed out")
  385. if "CTRL-EVENT-EAP-TLS-CERT-ERROR" not in ev:
  386. raise Exception("TLS certificate error not reported")
  387. if "Domain suffix mismatch" not in ev:
  388. raise Exception("Domain suffix mismatch not reported")
  389. ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS",
  390. "CTRL-EVENT-EAP-FAILURE",
  391. "CTRL-EVENT-CONNECTED",
  392. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  393. if ev is None:
  394. raise Exception("EAP result(2) timed out")
  395. if "CTRL-EVENT-EAP-FAILURE" not in ev:
  396. raise Exception("EAP failure not reported")
  397. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
  398. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  399. if ev is None:
  400. raise Exception("EAP result(3) timed out")
  401. if "CTRL-EVENT-DISCONNECTED" not in ev:
  402. raise Exception("Disconnection not reported")
  403. ev = dev[0].wait_event(["CTRL-EVENT-SSID-TEMP-DISABLED"], timeout=10)
  404. if ev is None:
  405. raise Exception("Network block disabling not reported")
  406. def test_ap_wpa2_eap_tls_neg_subject_match(dev, apdev):
  407. """WPA2-Enterprise negative test - subject mismatch"""
  408. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  409. hostapd.add_ap(apdev[0]['ifname'], params)
  410. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS",
  411. identity="DOMAIN\mschapv2 user", anonymous_identity="ttls",
  412. password="password", phase2="auth=MSCHAPV2",
  413. ca_cert="auth_serv/ca.pem",
  414. subject_match="/C=FI/O=w1.fi/CN=example.com",
  415. wait_connect=False, scan_freq="2412")
  416. ev = dev[0].wait_event(["CTRL-EVENT-EAP-STARTED"], timeout=10)
  417. if ev is None:
  418. raise Exception("Association and EAP start timed out")
  419. ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=10)
  420. if ev is None:
  421. raise Exception("EAP method selection timed out")
  422. if "TTLS" not in ev:
  423. raise Exception("Unexpected EAP method")
  424. ev = dev[0].wait_event(["CTRL-EVENT-EAP-TLS-CERT-ERROR",
  425. "CTRL-EVENT-EAP-SUCCESS",
  426. "CTRL-EVENT-EAP-FAILURE",
  427. "CTRL-EVENT-CONNECTED",
  428. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  429. if ev is None:
  430. raise Exception("EAP result timed out")
  431. if "CTRL-EVENT-EAP-TLS-CERT-ERROR" not in ev:
  432. raise Exception("TLS certificate error not reported")
  433. if "Subject mismatch" not in ev:
  434. raise Exception("Subject mismatch not reported")
  435. ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS",
  436. "CTRL-EVENT-EAP-FAILURE",
  437. "CTRL-EVENT-CONNECTED",
  438. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  439. if ev is None:
  440. raise Exception("EAP result(2) timed out")
  441. if "CTRL-EVENT-EAP-FAILURE" not in ev:
  442. raise Exception("EAP failure not reported")
  443. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
  444. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  445. if ev is None:
  446. raise Exception("EAP result(3) timed out")
  447. if "CTRL-EVENT-DISCONNECTED" not in ev:
  448. raise Exception("Disconnection not reported")
  449. ev = dev[0].wait_event(["CTRL-EVENT-SSID-TEMP-DISABLED"], timeout=10)
  450. if ev is None:
  451. raise Exception("Network block disabling not reported")
  452. def test_ap_wpa2_eap_tls_neg_altsubject_match(dev, apdev):
  453. """WPA2-Enterprise negative test - altsubject mismatch"""
  454. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  455. hostapd.add_ap(apdev[0]['ifname'], params)
  456. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS",
  457. identity="DOMAIN\mschapv2 user", anonymous_identity="ttls",
  458. password="password", phase2="auth=MSCHAPV2",
  459. ca_cert="auth_serv/ca.pem",
  460. altsubject_match="incorrect.example.com",
  461. wait_connect=False, scan_freq="2412")
  462. ev = dev[0].wait_event(["CTRL-EVENT-EAP-STARTED"], timeout=10)
  463. if ev is None:
  464. raise Exception("Association and EAP start timed out")
  465. ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=10)
  466. if ev is None:
  467. raise Exception("EAP method selection timed out")
  468. if "TTLS" not in ev:
  469. raise Exception("Unexpected EAP method")
  470. ev = dev[0].wait_event(["CTRL-EVENT-EAP-TLS-CERT-ERROR",
  471. "CTRL-EVENT-EAP-SUCCESS",
  472. "CTRL-EVENT-EAP-FAILURE",
  473. "CTRL-EVENT-CONNECTED",
  474. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  475. if ev is None:
  476. raise Exception("EAP result timed out")
  477. if "CTRL-EVENT-EAP-TLS-CERT-ERROR" not in ev:
  478. raise Exception("TLS certificate error not reported")
  479. if "AltSubject mismatch" not in ev:
  480. raise Exception("altsubject mismatch not reported")
  481. ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS",
  482. "CTRL-EVENT-EAP-FAILURE",
  483. "CTRL-EVENT-CONNECTED",
  484. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  485. if ev is None:
  486. raise Exception("EAP result(2) timed out")
  487. if "CTRL-EVENT-EAP-FAILURE" not in ev:
  488. raise Exception("EAP failure not reported")
  489. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
  490. "CTRL-EVENT-DISCONNECTED"], timeout=10)
  491. if ev is None:
  492. raise Exception("EAP result(3) timed out")
  493. if "CTRL-EVENT-DISCONNECTED" not in ev:
  494. raise Exception("Disconnection not reported")
  495. ev = dev[0].wait_event(["CTRL-EVENT-SSID-TEMP-DISABLED"], timeout=10)
  496. if ev is None:
  497. raise Exception("Network block disabling not reported")
  498. def test_ap_wpa2_eap_ttls_server_cert_hash(dev, apdev):
  499. """WPA2-Enterprise connection using EAP-TTLS and server certificate hash"""
  500. srv_cert_hash = "0a3f81f63569226657a069855bb13f3b922670437a2b87585a4734f70ac7315b"
  501. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  502. hostapd.add_ap(apdev[0]['ifname'], params)
  503. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS",
  504. identity="probe", ca_cert="probe://",
  505. wait_connect=False, scan_freq="2412")
  506. ev = dev[0].wait_event(["CTRL-EVENT-EAP-STARTED"], timeout=10)
  507. if ev is None:
  508. raise Exception("Association and EAP start timed out")
  509. ev = dev[0].wait_event(["CTRL-EVENT-EAP-PEER-CERT depth=0"], timeout=10)
  510. if ev is None:
  511. raise Exception("No peer server certificate event seen")
  512. if "hash=" + srv_cert_hash not in ev:
  513. raise Exception("Expected server certificate hash not reported")
  514. ev = dev[0].wait_event(["CTRL-EVENT-EAP-TLS-CERT-ERROR"], timeout=10)
  515. if ev is None:
  516. raise Exception("EAP result timed out")
  517. if "Server certificate chain probe" not in ev:
  518. raise Exception("Server certificate probe not reported")
  519. ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10)
  520. if ev is None:
  521. raise Exception("Disconnection event not seen")
  522. dev[0].request("REMOVE_NETWORK all")
  523. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS",
  524. identity="DOMAIN\mschapv2 user", anonymous_identity="ttls",
  525. password="password", phase2="auth=MSCHAPV2",
  526. ca_cert="hash://server/sha256/5a1bc1296205e6fdbe3979728efe3920798885c1c4590b5f90f43222d239ca6a",
  527. wait_connect=False, scan_freq="2412")
  528. ev = dev[0].wait_event(["CTRL-EVENT-EAP-STARTED"], timeout=10)
  529. if ev is None:
  530. raise Exception("Association and EAP start timed out")
  531. ev = dev[0].wait_event(["CTRL-EVENT-EAP-TLS-CERT-ERROR"], timeout=10)
  532. if ev is None:
  533. raise Exception("EAP result timed out")
  534. if "Server certificate mismatch" not in ev:
  535. raise Exception("Server certificate mismatch not reported")
  536. ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10)
  537. if ev is None:
  538. raise Exception("Disconnection event not seen")
  539. dev[0].request("REMOVE_NETWORK all")
  540. eap_connect(dev[0], apdev[0], "TTLS", "DOMAIN\mschapv2 user",
  541. anonymous_identity="ttls", password="password",
  542. ca_cert="hash://server/sha256/" + srv_cert_hash,
  543. phase2="auth=MSCHAPV2")
  544. def test_ap_wpa2_eap_pwd(dev, apdev):
  545. """WPA2-Enterprise connection using EAP-pwd"""
  546. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  547. hostapd.add_ap(apdev[0]['ifname'], params)
  548. eap_connect(dev[0], apdev[0], "PWD", "pwd user", password="secret password")
  549. eap_reauth(dev[0], "PWD")
  550. dev[0].request("REMOVE_NETWORK all")
  551. eap_connect(dev[0], apdev[0], "PWD", "pwd user", password="secret password",
  552. fragment_size="90")
  553. logger.info("Negative test with incorrect password")
  554. dev[0].request("REMOVE_NETWORK all")
  555. eap_connect(dev[0], apdev[0], "PWD", "pwd user", password="secret-password",
  556. expect_failure=True, local_error_report=True)
  557. def test_ap_wpa2_eap_pwd_groups(dev, apdev):
  558. """WPA2-Enterprise connection using various EAP-pwd groups"""
  559. params = { "ssid": "test-wpa2-eap", "wpa": "2", "wpa_key_mgmt": "WPA-EAP",
  560. "rsn_pairwise": "CCMP", "ieee8021x": "1",
  561. "eap_server": "1", "eap_user_file": "auth_serv/eap_user.conf" }
  562. for i in [ 19, 20, 21, 25, 26 ]:
  563. params['pwd_group'] = str(i)
  564. hostapd.add_ap(apdev[0]['ifname'], params)
  565. dev[0].request("REMOVE_NETWORK all")
  566. eap_connect(dev[0], apdev[0], "PWD", "pwd user", password="secret password")
  567. def test_ap_wpa2_eap_gpsk(dev, apdev):
  568. """WPA2-Enterprise connection using EAP-GPSK"""
  569. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  570. hostapd.add_ap(apdev[0]['ifname'], params)
  571. id = eap_connect(dev[0], apdev[0], "GPSK", "gpsk user",
  572. password="abcdefghijklmnop0123456789abcdef")
  573. eap_reauth(dev[0], "GPSK")
  574. logger.info("Test forced algorithm selection")
  575. for phase1 in [ "cipher=1", "cipher=2" ]:
  576. dev[0].set_network_quoted(id, "phase1", phase1)
  577. ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS"], timeout=10)
  578. if ev is None:
  579. raise Exception("EAP success timed out")
  580. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=10)
  581. if ev is None:
  582. raise Exception("Association with the AP timed out")
  583. logger.info("Test failed algorithm negotiation")
  584. dev[0].set_network_quoted(id, "phase1", "cipher=9")
  585. ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
  586. if ev is None:
  587. raise Exception("EAP failure timed out")
  588. logger.info("Negative test with incorrect password")
  589. dev[0].request("REMOVE_NETWORK all")
  590. eap_connect(dev[0], apdev[0], "GPSK", "gpsk user",
  591. password="ffcdefghijklmnop0123456789abcdef",
  592. expect_failure=True)
  593. def test_ap_wpa2_eap_sake(dev, apdev):
  594. """WPA2-Enterprise connection using EAP-SAKE"""
  595. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  596. hostapd.add_ap(apdev[0]['ifname'], params)
  597. eap_connect(dev[0], apdev[0], "SAKE", "sake user",
  598. password_hex="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")
  599. eap_reauth(dev[0], "SAKE")
  600. logger.info("Negative test with incorrect password")
  601. dev[0].request("REMOVE_NETWORK all")
  602. eap_connect(dev[0], apdev[0], "SAKE", "sake user",
  603. password_hex="ff23456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  604. expect_failure=True)
  605. def test_ap_wpa2_eap_eke(dev, apdev):
  606. """WPA2-Enterprise connection using EAP-EKE"""
  607. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  608. hostapd.add_ap(apdev[0]['ifname'], params)
  609. id = eap_connect(dev[0], apdev[0], "EKE", "eke user", password="hello")
  610. eap_reauth(dev[0], "EKE")
  611. logger.info("Test forced algorithm selection")
  612. for phase1 in [ "dhgroup=5 encr=1 prf=2 mac=2",
  613. "dhgroup=4 encr=1 prf=2 mac=2",
  614. "dhgroup=3 encr=1 prf=2 mac=2",
  615. "dhgroup=3 encr=1 prf=1 mac=1" ]:
  616. dev[0].set_network_quoted(id, "phase1", phase1)
  617. ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS"], timeout=10)
  618. if ev is None:
  619. raise Exception("EAP success timed out")
  620. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=10)
  621. if ev is None:
  622. raise Exception("Association with the AP timed out")
  623. logger.info("Test failed algorithm negotiation")
  624. dev[0].set_network_quoted(id, "phase1", "dhgroup=9 encr=9 prf=9 mac=9")
  625. ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
  626. if ev is None:
  627. raise Exception("EAP failure timed out")
  628. logger.info("Negative test with incorrect password")
  629. dev[0].request("REMOVE_NETWORK all")
  630. eap_connect(dev[0], apdev[0], "EKE", "eke user", password="hello1",
  631. expect_failure=True)
  632. def test_ap_wpa2_eap_ikev2(dev, apdev):
  633. """WPA2-Enterprise connection using EAP-IKEv2"""
  634. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  635. hostapd.add_ap(apdev[0]['ifname'], params)
  636. eap_connect(dev[0], apdev[0], "IKEV2", "ikev2 user",
  637. password="ike password")
  638. eap_reauth(dev[0], "IKEV2")
  639. dev[0].request("REMOVE_NETWORK all")
  640. eap_connect(dev[0], apdev[0], "IKEV2", "ikev2 user",
  641. password="ike password", fragment_size="250")
  642. logger.info("Negative test with incorrect password")
  643. dev[0].request("REMOVE_NETWORK all")
  644. eap_connect(dev[0], apdev[0], "IKEV2", "ikev2 user",
  645. password="ike-password", expect_failure=True)
  646. def test_ap_wpa2_eap_pax(dev, apdev):
  647. """WPA2-Enterprise connection using EAP-PAX"""
  648. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  649. hostapd.add_ap(apdev[0]['ifname'], params)
  650. eap_connect(dev[0], apdev[0], "PAX", "pax.user@example.com",
  651. password_hex="0123456789abcdef0123456789abcdef")
  652. eap_reauth(dev[0], "PAX")
  653. logger.info("Negative test with incorrect password")
  654. dev[0].request("REMOVE_NETWORK all")
  655. eap_connect(dev[0], apdev[0], "PAX", "pax.user@example.com",
  656. password_hex="ff23456789abcdef0123456789abcdef",
  657. expect_failure=True)
  658. def test_ap_wpa2_eap_psk(dev, apdev):
  659. """WPA2-Enterprise connection using EAP-PSK"""
  660. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  661. params["wpa_key_mgmt"] = "WPA-EAP-SHA256"
  662. params["ieee80211w"] = "2"
  663. hostapd.add_ap(apdev[0]['ifname'], params)
  664. eap_connect(dev[0], apdev[0], "PSK", "psk.user@example.com",
  665. password_hex="0123456789abcdef0123456789abcdef", sha256=True)
  666. eap_reauth(dev[0], "PSK", sha256=True)
  667. logger.info("Negative test with incorrect password")
  668. dev[0].request("REMOVE_NETWORK all")
  669. eap_connect(dev[0], apdev[0], "PSK", "psk.user@example.com",
  670. password_hex="ff23456789abcdef0123456789abcdef", sha256=True,
  671. expect_failure=True)
  672. def test_ap_wpa_eap_peap_eap_mschapv2(dev, apdev):
  673. """WPA-Enterprise connection using EAP-PEAP/EAP-MSCHAPv2"""
  674. params = hostapd.wpa_eap_params(ssid="test-wpa-eap")
  675. hostapd.add_ap(apdev[0]['ifname'], params)
  676. dev[0].connect("test-wpa-eap", key_mgmt="WPA-EAP", eap="PEAP",
  677. identity="user", password="password", phase2="auth=MSCHAPV2",
  678. ca_cert="auth_serv/ca.pem", wait_connect=False,
  679. scan_freq="2412")
  680. eap_check_auth(dev[0], "PEAP", True, rsn=False)
  681. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  682. eap_reauth(dev[0], "PEAP", rsn=False)
  683. def test_ap_wpa2_eap_interactive(dev, apdev):
  684. """WPA2-Enterprise connection using interactive identity/password entry"""
  685. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  686. hostapd.add_ap(apdev[0]['ifname'], params)
  687. hapd = hostapd.Hostapd(apdev[0]['ifname'])
  688. tests = [ ("Connection with dynamic TTLS/MSCHAPv2 password entry",
  689. "TTLS", "ttls", "DOMAIN\mschapv2 user", "auth=MSCHAPV2",
  690. None, "password"),
  691. ("Connection with dynamic TTLS/MSCHAPv2 identity and password entry",
  692. "TTLS", "ttls", None, "auth=MSCHAPV2",
  693. "DOMAIN\mschapv2 user", "password"),
  694. ("Connection with dynamic TTLS/EAP-MSCHAPv2 password entry",
  695. "TTLS", "ttls", "user", "autheap=MSCHAPV2", None, "password"),
  696. ("Connection with dynamic TTLS/EAP-MD5 password entry",
  697. "TTLS", "ttls", "user", "autheap=MD5", None, "password"),
  698. ("Connection with dynamic PEAP/EAP-MSCHAPv2 password entry",
  699. "PEAP", None, "user", "auth=MSCHAPV2", None, "password"),
  700. ("Connection with dynamic PEAP/EAP-GTC password entry",
  701. "PEAP", None, "user", "auth=GTC", None, "password") ]
  702. for [desc,eap,anon,identity,phase2,req_id,req_pw] in tests:
  703. logger.info(desc)
  704. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap=eap,
  705. anonymous_identity=anon, identity=identity,
  706. ca_cert="auth_serv/ca.pem", phase2=phase2,
  707. wait_connect=False, scan_freq="2412")
  708. if req_id:
  709. ev = dev[0].wait_event(["CTRL-REQ-IDENTITY"])
  710. if ev is None:
  711. raise Exception("Request for identity timed out")
  712. id = ev.split(':')[0].split('-')[-1]
  713. dev[0].request("CTRL-RSP-IDENTITY-" + id + ":" + req_id)
  714. ev = dev[0].wait_event(["CTRL-REQ-PASSWORD","CTRL-REQ-OTP"])
  715. if ev is None:
  716. raise Exception("Request for password timed out")
  717. id = ev.split(':')[0].split('-')[-1]
  718. type = "OTP" if "CTRL-REQ-OTP" in ev else "PASSWORD"
  719. dev[0].request("CTRL-RSP-" + type + "-" + id + ":" + req_pw)
  720. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=10)
  721. if ev is None:
  722. raise Exception("Connection timed out")
  723. dev[0].request("REMOVE_NETWORK all")
  724. def test_ap_wpa2_eap_vendor_test(dev, apdev):
  725. """WPA2-Enterprise connection using EAP vendor test"""
  726. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  727. hostapd.add_ap(apdev[0]['ifname'], params)
  728. eap_connect(dev[0], apdev[0], "VENDOR-TEST", "vendor-test")
  729. eap_reauth(dev[0], "VENDOR-TEST")
  730. def test_ap_wpa2_eap_fast_mschapv2_unauth_prov(dev, apdev):
  731. """WPA2-Enterprise connection using EAP-FAST/MSCHAPv2 and unauthenticated provisioning"""
  732. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  733. hostapd.add_ap(apdev[0]['ifname'], params)
  734. eap_connect(dev[0], apdev[0], "FAST", "user",
  735. anonymous_identity="FAST", password="password",
  736. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAPV2",
  737. phase1="fast_provisioning=1", pac_file="blob://fast_pac")
  738. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  739. eap_reauth(dev[0], "FAST")
  740. def test_ap_wpa2_eap_fast_gtc_auth_prov(dev, apdev):
  741. """WPA2-Enterprise connection using EAP-FAST/GTC and authenticated provisioning"""
  742. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  743. hostapd.add_ap(apdev[0]['ifname'], params)
  744. eap_connect(dev[0], apdev[0], "FAST", "user",
  745. anonymous_identity="FAST", password="password",
  746. ca_cert="auth_serv/ca.pem", phase2="auth=GTC",
  747. phase1="fast_provisioning=2", pac_file="blob://fast_pac_auth")
  748. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  749. eap_reauth(dev[0], "FAST")
  750. def test_ap_wpa2_eap_tls_ocsp(dev, apdev):
  751. """WPA2-Enterprise connection using EAP-TLS and verifying OCSP"""
  752. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  753. hostapd.add_ap(apdev[0]['ifname'], params)
  754. eap_connect(dev[0], apdev[0], "TLS", "tls user", ca_cert="auth_serv/ca.pem",
  755. private_key="auth_serv/user.pkcs12",
  756. private_key_passwd="whatever", ocsp=2)
  757. def int_eap_server_params():
  758. params = { "ssid": "test-wpa2-eap", "wpa": "2", "wpa_key_mgmt": "WPA-EAP",
  759. "rsn_pairwise": "CCMP", "ieee8021x": "1",
  760. "eap_server": "1", "eap_user_file": "auth_serv/eap_user.conf",
  761. "ca_cert": "auth_serv/ca.pem",
  762. "server_cert": "auth_serv/server.pem",
  763. "private_key": "auth_serv/server.key" }
  764. return params
  765. def test_ap_wpa2_eap_tls_ocsp_invalid(dev, apdev):
  766. """WPA2-Enterprise connection using EAP-TLS and invalid OCSP response"""
  767. params = int_eap_server_params()
  768. params["ocsp_stapling_response"] = "auth_serv/ocsp-server-cache.der-invalid"
  769. hostapd.add_ap(apdev[0]['ifname'], params)
  770. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TLS",
  771. identity="tls user", ca_cert="auth_serv/ca.pem",
  772. private_key="auth_serv/user.pkcs12",
  773. private_key_passwd="whatever", ocsp=2,
  774. wait_connect=False, scan_freq="2412")
  775. count = 0
  776. while True:
  777. ev = dev[0].wait_event(["CTRL-EVENT-EAP-STATUS"])
  778. if ev is None:
  779. raise Exception("Timeout on EAP status")
  780. if 'bad certificate status response' in ev:
  781. break
  782. count = count + 1
  783. if count > 10:
  784. raise Exception("Unexpected number of EAP status messages")
  785. ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"])
  786. if ev is None:
  787. raise Exception("Timeout on EAP failure report")
  788. def test_ap_wpa2_eap_tls_domain_suffix_match_cn(dev, apdev):
  789. """WPA2-Enterprise using EAP-TLS and domain suffix match (CN)"""
  790. params = int_eap_server_params()
  791. params["server_cert"] = "auth_serv/server-no-dnsname.pem"
  792. params["private_key"] = "auth_serv/server-no-dnsname.key"
  793. hostapd.add_ap(apdev[0]['ifname'], params)
  794. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TLS",
  795. identity="tls user", ca_cert="auth_serv/ca.pem",
  796. private_key="auth_serv/user.pkcs12",
  797. private_key_passwd="whatever",
  798. domain_suffix_match="server3.w1.fi",
  799. scan_freq="2412")
  800. dev[1].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TLS",
  801. identity="tls user", ca_cert="auth_serv/ca.pem",
  802. private_key="auth_serv/user.pkcs12",
  803. private_key_passwd="whatever",
  804. domain_suffix_match="w1.fi",
  805. scan_freq="2412")
  806. def test_ap_wpa2_eap_tls_domain_suffix_mismatch_cn(dev, apdev):
  807. """WPA2-Enterprise using EAP-TLS and domain suffix mismatch (CN)"""
  808. params = int_eap_server_params()
  809. params["server_cert"] = "auth_serv/server-no-dnsname.pem"
  810. params["private_key"] = "auth_serv/server-no-dnsname.key"
  811. hostapd.add_ap(apdev[0]['ifname'], params)
  812. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TLS",
  813. identity="tls user", ca_cert="auth_serv/ca.pem",
  814. private_key="auth_serv/user.pkcs12",
  815. private_key_passwd="whatever",
  816. domain_suffix_match="example.com",
  817. wait_connect=False,
  818. scan_freq="2412")
  819. ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"])
  820. if ev is None:
  821. raise Exception("Timeout on EAP failure report")
  822. def test_ap_wpa2_eap_ttls_expired_cert(dev, apdev):
  823. """WPA2-Enterprise using EAP-TTLS and expired certificate"""
  824. params = int_eap_server_params()
  825. params["server_cert"] = "auth_serv/server-expired.pem"
  826. params["private_key"] = "auth_serv/server-expired.key"
  827. hostapd.add_ap(apdev[0]['ifname'], params)
  828. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS",
  829. identity="mschap user", password="password",
  830. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAP",
  831. wait_connect=False,
  832. scan_freq="2412")
  833. ev = dev[0].wait_event(["CTRL-EVENT-EAP-TLS-CERT-ERROR"])
  834. if ev is None:
  835. raise Exception("Timeout on EAP certificate error report")
  836. if "reason=4" not in ev or "certificate has expired" not in ev:
  837. raise Exception("Unexpected failure reason: " + ev)
  838. ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"])
  839. if ev is None:
  840. raise Exception("Timeout on EAP failure report")
  841. def test_ap_wpa2_eap_ttls_ignore_expired_cert(dev, apdev):
  842. """WPA2-Enterprise using EAP-TTLS and ignore certificate expiration"""
  843. params = int_eap_server_params()
  844. params["server_cert"] = "auth_serv/server-expired.pem"
  845. params["private_key"] = "auth_serv/server-expired.key"
  846. hostapd.add_ap(apdev[0]['ifname'], params)
  847. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS",
  848. identity="mschap user", password="password",
  849. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAP",
  850. phase1="tls_disable_time_checks=1",
  851. scan_freq="2412")
  852. def test_ap_wpa2_eap_ttls_server_cert_eku_client(dev, apdev):
  853. """WPA2-Enterprise using EAP-TTLS and server cert with client EKU"""
  854. params = int_eap_server_params()
  855. params["server_cert"] = "auth_serv/server-eku-client.pem"
  856. params["private_key"] = "auth_serv/server-eku-client.key"
  857. hostapd.add_ap(apdev[0]['ifname'], params)
  858. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP", eap="TTLS",
  859. identity="mschap user", password="password",
  860. ca_cert="auth_serv/ca.pem", phase2="auth=MSCHAP",
  861. wait_connect=False,
  862. scan_freq="2412")
  863. ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"])
  864. if ev is None:
  865. raise Exception("Timeout on EAP failure report")
  866. def test_ap_wpa2_eap_ttls_dh_params(dev, apdev):
  867. """WPA2-Enterprise connection using EAP-TTLS/CHAP and setting DH params"""
  868. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  869. hostapd.add_ap(apdev[0]['ifname'], params)
  870. eap_connect(dev[0], apdev[0], "TTLS", "chap user",
  871. anonymous_identity="ttls", password="password",
  872. ca_cert="auth_serv/ca.der", phase2="auth=CHAP",
  873. dh_file="auth_serv/dh.conf")