1 # hostapd authentication server tests
2 # Copyright (c) 2017, Jouni Malinen
3 #
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
6 
7 import hostapd
8 from utils import alloc_fail, fail_test, wait_fail_trigger
9 
10 def authsrv_params():
11     params = {"ssid": "as", "beacon_int": "2000",
12               "radius_server_clients": "auth_serv/radius_clients.conf",
13               "radius_server_auth_port": '18128',
14               "eap_server": "1",
15               "eap_user_file": "auth_serv/eap_user.conf",
16               "eap_sim_db": "unix:/tmp/hlr_auc_gw.sock",
17               "ca_cert": "auth_serv/ca.pem",
18               "server_cert": "auth_serv/server.pem",
19               "private_key": "auth_serv/server.key",
20               "eap_message": "hello"}
21     return params
22 
23 def test_authsrv_oom(dev, apdev):
24     """Authentication server OOM"""
25     params = authsrv_params()
26     authsrv = hostapd.add_ap(apdev[1], params)
27 
28     params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
29     params['auth_server_port'] = "18128"
30     hapd = hostapd.add_ap(apdev[0], params)
31 
32     dev[0].scan_for_bss(hapd.own_addr(), 2412)
33     with alloc_fail(authsrv, 1, "hostapd_radius_get_eap_user"):
34         dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
35                        eap="TTLS", identity="user",
36                        anonymous_identity="ttls", password="password",
37                        ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
38                        wait_connect=False, scan_freq="2412")
39         ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
40         if ev is None:
41             raise Exception("EAP failure not reported")
42     dev[0].request("REMOVE_NETWORK all")
43     dev[0].wait_disconnected()
44     dev[0].dump_monitor()
45 
46     with alloc_fail(authsrv, 1, "srv_log"):
47         dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
48                        eap="TTLS", identity="user",
49                        anonymous_identity="ttls", password="password",
50                        ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
51                        scan_freq="2412")
52     dev[0].request("REMOVE_NETWORK all")
53     dev[0].wait_disconnected()
54     dev[0].dump_monitor()
55 
56     with alloc_fail(authsrv, 1, "radius_server_new_session"):
57         dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
58                        eap="TTLS", identity="user",
59                        anonymous_identity="ttls", password="password",
60                        ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
61                        wait_connect=False, scan_freq="2412")
62         dev[0].wait_disconnected()
63     dev[0].request("REMOVE_NETWORK all")
64     dev[0].dump_monitor()
65 
66     for count in range(1, 3):
67         with alloc_fail(authsrv, count, "=radius_server_get_new_session"):
68             dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
69                            eap="TTLS", identity="user",
70                            anonymous_identity="ttls", password="password",
71                            ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
72                            wait_connect=False, scan_freq="2412")
73             dev[0].wait_disconnected()
74         dev[0].request("REMOVE_NETWORK all")
75         dev[0].dump_monitor()
76 
77     with alloc_fail(authsrv, 1, "eap_server_sm_init"):
78         dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
79                        eap="TTLS", identity="user",
80                        anonymous_identity="ttls", password="password",
81                        ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
82                        wait_connect=False, scan_freq="2412")
83         dev[0].wait_disconnected()
84     dev[0].request("REMOVE_NETWORK all")
85     dev[0].dump_monitor()
86 
87     tests = ["radius_server_encapsulate_eap",
88              "radius_server_receive_auth"]
89     for t in tests:
90         with alloc_fail(authsrv, 1, t):
91             dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
92                            eap="TTLS", identity="user",
93                            anonymous_identity="ttls", password="password",
94                            ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
95                            wait_connect=False, scan_freq="2412")
96             wait_fail_trigger(authsrv, "GET_ALLOC_FAIL")
97         dev[0].request("REMOVE_NETWORK all")
98         dev[0].wait_disconnected()
99         dev[0].dump_monitor()
100 
101     tests = ["radius_msg_add_attr;radius_server_encapsulate_eap",
102              "radius_msg_add_eap;radius_server_encapsulate_eap",
103              "radius_msg_finish_srv;radius_server_encapsulate_eap"]
104     for t in tests:
105         with fail_test(authsrv, 1, t):
106             dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
107                            eap="TTLS", identity="user",
108                            anonymous_identity="ttls", password="password",
109                            ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
110                            wait_connect=False, scan_freq="2412")
111             wait_fail_trigger(authsrv, "GET_FAIL")
112         dev[0].request("REMOVE_NETWORK all")
113         dev[0].wait_disconnected()
114         dev[0].dump_monitor()
115 
116     with alloc_fail(authsrv, 1, "radius_server_get_new_session"):
117         with fail_test(authsrv, 1, "radius_msg_add_eap;radius_server_reject"):
118             dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
119                            eap="TTLS", identity="user",
120                            anonymous_identity="ttls", password="password",
121                            ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
122                            wait_connect=False, scan_freq="2412")
123             wait_fail_trigger(authsrv, "GET_FAIL")
124         dev[0].request("REMOVE_NETWORK all")
125         dev[0].wait_disconnected()
126         dev[0].dump_monitor()
127 
128     with alloc_fail(authsrv, 1, "radius_server_get_new_session"):
129         with fail_test(authsrv, 1,
130                        "radius_msg_finish_srv;radius_server_reject"):
131             dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
132                            eap="TTLS", identity="user",
133                            anonymous_identity="ttls", password="password",
134                            ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
135                            wait_connect=False, scan_freq="2412")
136             wait_fail_trigger(authsrv, "GET_FAIL")
137         dev[0].request("REMOVE_NETWORK all")
138         dev[0].wait_disconnected()
139         dev[0].dump_monitor()
140 
141     authsrv.disable()
142     with alloc_fail(authsrv, 1, "radius_server_init;hostapd_setup_radius_srv"):
143         if "FAIL" not in authsrv.request("ENABLE"):
144             raise Exception("ENABLE succeeded during OOM")
145     with alloc_fail(authsrv, 2, "radius_server_init;hostapd_setup_radius_srv"):
146         if "FAIL" not in authsrv.request("ENABLE"):
147             raise Exception("ENABLE succeeded during OOM")
148 
149     for count in range(1, 4):
150         with alloc_fail(authsrv, count,
151                         "radius_server_read_clients;radius_server_init;hostapd_setup_radius_srv"):
152             if "FAIL" not in authsrv.request("ENABLE"):
153                 raise Exception("ENABLE succeeded during OOM")
154 
155     with alloc_fail(authsrv, 1, "eloop_sock_table_add_sock;radius_server_init;hostapd_setup_radius_srv"):
156         if "FAIL" not in authsrv.request("ENABLE"):
157             raise Exception("ENABLE succeeded during OOM")
158 
159     with alloc_fail(authsrv, 1, "tls_init;authsrv_init"):
160         if "FAIL" not in authsrv.request("ENABLE"):
161             raise Exception("ENABLE succeeded during OOM")
162 
163     for count in range(1, 3):
164         with alloc_fail(authsrv, count, "eap_sim_db_init;authsrv_init"):
165             if "FAIL" not in authsrv.request("ENABLE"):
166                 raise Exception("ENABLE succeeded during OOM")
167 
168 def test_authsrv_errors_1(dev, apdev):
169     """Authentication server errors (1)"""
170     params = authsrv_params()
171     params["eap_user_file"] = "sqlite:auth_serv/does-not-exist/does-not-exist"
172     authsrv = hostapd.add_ap(apdev[1], params, no_enable=True)
173     if "FAIL" not in authsrv.request("ENABLE"):
174         raise Exception("ENABLE succeeded with invalid SQLite EAP user file")
175 
176 def test_authsrv_errors_2(dev, apdev):
177     """Authentication server errors (2)"""
178     params = authsrv_params()
179     params["radius_server_clients"] = "auth_serv/does-not-exist"
180     authsrv = hostapd.add_ap(apdev[1], params, no_enable=True)
181     if "FAIL" not in authsrv.request("ENABLE"):
182         raise Exception("ENABLE succeeded with invalid RADIUS client file")
183 
184 def test_authsrv_errors_3(dev, apdev):
185     """Authentication server errors (3)"""
186     params = authsrv_params()
187     params["eap_sim_db"] = "unix:/tmp/hlr_auc_gw.sock db=auth_serv/does-not-exist/does-not-exist"
188     authsrv = hostapd.add_ap(apdev[1], params, no_enable=True)
189     if "FAIL" not in authsrv.request("ENABLE"):
190         raise Exception("ENABLE succeeded with invalid RADIUS client file")
191 
192 def test_authsrv_testing_options(dev, apdev):
193     """Authentication server and testing options"""
194     params = authsrv_params()
195     authsrv = hostapd.add_ap(apdev[1], params)
196 
197     params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
198     params['auth_server_port'] = "18128"
199     hapd = hostapd.add_ap(apdev[0], params)
200 
201     dev[0].scan_for_bss(hapd.own_addr(), 2412)
202     # The first two would be fine to run with any server build; the rest are
203     # actually supposed to fail, but they don't fail when using a server build
204     # that does not support the TLS protocol tests.
205     tests = ["foo@test-unknown",
206              "foo@test-tls-unknown",
207              "foo@test-tls-1",
208              "foo@test-tls-2",
209              "foo@test-tls-3",
210              "foo@test-tls-4",
211              "foo@test-tls-5",
212              "foo@test-tls-6",
213              "foo@test-tls-7",
214              "foo@test-tls-8"]
215     for t in tests:
216         dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
217                        eap="TTLS", identity="user",
218                        anonymous_identity=t,
219                        password="password",
220                        ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
221                        scan_freq="2412")
222         dev[0].request("REMOVE_NETWORK all")
223         dev[0].wait_disconnected()
224 
225 def test_authsrv_unknown_user(dev, apdev):
226     """Authentication server and unknown user"""
227     params = authsrv_params()
228     params["eap_user_file"] = "auth_serv/eap_user_vlan.conf"
229     authsrv = hostapd.add_ap(apdev[1], params)
230 
231     params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
232     params['auth_server_port'] = "18128"
233     hapd = hostapd.add_ap(apdev[0], params)
234 
235     dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
236                    eap="TTLS", identity="user",
237                    anonymous_identity="ttls", password="password",
238                    ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
239                    wait_connect=False, scan_freq="2412")
240     dev[0].wait_disconnected()
241     dev[0].request("REMOVE_NETWORK all")
242 
243 def test_authsrv_unknown_client(dev, apdev):
244     """Authentication server and unknown user"""
245     params = authsrv_params()
246     params["radius_server_clients"] = "auth_serv/radius_clients_none.conf"
247     authsrv = hostapd.add_ap(apdev[1], params)
248 
249     params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
250     params['auth_server_port'] = "18128"
251     hapd = hostapd.add_ap(apdev[0], params)
252 
253     # RADIUS SRV: Unknown client 127.0.0.1 - packet ignored
254     dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
255                    eap="TTLS", identity="user",
256                    anonymous_identity="ttls", password="password",
257                    ca_cert="auth_serv/ca.pem", phase2="autheap=GTC",
258                    wait_connect=False, scan_freq="2412")
259     ev = dev[0].wait_event(["CTRL-EVENT-EAP-STARTED"], timeout=10)
260     if ev is None:
261         raise Exception("EAP not started")
262     dev[0].request("REMOVE_NETWORK all")
263