test_ap_eap.py 55 KB

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