]>
Commit | Line | Data |
---|---|---|
cd7f1b9a JM |
1 | # Fast BSS Transition tests |
2 | # Copyright (c) 2013, 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 | ||
7 | import time | |
8 | import subprocess | |
9 | import logging | |
c9aa4308 | 10 | logger = logging.getLogger() |
cd7f1b9a JM |
11 | |
12 | import hwsim_utils | |
13 | import hostapd | |
14 | from wlantest import Wlantest | |
15 | ||
16 | def ft_base_rsn(): | |
17 | params = { "wpa": "2", | |
18 | "wpa_key_mgmt": "FT-PSK", | |
19 | "rsn_pairwise": "CCMP" } | |
20 | return params | |
21 | ||
22 | def ft_base_mixed(): | |
23 | params = { "wpa": "3", | |
24 | "wpa_key_mgmt": "WPA-PSK FT-PSK", | |
25 | "wpa_pairwise": "TKIP", | |
26 | "rsn_pairwise": "CCMP" } | |
27 | return params | |
28 | ||
29 | def ft_params(rsn=True, ssid=None, passphrase=None): | |
30 | if rsn: | |
31 | params = ft_base_rsn() | |
32 | else: | |
33 | params = ft_base_mixed() | |
34 | if ssid: | |
35 | params["ssid"] = ssid | |
36 | if passphrase: | |
37 | params["wpa_passphrase"] = passphrase | |
38 | ||
39 | params["mobility_domain"] = "a1b2" | |
40 | params["r0_key_lifetime"] = "10000" | |
41 | params["pmk_r1_push"] = "1" | |
42 | params["reassociation_deadline"] = "1000" | |
43 | return params | |
44 | ||
45 | def ft_params1(rsn=True, ssid=None, passphrase=None): | |
46 | params = ft_params(rsn, ssid, passphrase) | |
47 | params['nas_identifier'] = "nas1.w1.fi" | |
48 | params['r1_key_holder'] = "000102030405" | |
49 | params['r0kh'] = [ "02:00:00:00:03:00 nas1.w1.fi 100102030405060708090a0b0c0d0e0f", | |
50 | "02:00:00:00:04:00 nas2.w1.fi 300102030405060708090a0b0c0d0e0f" ] | |
51 | params['r1kh'] = "02:00:00:00:04:00 00:01:02:03:04:06 200102030405060708090a0b0c0d0e0f" | |
52 | return params | |
53 | ||
54 | def ft_params2(rsn=True, ssid=None, passphrase=None): | |
55 | params = ft_params(rsn, ssid, passphrase) | |
56 | params['nas_identifier'] = "nas2.w1.fi" | |
57 | params['r1_key_holder'] = "000102030406" | |
58 | params['r0kh'] = [ "02:00:00:00:03:00 nas1.w1.fi 200102030405060708090a0b0c0d0e0f", | |
59 | "02:00:00:00:04:00 nas2.w1.fi 000102030405060708090a0b0c0d0e0f" ] | |
60 | params['r1kh'] = "02:00:00:00:03:00 00:01:02:03:04:05 300102030405060708090a0b0c0d0e0f" | |
61 | return params | |
62 | ||
6f62809b | 63 | def run_roams(dev, apdev, ssid, passphrase, over_ds=False, sae=False, eap=False): |
cd7f1b9a | 64 | logger.info("Connect to first AP") |
6f62809b JM |
65 | if eap: |
66 | dev.connect(ssid, key_mgmt="FT-EAP", proto="WPA2", ieee80211w="1", | |
67 | eap="EKE", identity="eke user", password="hello") | |
6e658cc4 | 68 | else: |
6f62809b JM |
69 | if sae: |
70 | key_mgmt="FT-SAE" | |
71 | else: | |
72 | key_mgmt="FT-PSK" | |
73 | dev.connect(ssid, psk=passphrase, key_mgmt=key_mgmt, proto="WPA2", | |
74 | ieee80211w="1") | |
cd7f1b9a JM |
75 | if dev.get_status_field('bssid') == apdev[0]['bssid']: |
76 | ap1 = apdev[0] | |
77 | ap2 = apdev[1] | |
78 | else: | |
79 | ap1 = apdev[1] | |
80 | ap2 = apdev[0] | |
81 | hwsim_utils.test_connectivity(dev.ifname, ap1['ifname']) | |
82 | ||
83 | logger.info("Roam to the second AP") | |
b553eab1 JM |
84 | if over_ds: |
85 | dev.roam_over_ds(ap2['bssid']) | |
86 | else: | |
87 | dev.roam(ap2['bssid']) | |
cd7f1b9a JM |
88 | if dev.get_status_field('bssid') != ap2['bssid']: |
89 | raise Exception("Did not connect to correct AP") | |
90 | hwsim_utils.test_connectivity(dev.ifname, ap2['ifname']) | |
91 | ||
92 | logger.info("Roam back to the first AP") | |
b553eab1 JM |
93 | if over_ds: |
94 | dev.roam_over_ds(ap1['bssid']) | |
95 | else: | |
96 | dev.roam(ap1['bssid']) | |
cd7f1b9a JM |
97 | if dev.get_status_field('bssid') != ap1['bssid']: |
98 | raise Exception("Did not connect to correct AP") | |
99 | hwsim_utils.test_connectivity(dev.ifname, ap1['ifname']) | |
100 | ||
101 | def test_ap_ft(dev, apdev): | |
102 | """WPA2-PSK-FT AP""" | |
103 | ssid = "test-ft" | |
104 | passphrase="12345678" | |
105 | ||
106 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
107 | hostapd.add_ap(apdev[0]['ifname'], params) | |
108 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
109 | hostapd.add_ap(apdev[1]['ifname'], params) | |
110 | ||
111 | run_roams(dev[0], apdev, ssid, passphrase) | |
112 | ||
113 | def test_ap_ft_mixed(dev, apdev): | |
114 | """WPA2-PSK-FT mixed-mode AP""" | |
115 | ssid = "test-ft-mixed" | |
116 | passphrase="12345678" | |
117 | ||
118 | params = ft_params1(rsn=False, ssid=ssid, passphrase=passphrase) | |
65038313 JM |
119 | hapd = hostapd.add_ap(apdev[0]['ifname'], params) |
120 | key_mgmt = hapd.get_config()['key_mgmt'] | |
121 | vals = key_mgmt.split(' ') | |
122 | if vals[0] != "WPA-PSK" or vals[1] != "FT-PSK": | |
123 | raise Exception("Unexpected GET_CONFIG(key_mgmt): " + key_mgmt) | |
cd7f1b9a JM |
124 | params = ft_params2(rsn=False, ssid=ssid, passphrase=passphrase) |
125 | hostapd.add_ap(apdev[1]['ifname'], params) | |
126 | ||
127 | run_roams(dev[0], apdev, ssid, passphrase) | |
128 | ||
129 | def test_ap_ft_pmf(dev, apdev): | |
130 | """WPA2-PSK-FT AP with PMF""" | |
131 | ssid = "test-ft" | |
132 | passphrase="12345678" | |
133 | ||
134 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
135 | params["ieee80211w"] = "2"; | |
136 | hostapd.add_ap(apdev[0]['ifname'], params) | |
137 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
138 | params["ieee80211w"] = "2"; | |
139 | hostapd.add_ap(apdev[1]['ifname'], params) | |
140 | ||
141 | run_roams(dev[0], apdev, ssid, passphrase) | |
b553eab1 JM |
142 | |
143 | def test_ap_ft_over_ds(dev, apdev): | |
144 | """WPA2-PSK-FT AP over DS""" | |
145 | ssid = "test-ft" | |
146 | passphrase="12345678" | |
147 | ||
148 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
149 | hostapd.add_ap(apdev[0]['ifname'], params) | |
150 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
151 | hostapd.add_ap(apdev[1]['ifname'], params) | |
152 | ||
153 | run_roams(dev[0], apdev, ssid, passphrase, over_ds=True) | |
154 | ||
155 | def test_ap_ft_pmf_over_ds(dev, apdev): | |
156 | """WPA2-PSK-FT AP over DS with PMF""" | |
157 | ssid = "test-ft" | |
158 | passphrase="12345678" | |
159 | ||
160 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
161 | params["ieee80211w"] = "2"; | |
162 | hostapd.add_ap(apdev[0]['ifname'], params) | |
163 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
164 | params["ieee80211w"] = "2"; | |
165 | hostapd.add_ap(apdev[1]['ifname'], params) | |
166 | ||
167 | run_roams(dev[0], apdev, ssid, passphrase, over_ds=True) | |
6e658cc4 | 168 | |
aaba98d3 JM |
169 | def test_ap_ft_over_ds_pull(dev, apdev): |
170 | """WPA2-PSK-FT AP over DS (pull PMK)""" | |
171 | ssid = "test-ft" | |
172 | passphrase="12345678" | |
173 | ||
174 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
175 | params["pmk_r1_push"] = "0" | |
176 | hostapd.add_ap(apdev[0]['ifname'], params) | |
177 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
178 | params["pmk_r1_push"] = "0" | |
179 | hostapd.add_ap(apdev[1]['ifname'], params) | |
180 | ||
181 | run_roams(dev[0], apdev, ssid, passphrase, over_ds=True) | |
182 | ||
6e658cc4 JM |
183 | def test_ap_ft_sae(dev, apdev): |
184 | """WPA2-PSK-FT-SAE AP""" | |
185 | ssid = "test-ft" | |
186 | passphrase="12345678" | |
187 | ||
188 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
189 | params['wpa_key_mgmt'] = "FT-SAE" | |
190 | hostapd.add_ap(apdev[0]['ifname'], params) | |
191 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
192 | params['wpa_key_mgmt'] = "FT-SAE" | |
65038313 JM |
193 | hapd = hostapd.add_ap(apdev[1]['ifname'], params) |
194 | key_mgmt = hapd.get_config()['key_mgmt'] | |
195 | if key_mgmt.split(' ')[0] != "FT-SAE": | |
196 | raise Exception("Unexpected GET_CONFIG(key_mgmt): " + key_mgmt) | |
6e658cc4 JM |
197 | |
198 | run_roams(dev[0], apdev, ssid, passphrase, sae=True) | |
199 | ||
200 | def test_ap_ft_sae_over_ds(dev, apdev): | |
201 | """WPA2-PSK-FT-SAE AP over DS""" | |
202 | ssid = "test-ft" | |
203 | passphrase="12345678" | |
204 | ||
205 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
206 | params['wpa_key_mgmt'] = "FT-SAE" | |
207 | hostapd.add_ap(apdev[0]['ifname'], params) | |
208 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
209 | params['wpa_key_mgmt'] = "FT-SAE" | |
210 | hostapd.add_ap(apdev[1]['ifname'], params) | |
211 | ||
212 | run_roams(dev[0], apdev, ssid, passphrase, sae=True, over_ds=True) | |
6f62809b JM |
213 | |
214 | def test_ap_ft_eap(dev, apdev): | |
215 | """WPA2-EAP-FT AP""" | |
216 | ssid = "test-ft" | |
217 | passphrase="12345678" | |
218 | ||
219 | radius = hostapd.radius_params() | |
220 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
221 | params['wpa_key_mgmt'] = "FT-EAP" | |
222 | params["ieee8021x"] = "1" | |
223 | params = dict(radius.items() + params.items()) | |
65038313 JM |
224 | hapd = hostapd.add_ap(apdev[0]['ifname'], params) |
225 | key_mgmt = hapd.get_config()['key_mgmt'] | |
226 | if key_mgmt.split(' ')[0] != "FT-EAP": | |
227 | raise Exception("Unexpected GET_CONFIG(key_mgmt): " + key_mgmt) | |
6f62809b JM |
228 | params = ft_params2(ssid=ssid, passphrase=passphrase) |
229 | params['wpa_key_mgmt'] = "FT-EAP" | |
230 | params["ieee8021x"] = "1" | |
231 | params = dict(radius.items() + params.items()) | |
232 | hostapd.add_ap(apdev[1]['ifname'], params) | |
233 | ||
234 | run_roams(dev[0], apdev, ssid, passphrase, eap=True) | |
aaba98d3 JM |
235 | |
236 | def test_ap_ft_eap_pull(dev, apdev): | |
237 | """WPA2-EAP-FT AP (pull PMK)""" | |
238 | ssid = "test-ft" | |
239 | passphrase="12345678" | |
240 | ||
241 | radius = hostapd.radius_params() | |
242 | params = ft_params1(ssid=ssid, passphrase=passphrase) | |
243 | params['wpa_key_mgmt'] = "FT-EAP" | |
244 | params["ieee8021x"] = "1" | |
245 | params["pmk_r1_push"] = "0" | |
246 | params = dict(radius.items() + params.items()) | |
247 | hapd = hostapd.add_ap(apdev[0]['ifname'], params) | |
248 | key_mgmt = hapd.get_config()['key_mgmt'] | |
249 | if key_mgmt.split(' ')[0] != "FT-EAP": | |
250 | raise Exception("Unexpected GET_CONFIG(key_mgmt): " + key_mgmt) | |
251 | params = ft_params2(ssid=ssid, passphrase=passphrase) | |
252 | params['wpa_key_mgmt'] = "FT-EAP" | |
253 | params["ieee8021x"] = "1" | |
254 | params["pmk_r1_push"] = "0" | |
255 | params = dict(radius.items() + params.items()) | |
256 | hostapd.add_ap(apdev[1]['ifname'], params) | |
257 | ||
258 | run_roams(dev[0], apdev, ssid, passphrase, eap=True) |