test_erp.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. # EAP Re-authentication Protocol (ERP) tests
  2. # Copyright (c) 2014, Jouni Malinen <j@w1.fi>
  3. #
  4. # This software may be distributed under the terms of the BSD license.
  5. # See README for more details.
  6. import logging
  7. logger = logging.getLogger()
  8. import hostapd
  9. from test_ap_eap import int_eap_server_params
  10. def test_erp_initiate_reauth_start(dev, apdev):
  11. """Authenticator sending EAP-Initiate/Re-auth-Start, but ERP disabled on peer"""
  12. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  13. params['erp_send_reauth_start'] = '1'
  14. params['erp_domain'] = 'example.com'
  15. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  16. dev[0].request("ERP_FLUSH")
  17. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
  18. eap="PAX", identity="pax.user@example.com",
  19. password_hex="0123456789abcdef0123456789abcdef",
  20. scan_freq="2412")
  21. def test_erp_enabled_on_server(dev, apdev):
  22. """ERP enabled on internal EAP server, but disabled on peer"""
  23. params = int_eap_server_params()
  24. params['erp_send_reauth_start'] = '1'
  25. params['erp_domain'] = 'example.com'
  26. params['eap_server_erp'] = '1'
  27. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  28. dev[0].request("ERP_FLUSH")
  29. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
  30. eap="PAX", identity="pax.user@example.com",
  31. password_hex="0123456789abcdef0123456789abcdef",
  32. scan_freq="2412")
  33. def test_erp(dev, apdev):
  34. """ERP enabled on server and peer"""
  35. capab = dev[0].get_capability("erp")
  36. if not capab or 'ERP' not in capab:
  37. return "skip"
  38. params = int_eap_server_params()
  39. params['erp_send_reauth_start'] = '1'
  40. params['erp_domain'] = 'example.com'
  41. params['eap_server_erp'] = '1'
  42. params['disable_pmksa_caching'] = '1'
  43. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  44. dev[0].request("ERP_FLUSH")
  45. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
  46. eap="PSK", identity="psk.user@example.com",
  47. password_hex="0123456789abcdef0123456789abcdef",
  48. erp="1", scan_freq="2412")
  49. for i in range(3):
  50. dev[0].request("DISCONNECT")
  51. dev[0].wait_disconnected(timeout=15)
  52. dev[0].request("RECONNECT")
  53. ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS"], timeout=15)
  54. if ev is None:
  55. raise Exception("EAP success timed out")
  56. if "EAP re-authentication completed successfully" not in ev:
  57. raise Exception("Did not use ERP")
  58. dev[0].wait_connected(timeout=15, error="Reconnection timed out")
  59. def test_erp_server_no_match(dev, apdev):
  60. """ERP enabled on server and peer, but server has no key match"""
  61. capab = dev[0].get_capability("erp")
  62. if not capab or 'ERP' not in capab:
  63. return "skip"
  64. params = int_eap_server_params()
  65. params['erp_send_reauth_start'] = '1'
  66. params['erp_domain'] = 'example.com'
  67. params['eap_server_erp'] = '1'
  68. params['disable_pmksa_caching'] = '1'
  69. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  70. dev[0].request("ERP_FLUSH")
  71. id = dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
  72. eap="PSK", identity="psk.user@example.com",
  73. password_hex="0123456789abcdef0123456789abcdef",
  74. erp="1", scan_freq="2412")
  75. dev[0].request("DISCONNECT")
  76. dev[0].wait_disconnected(timeout=15)
  77. hapd.request("ERP_FLUSH")
  78. dev[0].request("RECONNECT")
  79. ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS",
  80. "CTRL-EVENT-EAP-FAILURE"], timeout=15)
  81. if ev is None:
  82. raise Exception("EAP result timed out")
  83. if "CTRL-EVENT-EAP-SUCCESS" in ev:
  84. raise Exception("Unexpected EAP success")
  85. dev[0].request("DISCONNECT")
  86. dev[0].select_network(id)
  87. ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS"], timeout=15)
  88. if ev is None:
  89. raise Exception("EAP success timed out")
  90. if "EAP re-authentication completed successfully" in ev:
  91. raise Exception("Unexpected use of ERP")
  92. dev[0].wait_connected(timeout=15, error="Reconnection timed out")
  93. def start_erp_as(apdev):
  94. params = { "ssid": "as", "beacon_int": "2000",
  95. "radius_server_clients": "auth_serv/radius_clients.conf",
  96. "radius_server_auth_port": '18128',
  97. "eap_server": "1",
  98. "eap_user_file": "auth_serv/eap_user.conf",
  99. "ca_cert": "auth_serv/ca.pem",
  100. "server_cert": "auth_serv/server.pem",
  101. "private_key": "auth_serv/server.key",
  102. "eap_sim_db": "unix:/tmp/hlr_auc_gw.sock",
  103. "dh_file": "auth_serv/dh.conf",
  104. "pac_opaque_encr_key": "000102030405060708090a0b0c0d0e0f",
  105. "eap_fast_a_id": "101112131415161718191a1b1c1d1e1f",
  106. "eap_fast_a_id_info": "test server",
  107. "eap_server_erp": "1",
  108. "erp_domain": "example.com" }
  109. hostapd.add_ap(apdev['ifname'], params)
  110. def test_erp_radius(dev, apdev):
  111. """ERP enabled on RADIUS server and peer"""
  112. capab = dev[0].get_capability("erp")
  113. if not capab or 'ERP' not in capab:
  114. return "skip"
  115. start_erp_as(apdev[1])
  116. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  117. params['auth_server_port'] = "18128"
  118. params['erp_send_reauth_start'] = '1'
  119. params['erp_domain'] = 'example.com'
  120. params['disable_pmksa_caching'] = '1'
  121. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  122. dev[0].request("ERP_FLUSH")
  123. dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
  124. eap="PSK", identity="psk.user@example.com",
  125. password_hex="0123456789abcdef0123456789abcdef",
  126. erp="1", scan_freq="2412")
  127. for i in range(3):
  128. dev[0].request("DISCONNECT")
  129. dev[0].wait_disconnected(timeout=15)
  130. dev[0].request("RECONNECT")
  131. ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS"], timeout=15)
  132. if ev is None:
  133. raise Exception("EAP success timed out")
  134. if "EAP re-authentication completed successfully" not in ev:
  135. raise Exception("Did not use ERP")
  136. dev[0].wait_connected(timeout=15, error="Reconnection timed out")
  137. def erp_test(dev, hapd, **kwargs):
  138. hapd.dump_monitor()
  139. dev.dump_monitor()
  140. dev.request("ERP_FLUSH")
  141. id = dev.connect("test-wpa2-eap", key_mgmt="WPA-EAP", erp="1",
  142. scan_freq="2412", **kwargs)
  143. dev.request("DISCONNECT")
  144. dev.wait_disconnected(timeout=15)
  145. hapd.dump_monitor()
  146. dev.request("RECONNECT")
  147. ev = dev.wait_event(["CTRL-EVENT-EAP-SUCCESS"], timeout=15)
  148. if ev is None:
  149. raise Exception("EAP success timed out")
  150. if "EAP re-authentication completed successfully" not in ev:
  151. raise Exception("Did not use ERP")
  152. dev.wait_connected(timeout=15, error="Reconnection timed out")
  153. ev = hapd.wait_event([ "AP-STA-CONNECTED" ], timeout=5)
  154. if ev is None:
  155. raise Exception("No connection event received from hostapd")
  156. dev.request("DISCONNECT")
  157. def test_erp_radius_eap_methods(dev, apdev):
  158. """ERP enabled on RADIUS server and peer"""
  159. capab = dev[0].get_capability("erp")
  160. if not capab or 'ERP' not in capab:
  161. return "skip"
  162. start_erp_as(apdev[1])
  163. params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
  164. params['auth_server_port'] = "18128"
  165. params['erp_send_reauth_start'] = '1'
  166. params['erp_domain'] = 'example.com'
  167. params['disable_pmksa_caching'] = '1'
  168. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  169. erp_test(dev[0], hapd, eap="AKA", identity="0232010000000000@example.com",
  170. password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123")
  171. erp_test(dev[0], hapd, eap="AKA'", identity="6555444333222111@example.com",
  172. password="5122250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123")
  173. # TODO: EKE getSession
  174. #erp_test(dev[0], hapd, eap="EKE", identity="erp-eke@example.com",
  175. # password="hello")
  176. erp_test(dev[0], hapd, eap="FAST", identity="erp-fast@example.com",
  177. password="password", ca_cert="auth_serv/ca.pem", phase2="auth=GTC",
  178. phase1="fast_provisioning=2", pac_file="blob://fast_pac_auth_erp")
  179. erp_test(dev[0], hapd, eap="GPSK", identity="erp-gpsk@example.com",
  180. password="abcdefghijklmnop0123456789abcdef")
  181. erp_test(dev[0], hapd, eap="PAX", identity="erp-pax@example.com",
  182. password_hex="0123456789abcdef0123456789abcdef")
  183. # TODO: PEAP (EMSK)
  184. #erp_test(dev[0], hapd, eap="PEAP", identity="erp-peap@example.com",
  185. # password="password", ca_cert="auth_serv/ca.pem",
  186. # phase2="auth=MSCHAPV2")
  187. erp_test(dev[0], hapd, eap="PSK", identity="erp-psk@example.com",
  188. password_hex="0123456789abcdef0123456789abcdef")
  189. erp_test(dev[0], hapd, eap="PWD", identity="erp-pwd@example.com",
  190. password="secret password")
  191. erp_test(dev[0], hapd, eap="SAKE", identity="erp-sake@example.com",
  192. password_hex="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")
  193. erp_test(dev[0], hapd, eap="SIM", identity="1232010000000000@example.com",
  194. password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581")
  195. erp_test(dev[0], hapd, eap="TLS", identity="erp-tls@example.com",
  196. ca_cert="auth_serv/ca.pem", client_cert="auth_serv/user.pem",
  197. private_key="auth_serv/user.key")
  198. erp_test(dev[0], hapd, eap="TTLS", identity="erp-ttls@example.com",
  199. password="password", ca_cert="auth_serv/ca.pem", phase2="auth=PAP")