test_ap_ft.py 6.9 KB

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