]> git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_wpas_ap.py
tests: Verify that wpa_supplicant clears keys from memory
[thirdparty/hostap.git] / tests / hwsim / test_wpas_ap.py
1 # wpa_supplicant AP mode tests
2 # Copyright (c) 2014, Qualcomm Atheros, Inc.
3 #
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
6
7 import time
8 import logging
9 logger = logging.getLogger()
10
11 import hwsim_utils
12
13 def wait_ap_ready(dev):
14 ev = dev.wait_event(["CTRL-EVENT-CONNECTED"])
15 if ev is None:
16 raise Exception("AP failed to start")
17
18 def test_wpas_ap_open(dev):
19 """wpa_supplicant AP mode - open network"""
20 if "FAIL" not in dev[0].request("DEAUTHENTICATE 00:11:22:33:44:55"):
21 raise Exception("Unexpected DEAUTHENTICATE accepted")
22 if "FAIL" not in dev[0].request("DISASSOCIATE 00:11:22:33:44:55"):
23 raise Exception("Unexpected DISASSOCIATE accepted")
24 if "FAIL" not in dev[0].request("CHAN_SWITCH 0 2432"):
25 raise Exception("Unexpected CHAN_SWITCH accepted")
26
27 id = dev[0].add_network()
28 dev[0].set_network(id, "mode", "2")
29 dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
30 dev[0].set_network(id, "key_mgmt", "NONE")
31 dev[0].set_network(id, "frequency", "2412")
32 dev[0].set_network(id, "scan_freq", "2412")
33 dev[0].select_network(id)
34 wait_ap_ready(dev[0])
35
36 if "FAIL" not in dev[0].request("DEAUTHENTICATE foo"):
37 raise Exception("Invalid DEAUTHENTICATE accepted")
38 if "FAIL" not in dev[0].request("DISASSOCIATE foo"):
39 raise Exception("Invalid DISASSOCIATE accepted")
40
41 dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
42 dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
43 hwsim_utils.test_connectivity(dev[0], dev[1])
44 hwsim_utils.test_connectivity(dev[1], dev[2])
45
46 addr1 = dev[1].p2p_interface_addr()
47 addr2 = dev[2].p2p_interface_addr()
48 addrs = [ addr1, addr2 ]
49 sta = dev[0].get_sta(None)
50 if sta['addr'] not in addrs:
51 raise Exception("Unexpected STA address")
52 sta1 = dev[0].get_sta(sta['addr'])
53 if sta1['addr'] not in addrs:
54 raise Exception("Unexpected STA address")
55 sta2 = dev[0].get_sta(sta['addr'], next=True)
56 if sta2['addr'] not in addrs:
57 raise Exception("Unexpected STA2 address")
58 sta3 = dev[0].get_sta(sta2['addr'], next=True)
59 if len(sta3) != 0:
60 raise Exception("Unexpected STA iteration result (did not stop)")
61
62 status = dev[0].get_status()
63 if status['mode'] != "AP":
64 raise Exception("Unexpected status mode")
65
66 dev[1].dump_monitor()
67 dev[2].dump_monitor()
68 dev[0].request("DEAUTHENTICATE " + addr1)
69 dev[0].request("DISASSOCIATE " + addr2)
70 dev[1].wait_disconnected(timeout=10)
71 dev[2].wait_disconnected(timeout=10)
72 dev[1].wait_connected(timeout=10, error="Reconnection timed out")
73 dev[2].wait_connected(timeout=10, error="Reconnection timed out")
74 dev[1].request("DISCONNECT")
75 dev[2].request("DISCONNECT")
76
77 def test_wpas_ap_wep(dev):
78 """wpa_supplicant AP mode - WEP"""
79 id = dev[0].add_network()
80 dev[0].set_network(id, "mode", "2")
81 dev[0].set_network_quoted(id, "ssid", "wpas-ap-wep")
82 dev[0].set_network(id, "key_mgmt", "NONE")
83 dev[0].set_network(id, "frequency", "2412")
84 dev[0].set_network(id, "scan_freq", "2412")
85 dev[0].set_network_quoted(id, "wep_key0", "hello")
86 dev[0].select_network(id)
87 wait_ap_ready(dev[0])
88
89 dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"',
90 scan_freq="2412")
91 hwsim_utils.test_connectivity(dev[0], dev[1])
92 dev[1].request("DISCONNECT")
93
94 def test_wpas_ap_no_ssid(dev):
95 """wpa_supplicant AP mode - invalid network configuration"""
96 id = dev[0].add_network()
97 dev[0].set_network(id, "mode", "2")
98 dev[0].set_network(id, "key_mgmt", "NONE")
99 dev[0].set_network(id, "frequency", "2412")
100 dev[0].set_network(id, "scan_freq", "2412")
101 dev[0].select_network(id)
102 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
103 if ev is not None:
104 raise Exception("Unexpected AP start")
105
106 def test_wpas_ap_default_frequency(dev):
107 """wpa_supplicant AP mode - default frequency"""
108 id = dev[0].add_network()
109 dev[0].set_network(id, "mode", "2")
110 dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
111 dev[0].set_network(id, "key_mgmt", "NONE")
112 dev[0].set_network(id, "scan_freq", "2412")
113 dev[0].select_network(id)
114 wait_ap_ready(dev[0])
115 dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462")
116 dev[1].request("DISCONNECT")
117
118 def test_wpas_ap_invalid_frequency(dev):
119 """wpa_supplicant AP mode - invalid frequency configuration"""
120 id = dev[0].add_network()
121 dev[0].set_network(id, "mode", "2")
122 dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
123 dev[0].set_network(id, "key_mgmt", "NONE")
124 dev[0].set_network(id, "frequency", "2413")
125 dev[0].set_network(id, "scan_freq", "2412")
126 dev[0].select_network(id)
127 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
128 if ev is not None:
129 raise Exception("Unexpected AP start")
130
131 def test_wpas_ap_wps(dev):
132 """wpa_supplicant AP mode - WPS operations"""
133 id = dev[0].add_network()
134 dev[0].set_network(id, "mode", "2")
135 dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
136 dev[0].set_network_quoted(id, "psk", "1234567890")
137 dev[0].set_network(id, "frequency", "2412")
138 dev[0].set_network(id, "scan_freq", "2412")
139 dev[0].select_network(id)
140 wait_ap_ready(dev[0])
141 bssid = dev[0].p2p_interface_addr()
142
143 logger.info("Test PBC mode start/stop")
144 if "FAIL" not in dev[0].request("WPS_CANCEL"):
145 raise Exception("Unexpected WPS_CANCEL success")
146 dev[0].request("WPS_PBC")
147 ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
148 if ev is None:
149 raise Exception("PBC mode start timeout")
150 if "OK" not in dev[0].request("WPS_CANCEL"):
151 raise Exception("Unexpected WPS_CANCEL failure")
152 ev = dev[0].wait_event(["WPS-TIMEOUT"])
153 if ev is None:
154 raise Exception("PBC mode disabling timeout")
155
156 logger.info("Test PBC protocol run")
157 dev[0].request("WPS_PBC")
158 ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
159 if ev is None:
160 raise Exception("PBC mode start timeout")
161 dev[1].request("WPS_PBC")
162 dev[1].wait_connected(timeout=30, error="WPS PBC operation timed out")
163 hwsim_utils.test_connectivity(dev[0], dev[1])
164
165 logger.info("Test AP PIN to learn configuration")
166 pin = dev[0].request("WPS_AP_PIN random")
167 if "FAIL" in pin:
168 raise Exception("Could not generate random AP PIN")
169 if pin not in dev[0].request("WPS_AP_PIN get"):
170 raise Exception("Could not fetch current AP PIN")
171 dev[2].wps_reg(bssid, pin)
172 hwsim_utils.test_connectivity(dev[1], dev[2])
173
174 dev[1].request("REMOVE_NETWORK all")
175 dev[2].request("REMOVE_NETWORK all")
176
177 logger.info("Test AP PIN operations")
178 dev[0].request("WPS_AP_PIN disable")
179 dev[0].request("WPS_AP_PIN set " + pin + " 1")
180 time.sleep(1.1)
181 if "FAIL" not in dev[0].request("WPS_AP_PIN get"):
182 raise Exception("AP PIN unexpectedly still enabled")
183
184 pin = dev[1].wps_read_pin()
185 dev[0].request("WPS_PIN any " + pin)
186 dev[1].request("WPS_PIN any " + pin)
187 dev[1].wait_connected(timeout=30)
188 dev[1].request("REMOVE_NETWORK all")
189 dev[1].dump_monitor()
190
191 dev[0].request("WPS_PIN any " + pin + " 100")
192 dev[1].request("WPS_PIN any " + pin)
193 dev[1].wait_connected(timeout=30)
194 dev[1].request("REMOVE_NETWORK all")
195 dev[1].dump_monitor()
196
197 dev[0].request("WPS_AP_PIN set 12345670")
198 dev[0].dump_monitor()
199
200 runs = ("88887777", "12340000", "00000000", "12345670")
201 for pin in runs:
202 logger.info("Try AP PIN " + pin)
203 dev[2].dump_monitor()
204 dev[2].request("WPS_REG " + bssid + " " + pin)
205 ev = dev[2].wait_event(["WPS-SUCCESS", "WPS-FAIL msg"], timeout=15)
206 if ev is None:
207 raise Exception("WPS operation timed out")
208 if "WPS-SUCCESS" in ev:
209 raise Exception("WPS operation succeeded unexpectedly")
210 dev[2].wait_disconnected(timeout=10)
211 dev[2].request("WPS_CANCEL")
212 dev[2].request("REMOVE_NETWORK all")
213 ev = dev[0].wait_event(["WPS-AP-SETUP-LOCKED"])
214 if ev is None:
215 raise Exception("WPS AP PIN not locked")
216
217 dev[0].dump_monitor()
218 logger.info("Test random AP PIN timeout")
219 pin = dev[0].request("WPS_AP_PIN random 1")
220 if "FAIL" in pin:
221 raise Exception("Could not generate random AP PIN")
222 res = dev[0].request("WPS_AP_PIN get")
223 if pin not in res:
224 raise Exception("Could not fetch current AP PIN")
225 for i in range(10):
226 time.sleep(0.2)
227 res = dev[0].request("WPS_AP_PIN get")
228 if "FAIL" in res:
229 break
230 if "FAIL" not in res:
231 raise Exception("WPS_AP_PIN random timeout did not work")
232
233 if "FAIL" not in dev[0].request("WPS_AP_PIN foo"):
234 raise Exception("Invalid WPS_AP_PIN command not rejected")
235 if "FAIL" not in dev[0].request("WPS_AP_PIN set"):
236 raise Exception("Invalid WPS_AP_PIN command not rejected")
237
238 def test_wpas_ap_wps_pbc_overlap(dev):
239 """wpa_supplicant AP mode - WPS operations with PBC overlap"""
240 id = dev[0].add_network()
241 dev[0].set_network(id, "mode", "2")
242 dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
243 dev[0].set_network_quoted(id, "psk", "1234567890")
244 dev[0].set_network(id, "frequency", "2412")
245 dev[0].set_network(id, "scan_freq", "2412")
246 dev[0].select_network(id)
247 wait_ap_ready(dev[0])
248 bssid = dev[0].p2p_interface_addr()
249
250 dev[1].scan_for_bss(bssid, freq="2412")
251 dev[1].dump_monitor()
252 dev[2].scan_for_bss(bssid, freq="2412")
253 dev[2].dump_monitor()
254 dev[0].request("WPS_PBC")
255 dev[1].request("WPS_PBC " + bssid)
256 dev[2].request("WPS_PBC " + bssid)
257
258 ev = dev[1].wait_event(["WPS-M2D"], timeout=15)
259 if ev is None:
260 raise Exception("PBC session overlap not detected (dev1)")
261 if "config_error=12" not in ev:
262 raise Exception("PBC session overlap not correctly reported (dev1)")
263
264 ev = dev[2].wait_event(["WPS-M2D"], timeout=15)
265 if ev is None:
266 raise Exception("PBC session overlap not detected (dev2)")
267 if "config_error=12" not in ev:
268 raise Exception("PBC session overlap not correctly reported (dev2)")
269
270 if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC"):
271 raise Exception("WPS_PBC(AP) accepted during overlap")
272 if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC any"):
273 raise Exception("WPS_PBC(AP) accepted during overlap")
274 dev[0].request("WPS_CANCEL")
275 dev[1].request("WPS_CANCEL")
276 dev[2].request("WPS_CANCEL")