test_ap_eap.py 45 KB

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