diff --git a/tests/hwsim/test_ap_eap.py b/tests/hwsim/test_ap_eap.py index 5b1b58ff4..98f47ddd1 100644 --- a/tests/hwsim/test_ap_eap.py +++ b/tests/hwsim/test_ap_eap.py @@ -12,6 +12,8 @@ import subprocess import logging logger = logging.getLogger() import os +import socket +import SocketServer import hwsim_utils import hostapd @@ -4097,3 +4099,76 @@ def test_eap_gpsk_errors(dev, apdev): wait_fail_trigger(dev[0], "GET_ALLOC_FAIL") dev[0].request("REMOVE_NETWORK all") dev[0].wait_disconnected() + +def test_ap_wpa2_eap_sim_db(dev, apdev, params): + """EAP-SIM DB error cases""" + sockpath = '/tmp/hlr_auc_gw.sock-test' + try: + os.remove(sockpath) + except: + pass + hparams = int_eap_server_params() + hparams['eap_sim_db'] = 'unix:' + sockpath + hapd = hostapd.add_ap(apdev[0]['ifname'], hparams) + + # Initial test with hlr_auc_gw socket not available + id = dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP WPA-EAP-SHA256", + eap="SIM", identity="1232010000000000", + password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581", + scan_freq="2412", wait_connect=False) + ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10) + if ev is None: + raise Exception("EAP-Failure not reported") + dev[0].wait_disconnected() + dev[0].request("DISCONNECT") + + # Test with invalid responses and response timeout + + class test_handler(SocketServer.DatagramRequestHandler): + def handle(self): + data = self.request[0].strip() + socket = self.request[1] + logger.debug("Received hlr_auc_gw request: " + data) + # EAP-SIM DB: Failed to parse response string + socket.sendto("FOO", self.client_address) + # EAP-SIM DB: Failed to parse response string + socket.sendto("FOO 1", self.client_address) + # EAP-SIM DB: Unknown external response + socket.sendto("FOO 1 2", self.client_address) + logger.info("No proper response - wait for pending eap_sim_db request timeout") + + server = SocketServer.UnixDatagramServer(sockpath, test_handler) + server.timeout = 1 + + dev[0].select_network(id) + server.handle_request() + ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10) + if ev is None: + raise Exception("EAP-Failure not reported") + dev[0].wait_disconnected() + dev[0].request("DISCONNECT") + + # Test with a valid response + + class test_handler2(SocketServer.DatagramRequestHandler): + def handle(self): + data = self.request[0].strip() + socket = self.request[1] + logger.debug("Received hlr_auc_gw request: " + data) + fname = os.path.join(params['logdir'], + 'hlr_auc_gw.milenage_db') + cmd = subprocess.Popen(['../../hostapd/hlr_auc_gw', + '-m', fname, data], + stdout=subprocess.PIPE) + res = cmd.stdout.read().strip() + cmd.stdout.close() + logger.debug("hlr_auc_gw response: " + res) + socket.sendto(res, self.client_address) + + server.RequestHandlerClass = test_handler2 + + dev[0].select_network(id) + server.handle_request() + dev[0].wait_connected() + dev[0].request("DISCONNECT") + dev[0].wait_disconnected()