test_ap_psk.py 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020
  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 binascii
  7. import hashlib
  8. import hmac
  9. import logging
  10. logger = logging.getLogger()
  11. import os
  12. import re
  13. import struct
  14. import subprocess
  15. import time
  16. import hostapd
  17. from utils import HwsimSkip
  18. import hwsim_utils
  19. from wpasupplicant import WpaSupplicant
  20. def check_mib(dev, vals):
  21. mib = dev.get_mib()
  22. for v in vals:
  23. if mib[v[0]] != v[1]:
  24. raise Exception("Unexpected {} = {} (expected {})".format(v[0], mib[v[0]], v[1]))
  25. def test_ap_wpa2_psk(dev, apdev):
  26. """WPA2-PSK AP with PSK instead of passphrase"""
  27. ssid = "test-wpa2-psk"
  28. passphrase = 'qwertyuiop'
  29. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  30. params = hostapd.wpa2_params(ssid=ssid)
  31. params['wpa_psk'] = psk
  32. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  33. key_mgmt = hapd.get_config()['key_mgmt']
  34. if key_mgmt.split(' ')[0] != "WPA-PSK":
  35. raise Exception("Unexpected GET_CONFIG(key_mgmt): " + key_mgmt)
  36. dev[0].connect(ssid, raw_psk=psk, scan_freq="2412")
  37. dev[1].connect(ssid, psk=passphrase, scan_freq="2412")
  38. sig = dev[0].request("SIGNAL_POLL").splitlines()
  39. pkt = dev[0].request("PKTCNT_POLL").splitlines()
  40. if "FREQUENCY=2412" not in sig:
  41. raise Exception("Unexpected SIGNAL_POLL value: " + str(sig))
  42. if "TXBAD=0" not in pkt:
  43. raise Exception("Unexpected TXBAD value: " + str(pkt))
  44. def test_ap_wpa2_psk_file(dev, apdev):
  45. """WPA2-PSK AP with PSK from a file"""
  46. ssid = "test-wpa2-psk"
  47. passphrase = 'qwertyuiop'
  48. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  49. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  50. params['wpa_psk_file'] = 'hostapd.wpa_psk'
  51. hostapd.add_ap(apdev[0]['ifname'], params)
  52. dev[1].connect(ssid, psk="very secret", scan_freq="2412", wait_connect=False)
  53. dev[2].connect(ssid, raw_psk=psk, scan_freq="2412")
  54. dev[2].request("REMOVE_NETWORK all")
  55. dev[0].connect(ssid, psk="very secret", scan_freq="2412")
  56. dev[0].request("REMOVE_NETWORK all")
  57. dev[2].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412")
  58. dev[0].connect(ssid, psk="another passphrase for all STAs", scan_freq="2412")
  59. ev = dev[1].wait_event(["WPA: 4-Way Handshake failed"], timeout=10)
  60. if ev is None:
  61. raise Exception("Timed out while waiting for failure report")
  62. dev[1].request("REMOVE_NETWORK all")
  63. def test_ap_wpa2_ptk_rekey(dev, apdev):
  64. """WPA2-PSK AP and PTK rekey enforced by station"""
  65. ssid = "test-wpa2-psk"
  66. passphrase = 'qwertyuiop'
  67. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  68. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  69. dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
  70. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  71. if ev is None:
  72. raise Exception("PTK rekey timed out")
  73. hwsim_utils.test_connectivity(dev[0], hapd)
  74. def test_ap_wpa2_ptk_rekey_ap(dev, apdev):
  75. """WPA2-PSK AP and PTK rekey enforced by AP"""
  76. ssid = "test-wpa2-psk"
  77. passphrase = 'qwertyuiop'
  78. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  79. params['wpa_ptk_rekey'] = '2'
  80. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  81. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  82. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  83. if ev is None:
  84. raise Exception("PTK rekey timed out")
  85. hwsim_utils.test_connectivity(dev[0], hapd)
  86. def test_ap_wpa2_sha256_ptk_rekey(dev, apdev):
  87. """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by station"""
  88. ssid = "test-wpa2-psk"
  89. passphrase = 'qwertyuiop'
  90. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  91. params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
  92. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  93. dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
  94. wpa_ptk_rekey="1", scan_freq="2412")
  95. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  96. if ev is None:
  97. raise Exception("PTK rekey timed out")
  98. hwsim_utils.test_connectivity(dev[0], hapd)
  99. check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"),
  100. ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ])
  101. def test_ap_wpa2_sha256_ptk_rekey_ap(dev, apdev):
  102. """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by AP"""
  103. ssid = "test-wpa2-psk"
  104. passphrase = 'qwertyuiop'
  105. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  106. params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
  107. params['wpa_ptk_rekey'] = '2'
  108. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  109. dev[0].connect(ssid, psk=passphrase, key_mgmt="WPA-PSK-SHA256",
  110. scan_freq="2412")
  111. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  112. if ev is None:
  113. raise Exception("PTK rekey timed out")
  114. hwsim_utils.test_connectivity(dev[0], hapd)
  115. check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"),
  116. ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ])
  117. def test_ap_wpa_ptk_rekey(dev, apdev):
  118. """WPA-PSK/TKIP AP and PTK rekey enforced by station"""
  119. ssid = "test-wpa-psk"
  120. passphrase = 'qwertyuiop'
  121. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  122. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  123. dev[0].connect(ssid, psk=passphrase, wpa_ptk_rekey="1", scan_freq="2412")
  124. if "[WPA-PSK-TKIP]" not in dev[0].request("SCAN_RESULTS"):
  125. raise Exception("Scan results missing WPA element info")
  126. ev = dev[0].wait_event(["WPA: Key negotiation completed"])
  127. if ev is None:
  128. raise Exception("PTK rekey timed out")
  129. hwsim_utils.test_connectivity(dev[0], hapd)
  130. def test_ap_wpa_ptk_rekey_ap(dev, apdev):
  131. """WPA-PSK/TKIP AP and PTK rekey enforced by AP"""
  132. ssid = "test-wpa-psk"
  133. passphrase = 'qwertyuiop'
  134. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  135. params['wpa_ptk_rekey'] = '2'
  136. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  137. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  138. ev = dev[0].wait_event(["WPA: Key negotiation completed"], timeout=10)
  139. if ev is None:
  140. raise Exception("PTK rekey timed out")
  141. hwsim_utils.test_connectivity(dev[0], hapd)
  142. def test_ap_wpa_ccmp(dev, apdev):
  143. """WPA-PSK/CCMP"""
  144. ssid = "test-wpa-psk"
  145. passphrase = 'qwertyuiop'
  146. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  147. params['wpa_pairwise'] = "CCMP"
  148. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  149. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  150. hwsim_utils.test_connectivity(dev[0], hapd)
  151. check_mib(dev[0], [ ("dot11RSNAConfigGroupCipherSize", "128"),
  152. ("dot11RSNAGroupCipherRequested", "00-50-f2-4"),
  153. ("dot11RSNAPairwiseCipherRequested", "00-50-f2-4"),
  154. ("dot11RSNAAuthenticationSuiteRequested", "00-50-f2-2"),
  155. ("dot11RSNAGroupCipherSelected", "00-50-f2-4"),
  156. ("dot11RSNAPairwiseCipherSelected", "00-50-f2-4"),
  157. ("dot11RSNAAuthenticationSuiteSelected", "00-50-f2-2"),
  158. ("dot1xSuppSuppControlledPortStatus", "Authorized") ])
  159. def test_ap_wpa2_psk_file(dev, apdev):
  160. """WPA2-PSK AP with various PSK file error and success cases"""
  161. addr0 = dev[0].own_addr()
  162. addr1 = dev[1].own_addr()
  163. addr2 = dev[2].own_addr()
  164. ssid = "psk"
  165. pskfile = "/tmp/ap_wpa2_psk_file_errors.psk_file"
  166. try:
  167. os.remove(pskfile)
  168. except:
  169. pass
  170. params = { "ssid": ssid, "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
  171. "rsn_pairwise": "CCMP", "wpa_psk_file": pskfile }
  172. try:
  173. # missing PSK file
  174. hapd = hostapd.add_ap(apdev[0]['ifname'], params, no_enable=True)
  175. if "FAIL" not in hapd.request("ENABLE"):
  176. raise Exception("Unexpected ENABLE success")
  177. hapd.request("DISABLE")
  178. # invalid MAC address
  179. with open(pskfile, "w") as f:
  180. f.write("\n")
  181. f.write("foo\n")
  182. if "FAIL" not in hapd.request("ENABLE"):
  183. raise Exception("Unexpected ENABLE success")
  184. hapd.request("DISABLE")
  185. # no PSK on line
  186. with open(pskfile, "w") as f:
  187. f.write("00:11:22:33:44:55\n")
  188. if "FAIL" not in hapd.request("ENABLE"):
  189. raise Exception("Unexpected ENABLE success")
  190. hapd.request("DISABLE")
  191. # invalid PSK
  192. with open(pskfile, "w") as f:
  193. f.write("00:11:22:33:44:55 1234567\n")
  194. if "FAIL" not in hapd.request("ENABLE"):
  195. raise Exception("Unexpected ENABLE success")
  196. hapd.request("DISABLE")
  197. # valid PSK file
  198. with open(pskfile, "w") as f:
  199. f.write("00:11:22:33:44:55 12345678\n")
  200. f.write(addr0 + " 123456789\n")
  201. f.write(addr1 + " 123456789a\n")
  202. f.write(addr2 + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\n")
  203. if "FAIL" in hapd.request("ENABLE"):
  204. raise Exception("Unexpected ENABLE failure")
  205. dev[0].connect(ssid, psk="123456789", scan_freq="2412")
  206. dev[1].connect(ssid, psk="123456789a", scan_freq="2412")
  207. dev[2].connect(ssid, raw_psk="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", scan_freq="2412")
  208. finally:
  209. try:
  210. os.remove(pskfile)
  211. except:
  212. pass
  213. def test_ap_wpa2_psk_wildcard_ssid(dev, apdev):
  214. """WPA2-PSK AP and wildcard SSID configuration"""
  215. ssid = "test-wpa2-psk"
  216. passphrase = 'qwertyuiop'
  217. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  218. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  219. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  220. dev[0].connect("", bssid=apdev[0]['bssid'], psk=passphrase,
  221. scan_freq="2412")
  222. dev[1].connect("", bssid=apdev[0]['bssid'], raw_psk=psk, scan_freq="2412")
  223. def test_ap_wpa2_gtk_rekey(dev, apdev):
  224. """WPA2-PSK AP and GTK rekey enforced by AP"""
  225. ssid = "test-wpa2-psk"
  226. passphrase = 'qwertyuiop'
  227. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  228. params['wpa_group_rekey'] = '1'
  229. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  230. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  231. ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
  232. if ev is None:
  233. raise Exception("GTK rekey timed out")
  234. hwsim_utils.test_connectivity(dev[0], hapd)
  235. def test_ap_wpa_gtk_rekey(dev, apdev):
  236. """WPA-PSK/TKIP AP and GTK rekey enforced by AP"""
  237. ssid = "test-wpa-psk"
  238. passphrase = 'qwertyuiop'
  239. params = hostapd.wpa_params(ssid=ssid, passphrase=passphrase)
  240. params['wpa_group_rekey'] = '1'
  241. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  242. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  243. ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
  244. if ev is None:
  245. raise Exception("GTK rekey timed out")
  246. hwsim_utils.test_connectivity(dev[0], hapd)
  247. def test_ap_wpa2_gmk_rekey(dev, apdev):
  248. """WPA2-PSK AP and GMK and GTK rekey enforced by AP"""
  249. ssid = "test-wpa2-psk"
  250. passphrase = 'qwertyuiop'
  251. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  252. params['wpa_group_rekey'] = '1'
  253. params['wpa_gmk_rekey'] = '2'
  254. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  255. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  256. for i in range(0, 3):
  257. ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
  258. if ev is None:
  259. raise Exception("GTK rekey timed out")
  260. hwsim_utils.test_connectivity(dev[0], hapd)
  261. def test_ap_wpa2_strict_rekey(dev, apdev):
  262. """WPA2-PSK AP and strict GTK rekey enforced by AP"""
  263. ssid = "test-wpa2-psk"
  264. passphrase = 'qwertyuiop'
  265. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  266. params['wpa_strict_rekey'] = '1'
  267. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  268. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  269. dev[1].connect(ssid, psk=passphrase, scan_freq="2412")
  270. dev[1].request("DISCONNECT")
  271. ev = dev[0].wait_event(["WPA: Group rekeying completed"], timeout=2)
  272. if ev is None:
  273. raise Exception("GTK rekey timed out")
  274. hwsim_utils.test_connectivity(dev[0], hapd)
  275. def test_ap_wpa2_bridge_fdb(dev, apdev):
  276. """Bridge FDB entry removal"""
  277. try:
  278. ssid = "test-wpa2-psk"
  279. passphrase = "12345678"
  280. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  281. params['bridge'] = 'ap-br0'
  282. hostapd.add_ap(apdev[0]['ifname'], params)
  283. subprocess.call(['brctl', 'setfd', 'ap-br0', '0'])
  284. subprocess.call(['ip', 'link', 'set', 'dev', 'ap-br0', 'up'])
  285. dev[0].connect(ssid, psk=passphrase, scan_freq="2412",
  286. bssid=apdev[0]['bssid'])
  287. dev[1].connect(ssid, psk=passphrase, scan_freq="2412",
  288. bssid=apdev[0]['bssid'])
  289. addr0 = dev[0].p2p_interface_addr()
  290. hwsim_utils.test_connectivity_sta(dev[0], dev[1])
  291. cmd = subprocess.Popen(['brctl', 'showmacs', 'ap-br0'],
  292. stdout=subprocess.PIPE)
  293. macs1 = cmd.stdout.read()
  294. dev[0].request("DISCONNECT")
  295. dev[1].request("DISCONNECT")
  296. time.sleep(1)
  297. cmd = subprocess.Popen(['brctl', 'showmacs', 'ap-br0'],
  298. stdout=subprocess.PIPE)
  299. macs2 = cmd.stdout.read()
  300. addr1 = dev[1].p2p_interface_addr()
  301. if addr0 not in macs1 or addr1 not in macs1:
  302. raise Exception("Bridge FDB entry missing")
  303. if addr0 in macs2 or addr1 in macs2:
  304. raise Exception("Bridge FDB entry was not removed")
  305. finally:
  306. subprocess.call(['ip', 'link', 'set', 'dev', 'ap-br0', 'down'])
  307. subprocess.call(['brctl', 'delbr', 'ap-br0'])
  308. def test_ap_wpa2_already_in_bridge(dev, apdev):
  309. """hostapd behavior with interface already in bridge"""
  310. ifname = apdev[0]['ifname']
  311. br_ifname = 'ext-ap-br0'
  312. try:
  313. ssid = "test-wpa2-psk"
  314. passphrase = "12345678"
  315. subprocess.call(['brctl', 'addbr', br_ifname])
  316. subprocess.call(['brctl', 'setfd', br_ifname, '0'])
  317. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
  318. subprocess.call(['iw', ifname, 'set', 'type', '__ap'])
  319. subprocess.call(['brctl', 'addif', br_ifname, ifname])
  320. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  321. hapd = hostapd.add_ap(ifname, params)
  322. if hapd.get_driver_status_field('brname') != br_ifname:
  323. raise Exception("Bridge name not identified correctly")
  324. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  325. finally:
  326. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
  327. subprocess.call(['brctl', 'delif', br_ifname, ifname])
  328. subprocess.call(['iw', ifname, 'set', 'type', 'station'])
  329. subprocess.call(['brctl', 'delbr', br_ifname])
  330. def test_ap_wpa2_in_different_bridge(dev, apdev):
  331. """hostapd behavior with interface in different bridge"""
  332. ifname = apdev[0]['ifname']
  333. br_ifname = 'ext-ap-br0'
  334. try:
  335. ssid = "test-wpa2-psk"
  336. passphrase = "12345678"
  337. subprocess.call(['brctl', 'addbr', br_ifname])
  338. subprocess.call(['brctl', 'setfd', br_ifname, '0'])
  339. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
  340. subprocess.call(['iw', ifname, 'set', 'type', '__ap'])
  341. subprocess.call(['brctl', 'addif', br_ifname, ifname])
  342. time.sleep(0.5)
  343. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  344. params['bridge'] = 'ap-br0'
  345. hapd = hostapd.add_ap(ifname, params)
  346. subprocess.call(['brctl', 'setfd', 'ap-br0', '0'])
  347. subprocess.call(['ip', 'link', 'set', 'dev', 'ap-br0', 'up'])
  348. brname = hapd.get_driver_status_field('brname')
  349. if brname != 'ap-br0':
  350. raise Exception("Incorrect bridge: " + brname)
  351. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  352. hwsim_utils.test_connectivity_iface(dev[0], hapd, "ap-br0")
  353. if hapd.get_driver_status_field("added_bridge") != "1":
  354. raise Exception("Unexpected added_bridge value")
  355. if hapd.get_driver_status_field("added_if_into_bridge") != "1":
  356. raise Exception("Unexpected added_if_into_bridge value")
  357. dev[0].request("DISCONNECT")
  358. hapd.disable()
  359. finally:
  360. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
  361. subprocess.call(['brctl', 'delif', br_ifname, ifname],
  362. stderr=open('/dev/null', 'w'))
  363. subprocess.call(['brctl', 'delbr', br_ifname])
  364. def test_ap_wpa2_ext_add_to_bridge(dev, apdev):
  365. """hostapd behavior with interface added to bridge externally"""
  366. ifname = apdev[0]['ifname']
  367. br_ifname = 'ext-ap-br0'
  368. try:
  369. ssid = "test-wpa2-psk"
  370. passphrase = "12345678"
  371. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  372. hapd = hostapd.add_ap(ifname, params)
  373. subprocess.call(['brctl', 'addbr', br_ifname])
  374. subprocess.call(['brctl', 'setfd', br_ifname, '0'])
  375. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
  376. subprocess.call(['brctl', 'addif', br_ifname, ifname])
  377. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  378. if hapd.get_driver_status_field('brname') != br_ifname:
  379. raise Exception("Bridge name not identified correctly")
  380. finally:
  381. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
  382. subprocess.call(['brctl', 'delif', br_ifname, ifname])
  383. subprocess.call(['brctl', 'delbr', br_ifname])
  384. def test_ap_wpa2_psk_ext(dev, apdev):
  385. """WPA2-PSK AP using external EAPOL I/O"""
  386. bssid = apdev[0]['bssid']
  387. ssid = "test-wpa2-psk"
  388. passphrase = 'qwertyuiop'
  389. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  390. params = hostapd.wpa2_params(ssid=ssid)
  391. params['wpa_psk'] = psk
  392. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  393. hapd.request("SET ext_eapol_frame_io 1")
  394. dev[0].request("SET ext_eapol_frame_io 1")
  395. dev[0].connect(ssid, psk=passphrase, scan_freq="2412", wait_connect=False)
  396. addr = dev[0].p2p_interface_addr()
  397. while True:
  398. ev = hapd.wait_event(["EAPOL-TX", "AP-STA-CONNECTED"], timeout=15)
  399. if ev is None:
  400. raise Exception("Timeout on EAPOL-TX from hostapd")
  401. if "AP-STA-CONNECTED" in ev:
  402. dev[0].wait_connected(timeout=15)
  403. break
  404. res = dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
  405. if "OK" not in res:
  406. raise Exception("EAPOL_RX to wpa_supplicant failed")
  407. ev = dev[0].wait_event(["EAPOL-TX", "CTRL-EVENT-CONNECTED"], timeout=15)
  408. if ev is None:
  409. raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
  410. if "CTRL-EVENT-CONNECTED" in ev:
  411. break
  412. res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
  413. if "OK" not in res:
  414. raise Exception("EAPOL_RX to hostapd failed")
  415. def parse_eapol(data):
  416. (version, type, length) = struct.unpack('>BBH', data[0:4])
  417. payload = data[4:]
  418. if length > len(payload):
  419. raise Exception("Invalid EAPOL length")
  420. if length < len(payload):
  421. payload = payload[0:length]
  422. eapol = {}
  423. eapol['version'] = version
  424. eapol['type'] = type
  425. eapol['length'] = length
  426. eapol['payload'] = payload
  427. if type == 3:
  428. # EAPOL-Key
  429. (eapol['descr_type'],) = struct.unpack('B', payload[0:1])
  430. payload = payload[1:]
  431. if eapol['descr_type'] == 2 or eapol['descr_type'] == 254:
  432. # RSN EAPOL-Key
  433. (key_info, key_len) = struct.unpack('>HH', payload[0:4])
  434. eapol['rsn_key_info'] = key_info
  435. eapol['rsn_key_len'] = key_len
  436. eapol['rsn_replay_counter'] = payload[4:12]
  437. eapol['rsn_key_nonce'] = payload[12:44]
  438. eapol['rsn_key_iv'] = payload[44:60]
  439. eapol['rsn_key_rsc'] = payload[60:68]
  440. eapol['rsn_key_id'] = payload[68:76]
  441. eapol['rsn_key_mic'] = payload[76:92]
  442. payload = payload[92:]
  443. (eapol['rsn_key_data_len'],) = struct.unpack('>H', payload[0:2])
  444. payload = payload[2:]
  445. eapol['rsn_key_data'] = payload
  446. return eapol
  447. def build_eapol(msg):
  448. data = struct.pack(">BBH", msg['version'], msg['type'], msg['length'])
  449. if msg['type'] == 3:
  450. data += struct.pack('>BHH', msg['descr_type'], msg['rsn_key_info'],
  451. msg['rsn_key_len'])
  452. data += msg['rsn_replay_counter']
  453. data += msg['rsn_key_nonce']
  454. data += msg['rsn_key_iv']
  455. data += msg['rsn_key_rsc']
  456. data += msg['rsn_key_id']
  457. data += msg['rsn_key_mic']
  458. data += struct.pack('>H', msg['rsn_key_data_len'])
  459. data += msg['rsn_key_data']
  460. else:
  461. data += msg['payload']
  462. return data
  463. def sha1_prf(key, label, data, outlen):
  464. res = ''
  465. counter = 0
  466. while outlen > 0:
  467. m = hmac.new(key, label, hashlib.sha1)
  468. m.update(struct.pack('B', 0))
  469. m.update(data)
  470. m.update(struct.pack('B', counter))
  471. counter += 1
  472. hash = m.digest()
  473. if outlen > len(hash):
  474. res += hash
  475. outlen -= len(hash)
  476. else:
  477. res += hash[0:outlen]
  478. outlen = 0
  479. return res
  480. def pmk_to_ptk(pmk, addr1, addr2, nonce1, nonce2):
  481. if addr1 < addr2:
  482. data = binascii.unhexlify(addr1.replace(':','')) + binascii.unhexlify(addr2.replace(':',''))
  483. else:
  484. data = binascii.unhexlify(addr2.replace(':','')) + binascii.unhexlify(addr1.replace(':',''))
  485. if nonce1 < nonce2:
  486. data += nonce1 + nonce2
  487. else:
  488. data += nonce2 + nonce1
  489. label = "Pairwise key expansion"
  490. ptk = sha1_prf(pmk, label, data, 48)
  491. kck = ptk[0:16]
  492. kek = ptk[16:32]
  493. return (ptk, kck, kek)
  494. def eapol_key_mic(kck, msg):
  495. msg['rsn_key_mic'] = binascii.unhexlify('00000000000000000000000000000000')
  496. data = build_eapol(msg)
  497. m = hmac.new(kck, data, hashlib.sha1)
  498. msg['rsn_key_mic'] = m.digest()[0:16]
  499. def rsn_eapol_key_set(msg, key_info, key_len, nonce, data):
  500. msg['rsn_key_info'] = key_info
  501. msg['rsn_key_len'] = key_len
  502. if nonce:
  503. msg['rsn_key_nonce'] = nonce
  504. else:
  505. msg['rsn_key_nonce'] = binascii.unhexlify('0000000000000000000000000000000000000000000000000000000000000000')
  506. if data:
  507. msg['rsn_key_data_len'] = len(data)
  508. msg['rsn_key_data'] = data
  509. msg['length'] = 95 + len(data)
  510. else:
  511. msg['rsn_key_data_len'] = 0
  512. msg['rsn_key_data'] = ''
  513. msg['length'] = 95
  514. def recv_eapol(hapd):
  515. ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
  516. if ev is None:
  517. raise Exception("Timeout on EAPOL-TX from hostapd")
  518. eapol = binascii.unhexlify(ev.split(' ')[2])
  519. return parse_eapol(eapol)
  520. def send_eapol(hapd, addr, data):
  521. res = hapd.request("EAPOL_RX " + addr + " " + binascii.hexlify(data))
  522. if "OK" not in res:
  523. raise Exception("EAPOL_RX to hostapd failed")
  524. def reply_eapol(info, hapd, addr, msg, key_info, nonce, data, kck):
  525. logger.info("Send EAPOL-Key msg " + info)
  526. rsn_eapol_key_set(msg, key_info, 0, nonce, data)
  527. eapol_key_mic(kck, msg)
  528. send_eapol(hapd, addr, build_eapol(msg))
  529. def hapd_connected(hapd):
  530. ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=15)
  531. if ev is None:
  532. raise Exception("Timeout on AP-STA-CONNECTED from hostapd")
  533. def eapol_test(apdev, dev, wpa2=True):
  534. bssid = apdev['bssid']
  535. if wpa2:
  536. ssid = "test-wpa2-psk"
  537. else:
  538. ssid = "test-wpa-psk"
  539. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  540. pmk = binascii.unhexlify(psk)
  541. if wpa2:
  542. params = hostapd.wpa2_params(ssid=ssid)
  543. else:
  544. params = hostapd.wpa_params(ssid=ssid)
  545. params['wpa_psk'] = psk
  546. hapd = hostapd.add_ap(apdev['ifname'], params)
  547. hapd.request("SET ext_eapol_frame_io 1")
  548. dev.request("SET ext_eapol_frame_io 1")
  549. dev.connect(ssid, psk="not used", scan_freq="2412", wait_connect=False)
  550. addr = dev.p2p_interface_addr()
  551. if wpa2:
  552. rsne = binascii.unhexlify('30140100000fac040100000fac040100000fac020000')
  553. else:
  554. rsne = binascii.unhexlify('dd160050f20101000050f20201000050f20201000050f202')
  555. snonce = binascii.unhexlify('1111111111111111111111111111111111111111111111111111111111111111')
  556. return (bssid,ssid,hapd,snonce,pmk,addr,rsne)
  557. def test_ap_wpa2_psk_ext_eapol(dev, apdev):
  558. """WPA2-PSK AP using external EAPOL supplicant"""
  559. (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
  560. msg = recv_eapol(hapd)
  561. anonce = msg['rsn_key_nonce']
  562. logger.info("Replay same data back")
  563. send_eapol(hapd, addr, build_eapol(msg))
  564. (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
  565. logger.info("Truncated Key Data in EAPOL-Key msg 2/4")
  566. rsn_eapol_key_set(msg, 0x0101, 0, snonce, rsne)
  567. msg['length'] = 95 + 22 - 1
  568. send_eapol(hapd, addr, build_eapol(msg))
  569. reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, rsne, kck)
  570. msg = recv_eapol(hapd)
  571. if anonce != msg['rsn_key_nonce']:
  572. raise Exception("ANonce changed")
  573. logger.info("Replay same data back")
  574. send_eapol(hapd, addr, build_eapol(msg))
  575. reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
  576. hapd_connected(hapd)
  577. def test_ap_wpa2_psk_ext_eapol_retry1(dev, apdev):
  578. """WPA2 4-way handshake with EAPOL-Key 1/4 retransmitted"""
  579. (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
  580. msg1 = recv_eapol(hapd)
  581. anonce = msg1['rsn_key_nonce']
  582. msg2 = recv_eapol(hapd)
  583. if anonce != msg2['rsn_key_nonce']:
  584. raise Exception("ANonce changed")
  585. (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
  586. logger.info("Send EAPOL-Key msg 2/4")
  587. msg = msg2
  588. rsn_eapol_key_set(msg, 0x010a, 0, snonce, rsne)
  589. eapol_key_mic(kck, msg)
  590. send_eapol(hapd, addr, build_eapol(msg))
  591. msg = recv_eapol(hapd)
  592. if anonce != msg['rsn_key_nonce']:
  593. raise Exception("ANonce changed")
  594. reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
  595. hapd_connected(hapd)
  596. def test_ap_wpa2_psk_ext_eapol_retry1b(dev, apdev):
  597. """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted"""
  598. (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
  599. msg1 = recv_eapol(hapd)
  600. anonce = msg1['rsn_key_nonce']
  601. msg2 = recv_eapol(hapd)
  602. if anonce != msg2['rsn_key_nonce']:
  603. raise Exception("ANonce changed")
  604. (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
  605. reply_eapol("2/4 (a)", hapd, addr, msg1, 0x010a, snonce, rsne, kck)
  606. reply_eapol("2/4 (b)", hapd, addr, msg2, 0x010a, snonce, rsne, kck)
  607. msg = recv_eapol(hapd)
  608. if anonce != msg['rsn_key_nonce']:
  609. raise Exception("ANonce changed")
  610. reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
  611. hapd_connected(hapd)
  612. def test_ap_wpa2_psk_ext_eapol_retry1c(dev, apdev):
  613. """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted and SNonce changing"""
  614. (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
  615. msg1 = recv_eapol(hapd)
  616. anonce = msg1['rsn_key_nonce']
  617. msg2 = recv_eapol(hapd)
  618. if anonce != msg2['rsn_key_nonce']:
  619. raise Exception("ANonce changed")
  620. (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
  621. reply_eapol("2/4 (a)", hapd, addr, msg1, 0x010a, snonce, rsne, kck)
  622. snonce2 = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
  623. (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce2, anonce)
  624. reply_eapol("2/4 (b)", hapd, addr, msg2, 0x010a, snonce2, rsne, kck)
  625. msg = recv_eapol(hapd)
  626. if anonce != msg['rsn_key_nonce']:
  627. raise Exception("ANonce changed")
  628. reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
  629. hapd_connected(hapd)
  630. def test_ap_wpa2_psk_ext_eapol_retry1d(dev, apdev):
  631. """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted and SNonce changing and older used"""
  632. (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
  633. msg1 = recv_eapol(hapd)
  634. anonce = msg1['rsn_key_nonce']
  635. msg2 = recv_eapol(hapd)
  636. if anonce != msg2['rsn_key_nonce']:
  637. raise Exception("ANonce changed")
  638. (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
  639. reply_eapol("2/4 (a)", hapd, addr, msg1, 0x010a, snonce, rsne, kck)
  640. snonce2 = binascii.unhexlify('2222222222222222222222222222222222222222222222222222222222222222')
  641. (ptk2, kck2, kek2) = pmk_to_ptk(pmk, addr, bssid, snonce2, anonce)
  642. reply_eapol("2/4 (b)", hapd, addr, msg2, 0x010a, snonce2, rsne, kck2)
  643. msg = recv_eapol(hapd)
  644. if anonce != msg['rsn_key_nonce']:
  645. raise Exception("ANonce changed")
  646. reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
  647. hapd_connected(hapd)
  648. def test_ap_wpa2_psk_ext_eapol_type_diff(dev, apdev):
  649. """WPA2 4-way handshake using external EAPOL supplicant"""
  650. (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
  651. msg = recv_eapol(hapd)
  652. anonce = msg['rsn_key_nonce']
  653. (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
  654. # Incorrect descriptor type (frame dropped)
  655. msg['descr_type'] = 253
  656. rsn_eapol_key_set(msg, 0x010a, 0, snonce, rsne)
  657. eapol_key_mic(kck, msg)
  658. send_eapol(hapd, addr, build_eapol(msg))
  659. # Incorrect descriptor type, but with a workaround (frame processed)
  660. msg['descr_type'] = 254
  661. rsn_eapol_key_set(msg, 0x010a, 0, snonce, rsne)
  662. eapol_key_mic(kck, msg)
  663. send_eapol(hapd, addr, build_eapol(msg))
  664. msg = recv_eapol(hapd)
  665. if anonce != msg['rsn_key_nonce']:
  666. raise Exception("ANonce changed")
  667. logger.info("Replay same data back")
  668. send_eapol(hapd, addr, build_eapol(msg))
  669. reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
  670. hapd_connected(hapd)
  671. def test_ap_wpa_psk_ext_eapol(dev, apdev):
  672. """WPA2-PSK AP using external EAPOL supplicant"""
  673. (bssid,ssid,hapd,snonce,pmk,addr,wpae) = eapol_test(apdev[0], dev[0],
  674. wpa2=False)
  675. msg = recv_eapol(hapd)
  676. anonce = msg['rsn_key_nonce']
  677. logger.info("Replay same data back")
  678. send_eapol(hapd, addr, build_eapol(msg))
  679. logger.info("Too short data")
  680. send_eapol(hapd, addr, build_eapol(msg)[0:98])
  681. (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
  682. msg['descr_type'] = 2
  683. reply_eapol("2/4(invalid type)", hapd, addr, msg, 0x010a, snonce, wpae, kck)
  684. msg['descr_type'] = 254
  685. reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, wpae, kck)
  686. msg = recv_eapol(hapd)
  687. if anonce != msg['rsn_key_nonce']:
  688. raise Exception("ANonce changed")
  689. logger.info("Replay same data back")
  690. send_eapol(hapd, addr, build_eapol(msg))
  691. reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
  692. hapd_connected(hapd)
  693. def test_ap_wpa2_psk_ext_eapol_key_info(dev, apdev):
  694. """WPA2-PSK 4-way handshake with strange key info values"""
  695. (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0])
  696. msg = recv_eapol(hapd)
  697. anonce = msg['rsn_key_nonce']
  698. (ptk, kck, kek) = pmk_to_ptk(pmk, addr, bssid, snonce, anonce)
  699. rsn_eapol_key_set(msg, 0x0000, 0, snonce, rsne)
  700. send_eapol(hapd, addr, build_eapol(msg))
  701. rsn_eapol_key_set(msg, 0xffff, 0, snonce, rsne)
  702. send_eapol(hapd, addr, build_eapol(msg))
  703. # SMK M1
  704. rsn_eapol_key_set(msg, 0x2802, 0, snonce, rsne)
  705. send_eapol(hapd, addr, build_eapol(msg))
  706. # SMK M3
  707. rsn_eapol_key_set(msg, 0x2002, 0, snonce, rsne)
  708. send_eapol(hapd, addr, build_eapol(msg))
  709. # Request
  710. rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne)
  711. send_eapol(hapd, addr, build_eapol(msg))
  712. # Request
  713. rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne)
  714. tmp_kck = binascii.unhexlify('00000000000000000000000000000000')
  715. eapol_key_mic(tmp_kck, msg)
  716. send_eapol(hapd, addr, build_eapol(msg))
  717. reply_eapol("2/4", hapd, addr, msg, 0x010a, snonce, rsne, kck)
  718. msg = recv_eapol(hapd)
  719. if anonce != msg['rsn_key_nonce']:
  720. raise Exception("ANonce changed")
  721. # Request (valic MIC)
  722. rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne)
  723. eapol_key_mic(kck, msg)
  724. send_eapol(hapd, addr, build_eapol(msg))
  725. # Request (valid MIC, replayed counter)
  726. rsn_eapol_key_set(msg, 0x0902, 0, snonce, rsne)
  727. eapol_key_mic(kck, msg)
  728. send_eapol(hapd, addr, build_eapol(msg))
  729. reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck)
  730. hapd_connected(hapd)
  731. def find_wpas_process(dev):
  732. ifname = dev.ifname
  733. cmd = subprocess.Popen(['ps', 'ax'], stdout=subprocess.PIPE)
  734. (data,err) = cmd.communicate()
  735. for l in data.splitlines():
  736. if "wpa_supplicant" not in l:
  737. continue
  738. if "-i" + ifname not in l:
  739. continue
  740. return int(l.strip().split(' ')[0])
  741. raise Exception("Could not find wpa_supplicant process")
  742. def read_process_memory(pid, key=None):
  743. buf = bytes()
  744. with open('/proc/%d/maps' % pid, 'r') as maps, \
  745. open('/proc/%d/mem' % pid, 'r') as mem:
  746. for l in maps.readlines():
  747. m = re.match(r'([0-9a-f]+)-([0-9a-f]+) ([-r][-w][-x][-p])', l)
  748. if not m:
  749. continue
  750. start = int(m.group(1), 16)
  751. end = int(m.group(2), 16)
  752. perm = m.group(3)
  753. if start > 0xffffffffffff:
  754. continue
  755. if end < start:
  756. continue
  757. if not perm.startswith('rw'):
  758. continue
  759. mem.seek(start)
  760. data = mem.read(end - start)
  761. buf += data
  762. if key and key in data:
  763. logger.info("Key found in " + l)
  764. return buf
  765. def verify_not_present(buf, key, fname, keyname):
  766. pos = buf.find(key)
  767. if pos < 0:
  768. return
  769. prefix = 2048 if pos > 2048 else pos
  770. with open(fname + keyname, 'w') as f:
  771. f.write(buf[pos - prefix:pos + 2048])
  772. raise Exception(keyname + " found after disassociation")
  773. def get_key_locations(buf, key, keyname):
  774. count = 0
  775. pos = 0
  776. while True:
  777. pos = buf.find(key, pos)
  778. if pos < 0:
  779. break
  780. logger.info("Found %s at %d" % (keyname, pos))
  781. count += 1
  782. pos += len(key)
  783. return count
  784. def test_wpa2_psk_key_lifetime_in_memory(dev, apdev, params):
  785. """WPA2-PSK and PSK/PTK lifetime in memory"""
  786. ssid = "test-wpa2-psk"
  787. passphrase = 'qwertyuiop'
  788. psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
  789. pmk = binascii.unhexlify(psk)
  790. p = hostapd.wpa2_params(ssid=ssid)
  791. p['wpa_psk'] = psk
  792. hapd = hostapd.add_ap(apdev[0]['ifname'], p)
  793. pid = find_wpas_process(dev[0])
  794. id = dev[0].connect(ssid, raw_psk=psk, scan_freq="2412",
  795. only_add_network=True)
  796. logger.info("Checking keys in memory after network profile configuration")
  797. buf = read_process_memory(pid, pmk)
  798. get_key_locations(buf, pmk, "PMK")
  799. dev[0].request("REMOVE_NETWORK all")
  800. logger.info("Checking keys in memory after network profile removal")
  801. buf = read_process_memory(pid, pmk)
  802. get_key_locations(buf, pmk, "PMK")
  803. id = dev[0].connect(ssid, psk=passphrase, scan_freq="2412",
  804. only_add_network=True)
  805. logger.info("Checking keys in memory before connection")
  806. buf = read_process_memory(pid, pmk)
  807. get_key_locations(buf, pmk, "PMK")
  808. dev[0].connect_network(id, timeout=20)
  809. time.sleep(1)
  810. buf = read_process_memory(pid, pmk)
  811. dev[0].request("DISCONNECT")
  812. dev[0].wait_disconnected()
  813. dev[0].relog()
  814. ptk = None
  815. gtk = None
  816. with open(os.path.join(params['logdir'], 'log0'), 'r') as f:
  817. for l in f.readlines():
  818. if "WPA: PTK - hexdump" in l:
  819. val = l.strip().split(':')[3].replace(' ', '')
  820. ptk = binascii.unhexlify(val)
  821. if "WPA: Group Key - hexdump" in l:
  822. val = l.strip().split(':')[3].replace(' ', '')
  823. gtk = binascii.unhexlify(val)
  824. if not pmk or not ptk or not gtk:
  825. raise Exception("Could not find keys from debug log")
  826. if len(gtk) != 16:
  827. raise Exception("Unexpected GTK length")
  828. kck = ptk[0:16]
  829. kek = ptk[16:32]
  830. tk = ptk[32:48]
  831. logger.info("Checking keys in memory while associated")
  832. get_key_locations(buf, pmk, "PMK")
  833. if pmk not in buf:
  834. raise HwsimSkip("PMK not found while associated")
  835. if kck not in buf:
  836. raise Exception("KCK not found while associated")
  837. if kek not in buf:
  838. raise Exception("KEK not found while associated")
  839. if tk in buf:
  840. raise Exception("TK found from memory")
  841. if gtk in buf:
  842. raise Exception("GTK found from memory")
  843. logger.info("Checking keys in memory after disassociation")
  844. buf = read_process_memory(pid, pmk)
  845. get_key_locations(buf, pmk, "PMK")
  846. # Note: PMK/PSK is still present in network configuration
  847. fname = os.path.join(params['logdir'],
  848. 'wpa2_psk_key_lifetime_in_memory.memctx-')
  849. verify_not_present(buf, kck, fname, "KCK")
  850. verify_not_present(buf, kek, fname, "KEK")
  851. verify_not_present(buf, tk, fname, "TK")
  852. verify_not_present(buf, gtk, fname, "GTK")
  853. dev[0].request("REMOVE_NETWORK all")
  854. logger.info("Checking keys in memory after network profile removal")
  855. buf = read_process_memory(pid, pmk)
  856. get_key_locations(buf, pmk, "PMK")
  857. verify_not_present(buf, pmk, fname, "PMK")
  858. verify_not_present(buf, kck, fname, "KCK")
  859. verify_not_present(buf, kek, fname, "KEK")
  860. verify_not_present(buf, tk, fname, "TK")
  861. verify_not_present(buf, gtk, fname, "GTK")
  862. def test_ap_wpa2_psk_wep(dev, apdev):
  863. """WPA2-PSK AP and WEP enabled"""
  864. ssid = "test-wpa2-psk"
  865. passphrase = 'qwertyuiop'
  866. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  867. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  868. try:
  869. hapd.set('wep_key0', '"hello"')
  870. raise Exception("WEP key accepted to WPA2 network")
  871. except Exception:
  872. pass
  873. def test_ap_wpa2_psk_wpas_in_bridge(dev, apdev):
  874. """WPA2-PSK AP and wpas interface in a bridge"""
  875. br_ifname='sta-br0'
  876. ifname='wlan5'
  877. try:
  878. _test_ap_wpa2_psk_wpas_in_bridge(dev, apdev)
  879. finally:
  880. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'down'])
  881. subprocess.call(['brctl', 'delif', br_ifname, ifname])
  882. subprocess.call(['brctl', 'delbr', br_ifname])
  883. subprocess.call(['iw', ifname, 'set', '4addr', 'on'])
  884. def _test_ap_wpa2_psk_wpas_in_bridge(dev, apdev):
  885. ssid = "test-wpa2-psk"
  886. passphrase = 'qwertyuiop'
  887. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  888. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  889. br_ifname='sta-br0'
  890. ifname='wlan5'
  891. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
  892. subprocess.call(['brctl', 'addbr', br_ifname])
  893. subprocess.call(['brctl', 'setfd', br_ifname, '0'])
  894. subprocess.call(['ip', 'link', 'set', 'dev', br_ifname, 'up'])
  895. subprocess.call(['iw', ifname, 'set', '4addr', 'on'])
  896. subprocess.check_call(['brctl', 'addif', br_ifname, ifname])
  897. wpas.interface_add(ifname, br_ifname=br_ifname)
  898. wpas.connect(ssid, psk=passphrase, scan_freq="2412")