test_ap_psk.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. def test_ap_wpa2_psk_file(dev, apdev):
  30. """WPA2-PSK AP with PSK from a file"""
  31. ssid = "test-wpa2-psk"
  32. passphrase = 'qwertyuiop'
  33. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  34. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  35. params['wpa_psk_file'] = 'hostapd.wpa_psk'
  36. hostapd.add_ap(apdev[0]['ifname'], params)
  37. dev[1].connect(ssid, psk="very secret", scan_freq="2412", wait_connect=False)
  38. dev[2].connect(ssid, raw_psk=psk, scan_freq="2412")
  39. dev[2].request("REMOVE_NETWORK all")
  40. dev[0].connect(ssid, psk="very secret", scan_freq="2412")
  41. dev[0].request("REMOVE_NETWORK all")
  42. dev[2].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412")
  43. dev[0].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412")
  44. ev = dev[1].wait_event(["WPA: 4-Way Handshake failed"], timeout=10)
  45. if ev is None:
  46. raise Exception("Timed out while waiting for failure report")
  47. dev[1].request("REMOVE_NETWORK all")
  48. def test_ap_wpa2_ptk_rekey(dev, apdev):
  49. """WPA2-PSK AP and PTK rekey enforced by station"""
  50. ssid = "test-wpa2-psk"
  51. passphrase = 'qwertyuiop'
  52. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  53. hostapd.add_ap(apdev[0]['ifname'], params)
  54. dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
  55. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  56. if ev is None:
  57. raise Exception("PTK rekey timed out")
  58. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  59. def test_ap_wpa2_sha256_ptk_rekey(dev, apdev):
  60. """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by station"""
  61. ssid = "test-wpa2-psk"
  62. passphrase = 'qwertyuiop'
  63. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  64. params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
  65. hostapd.add_ap(apdev[0]['ifname'], params)
  66. dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
  67. wpa_ptk_rekey="1", scan_freq="2412")
  68. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  69. if ev is None:
  70. raise Exception("PTK rekey timed out")
  71. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  72. check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"),
  73. ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ])
  74. def test_ap_wpa_ptk_rekey(dev, apdev):
  75. """WPA-PSK/TKIP AP and PTK rekey enforced by station"""
  76. ssid = "test-wpa-psk"
  77. passphrase = 'qwertyuiop'
  78. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  79. hostapd.add_ap(apdev[0]['ifname'], params)
  80. dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
  81. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  82. if ev is None:
  83. raise Exception("PTK rekey timed out")
  84. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  85. def test_ap_wpa_ccmp(dev, apdev):
  86. """WPA-PSK/CCMP"""
  87. ssid = "test-wpa-psk"
  88. passphrase = 'qwertyuiop'
  89. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  90. params['wpa_pairwise'] = "CCMP"
  91. hostapd.add_ap(apdev[0]['ifname'], params)
  92. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  93. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  94. check_mib(dev[0], [ ("dot11RSNAConfigGroupCipherSize", "128"),
  95. ("dot11RSNAGroupCipherRequested", "00-50-f2-4"),
  96. ("dot11RSNAPairwiseCipherRequested", "00-50-f2-4"),
  97. ("dot11RSNAAuthenticationSuiteRequested", "00-50-f2-2"),
  98. ("dot11RSNAGroupCipherSelected", "00-50-f2-4"),
  99. ("dot11RSNAPairwiseCipherSelected", "00-50-f2-4"),
  100. ("dot11RSNAAuthenticationSuiteSelected", "00-50-f2-2"),
  101. ("dot1xSuppSuppControlledPortStatus", "Authorized") ])
  102. def test_ap_wpa2_psk_file(dev, apdev):
  103. """WPA2-PSK AP with various PSK file error and success cases"""
  104. addr0 = dev[0].p2p_dev_addr()
  105. addr1 = dev[1].p2p_dev_addr()
  106. addr2 = dev[2].p2p_dev_addr()
  107. ssid = "psk"
  108. pskfile = "/tmp/ap_wpa2_psk_file_errors.psk_file"
  109. try:
  110. os.remove(pskfile)
  111. except:
  112. pass
  113. params = { "ssid": ssid, "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
  114. "rsn_pairwise": "CCMP", "wpa_psk_file": pskfile }
  115. try:
  116. # missing PSK file
  117. hapd = hostapd.add_ap(apdev[0]['ifname'], params, no_enable=True)
  118. if "FAIL" not in hapd.request("ENABLE"):
  119. raise Exception("Unexpected ENABLE success")
  120. hapd.request("DISABLE")
  121. # invalid MAC address
  122. with open(pskfile, "w") as f:
  123. f.write("\n")
  124. f.write("foo\n")
  125. if "FAIL" not in hapd.request("ENABLE"):
  126. raise Exception("Unexpected ENABLE success")
  127. hapd.request("DISABLE")
  128. # no PSK on line
  129. with open(pskfile, "w") as f:
  130. f.write("00:11:22:33:44:55\n")
  131. if "FAIL" not in hapd.request("ENABLE"):
  132. raise Exception("Unexpected ENABLE success")
  133. hapd.request("DISABLE")
  134. # invalid PSK
  135. with open(pskfile, "w") as f:
  136. f.write("00:11:22:33:44:55 1234567\n")
  137. if "FAIL" not in hapd.request("ENABLE"):
  138. raise Exception("Unexpected ENABLE success")
  139. hapd.request("DISABLE")
  140. # valid PSK file
  141. with open(pskfile, "w") as f:
  142. f.write("00:11:22:33:44:55 12345678\n")
  143. f.write(addr0 + " 123456789\n")
  144. f.write(addr1 + " 123456789a\n")
  145. f.write(addr2 + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\n")
  146. if "FAIL" in hapd.request("ENABLE"):
  147. raise Exception("Unexpected ENABLE failure")
  148. dev[0].connect(ssid, psk="123456789", scan_freq="2412")
  149. dev[1].connect(ssid, psk="123456789a", scan_freq="2412")
  150. dev[2].connect(ssid, raw_psk="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", scan_freq="2412")
  151. finally:
  152. try:
  153. os.remove(pskfile)
  154. except:
  155. pass