test_ap_psk.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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_sha256_ptk_rekey(dev, apdev):
  66. """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by station"""
  67. ssid = "test-wpa2-psk"
  68. passphrase = 'qwertyuiop'
  69. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  70. params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
  71. hostapd.add_ap(apdev[0]['ifname'], params)
  72. dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
  73. wpa_ptk_rekey="1", scan_freq="2412")
  74. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  75. if ev is None:
  76. raise Exception("PTK rekey timed out")
  77. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  78. check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"),
  79. ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ])
  80. def test_ap_wpa_ptk_rekey(dev, apdev):
  81. """WPA-PSK/TKIP AP and PTK rekey enforced by station"""
  82. ssid = "test-wpa-psk"
  83. passphrase = 'qwertyuiop'
  84. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  85. hostapd.add_ap(apdev[0]['ifname'], params)
  86. dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
  87. if "[WPA-PSK-TKIP]" not in dev[0].request("SCAN_RESULTS"):
  88. raise Exception("Scan results missing WPA element info")
  89. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  90. if ev is None:
  91. raise Exception("PTK rekey timed out")
  92. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  93. def test_ap_wpa_ccmp(dev, apdev):
  94. """WPA-PSK/CCMP"""
  95. ssid = "test-wpa-psk"
  96. passphrase = 'qwertyuiop'
  97. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  98. params['wpa_pairwise'] = "CCMP"
  99. hostapd.add_ap(apdev[0]['ifname'], params)
  100. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  101. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  102. check_mib(dev[0], [ ("dot11RSNAConfigGroupCipherSize", "128"),
  103. ("dot11RSNAGroupCipherRequested", "00-50-f2-4"),
  104. ("dot11RSNAPairwiseCipherRequested", "00-50-f2-4"),
  105. ("dot11RSNAAuthenticationSuiteRequested", "00-50-f2-2"),
  106. ("dot11RSNAGroupCipherSelected", "00-50-f2-4"),
  107. ("dot11RSNAPairwiseCipherSelected", "00-50-f2-4"),
  108. ("dot11RSNAAuthenticationSuiteSelected", "00-50-f2-2"),
  109. ("dot1xSuppSuppControlledPortStatus", "Authorized") ])
  110. def test_ap_wpa2_psk_file(dev, apdev):
  111. """WPA2-PSK AP with various PSK file error and success cases"""
  112. addr0 = dev[0].p2p_dev_addr()
  113. addr1 = dev[1].p2p_dev_addr()
  114. addr2 = dev[2].p2p_dev_addr()
  115. ssid = "psk"
  116. pskfile = "/tmp/ap_wpa2_psk_file_errors.psk_file"
  117. try:
  118. os.remove(pskfile)
  119. except:
  120. pass
  121. params = { "ssid": ssid, "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
  122. "rsn_pairwise": "CCMP", "wpa_psk_file": pskfile }
  123. try:
  124. # missing PSK file
  125. hapd = hostapd.add_ap(apdev[0]['ifname'], params, no_enable=True)
  126. if "FAIL" not in hapd.request("ENABLE"):
  127. raise Exception("Unexpected ENABLE success")
  128. hapd.request("DISABLE")
  129. # invalid MAC address
  130. with open(pskfile, "w") as f:
  131. f.write("\n")
  132. f.write("foo\n")
  133. if "FAIL" not in hapd.request("ENABLE"):
  134. raise Exception("Unexpected ENABLE success")
  135. hapd.request("DISABLE")
  136. # no PSK on line
  137. with open(pskfile, "w") as f:
  138. f.write("00:11:22:33:44:55\n")
  139. if "FAIL" not in hapd.request("ENABLE"):
  140. raise Exception("Unexpected ENABLE success")
  141. hapd.request("DISABLE")
  142. # invalid PSK
  143. with open(pskfile, "w") as f:
  144. f.write("00:11:22:33:44:55 1234567\n")
  145. if "FAIL" not in hapd.request("ENABLE"):
  146. raise Exception("Unexpected ENABLE success")
  147. hapd.request("DISABLE")
  148. # valid PSK file
  149. with open(pskfile, "w") as f:
  150. f.write("00:11:22:33:44:55 12345678\n")
  151. f.write(addr0 + " 123456789\n")
  152. f.write(addr1 + " 123456789a\n")
  153. f.write(addr2 + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\n")
  154. if "FAIL" in hapd.request("ENABLE"):
  155. raise Exception("Unexpected ENABLE failure")
  156. dev[0].connect(ssid, psk="123456789", scan_freq="2412")
  157. dev[1].connect(ssid, psk="123456789a", scan_freq="2412")
  158. dev[2].connect(ssid, raw_psk="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", scan_freq="2412")
  159. finally:
  160. try:
  161. os.remove(pskfile)
  162. except:
  163. pass
  164. def test_ap_wpa2_psk_wildcard_ssid(dev, apdev):
  165. """WPA2-PSK AP and wildcard SSID configuration"""
  166. ssid = "test-wpa2-psk"
  167. passphrase = 'qwertyuiop'
  168. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  169. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  170. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  171. dev[0].connect("", bssid=apdev[0]['bssid'], psk=passphrase,
  172. scan_freq="2412")
  173. dev[1].connect("", bssid=apdev[0]['bssid'], raw_psk=psk, scan_freq="2412")