test_ap_ft.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. import time
  7. import subprocess
  8. import logging
  9. logger = logging.getLogger()
  10. import hwsim_utils
  11. import hostapd
  12. from wlantest import Wlantest
  13. def ft_base_rsn():
  14. params = { "wpa": "2",
  15. "wpa_key_mgmt": "FT-PSK",
  16. "rsn_pairwise": "CCMP" }
  17. return params
  18. def ft_base_mixed():
  19. params = { "wpa": "3",
  20. "wpa_key_mgmt": "WPA-PSK FT-PSK",
  21. "wpa_pairwise": "TKIP",
  22. "rsn_pairwise": "CCMP" }
  23. return params
  24. def ft_params(rsn=True, ssid=None, passphrase=None):
  25. if rsn:
  26. params = ft_base_rsn()
  27. else:
  28. params = ft_base_mixed()
  29. if ssid:
  30. params["ssid"] = ssid
  31. if passphrase:
  32. params["wpa_passphrase"] = passphrase
  33. params["mobility_domain"] = "a1b2"
  34. params["r0_key_lifetime"] = "10000"
  35. params["pmk_r1_push"] = "1"
  36. params["reassociation_deadline"] = "1000"
  37. return params
  38. def ft_params1(rsn=True, ssid=None, passphrase=None):
  39. params = ft_params(rsn, ssid, passphrase)
  40. params['nas_identifier'] = "nas1.w1.fi"
  41. params['r1_key_holder'] = "000102030405"
  42. params['r0kh'] = [ "02:00:00:00:03:00 nas1.w1.fi 100102030405060708090a0b0c0d0e0f",
  43. "02:00:00:00:04:00 nas2.w1.fi 300102030405060708090a0b0c0d0e0f" ]
  44. params['r1kh'] = "02:00:00:00:04:00 00:01:02:03:04:06 200102030405060708090a0b0c0d0e0f"
  45. return params
  46. def ft_params2(rsn=True, ssid=None, passphrase=None):
  47. params = ft_params(rsn, ssid, passphrase)
  48. params['nas_identifier'] = "nas2.w1.fi"
  49. params['r1_key_holder'] = "000102030406"
  50. params['r0kh'] = [ "02:00:00:00:03:00 nas1.w1.fi 200102030405060708090a0b0c0d0e0f",
  51. "02:00:00:00:04:00 nas2.w1.fi 000102030405060708090a0b0c0d0e0f" ]
  52. params['r1kh'] = "02:00:00:00:03:00 00:01:02:03:04:05 300102030405060708090a0b0c0d0e0f"
  53. return params
  54. def run_roams(dev, apdev, ssid, passphrase, over_ds=False, sae=False, eap=False):
  55. logger.info("Connect to first AP")
  56. if eap:
  57. dev.connect(ssid, key_mgmt="FT-EAP", proto="WPA2", ieee80211w="1",
  58. eap="EKE", identity="eke user", password="hello")
  59. else:
  60. if sae:
  61. key_mgmt="FT-SAE"
  62. else:
  63. key_mgmt="FT-PSK"
  64. dev.connect(ssid, psk=passphrase, key_mgmt=key_mgmt, proto="WPA2",
  65. ieee80211w="1")
  66. if dev.get_status_field('bssid') == apdev[0]['bssid']:
  67. ap1 = apdev[0]
  68. ap2 = apdev[1]
  69. else:
  70. ap1 = apdev[1]
  71. ap2 = apdev[0]
  72. hwsim_utils.test_connectivity(dev.ifname, ap1['ifname'])
  73. logger.info("Roam to the second AP")
  74. if over_ds:
  75. dev.roam_over_ds(ap2['bssid'])
  76. else:
  77. dev.roam(ap2['bssid'])
  78. if dev.get_status_field('bssid') != ap2['bssid']:
  79. raise Exception("Did not connect to correct AP")
  80. hwsim_utils.test_connectivity(dev.ifname, ap2['ifname'])
  81. logger.info("Roam back to the first AP")
  82. if over_ds:
  83. dev.roam_over_ds(ap1['bssid'])
  84. else:
  85. dev.roam(ap1['bssid'])
  86. if dev.get_status_field('bssid') != ap1['bssid']:
  87. raise Exception("Did not connect to correct AP")
  88. hwsim_utils.test_connectivity(dev.ifname, ap1['ifname'])
  89. def test_ap_ft(dev, apdev):
  90. """WPA2-PSK-FT AP"""
  91. ssid = "test-ft"
  92. passphrase="12345678"
  93. params = ft_params1(ssid=ssid, passphrase=passphrase)
  94. hostapd.add_ap(apdev[0]['ifname'], params)
  95. params = ft_params2(ssid=ssid, passphrase=passphrase)
  96. hostapd.add_ap(apdev[1]['ifname'], params)
  97. run_roams(dev[0], apdev, ssid, passphrase)
  98. def test_ap_ft_mixed(dev, apdev):
  99. """WPA2-PSK-FT mixed-mode AP"""
  100. ssid = "test-ft-mixed"
  101. passphrase="12345678"
  102. params = ft_params1(rsn=False, ssid=ssid, passphrase=passphrase)
  103. hostapd.add_ap(apdev[0]['ifname'], params)
  104. params = ft_params2(rsn=False, ssid=ssid, passphrase=passphrase)
  105. hostapd.add_ap(apdev[1]['ifname'], params)
  106. run_roams(dev[0], apdev, ssid, passphrase)
  107. def test_ap_ft_pmf(dev, apdev):
  108. """WPA2-PSK-FT AP with PMF"""
  109. ssid = "test-ft"
  110. passphrase="12345678"
  111. params = ft_params1(ssid=ssid, passphrase=passphrase)
  112. params["ieee80211w"] = "2";
  113. hostapd.add_ap(apdev[0]['ifname'], params)
  114. params = ft_params2(ssid=ssid, passphrase=passphrase)
  115. params["ieee80211w"] = "2";
  116. hostapd.add_ap(apdev[1]['ifname'], params)
  117. run_roams(dev[0], apdev, ssid, passphrase)
  118. def test_ap_ft_over_ds(dev, apdev):
  119. """WPA2-PSK-FT AP over DS"""
  120. ssid = "test-ft"
  121. passphrase="12345678"
  122. params = ft_params1(ssid=ssid, passphrase=passphrase)
  123. hostapd.add_ap(apdev[0]['ifname'], params)
  124. params = ft_params2(ssid=ssid, passphrase=passphrase)
  125. hostapd.add_ap(apdev[1]['ifname'], params)
  126. run_roams(dev[0], apdev, ssid, passphrase, over_ds=True)
  127. def test_ap_ft_pmf_over_ds(dev, apdev):
  128. """WPA2-PSK-FT AP over DS with PMF"""
  129. ssid = "test-ft"
  130. passphrase="12345678"
  131. params = ft_params1(ssid=ssid, passphrase=passphrase)
  132. params["ieee80211w"] = "2";
  133. hostapd.add_ap(apdev[0]['ifname'], params)
  134. params = ft_params2(ssid=ssid, passphrase=passphrase)
  135. params["ieee80211w"] = "2";
  136. hostapd.add_ap(apdev[1]['ifname'], params)
  137. run_roams(dev[0], apdev, ssid, passphrase, over_ds=True)
  138. def test_ap_ft_sae(dev, apdev):
  139. """WPA2-PSK-FT-SAE AP"""
  140. ssid = "test-ft"
  141. passphrase="12345678"
  142. params = ft_params1(ssid=ssid, passphrase=passphrase)
  143. params['wpa_key_mgmt'] = "FT-SAE"
  144. hostapd.add_ap(apdev[0]['ifname'], params)
  145. params = ft_params2(ssid=ssid, passphrase=passphrase)
  146. params['wpa_key_mgmt'] = "FT-SAE"
  147. hostapd.add_ap(apdev[1]['ifname'], params)
  148. run_roams(dev[0], apdev, ssid, passphrase, sae=True)
  149. def test_ap_ft_sae_over_ds(dev, apdev):
  150. """WPA2-PSK-FT-SAE AP over DS"""
  151. ssid = "test-ft"
  152. passphrase="12345678"
  153. params = ft_params1(ssid=ssid, passphrase=passphrase)
  154. params['wpa_key_mgmt'] = "FT-SAE"
  155. hostapd.add_ap(apdev[0]['ifname'], params)
  156. params = ft_params2(ssid=ssid, passphrase=passphrase)
  157. params['wpa_key_mgmt'] = "FT-SAE"
  158. hostapd.add_ap(apdev[1]['ifname'], params)
  159. run_roams(dev[0], apdev, ssid, passphrase, sae=True, over_ds=True)
  160. def test_ap_ft_eap(dev, apdev):
  161. """WPA2-EAP-FT AP"""
  162. ssid = "test-ft"
  163. passphrase="12345678"
  164. radius = hostapd.radius_params()
  165. params = ft_params1(ssid=ssid, passphrase=passphrase)
  166. params['wpa_key_mgmt'] = "FT-EAP"
  167. params["ieee8021x"] = "1"
  168. params = dict(radius.items() + params.items())
  169. hostapd.add_ap(apdev[0]['ifname'], params)
  170. params = ft_params2(ssid=ssid, passphrase=passphrase)
  171. params['wpa_key_mgmt'] = "FT-EAP"
  172. params["ieee8021x"] = "1"
  173. params = dict(radius.items() + params.items())
  174. hostapd.add_ap(apdev[1]['ifname'], params)
  175. run_roams(dev[0], apdev, ssid, passphrase, eap=True)