test_ap_psk.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. # WPA2-Personal 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. import logging
  7. logger = logging.getLogger()
  8. import os
  9. import hostapd
  10. import hwsim_utils
  11. def check_mib(dev, vals):
  12. mib = dev.get_mib()
  13. for v in vals:
  14. if mib[v[0]] != v[1]:
  15. raise Exception("Unexpected {} = {} (expected {})".format(v[0], mib[v[0]], v[1]))
  16. def test_ap_wpa2_psk(dev, apdev):
  17. """WPA2-PSK AP with PSK instead of passphrase"""
  18. ssid = "test-wpa2-psk"
  19. passphrase = 'qwertyuiop'
  20. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  21. params = hostapd.wpa2_params(ssid=ssid)
  22. params['wpa_psk'] = psk
  23. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  24. key_mgmt = hapd.get_config()['key_mgmt']
  25. if key_mgmt.split(' ')[0] != "WPA-PSK":
  26. raise Exception("Unexpected GET_CONFIG(key_mgmt): " + key_mgmt)
  27. dev[0].connect(ssid, raw_psk=psk, scan_freq="2412")
  28. dev[1].connect(ssid, psk=passphrase, scan_freq="2412")
  29. sig = dev[0].request("SIGNAL_POLL").splitlines()
  30. pkt = dev[0].request("PKTCNT_POLL").splitlines()
  31. if "FREQUENCY=2412" not in sig:
  32. raise Exception("Unexpected SIGNAL_POLL value: " + str(sig))
  33. if "TXBAD=0" not in pkt:
  34. raise Exception("Unexpected TXBAD value: " + str(pkt))
  35. def test_ap_wpa2_psk_file(dev, apdev):
  36. """WPA2-PSK AP with PSK from a file"""
  37. ssid = "test-wpa2-psk"
  38. passphrase = 'qwertyuiop'
  39. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  40. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  41. params['wpa_psk_file'] = 'hostapd.wpa_psk'
  42. hostapd.add_ap(apdev[0]['ifname'], params)
  43. dev[1].connect(ssid, psk="very secret", scan_freq="2412", wait_connect=False)
  44. dev[2].connect(ssid, raw_psk=psk, scan_freq="2412")
  45. dev[2].request("REMOVE_NETWORK all")
  46. dev[0].connect(ssid, psk="very secret", scan_freq="2412")
  47. dev[0].request("REMOVE_NETWORK all")
  48. dev[2].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412")
  49. dev[0].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412")
  50. ev = dev[1].wait_event(["WPA: 4-Way Handshake failed"], timeout=10)
  51. if ev is None:
  52. raise Exception("Timed out while waiting for failure report")
  53. dev[1].request("REMOVE_NETWORK all")
  54. def test_ap_wpa2_ptk_rekey(dev, apdev):
  55. """WPA2-PSK AP and PTK rekey enforced by station"""
  56. ssid = "test-wpa2-psk"
  57. passphrase = 'qwertyuiop'
  58. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  59. hostapd.add_ap(apdev[0]['ifname'], params)
  60. dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
  61. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  62. if ev is None:
  63. raise Exception("PTK rekey timed out")
  64. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  65. def test_ap_wpa2_ptk_rekey_ap(dev, apdev):
  66. """WPA2-PSK AP and PTK rekey enforced by AP"""
  67. ssid = "test-wpa2-psk"
  68. passphrase = 'qwertyuiop'
  69. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  70. params['wpa_ptk_rekey'] = '2'
  71. hostapd.add_ap(apdev[0]['ifname'], params)
  72. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  73. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  74. if ev is None:
  75. raise Exception("PTK rekey timed out")
  76. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  77. def test_ap_wpa2_sha256_ptk_rekey(dev, apdev):
  78. """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by station"""
  79. ssid = "test-wpa2-psk"
  80. passphrase = 'qwertyuiop'
  81. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  82. params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
  83. hostapd.add_ap(apdev[0]['ifname'], params)
  84. dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
  85. wpa_ptk_rekey="1", scan_freq="2412")
  86. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  87. if ev is None:
  88. raise Exception("PTK rekey timed out")
  89. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  90. check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"),
  91. ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ])
  92. def test_ap_wpa2_sha256_ptk_rekey_ap(dev, apdev):
  93. """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by AP"""
  94. ssid = "test-wpa2-psk"
  95. passphrase = 'qwertyuiop'
  96. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  97. params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
  98. params['wpa_ptk_rekey'] = '2'
  99. hostapd.add_ap(apdev[0]['ifname'], params)
  100. dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
  101. scan_freq="2412")
  102. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  103. if ev is None:
  104. raise Exception("PTK rekey timed out")
  105. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  106. check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"),
  107. ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ])
  108. def test_ap_wpa_ptk_rekey(dev, apdev):
  109. """WPA-PSK/TKIP AP and PTK rekey enforced by station"""
  110. ssid = "test-wpa-psk"
  111. passphrase = 'qwertyuiop'
  112. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  113. hostapd.add_ap(apdev[0]['ifname'], params)
  114. dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
  115. if "[WPA-PSK-TKIP]" not in dev[0].request("SCAN_RESULTS"):
  116. raise Exception("Scan results missing WPA element info")
  117. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  118. if ev is None:
  119. raise Exception("PTK rekey timed out")
  120. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  121. def test_ap_wpa_ptk_rekey_ap(dev, apdev):
  122. """WPA-PSK/TKIP AP and PTK rekey enforced by AP"""
  123. ssid = "test-wpa-psk"
  124. passphrase = 'qwertyuiop'
  125. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  126. params['wpa_ptk_rekey'] = '2'
  127. hostapd.add_ap(apdev[0]['ifname'], params)
  128. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  129. ev = dev[0].wait_event(["WPA: Key negotiation completed"], timeout=10)
  130. if ev is None:
  131. raise Exception("PTK rekey timed out")
  132. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  133. def test_ap_wpa_ccmp(dev, apdev):
  134. """WPA-PSK/CCMP"""
  135. ssid = "test-wpa-psk"
  136. passphrase = 'qwertyuiop'
  137. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  138. params['wpa_pairwise'] = "CCMP"
  139. hostapd.add_ap(apdev[0]['ifname'], params)
  140. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  141. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  142. check_mib(dev[0], [ ("dot11RSNAConfigGroupCipherSize", "128"),
  143. ("dot11RSNAGroupCipherRequested", "00-50-f2-4"),
  144. ("dot11RSNAPairwiseCipherRequested", "00-50-f2-4"),
  145. ("dot11RSNAAuthenticationSuiteRequested", "00-50-f2-2"),
  146. ("dot11RSNAGroupCipherSelected", "00-50-f2-4"),
  147. ("dot11RSNAPairwiseCipherSelected", "00-50-f2-4"),
  148. ("dot11RSNAAuthenticationSuiteSelected", "00-50-f2-2"),
  149. ("dot1xSuppSuppControlledPortStatus", "Authorized") ])
  150. def test_ap_wpa2_psk_file(dev, apdev):
  151. """WPA2-PSK AP with various PSK file error and success cases"""
  152. addr0 = dev[0].p2p_dev_addr()
  153. addr1 = dev[1].p2p_dev_addr()
  154. addr2 = dev[2].p2p_dev_addr()
  155. ssid = "psk"
  156. pskfile = "/tmp/ap_wpa2_psk_file_errors.psk_file"
  157. try:
  158. os.remove(pskfile)
  159. except:
  160. pass
  161. params = { "ssid": ssid, "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
  162. "rsn_pairwise": "CCMP", "wpa_psk_file": pskfile }
  163. try:
  164. # missing PSK file
  165. hapd = hostapd.add_ap(apdev[0]['ifname'], params, no_enable=True)
  166. if "FAIL" not in hapd.request("ENABLE"):
  167. raise Exception("Unexpected ENABLE success")
  168. hapd.request("DISABLE")
  169. # invalid MAC address
  170. with open(pskfile, "w") as f:
  171. f.write("\n")
  172. f.write("foo\n")
  173. if "FAIL" not in hapd.request("ENABLE"):
  174. raise Exception("Unexpected ENABLE success")
  175. hapd.request("DISABLE")
  176. # no PSK on line
  177. with open(pskfile, "w") as f:
  178. f.write("00:11:22:33:44:55\n")
  179. if "FAIL" not in hapd.request("ENABLE"):
  180. raise Exception("Unexpected ENABLE success")
  181. hapd.request("DISABLE")
  182. # invalid PSK
  183. with open(pskfile, "w") as f:
  184. f.write("00:11:22:33:44:55 1234567\n")
  185. if "FAIL" not in hapd.request("ENABLE"):
  186. raise Exception("Unexpected ENABLE success")
  187. hapd.request("DISABLE")
  188. # valid PSK file
  189. with open(pskfile, "w") as f:
  190. f.write("00:11:22:33:44:55 12345678\n")
  191. f.write(addr0 + " 123456789\n")
  192. f.write(addr1 + " 123456789a\n")
  193. f.write(addr2 + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\n")
  194. if "FAIL" in hapd.request("ENABLE"):
  195. raise Exception("Unexpected ENABLE failure")
  196. dev[0].connect(ssid, psk="123456789", scan_freq="2412")
  197. dev[1].connect(ssid, psk="123456789a", scan_freq="2412")
  198. dev[2].connect(ssid, raw_psk="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", scan_freq="2412")
  199. finally:
  200. try:
  201. os.remove(pskfile)
  202. except:
  203. pass
  204. def test_ap_wpa2_psk_wildcard_ssid(dev, apdev):
  205. """WPA2-PSK AP and wildcard SSID configuration"""
  206. ssid = "test-wpa2-psk"
  207. passphrase = 'qwertyuiop'
  208. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  209. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  210. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  211. dev[0].connect("", bssid=apdev[0]['bssid'], psk=passphrase,
  212. scan_freq="2412")
  213. dev[1].connect("", bssid=apdev[0]['bssid'], raw_psk=psk, scan_freq="2412")