test_ap_psk.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  88. if ev is None:
  89. raise Exception("PTK rekey timed out")
  90. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  91. def test_ap_wpa_ccmp(dev, apdev):
  92. """WPA-PSK/CCMP"""
  93. ssid = "test-wpa-psk"
  94. passphrase = 'qwertyuiop'
  95. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  96. params['wpa_pairwise'] = "CCMP"
  97. hostapd.add_ap(apdev[0]['ifname'], params)
  98. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  99. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  100. check_mib(dev[0], [ ("dot11RSNAConfigGroupCipherSize", "128"),
  101. ("dot11RSNAGroupCipherRequested", "00-50-f2-4"),
  102. ("dot11RSNAPairwiseCipherRequested", "00-50-f2-4"),
  103. ("dot11RSNAAuthenticationSuiteRequested", "00-50-f2-2"),
  104. ("dot11RSNAGroupCipherSelected", "00-50-f2-4"),
  105. ("dot11RSNAPairwiseCipherSelected", "00-50-f2-4"),
  106. ("dot11RSNAAuthenticationSuiteSelected", "00-50-f2-2"),
  107. ("dot1xSuppSuppControlledPortStatus", "Authorized") ])
  108. def test_ap_wpa2_psk_file(dev, apdev):
  109. """WPA2-PSK AP with various PSK file error and success cases"""
  110. addr0 = dev[0].p2p_dev_addr()
  111. addr1 = dev[1].p2p_dev_addr()
  112. addr2 = dev[2].p2p_dev_addr()
  113. ssid = "psk"
  114. pskfile = "/tmp/ap_wpa2_psk_file_errors.psk_file"
  115. try:
  116. os.remove(pskfile)
  117. except:
  118. pass
  119. params = { "ssid": ssid, "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
  120. "rsn_pairwise": "CCMP", "wpa_psk_file": pskfile }
  121. try:
  122. # missing PSK file
  123. hapd = hostapd.add_ap(apdev[0]['ifname'], params, no_enable=True)
  124. if "FAIL" not in hapd.request("ENABLE"):
  125. raise Exception("Unexpected ENABLE success")
  126. hapd.request("DISABLE")
  127. # invalid MAC address
  128. with open(pskfile, "w") as f:
  129. f.write("\n")
  130. f.write("foo\n")
  131. if "FAIL" not in hapd.request("ENABLE"):
  132. raise Exception("Unexpected ENABLE success")
  133. hapd.request("DISABLE")
  134. # no PSK on line
  135. with open(pskfile, "w") as f:
  136. f.write("00:11:22:33:44:55\n")
  137. if "FAIL" not in hapd.request("ENABLE"):
  138. raise Exception("Unexpected ENABLE success")
  139. hapd.request("DISABLE")
  140. # invalid PSK
  141. with open(pskfile, "w") as f:
  142. f.write("00:11:22:33:44:55 1234567\n")
  143. if "FAIL" not in hapd.request("ENABLE"):
  144. raise Exception("Unexpected ENABLE success")
  145. hapd.request("DISABLE")
  146. # valid PSK file
  147. with open(pskfile, "w") as f:
  148. f.write("00:11:22:33:44:55 12345678\n")
  149. f.write(addr0 + " 123456789\n")
  150. f.write(addr1 + " 123456789a\n")
  151. f.write(addr2 + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\n")
  152. if "FAIL" in hapd.request("ENABLE"):
  153. raise Exception("Unexpected ENABLE failure")
  154. dev[0].connect(ssid, psk="123456789", scan_freq="2412")
  155. dev[1].connect(ssid, psk="123456789a", scan_freq="2412")
  156. dev[2].connect(ssid, raw_psk="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", scan_freq="2412")
  157. finally:
  158. try:
  159. os.remove(pskfile)
  160. except:
  161. pass