]> git.ipfire.org Git - thirdparty/hostap.git/blame - tests/hwsim/test_ap_ft.py
tests: Verify FT SAE
[thirdparty/hostap.git] / tests / hwsim / test_ap_ft.py
CommitLineData
cd7f1b9a
JM
1#!/usr/bin/python
2#
3# Fast BSS Transition tests
4# Copyright (c) 2013, Jouni Malinen <j@w1.fi>
5#
6# This software may be distributed under the terms of the BSD license.
7# See README for more details.
8
9import time
10import subprocess
11import logging
c9aa4308 12logger = logging.getLogger()
cd7f1b9a
JM
13
14import hwsim_utils
15import hostapd
16from wlantest import Wlantest
17
18def ft_base_rsn():
19 params = { "wpa": "2",
20 "wpa_key_mgmt": "FT-PSK",
21 "rsn_pairwise": "CCMP" }
22 return params
23
24def ft_base_mixed():
25 params = { "wpa": "3",
26 "wpa_key_mgmt": "WPA-PSK FT-PSK",
27 "wpa_pairwise": "TKIP",
28 "rsn_pairwise": "CCMP" }
29 return params
30
31def ft_params(rsn=True, ssid=None, passphrase=None):
32 if rsn:
33 params = ft_base_rsn()
34 else:
35 params = ft_base_mixed()
36 if ssid:
37 params["ssid"] = ssid
38 if passphrase:
39 params["wpa_passphrase"] = passphrase
40
41 params["mobility_domain"] = "a1b2"
42 params["r0_key_lifetime"] = "10000"
43 params["pmk_r1_push"] = "1"
44 params["reassociation_deadline"] = "1000"
45 return params
46
47def ft_params1(rsn=True, ssid=None, passphrase=None):
48 params = ft_params(rsn, ssid, passphrase)
49 params['nas_identifier'] = "nas1.w1.fi"
50 params['r1_key_holder'] = "000102030405"
51 params['r0kh'] = [ "02:00:00:00:03:00 nas1.w1.fi 100102030405060708090a0b0c0d0e0f",
52 "02:00:00:00:04:00 nas2.w1.fi 300102030405060708090a0b0c0d0e0f" ]
53 params['r1kh'] = "02:00:00:00:04:00 00:01:02:03:04:06 200102030405060708090a0b0c0d0e0f"
54 return params
55
56def ft_params2(rsn=True, ssid=None, passphrase=None):
57 params = ft_params(rsn, ssid, passphrase)
58 params['nas_identifier'] = "nas2.w1.fi"
59 params['r1_key_holder'] = "000102030406"
60 params['r0kh'] = [ "02:00:00:00:03:00 nas1.w1.fi 200102030405060708090a0b0c0d0e0f",
61 "02:00:00:00:04:00 nas2.w1.fi 000102030405060708090a0b0c0d0e0f" ]
62 params['r1kh'] = "02:00:00:00:03:00 00:01:02:03:04:05 300102030405060708090a0b0c0d0e0f"
63 return params
64
6e658cc4 65def run_roams(dev, apdev, ssid, passphrase, over_ds=False, sae=False):
cd7f1b9a 66 logger.info("Connect to first AP")
6e658cc4
JM
67 if sae:
68 key_mgmt="FT-SAE"
69 else:
70 key_mgmt="FT-PSK"
71 dev.connect(ssid, psk=passphrase, key_mgmt=key_mgmt, proto="WPA2",
cd7f1b9a
JM
72 ieee80211w="1")
73 if dev.get_status_field('bssid') == apdev[0]['bssid']:
74 ap1 = apdev[0]
75 ap2 = apdev[1]
76 else:
77 ap1 = apdev[1]
78 ap2 = apdev[0]
79 hwsim_utils.test_connectivity(dev.ifname, ap1['ifname'])
80
81 logger.info("Roam to the second AP")
b553eab1
JM
82 if over_ds:
83 dev.roam_over_ds(ap2['bssid'])
84 else:
85 dev.roam(ap2['bssid'])
cd7f1b9a
JM
86 if dev.get_status_field('bssid') != ap2['bssid']:
87 raise Exception("Did not connect to correct AP")
88 hwsim_utils.test_connectivity(dev.ifname, ap2['ifname'])
89
90 logger.info("Roam back to the first AP")
b553eab1
JM
91 if over_ds:
92 dev.roam_over_ds(ap1['bssid'])
93 else:
94 dev.roam(ap1['bssid'])
cd7f1b9a
JM
95 if dev.get_status_field('bssid') != ap1['bssid']:
96 raise Exception("Did not connect to correct AP")
97 hwsim_utils.test_connectivity(dev.ifname, ap1['ifname'])
98
99def test_ap_ft(dev, apdev):
100 """WPA2-PSK-FT AP"""
101 ssid = "test-ft"
102 passphrase="12345678"
103
104 params = ft_params1(ssid=ssid, passphrase=passphrase)
105 hostapd.add_ap(apdev[0]['ifname'], params)
106 params = ft_params2(ssid=ssid, passphrase=passphrase)
107 hostapd.add_ap(apdev[1]['ifname'], params)
108
109 run_roams(dev[0], apdev, ssid, passphrase)
110
111def test_ap_ft_mixed(dev, apdev):
112 """WPA2-PSK-FT mixed-mode AP"""
113 ssid = "test-ft-mixed"
114 passphrase="12345678"
115
116 params = ft_params1(rsn=False, ssid=ssid, passphrase=passphrase)
117 hostapd.add_ap(apdev[0]['ifname'], params)
118 params = ft_params2(rsn=False, ssid=ssid, passphrase=passphrase)
119 hostapd.add_ap(apdev[1]['ifname'], params)
120
121 run_roams(dev[0], apdev, ssid, passphrase)
122
123def test_ap_ft_pmf(dev, apdev):
124 """WPA2-PSK-FT AP with PMF"""
125 ssid = "test-ft"
126 passphrase="12345678"
127
128 params = ft_params1(ssid=ssid, passphrase=passphrase)
129 params["ieee80211w"] = "2";
130 hostapd.add_ap(apdev[0]['ifname'], params)
131 params = ft_params2(ssid=ssid, passphrase=passphrase)
132 params["ieee80211w"] = "2";
133 hostapd.add_ap(apdev[1]['ifname'], params)
134
135 run_roams(dev[0], apdev, ssid, passphrase)
b553eab1
JM
136
137def test_ap_ft_over_ds(dev, apdev):
138 """WPA2-PSK-FT AP over DS"""
139 ssid = "test-ft"
140 passphrase="12345678"
141
142 params = ft_params1(ssid=ssid, passphrase=passphrase)
143 hostapd.add_ap(apdev[0]['ifname'], params)
144 params = ft_params2(ssid=ssid, passphrase=passphrase)
145 hostapd.add_ap(apdev[1]['ifname'], params)
146
147 run_roams(dev[0], apdev, ssid, passphrase, over_ds=True)
148
149def test_ap_ft_pmf_over_ds(dev, apdev):
150 """WPA2-PSK-FT AP over DS with PMF"""
151 ssid = "test-ft"
152 passphrase="12345678"
153
154 params = ft_params1(ssid=ssid, passphrase=passphrase)
155 params["ieee80211w"] = "2";
156 hostapd.add_ap(apdev[0]['ifname'], params)
157 params = ft_params2(ssid=ssid, passphrase=passphrase)
158 params["ieee80211w"] = "2";
159 hostapd.add_ap(apdev[1]['ifname'], params)
160
161 run_roams(dev[0], apdev, ssid, passphrase, over_ds=True)
6e658cc4
JM
162
163def test_ap_ft_sae(dev, apdev):
164 """WPA2-PSK-FT-SAE AP"""
165 ssid = "test-ft"
166 passphrase="12345678"
167
168 params = ft_params1(ssid=ssid, passphrase=passphrase)
169 params['wpa_key_mgmt'] = "FT-SAE"
170 hostapd.add_ap(apdev[0]['ifname'], params)
171 params = ft_params2(ssid=ssid, passphrase=passphrase)
172 params['wpa_key_mgmt'] = "FT-SAE"
173 hostapd.add_ap(apdev[1]['ifname'], params)
174
175 run_roams(dev[0], apdev, ssid, passphrase, sae=True)
176
177def test_ap_ft_sae_over_ds(dev, apdev):
178 """WPA2-PSK-FT-SAE AP over DS"""
179 ssid = "test-ft"
180 passphrase="12345678"
181
182 params = ft_params1(ssid=ssid, passphrase=passphrase)
183 params['wpa_key_mgmt'] = "FT-SAE"
184 hostapd.add_ap(apdev[0]['ifname'], params)
185 params = ft_params2(ssid=ssid, passphrase=passphrase)
186 params['wpa_key_mgmt'] = "FT-SAE"
187 hostapd.add_ap(apdev[1]['ifname'], params)
188
189 run_roams(dev[0], apdev, ssid, passphrase, sae=True, over_ds=True)