diff --git a/tests/hwsim/test_ap_hs20.py b/tests/hwsim/test_ap_hs20.py index 23d2588ab..acf5ad343 100644 --- a/tests/hwsim/test_ap_hs20.py +++ b/tests/hwsim/test_ap_hs20.py @@ -23,7 +23,7 @@ from tshark import run_tshark from wlantest import Wlantest from wpasupplicant import WpaSupplicant from test_ap_eap import check_eap_capa, check_domain_match_full -from test_gas import gas_rx, parse_gas, action_response, send_gas_resp, ACTION_CATEG_PUBLIC, GAS_INITIAL_RESPONSE +from test_gas import gas_rx, parse_gas, action_response, anqp_initial_resp, send_gas_resp, ACTION_CATEG_PUBLIC, GAS_INITIAL_RESPONSE def hs20_ap_params(ssid="test-hs20"): params = hostapd.wpa2_params(ssid=ssid) @@ -3243,6 +3243,159 @@ def test_ap_hs20_fetch_osu_stop(dev, apdev): os.remove(dir + "/" + f) os.rmdir(dir) +def test_ap_hs20_fetch_osu_proto(dev, apdev): + """Hotspot 2.0 OSU provider and protocol testing""" + bssid = apdev[0]['bssid'] + params = hs20_ap_params() + hapd = hostapd.add_ap(apdev[0], params) + + dev[0].hs20_enable() + dir = "/tmp/osu-fetch" + if os.path.isdir(dir): + files = [ f for f in os.listdir(dir) if f.startswith("osu-") ] + for f in files: + os.remove(dir + "/" + f) + else: + try: + os.makedirs(dir) + except: + pass + + tests = [ ( "Empty provider list (no OSU SSID field)", '' ), + ( "HS 2.0: Not enough room for OSU SSID", + binascii.unhexlify('01') ), + ( "HS 2.0: Invalid OSU SSID Length 33", + binascii.unhexlify('21') + 33*'A' ), + ( "HS 2.0: Not enough room for Number of OSU Providers", + binascii.unhexlify('0130') ), + ( "Truncated OSU Provider", + binascii.unhexlify('013001020000') ), + ( "HS 2.0: Ignored 5 bytes of extra data after OSU Providers", + binascii.unhexlify('0130001122334455') ), + ( "HS 2.0: Not enough room for OSU Friendly Name Length", + binascii.unhexlify('013001000000') ), + ( "HS 2.0: Not enough room for OSU Friendly Name Duples", + build_prov('0100') ), + ( "Invalid OSU Friendly Name", build_prov('040000000000') ), + ( "Invalid OSU Friendly Name(2)", build_prov('040004000000') ), + ( "HS 2.0: Not enough room for OSU Server URI length", + build_prov('0000') ), + ( "HS 2.0: Not enough room for OSU Server URI", + build_prov('000001') ), + ( "HS 2.0: Not enough room for OSU Method list length", + build_prov('000000') ), + ( "HS 2.0: Not enough room for OSU Method list", + build_prov('00000001') ), + ( "HS 2.0: Not enough room for Icons Available Length", + build_prov('00000000') ), + ( "HS 2.0: Not enough room for Icons Available Length(2)", + build_prov('00000001ff00') ), + ( "HS 2.0: Not enough room for Icons Available", + build_prov('000000000100') ), + ( "HS 2.0: Invalid Icon Metadata", + build_prov('00000000010000') ), + ( "HS 2.0: Not room for Icon Type", + build_prov('000000000900111122223333330200') ), + ( "HS 2.0: Not room for Icon Filename length", + build_prov('000000000900111122223333330100') ), + ( "HS 2.0: Not room for Icon Filename", + build_prov('000000000900111122223333330001') ), + ( "HS 2.0: Not enough room for OSU_NAI", + build_prov('000000000000') ), + ( "HS 2.0: Not enough room for OSU_NAI(2)", + build_prov('00000000000001') ), + ( "HS 2.0: Not enough room for OSU Service Description Length", + build_prov('00000000000000') ), + ( "HS 2.0: Not enough room for OSU Service Description Length(2)", + build_prov('0000000000000000') ), + ( "HS 2.0: Not enough room for OSU Service Description Duples", + build_prov('000000000000000100') ), + ( "Invalid OSU Service Description", + build_prov('00000000000000040000000000') ), + ( "Invalid OSU Service Description(2)", + build_prov('00000000000000040004000000') ) ] + + try: + dev[0].request("SET osu_dir " + dir) + run_fetch_osu_icon_failure(hapd, dev, bssid) + for note, prov in tests: + run_fetch_osu(hapd, dev, bssid, note, prov) + finally: + files = [ f for f in os.listdir(dir) if f.startswith("osu-") ] + for f in files: + os.remove(dir + "/" + f) + os.rmdir(dir) + +def build_prov(prov): + data = binascii.unhexlify(prov) + return binascii.unhexlify('013001') + struct.pack('