# WPS tests
# Copyright (c) 2013-2015, Jouni Malinen <j@w1.fi>
#
# This software may be distributed under the terms of the BSD license.
# See README for more details.

import base64
import binascii
from Crypto.Cipher import AES
import hashlib
import hmac
import os
import time
import stat
import subprocess
import logging
logger = logging.getLogger()
import re
import socket
import struct
import httplib
import urlparse
import urllib
import xml.etree.ElementTree as ET
import StringIO
import SocketServer

import hwsim_utils
import hostapd
from wpasupplicant import WpaSupplicant
from utils import HwsimSkip, alloc_fail, fail_test, skip_with_fips

def wps_start_ap(apdev, ssid="test-wps-conf"):
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP" }
    return hostapd.add_ap(apdev['ifname'], params)

def test_ap_wps_init(dev, apdev):
    """Initial AP configuration with first WPS Enrollee"""
    ssid = "test-wps"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "1" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    hapd.request("WPS_PBC")
    if "PBC Status: Active" not in hapd.request("WPS_GET_STATUS"):
        raise Exception("PBC status not shown correctly")

    id = dev[0].add_network()
    dev[0].set_network_quoted(id, "ssid", "home")
    dev[0].set_network_quoted(id, "psk", "12345678")
    dev[0].request("ENABLE_NETWORK %s no-connect" % id)

    id = dev[0].add_network()
    dev[0].set_network_quoted(id, "ssid", "home2")
    dev[0].set_network(id, "bssid", "00:11:22:33:44:55")
    dev[0].set_network(id, "key_mgmt", "NONE")
    dev[0].request("ENABLE_NETWORK %s no-connect" % id)

    dev[0].request("WPS_PBC")
    dev[0].wait_connected(timeout=30)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED' or status['bssid'] != apdev[0]['bssid']:
        raise Exception("Not fully connected")
    if status['ssid'] != ssid:
        raise Exception("Unexpected SSID")
    if status['pairwise_cipher'] != 'CCMP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

    status = hapd.request("WPS_GET_STATUS")
    if "PBC Status: Disabled" not in status:
        raise Exception("PBC status not shown correctly")
    if "Last WPS result: Success" not in status:
        raise Exception("Last WPS result not shown correctly")
    if "Peer Address: " + dev[0].p2p_interface_addr() not in status:
        raise Exception("Peer address not shown correctly")
    conf = hapd.request("GET_CONFIG")
    if "wps_state=configured" not in conf:
        raise Exception("AP not in WPS configured state")
    if "wpa=3" not in conf:
        raise Exception("AP not in WPA+WPA2 configuration")
    if "rsn_pairwise_cipher=CCMP TKIP" not in conf:
        raise Exception("Unexpected rsn_pairwise_cipher")
    if "wpa_pairwise_cipher=CCMP TKIP" not in conf:
        raise Exception("Unexpected wpa_pairwise_cipher")
    if "group_cipher=TKIP" not in conf:
        raise Exception("Unexpected group_cipher")

    if len(dev[0].list_networks()) != 3:
        raise Exception("Unexpected number of network blocks")

def test_ap_wps_init_2ap_pbc(dev, apdev):
    """Initial two-radio AP configuration with first WPS PBC Enrollee"""
    ssid = "test-wps"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "1" }
    hostapd.add_ap(apdev[0]['ifname'], params)
    hostapd.add_ap(apdev[1]['ifname'], params)
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412", force_scan=True)
    dev[0].scan_for_bss(apdev[1]['bssid'], freq="2412")
    bss = dev[0].get_bss(apdev[0]['bssid'])
    if "[WPS-PBC]" not in bss['flags']:
        raise Exception("WPS-PBC flag missing from AP1")
    bss = dev[0].get_bss(apdev[1]['bssid'])
    if "[WPS-PBC]" not in bss['flags']:
        raise Exception("WPS-PBC flag missing from AP2")
    dev[0].dump_monitor()
    dev[0].request("SET wps_cred_processing 2")
    dev[0].request("WPS_PBC")
    ev = dev[0].wait_event(["WPS-CRED-RECEIVED"], timeout=30)
    dev[0].request("SET wps_cred_processing 0")
    if ev is None:
        raise Exception("WPS cred event not seen")
    if "100e" not in ev:
        raise Exception("WPS attributes not included in the cred event")
    dev[0].wait_connected(timeout=30)

    dev[1].scan_for_bss(apdev[0]['bssid'], freq="2412", force_scan=True)
    dev[1].scan_for_bss(apdev[1]['bssid'], freq="2412")
    bss = dev[1].get_bss(apdev[0]['bssid'])
    if "[WPS-PBC]" in bss['flags']:
        raise Exception("WPS-PBC flag not cleared from AP1")
    bss = dev[1].get_bss(apdev[1]['bssid'])
    if "[WPS-PBC]" in bss['flags']:
        raise Exception("WPS-PBC flag not cleared from AP2")

def test_ap_wps_init_2ap_pin(dev, apdev):
    """Initial two-radio AP configuration with first WPS PIN Enrollee"""
    ssid = "test-wps"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "1" }
    hostapd.add_ap(apdev[0]['ifname'], params)
    hostapd.add_ap(apdev[1]['ifname'], params)
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    pin = dev[0].wps_read_pin()
    hapd.request("WPS_PIN any " + pin)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412", force_scan=True)
    dev[0].scan_for_bss(apdev[1]['bssid'], freq="2412")
    bss = dev[0].get_bss(apdev[0]['bssid'])
    if "[WPS-AUTH]" not in bss['flags']:
        raise Exception("WPS-AUTH flag missing from AP1")
    bss = dev[0].get_bss(apdev[1]['bssid'])
    if "[WPS-AUTH]" not in bss['flags']:
        raise Exception("WPS-AUTH flag missing from AP2")
    dev[0].dump_monitor()
    dev[0].request("WPS_PIN any " + pin)
    dev[0].wait_connected(timeout=30)

    dev[1].scan_for_bss(apdev[0]['bssid'], freq="2412", force_scan=True)
    dev[1].scan_for_bss(apdev[1]['bssid'], freq="2412")
    bss = dev[1].get_bss(apdev[0]['bssid'])
    if "[WPS-AUTH]" in bss['flags']:
        raise Exception("WPS-AUTH flag not cleared from AP1")
    bss = dev[1].get_bss(apdev[1]['bssid'])
    if "[WPS-AUTH]" in bss['flags']:
        raise Exception("WPS-AUTH flag not cleared from AP2")

def test_ap_wps_init_through_wps_config(dev, apdev):
    """Initial AP configuration using wps_config command"""
    ssid = "test-wps-init-config"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "1" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    if "FAIL" in hapd.request("WPS_CONFIG " + ssid.encode("hex") + " WPA2PSK CCMP " + "12345678".encode("hex")):
        raise Exception("WPS_CONFIG command failed")
    ev = hapd.wait_event(["WPS-NEW-AP-SETTINGS"], timeout=5)
    if ev is None:
        raise Exception("Timeout on WPS-NEW-AP-SETTINGS events")
    # It takes some time for the AP to update Beacon and Probe Response frames,
    # so wait here before requesting the scan to be started to avoid adding
    # extra five second wait to the test due to fetching obsolete scan results.
    hapd.ping()
    time.sleep(0.2)
    dev[0].connect(ssid, psk="12345678", scan_freq="2412", proto="WPA2",
                   pairwise="CCMP", group="CCMP")

def test_ap_wps_init_through_wps_config_2(dev, apdev):
    """AP configuration using wps_config and wps_cred_processing=2"""
    ssid = "test-wps-init-config"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "1",
                     "wps_cred_processing": "2" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    if "FAIL" in hapd.request("WPS_CONFIG " + ssid.encode("hex") + " WPA2PSK CCMP " + "12345678".encode("hex")):
        raise Exception("WPS_CONFIG command failed")
    ev = hapd.wait_event(["WPS-NEW-AP-SETTINGS"], timeout=5)
    if ev is None:
        raise Exception("Timeout on WPS-NEW-AP-SETTINGS events")
    if "100e" not in ev:
        raise Exception("WPS-NEW-AP-SETTINGS did not include Credential")

def test_ap_wps_invalid_wps_config_passphrase(dev, apdev):
    """AP configuration using wps_config command with invalid passphrase"""
    ssid = "test-wps-init-config"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "1" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    if "FAIL" not in hapd.request("WPS_CONFIG " + ssid.encode("hex") + " WPA2PSK CCMP " + "1234567".encode("hex")):
        raise Exception("Invalid WPS_CONFIG command accepted")

def test_ap_wps_conf(dev, apdev):
    """WPS PBC provisioning with configured AP"""
    ssid = "test-wps-conf"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].dump_monitor()
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    dev[0].wait_connected(timeout=30)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED':
        raise Exception("Not fully connected")
    if status['bssid'] != apdev[0]['bssid']:
        raise Exception("Unexpected BSSID")
    if status['ssid'] != ssid:
        raise Exception("Unexpected SSID")
    if status['pairwise_cipher'] != 'CCMP' or status['group_cipher'] != 'CCMP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

    sta = hapd.get_sta(dev[0].p2p_interface_addr())
    if 'wpsDeviceName' not in sta or sta['wpsDeviceName'] != "Device A":
        raise Exception("Device name not available in STA command")

def test_ap_wps_conf_5ghz(dev, apdev):
    """WPS PBC provisioning with configured AP on 5 GHz band"""
    try:
        hapd = None
        ssid = "test-wps-conf"
        params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                   "wpa_passphrase": "12345678", "wpa": "2",
                   "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                   "country_code": "FI", "hw_mode": "a", "channel": "36" }
        hapd = hostapd.add_ap(apdev[0]['ifname'], params)
        logger.info("WPS provisioning step")
        hapd.request("WPS_PBC")
        dev[0].scan_for_bss(apdev[0]['bssid'], freq="5180")
        dev[0].request("WPS_PBC " + apdev[0]['bssid'])
        dev[0].wait_connected(timeout=30)

        sta = hapd.get_sta(dev[0].p2p_interface_addr())
        if 'wpsDeviceName' not in sta or sta['wpsDeviceName'] != "Device A":
            raise Exception("Device name not available in STA command")
    finally:
        dev[0].request("DISCONNECT")
        if hapd:
            hapd.request("DISABLE")
        subprocess.call(['iw', 'reg', 'set', '00'])
        dev[0].flush_scan_cache()

def test_ap_wps_conf_chan14(dev, apdev):
    """WPS PBC provisioning with configured AP on channel 14"""
    try:
        hapd = None
        ssid = "test-wps-conf"
        params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                   "wpa_passphrase": "12345678", "wpa": "2",
                   "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                   "country_code": "JP", "hw_mode": "b", "channel": "14" }
        hapd = hostapd.add_ap(apdev[0]['ifname'], params)
        logger.info("WPS provisioning step")
        hapd.request("WPS_PBC")
        dev[0].request("WPS_PBC")
        dev[0].wait_connected(timeout=30)

        sta = hapd.get_sta(dev[0].p2p_interface_addr())
        if 'wpsDeviceName' not in sta or sta['wpsDeviceName'] != "Device A":
            raise Exception("Device name not available in STA command")
    finally:
        dev[0].request("DISCONNECT")
        if hapd:
            hapd.request("DISABLE")
        subprocess.call(['iw', 'reg', 'set', '00'])
        dev[0].flush_scan_cache()

def test_ap_wps_twice(dev, apdev):
    """WPS provisioning with twice to change passphrase"""
    ssid = "test-wps-twice"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP" }
    hostapd.add_ap(apdev[0]['ifname'], params)
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].dump_monitor()
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    dev[0].wait_connected(timeout=30)
    dev[0].request("DISCONNECT")

    logger.info("Restart AP with different passphrase and re-run WPS")
    hapd_global = hostapd.HostapdGlobal()
    hapd_global.remove(apdev[0]['ifname'])
    params['wpa_passphrase'] = 'another passphrase'
    hostapd.add_ap(apdev[0]['ifname'], params)
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    hapd.request("WPS_PBC")
    dev[0].dump_monitor()
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    dev[0].wait_connected(timeout=30)
    networks = dev[0].list_networks()
    if len(networks) > 1:
        raise Exception("Unexpected duplicated network block present")

def test_ap_wps_incorrect_pin(dev, apdev):
    """WPS PIN provisioning with incorrect PIN"""
    ssid = "test-wps-incorrect-pin"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])

    logger.info("WPS provisioning attempt 1")
    hapd.request("WPS_PIN any 12345670")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].dump_monitor()
    dev[0].request("WPS_PIN %s 55554444" % apdev[0]['bssid'])
    ev = dev[0].wait_event(["WPS-FAIL"], timeout=30)
    if ev is None:
        raise Exception("WPS operation timed out")
    if "config_error=18" not in ev:
        raise Exception("Incorrect config_error reported")
    if "msg=8" not in ev:
        raise Exception("PIN error detected on incorrect message")
    dev[0].wait_disconnected(timeout=10)
    dev[0].request("WPS_CANCEL")
    # if a scan was in progress, wait for it to complete before trying WPS again
    ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)

    status = hapd.request("WPS_GET_STATUS")
    if "Last WPS result: Failed" not in status:
        raise Exception("WPS failure result not shown correctly")

    logger.info("WPS provisioning attempt 2")
    hapd.request("WPS_PIN any 12345670")
    dev[0].dump_monitor()
    dev[0].request("WPS_PIN %s 12344444" % apdev[0]['bssid'])
    ev = dev[0].wait_event(["WPS-FAIL"], timeout=30)
    if ev is None:
        raise Exception("WPS operation timed out")
    if "config_error=18" not in ev:
        raise Exception("Incorrect config_error reported")
    if "msg=10" not in ev:
        raise Exception("PIN error detected on incorrect message")
    dev[0].wait_disconnected(timeout=10)

def test_ap_wps_conf_pin(dev, apdev):
    """WPS PIN provisioning with configured AP"""
    ssid = "test-wps-conf-pin"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    pin = dev[0].wps_read_pin()
    hapd.request("WPS_PIN any " + pin)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].dump_monitor()
    dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    dev[0].wait_connected(timeout=30)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED' or status['bssid'] != apdev[0]['bssid']:
        raise Exception("Not fully connected")
    if status['ssid'] != ssid:
        raise Exception("Unexpected SSID")
    if status['pairwise_cipher'] != 'CCMP' or status['group_cipher'] != 'CCMP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

    dev[1].scan_for_bss(apdev[0]['bssid'], freq="2412", force_scan=True)
    bss = dev[1].get_bss(apdev[0]['bssid'])
    if "[WPS-AUTH]" in bss['flags']:
        raise Exception("WPS-AUTH flag not cleared")
    logger.info("Try to connect from another station using the same PIN")
    pin = dev[1].request("WPS_PIN " + apdev[0]['bssid'])
    ev = dev[1].wait_event(["WPS-M2D","CTRL-EVENT-CONNECTED"], timeout=30)
    if ev is None:
        raise Exception("Operation timed out")
    if "WPS-M2D" not in ev:
        raise Exception("Unexpected WPS operation started")
    hapd.request("WPS_PIN any " + pin)
    dev[1].wait_connected(timeout=30)

def test_ap_wps_conf_pin_v1(dev, apdev):
    """WPS PIN provisioning with configured WPS v1.0 AP"""
    ssid = "test-wps-conf-pin-v1"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    pin = dev[0].wps_read_pin()
    hapd.request("SET wps_version_number 0x10")
    hapd.request("WPS_PIN any " + pin)
    found = False
    for i in range(0, 10):
        dev[0].scan(freq="2412")
        if "[WPS-PIN]" in dev[0].request("SCAN_RESULTS"):
            found = True
            break
    if not found:
        hapd.request("SET wps_version_number 0x20")
        raise Exception("WPS-PIN flag not seen in scan results")
    dev[0].dump_monitor()
    dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    dev[0].wait_connected(timeout=30)
    hapd.request("SET wps_version_number 0x20")

def test_ap_wps_conf_pin_2sta(dev, apdev):
    """Two stations trying to use WPS PIN at the same time"""
    ssid = "test-wps-conf-pin2"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    pin = "12345670"
    pin2 = "55554444"
    hapd.request("WPS_PIN " + dev[0].get_status_field("uuid") + " " + pin)
    hapd.request("WPS_PIN " + dev[1].get_status_field("uuid") + " " + pin)
    dev[0].dump_monitor()
    dev[1].dump_monitor()
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[1].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    dev[1].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    dev[0].wait_connected(timeout=30)
    dev[1].wait_connected(timeout=30)

def test_ap_wps_conf_pin_timeout(dev, apdev):
    """WPS PIN provisioning with configured AP timing out PIN"""
    ssid = "test-wps-conf-pin"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    addr = dev[0].p2p_interface_addr()
    pin = dev[0].wps_read_pin()
    if "FAIL" not in hapd.request("WPS_PIN "):
        raise Exception("Unexpected success on invalid WPS_PIN")
    hapd.request("WPS_PIN any " + pin + " 1")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    time.sleep(1.1)
    dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    ev = hapd.wait_event(["WPS-PIN-NEEDED"], timeout=20)
    if ev is None:
        raise Exception("WPS-PIN-NEEDED event timed out")
    ev = dev[0].wait_event(["WPS-M2D"])
    if ev is None:
        raise Exception("M2D not reported")
    dev[0].request("WPS_CANCEL")

    hapd.request("WPS_PIN any " + pin + " 20 " + addr)
    dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    dev[0].wait_connected(timeout=30)

def test_ap_wps_reg_connect(dev, apdev):
    """WPS registrar using AP PIN to connect"""
    ssid = "test-wps-reg-ap-pin"
    appin = "12345670"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "ap_pin": appin})
    logger.info("WPS provisioning step")
    dev[0].dump_monitor()
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], appin)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED' or status['bssid'] != apdev[0]['bssid']:
        raise Exception("Not fully connected")
    if status['ssid'] != ssid:
        raise Exception("Unexpected SSID")
    if status['pairwise_cipher'] != 'CCMP' or status['group_cipher'] != 'CCMP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

def test_ap_wps_reg_connect_mixed_mode(dev, apdev):
    """WPS registrar using AP PIN to connect (WPA+WPA2)"""
    ssid = "test-wps-reg-ap-pin"
    appin = "12345670"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "3",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "wpa_pairwise": "TKIP", "ap_pin": appin})
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], appin)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED' or status['bssid'] != apdev[0]['bssid']:
        raise Exception("Not fully connected")
    if status['ssid'] != ssid:
        raise Exception("Unexpected SSID")
    if status['pairwise_cipher'] != 'CCMP' or status['group_cipher'] != 'TKIP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

def test_ap_wps_reg_override_ap_settings(dev, apdev):
    """WPS registrar and ap_settings override"""
    ap_settings = "/tmp/ap_wps_reg_override_ap_settings"
    try:
        os.remove(ap_settings)
    except:
        pass
    # Override AP Settings with values that point to another AP
    data = build_wsc_attr(ATTR_NETWORK_INDEX, '\x01')
    data += build_wsc_attr(ATTR_SSID, "test")
    data += build_wsc_attr(ATTR_AUTH_TYPE, '\x00\x01')
    data += build_wsc_attr(ATTR_ENCR_TYPE, '\x00\x01')
    data += build_wsc_attr(ATTR_NETWORK_KEY, '')
    data += build_wsc_attr(ATTR_MAC_ADDR, binascii.unhexlify(apdev[1]['bssid'].replace(':', '')))
    with open(ap_settings, "w") as f:
        f.write(data)
    ssid = "test-wps-reg-ap-pin"
    appin = "12345670"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "ap_pin": appin, "ap_settings": ap_settings })
    hapd2 = hostapd.add_ap(apdev[1]['ifname'], { "ssid": "test" })
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].scan_for_bss(apdev[1]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], appin)
    ev = hapd2.wait_event(['AP-STA-CONNECTED'], timeout=10)
    os.remove(ap_settings)
    if ev is None:
        raise Exception("No connection with the other AP")

def check_wps_reg_failure(dev, ap, appin):
    dev.request("WPS_REG " + ap['bssid'] + " " + appin)
    ev = dev.wait_event(["WPS-SUCCESS", "WPS-FAIL"], timeout=15)
    if ev is None:
        raise Exception("WPS operation timed out")
    if "WPS-SUCCESS" in ev:
        raise Exception("WPS operation succeeded unexpectedly")
    if "config_error=15" not in ev:
        raise Exception("WPS setup locked state was not reported correctly")

def test_ap_wps_random_ap_pin(dev, apdev):
    """WPS registrar using random AP PIN"""
    ssid = "test-wps-reg-random-ap-pin"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "device_name": "Wireless AP", "manufacturer": "Company",
                     "model_name": "WAP", "model_number": "123",
                     "serial_number": "12345", "device_type": "6-0050F204-1",
                     "os_version": "01020300",
                     "config_methods": "label push_button",
                     "uuid": ap_uuid, "upnp_iface": "lo" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    appin = hapd.request("WPS_AP_PIN random")
    if "FAIL" in appin:
        raise Exception("Could not generate random AP PIN")
    if appin not in hapd.request("WPS_AP_PIN get"):
        raise Exception("Could not fetch current AP PIN")
    logger.info("WPS provisioning step")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], appin)

    hapd.request("WPS_AP_PIN disable")
    logger.info("WPS provisioning step with AP PIN disabled")
    dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
    check_wps_reg_failure(dev[1], apdev[0], appin)

    logger.info("WPS provisioning step with AP PIN reset")
    appin = "12345670"
    hapd.request("WPS_AP_PIN set " + appin)
    dev[1].wps_reg(apdev[0]['bssid'], appin)
    dev[0].request("REMOVE_NETWORK all")
    dev[1].request("REMOVE_NETWORK all")
    dev[0].wait_disconnected(timeout=10)
    dev[1].wait_disconnected(timeout=10)

    logger.info("WPS provisioning step after AP PIN timeout")
    hapd.request("WPS_AP_PIN disable")
    appin = hapd.request("WPS_AP_PIN random 1")
    time.sleep(1.1)
    if "FAIL" not in hapd.request("WPS_AP_PIN get"):
        raise Exception("AP PIN unexpectedly still enabled")
    check_wps_reg_failure(dev[0], apdev[0], appin)

    logger.info("WPS provisioning step after AP PIN timeout(2)")
    hapd.request("WPS_AP_PIN disable")
    appin = "12345670"
    hapd.request("WPS_AP_PIN set " + appin + " 1")
    time.sleep(1.1)
    if "FAIL" not in hapd.request("WPS_AP_PIN get"):
        raise Exception("AP PIN unexpectedly still enabled")
    check_wps_reg_failure(dev[1], apdev[0], appin)

    with fail_test(hapd, 1, "os_get_random;wps_generate_pin"):
        if "FAIL" in hapd.request("WPS_AP_PIN random 1"):
            raise Exception("Failed to generate PIN during OOM")
        hapd.request("WPS_AP_PIN disable")

    with alloc_fail(hapd, 1, "upnp_wps_set_ap_pin"):
        hapd.request("WPS_AP_PIN set 12345670")
        hapd.request("WPS_AP_PIN disable")

def test_ap_wps_reg_config(dev, apdev):
    """WPS registrar configuring an AP using AP PIN"""
    ssid = "test-wps-init-ap-pin"
    appin = "12345670"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "ap_pin": appin})
    logger.info("WPS configuration step")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].dump_monitor()
    new_ssid = "wps-new-ssid"
    new_passphrase = "1234567890"
    dev[0].wps_reg(apdev[0]['bssid'], appin, new_ssid, "WPA2PSK", "CCMP",
                   new_passphrase)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED' or status['bssid'] != apdev[0]['bssid']:
        raise Exception("Not fully connected")
    if status['ssid'] != new_ssid:
        raise Exception("Unexpected SSID")
    if status['pairwise_cipher'] != 'CCMP' or status['group_cipher'] != 'CCMP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

    logger.info("Re-configure back to open")
    dev[0].request("REMOVE_NETWORK all")
    dev[0].flush_scan_cache()
    dev[0].dump_monitor()
    dev[0].wps_reg(apdev[0]['bssid'], appin, "wps-open", "OPEN", "NONE", "")
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED' or status['bssid'] != apdev[0]['bssid']:
        raise Exception("Not fully connected")
    if status['ssid'] != "wps-open":
        raise Exception("Unexpected SSID")
    if status['key_mgmt'] != 'NONE':
        raise Exception("Unexpected key_mgmt")

def test_ap_wps_reg_config_ext_processing(dev, apdev):
    """WPS registrar configuring an AP with external config processing"""
    ssid = "test-wps-init-ap-pin"
    appin = "12345670"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wps_cred_processing": "1", "ap_pin": appin}
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    new_ssid = "wps-new-ssid"
    new_passphrase = "1234567890"
    dev[0].wps_reg(apdev[0]['bssid'], appin, new_ssid, "WPA2PSK", "CCMP",
                   new_passphrase, no_wait=True)
    ev = dev[0].wait_event(["WPS-SUCCESS"], timeout=15)
    if ev is None:
        raise Exception("WPS registrar operation timed out")
    ev = hapd.wait_event(["WPS-NEW-AP-SETTINGS"], timeout=15)
    if ev is None:
        raise Exception("WPS configuration timed out")
    if "1026" not in ev:
        raise Exception("AP Settings missing from event")
    hapd.request("SET wps_cred_processing 0")
    if "FAIL" in hapd.request("WPS_CONFIG " + new_ssid.encode("hex") + " WPA2PSK CCMP " + new_passphrase.encode("hex")):
        raise Exception("WPS_CONFIG command failed")
    dev[0].wait_connected(timeout=15)

def test_ap_wps_reg_config_tkip(dev, apdev):
    """WPS registrar configuring AP to use TKIP and AP upgrading to TKIP+CCMP"""
    skip_with_fips(dev[0])
    ssid = "test-wps-init-ap"
    appin = "12345670"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "1",
                     "ap_pin": appin})
    logger.info("WPS configuration step")
    dev[0].request("SET wps_version_number 0x10")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].dump_monitor()
    new_ssid = "wps-new-ssid-with-tkip"
    new_passphrase = "1234567890"
    dev[0].wps_reg(apdev[0]['bssid'], appin, new_ssid, "WPAPSK", "TKIP",
                   new_passphrase)
    logger.info("Re-connect to verify WPA2 mixed mode")
    dev[0].request("DISCONNECT")
    id = 0
    dev[0].set_network(id, "pairwise", "CCMP")
    dev[0].set_network(id, "proto", "RSN")
    dev[0].connect_network(id)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED' or status['bssid'] != apdev[0]['bssid']:
        raise Exception("Not fully connected: wpa_state={} bssid={}".format(status['wpa_state'], status['bssid']))
    if status['ssid'] != new_ssid:
        raise Exception("Unexpected SSID")
    if status['pairwise_cipher'] != 'CCMP' or status['group_cipher'] != 'TKIP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

def test_ap_wps_setup_locked(dev, apdev):
    """WPS registrar locking up AP setup on AP PIN failures"""
    ssid = "test-wps-incorrect-ap-pin"
    appin = "12345670"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "ap_pin": appin})
    new_ssid = "wps-new-ssid-test"
    new_passphrase = "1234567890"

    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    ap_setup_locked=False
    for pin in ["55554444", "1234", "12345678", "00000000", "11111111"]:
        dev[0].dump_monitor()
        logger.info("Try incorrect AP PIN - attempt " + pin)
        dev[0].wps_reg(apdev[0]['bssid'], pin, new_ssid, "WPA2PSK",
                       "CCMP", new_passphrase, no_wait=True)
        ev = dev[0].wait_event(["WPS-FAIL", "CTRL-EVENT-CONNECTED"])
        if ev is None:
            raise Exception("Timeout on receiving WPS operation failure event")
        if "CTRL-EVENT-CONNECTED" in ev:
            raise Exception("Unexpected connection")
        if "config_error=15" in ev:
            logger.info("AP Setup Locked")
            ap_setup_locked=True
        elif "config_error=18" not in ev:
            raise Exception("config_error=18 not reported")
        dev[0].wait_disconnected(timeout=10)
        time.sleep(0.1)
    if not ap_setup_locked:
        raise Exception("AP setup was not locked")
    dev[0].request("WPS_CANCEL")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412, force_scan=True,
                        only_new=True)
    bss = dev[0].get_bss(apdev[0]['bssid'])
    if 'wps_ap_setup_locked' not in bss or bss['wps_ap_setup_locked'] != '1':
        logger.info("BSS: " + str(bss))
        raise Exception("AP Setup Locked not indicated in scan results")

    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    status = hapd.request("WPS_GET_STATUS")
    if "Last WPS result: Failed" not in status:
        raise Exception("WPS failure result not shown correctly")
    if "Peer Address: " + dev[0].p2p_interface_addr() not in status:
        raise Exception("Peer address not shown correctly")

    time.sleep(0.5)
    dev[0].dump_monitor()
    logger.info("WPS provisioning step")
    pin = dev[0].wps_read_pin()
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    hapd.request("WPS_PIN any " + pin)
    dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    ev = dev[0].wait_event(["WPS-SUCCESS"], timeout=30)
    if ev is None:
        raise Exception("WPS success was not reported")
    dev[0].wait_connected(timeout=30)

    appin = hapd.request("WPS_AP_PIN random")
    if "FAIL" in appin:
        raise Exception("Could not generate random AP PIN")
    ev = hapd.wait_event(["WPS-AP-SETUP-UNLOCKED"], timeout=10)
    if ev is None:
        raise Exception("Failed to unlock AP PIN")

def test_ap_wps_setup_locked_timeout(dev, apdev):
    """WPS re-enabling AP PIN after timeout"""
    ssid = "test-wps-incorrect-ap-pin"
    appin = "12345670"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "ap_pin": appin})
    new_ssid = "wps-new-ssid-test"
    new_passphrase = "1234567890"

    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    ap_setup_locked=False
    for pin in ["55554444", "1234", "12345678", "00000000", "11111111"]:
        dev[0].dump_monitor()
        logger.info("Try incorrect AP PIN - attempt " + pin)
        dev[0].wps_reg(apdev[0]['bssid'], pin, new_ssid, "WPA2PSK",
                       "CCMP", new_passphrase, no_wait=True)
        ev = dev[0].wait_event(["WPS-FAIL", "CTRL-EVENT-CONNECTED"], timeout=15)
        if ev is None:
            raise Exception("Timeout on receiving WPS operation failure event")
        if "CTRL-EVENT-CONNECTED" in ev:
            raise Exception("Unexpected connection")
        if "config_error=15" in ev:
            logger.info("AP Setup Locked")
            ap_setup_locked=True
            break
        elif "config_error=18" not in ev:
            raise Exception("config_error=18 not reported")
        dev[0].wait_disconnected(timeout=10)
        time.sleep(0.1)
    if not ap_setup_locked:
        raise Exception("AP setup was not locked")
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    ev = hapd.wait_event(["WPS-AP-SETUP-UNLOCKED"], timeout=80)
    if ev is None:
        raise Exception("AP PIN did not get unlocked on 60 second timeout")

def test_ap_wps_setup_locked_2(dev, apdev):
    """WPS AP configured for special ap_setup_locked=2 mode"""
    ssid = "test-wps-ap-pin"
    appin = "12345670"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
               "ap_pin": appin, "ap_setup_locked": "2" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    new_ssid = "wps-new-ssid-test"
    new_passphrase = "1234567890"

    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], appin)
    dev[0].request("REMOVE_NETWORK all")
    dev[0].wait_disconnected()

    hapd.dump_monitor()
    dev[0].dump_monitor()
    dev[0].wps_reg(apdev[0]['bssid'], appin, new_ssid, "WPA2PSK",
                   "CCMP", new_passphrase, no_wait=True)

    ev = hapd.wait_event(["WPS-FAIL"], timeout=5)
    if ev is None:
        raise Exception("hostapd did not report WPS failure")
    if "msg=12 config_error=15" not in ev:
        raise Exception("Unexpected failure reason (AP): " + ev)

    ev = dev[0].wait_event(["WPS-FAIL", "CTRL-EVENT-CONNECTED"])
    if ev is None:
        raise Exception("Timeout on receiving WPS operation failure event")
    if "CTRL-EVENT-CONNECTED" in ev:
        raise Exception("Unexpected connection")
    if "config_error=15" not in ev:
        raise Exception("Unexpected failure reason (STA): " + ev)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()

def test_ap_wps_pbc_overlap_2ap(dev, apdev):
    """WPS PBC session overlap with two active APs"""
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": "wps1", "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "wps_independent": "1"})
    hostapd.add_ap(apdev[1]['ifname'],
                   { "ssid": "wps2", "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "123456789", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "wps_independent": "1"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    hapd.request("WPS_PBC")
    hapd2 = hostapd.Hostapd(apdev[1]['ifname'])
    hapd2.request("WPS_PBC")
    logger.info("WPS provisioning step")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412", force_scan=True)
    dev[0].scan_for_bss(apdev[1]['bssid'], freq="2412")
    dev[0].request("WPS_PBC")
    ev = dev[0].wait_event(["WPS-OVERLAP-DETECTED"], timeout=15)
    if ev is None:
        raise Exception("PBC session overlap not detected")
    hapd.request("DISABLE")
    hapd2.request("DISABLE")
    dev[0].flush_scan_cache()

def test_ap_wps_pbc_overlap_2sta(dev, apdev):
    """WPS PBC session overlap with two active STAs"""
    ssid = "test-wps-pbc-overlap"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].dump_monitor()
    dev[1].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[1].dump_monitor()
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    dev[1].request("WPS_PBC " + apdev[0]['bssid'])
    ev = dev[0].wait_event(["WPS-M2D"], timeout=15)
    if ev is None:
        raise Exception("PBC session overlap not detected (dev0)")
    if "config_error=12" not in ev:
        raise Exception("PBC session overlap not correctly reported (dev0)")
    dev[0].request("WPS_CANCEL")
    dev[0].request("DISCONNECT")
    ev = dev[1].wait_event(["WPS-M2D"], timeout=15)
    if ev is None:
        raise Exception("PBC session overlap not detected (dev1)")
    if "config_error=12" not in ev:
        raise Exception("PBC session overlap not correctly reported (dev1)")
    dev[1].request("WPS_CANCEL")
    dev[1].request("DISCONNECT")
    hapd.request("WPS_CANCEL")
    ret = hapd.request("WPS_PBC")
    if "FAIL" not in ret:
        raise Exception("PBC mode allowed to be started while PBC overlap still active")
    hapd.request("DISABLE")
    dev[0].flush_scan_cache()
    dev[1].flush_scan_cache()

def test_ap_wps_cancel(dev, apdev):
    """WPS AP cancelling enabled config method"""
    ssid = "test-wps-ap-cancel"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP" })
    bssid = apdev[0]['bssid']
    hapd = hostapd.Hostapd(apdev[0]['ifname'])

    logger.info("Verify PBC enable/cancel")
    hapd.request("WPS_PBC")
    dev[0].scan(freq="2412")
    dev[0].scan(freq="2412")
    bss = dev[0].get_bss(apdev[0]['bssid'])
    if "[WPS-PBC]" not in bss['flags']:
        raise Exception("WPS-PBC flag missing")
    if "FAIL" in hapd.request("WPS_CANCEL"):
        raise Exception("WPS_CANCEL failed")
    dev[0].scan(freq="2412")
    dev[0].scan(freq="2412")
    bss = dev[0].get_bss(apdev[0]['bssid'])
    if "[WPS-PBC]" in bss['flags']:
        raise Exception("WPS-PBC flag not cleared")

    logger.info("Verify PIN enable/cancel")
    hapd.request("WPS_PIN any 12345670")
    dev[0].scan(freq="2412")
    dev[0].scan(freq="2412")
    bss = dev[0].get_bss(apdev[0]['bssid'])
    if "[WPS-AUTH]" not in bss['flags']:
        raise Exception("WPS-AUTH flag missing")
    if "FAIL" in hapd.request("WPS_CANCEL"):
        raise Exception("WPS_CANCEL failed")
    dev[0].scan(freq="2412")
    dev[0].scan(freq="2412")
    bss = dev[0].get_bss(apdev[0]['bssid'])
    if "[WPS-AUTH]" in bss['flags']:
        raise Exception("WPS-AUTH flag not cleared")

def test_ap_wps_er_add_enrollee(dev, apdev):
    """WPS ER configuring AP and adding a new enrollee using PIN"""
    try:
        _test_ap_wps_er_add_enrollee(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_add_enrollee(dev, apdev):
    ssid = "wps-er-add-enrollee"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "1",
                     "device_name": "Wireless AP", "manufacturer": "Company",
                     "model_name": "WAP", "model_number": "123",
                     "serial_number": "12345", "device_type": "6-0050F204-1",
                     "os_version": "01020300",
                     'friendly_name': "WPS AP - <>&'\" - TEST",
                     "config_methods": "label push_button",
                     "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo"})
    logger.info("WPS configuration step")
    new_passphrase = "1234567890"
    dev[0].dump_monitor()
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], ap_pin, ssid, "WPA2PSK", "CCMP",
                   new_passphrase)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED' or status['bssid'] != apdev[0]['bssid']:
        raise Exception("Not fully connected")
    if status['ssid'] != ssid:
        raise Exception("Unexpected SSID")
    if status['pairwise_cipher'] != 'CCMP' or status['group_cipher'] != 'CCMP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

    logger.info("Start ER")
    dev[0].request("WPS_ER_START ifname=lo")
    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=15)
    if ev is None:
        raise Exception("AP discovery timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not found")
    if "|WPS AP - &lt;&gt;&amp;&apos;&quot; - TEST|Company|" not in ev:
        raise Exception("Expected friendly name not found")

    logger.info("Learn AP configuration through UPnP")
    dev[0].dump_monitor()
    dev[0].request("WPS_ER_LEARN " + ap_uuid + " " + ap_pin)
    ev = dev[0].wait_event(["WPS-ER-AP-SETTINGS"], timeout=15)
    if ev is None:
        raise Exception("AP learn timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not in settings")
    if "ssid=" + ssid not in ev:
        raise Exception("Expected SSID not in settings")
    if "key=" + new_passphrase not in ev:
        raise Exception("Expected passphrase not in settings")
    ev = dev[0].wait_event(["WPS-FAIL"], timeout=15)
    if ev is None:
        raise Exception("WPS-FAIL after AP learn timed out")
    time.sleep(0.1)

    logger.info("Add Enrollee using ER")
    pin = dev[1].wps_read_pin()
    dev[0].dump_monitor()
    dev[0].request("WPS_ER_PIN any " + pin + " " + dev[1].p2p_interface_addr())
    dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[1].dump_monitor()
    dev[1].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    ev = dev[1].wait_event(["WPS-SUCCESS"], timeout=30)
    if ev is None:
        raise Exception("Enrollee did not report success")
    dev[1].wait_connected(timeout=15)
    ev = dev[0].wait_event(["WPS-SUCCESS"], timeout=15)
    if ev is None:
        raise Exception("WPS ER did not report success")
    hwsim_utils.test_connectivity_sta(dev[0], dev[1])

    logger.info("Add a specific Enrollee using ER")
    pin = dev[2].wps_read_pin()
    addr2 = dev[2].p2p_interface_addr()
    dev[0].dump_monitor()
    dev[2].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[2].dump_monitor()
    dev[2].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    ev = dev[0].wait_event(["WPS-ER-ENROLLEE-ADD"], timeout=10)
    if ev is None:
        raise Exception("Enrollee not seen")
    if addr2 not in ev:
        raise Exception("Unexpected Enrollee MAC address")
    dev[0].request("WPS_ER_PIN " + addr2 + " " + pin + " " + addr2)
    dev[2].wait_connected(timeout=30)
    ev = dev[0].wait_event(["WPS-SUCCESS"], timeout=15)
    if ev is None:
        raise Exception("WPS ER did not report success")

    logger.info("Verify registrar selection behavior")
    dev[0].request("WPS_ER_PIN any " + pin + " " + dev[1].p2p_interface_addr())
    dev[1].request("DISCONNECT")
    dev[1].wait_disconnected(timeout=10)
    dev[1].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[1].scan(freq="2412")
    bss = dev[1].get_bss(apdev[0]['bssid'])
    if "[WPS-AUTH]" not in bss['flags']:
        # It is possible for scan to miss an update especially when running
        # tests under load with multiple VMs, so allow another attempt.
        dev[1].scan(freq="2412")
        bss = dev[1].get_bss(apdev[0]['bssid'])
        if "[WPS-AUTH]" not in bss['flags']:
            raise Exception("WPS-AUTH flag missing")

    logger.info("Stop ER")
    dev[0].dump_monitor()
    dev[0].request("WPS_ER_STOP")
    ev = dev[0].wait_event(["WPS-ER-AP-REMOVE"])
    if ev is None:
        raise Exception("WPS ER unsubscription timed out")
    # It takes some time for the UPnP UNSUBSCRIBE command to go through, so wait
    # a bit before verifying that the scan results have changed.
    time.sleep(0.2)

    for i in range(0, 10):
        dev[1].request("BSS_FLUSH 0")
        dev[1].scan(freq="2412", only_new=True)
        bss = dev[1].get_bss(apdev[0]['bssid'])
        if bss and 'flags' in bss and "[WPS-AUTH]" not in bss['flags']:
            break
        logger.debug("WPS-AUTH flag was still in place - wait a bit longer")
        time.sleep(0.1)
    if "[WPS-AUTH]" in bss['flags']:
        raise Exception("WPS-AUTH flag not removed")

def test_ap_wps_er_add_enrollee_uuid(dev, apdev):
    """WPS ER adding a new enrollee identified by UUID"""
    try:
        _test_ap_wps_er_add_enrollee_uuid(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_add_enrollee_uuid(dev, apdev):
    ssid = "wps-er-add-enrollee"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "device_name": "Wireless AP", "manufacturer": "Company",
                     "model_name": "WAP", "model_number": "123",
                     "serial_number": "12345", "device_type": "6-0050F204-1",
                     "os_version": "01020300",
                     "config_methods": "label push_button",
                     "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo"})
    logger.info("WPS configuration step")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], ap_pin)

    logger.info("Start ER")
    dev[0].request("WPS_ER_START ifname=lo")
    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=15)
    if ev is None:
        raise Exception("AP discovery timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not found")

    logger.info("Learn AP configuration through UPnP")
    dev[0].dump_monitor()
    dev[0].request("WPS_ER_LEARN " + ap_uuid + " " + ap_pin)
    ev = dev[0].wait_event(["WPS-ER-AP-SETTINGS"], timeout=15)
    if ev is None:
        raise Exception("AP learn timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not in settings")
    ev = dev[0].wait_event(["WPS-FAIL"], timeout=15)
    if ev is None:
        raise Exception("WPS-FAIL after AP learn timed out")
    time.sleep(0.1)

    logger.info("Add a specific Enrollee using ER (PBC/UUID)")
    addr1 = dev[1].p2p_interface_addr()
    dev[0].dump_monitor()
    dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[1].dump_monitor()
    dev[1].request("WPS_PBC %s" % apdev[0]['bssid'])
    ev = dev[0].wait_event(["WPS-ER-ENROLLEE-ADD"], timeout=10)
    if ev is None:
        raise Exception("Enrollee not seen")
    if addr1 not in ev:
        raise Exception("Unexpected Enrollee MAC address")
    uuid = ev.split(' ')[1]
    dev[0].request("WPS_ER_PBC " + uuid)
    dev[1].wait_connected(timeout=30)
    ev = dev[0].wait_event(["WPS-SUCCESS"], timeout=15)
    if ev is None:
        raise Exception("WPS ER did not report success")

    logger.info("Add a specific Enrollee using ER (PIN/UUID)")
    pin = dev[2].wps_read_pin()
    addr2 = dev[2].p2p_interface_addr()
    dev[0].dump_monitor()
    dev[2].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[2].dump_monitor()
    dev[2].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    ev = dev[0].wait_event(["WPS-ER-ENROLLEE-ADD"], timeout=10)
    if ev is None:
        raise Exception("Enrollee not seen")
    if addr2 not in ev:
        raise Exception("Unexpected Enrollee MAC address")
    uuid = ev.split(' ')[1]
    dev[0].request("WPS_ER_PIN " + uuid + " " + pin)
    dev[2].wait_connected(timeout=30)
    ev = dev[0].wait_event(["WPS-SUCCESS"], timeout=15)
    if ev is None:
        raise Exception("WPS ER did not report success")

    ev = dev[0].wait_event(["WPS-ER-ENROLLEE-REMOVE"], timeout=15)
    if ev is None:
        raise Exception("No Enrollee STA entry timeout seen")

    logger.info("Stop ER")
    dev[0].dump_monitor()
    dev[0].request("WPS_ER_STOP")

def test_ap_wps_er_multi_add_enrollee(dev, apdev):
    """Multiple WPS ERs adding a new enrollee using PIN"""
    try:
        _test_ap_wps_er_multi_add_enrollee(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_multi_add_enrollee(dev, apdev):
    ssid = "wps-er-add-enrollee"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "device_name": "Wireless AP", "manufacturer": "Company",
                     "model_name": "WAP", "model_number": "123",
                     "serial_number": "12345", "device_type": "6-0050F204-1",
                     "os_version": "01020300",
                     'friendly_name': "WPS AP",
                     "config_methods": "label push_button",
                     "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo"})

    for i in range(2):
        dev[i].scan_for_bss(apdev[0]['bssid'], freq=2412)
        dev[i].wps_reg(apdev[0]['bssid'], ap_pin)
        dev[i].request("WPS_ER_START ifname=lo")
    for i in range(2):
        ev = dev[i].wait_event(["WPS-ER-AP-ADD"], timeout=15)
        if ev is None:
            raise Exception("AP discovery timed out")
        dev[i].dump_monitor()
        dev[i].request("WPS_ER_LEARN " + ap_uuid + " " + ap_pin)
        ev = dev[i].wait_event(["WPS-ER-AP-SETTINGS"], timeout=15)
        if ev is None:
            raise Exception("AP learn timed out")
        ev = dev[i].wait_event(["WPS-FAIL"], timeout=15)
        if ev is None:
            raise Exception("WPS-FAIL after AP learn timed out")

    time.sleep(0.1)

    pin = dev[2].wps_read_pin()
    addr = dev[2].own_addr()
    dev[0].dump_monitor()
    dev[0].request("WPS_ER_PIN any " + pin + " " + addr)
    dev[1].dump_monitor()
    dev[1].request("WPS_ER_PIN any " + pin + " " + addr)

    dev[2].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[2].dump_monitor()
    dev[2].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    ev = dev[2].wait_event(["WPS-SUCCESS"], timeout=30)
    if ev is None:
        raise Exception("Enrollee did not report success")
    dev[2].wait_connected(timeout=15)

def test_ap_wps_er_add_enrollee_pbc(dev, apdev):
    """WPS ER connected to AP and adding a new enrollee using PBC"""
    try:
        _test_ap_wps_er_add_enrollee_pbc(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_add_enrollee_pbc(dev, apdev):
    ssid = "wps-er-add-enrollee-pbc"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "device_name": "Wireless AP", "manufacturer": "Company",
                     "model_name": "WAP", "model_number": "123",
                     "serial_number": "12345", "device_type": "6-0050F204-1",
                     "os_version": "01020300",
                     "config_methods": "label push_button",
                     "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo"})
    logger.info("Learn AP configuration")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].dump_monitor()
    dev[0].wps_reg(apdev[0]['bssid'], ap_pin)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED' or status['bssid'] != apdev[0]['bssid']:
        raise Exception("Not fully connected")

    logger.info("Start ER")
    dev[0].request("WPS_ER_START ifname=lo")
    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=15)
    if ev is None:
        raise Exception("AP discovery timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not found")

    enrollee = dev[1].p2p_interface_addr()

    if "FAIL-UNKNOWN-UUID" not in dev[0].request("WPS_ER_PBC " + enrollee):
        raise Exception("Unknown UUID not reported")

    logger.info("Add Enrollee using ER and PBC")
    dev[0].dump_monitor()
    dev[1].dump_monitor()
    dev[1].request("WPS_PBC")

    for i in range(0, 2):
        ev = dev[0].wait_event(["WPS-ER-ENROLLEE-ADD"], timeout=15)
        if ev is None:
            raise Exception("Enrollee discovery timed out")
        if enrollee in ev:
            break
        if i == 1:
            raise Exception("Expected Enrollee not found")
    if "FAIL-NO-AP-SETTINGS" not in dev[0].request("WPS_ER_PBC " + enrollee):
        raise Exception("Unknown UUID not reported")
    logger.info("Use learned network configuration on ER")
    dev[0].request("WPS_ER_SET_CONFIG " + ap_uuid + " 0")
    if "OK" not in dev[0].request("WPS_ER_PBC " + enrollee):
        raise Exception("WPS_ER_PBC failed")

    ev = dev[1].wait_event(["WPS-SUCCESS"], timeout=15)
    if ev is None:
        raise Exception("Enrollee did not report success")
    dev[1].wait_connected(timeout=15)
    ev = dev[0].wait_event(["WPS-SUCCESS"], timeout=15)
    if ev is None:
        raise Exception("WPS ER did not report success")
    hwsim_utils.test_connectivity_sta(dev[0], dev[1])

def test_ap_wps_er_pbc_overlap(dev, apdev):
    """WPS ER connected to AP and PBC session overlap"""
    try:
        _test_ap_wps_er_pbc_overlap(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_pbc_overlap(dev, apdev):
    ssid = "wps-er-add-enrollee-pbc"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "device_name": "Wireless AP", "manufacturer": "Company",
                     "model_name": "WAP", "model_number": "123",
                     "serial_number": "12345", "device_type": "6-0050F204-1",
                     "os_version": "01020300",
                     "config_methods": "label push_button",
                     "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo"})
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].dump_monitor()
    dev[0].wps_reg(apdev[0]['bssid'], ap_pin)

    dev[1].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[2].scan_for_bss(apdev[0]['bssid'], freq="2412")
    # avoid leaving dev 1 or 2 as the last Probe Request to the AP
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412, force_scan=True)

    dev[0].dump_monitor()
    dev[0].request("WPS_ER_START ifname=lo")

    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=15)
    if ev is None:
        raise Exception("AP discovery timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not found")

    # verify BSSID selection of the AP instead of UUID
    if "FAIL" in dev[0].request("WPS_ER_SET_CONFIG " + apdev[0]['bssid'] + " 0"):
        raise Exception("Could not select AP based on BSSID")

    dev[0].dump_monitor()
    dev[1].request("WPS_PBC " + apdev[0]['bssid'])
    dev[2].request("WPS_PBC " + apdev[0]['bssid'])
    ev = dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10)
    if ev is None:
        raise Exception("PBC scan failed")
    ev = dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10)
    if ev is None:
        raise Exception("PBC scan failed")
    found1 = False
    found2 = False
    addr1 = dev[1].own_addr()
    addr2 = dev[2].own_addr()
    for i in range(3):
        ev = dev[0].wait_event(["WPS-ER-ENROLLEE-ADD"], timeout=15)
        if ev is None:
            raise Exception("Enrollee discovery timed out")
        if addr1 in ev:
            found1 = True
            if found2:
                break
        if addr2 in ev:
            found2 = True
            if found1:
                break
    if dev[0].request("WPS_ER_PBC " + ap_uuid) != "FAIL-PBC-OVERLAP\n":
        raise Exception("PBC overlap not reported")
    dev[1].request("WPS_CANCEL")
    dev[2].request("WPS_CANCEL")
    if dev[0].request("WPS_ER_PBC foo") != "FAIL\n":
        raise Exception("Invalid WPS_ER_PBC accepted")

def test_ap_wps_er_v10_add_enrollee_pin(dev, apdev):
    """WPS v1.0 ER connected to AP and adding a new enrollee using PIN"""
    try:
        _test_ap_wps_er_v10_add_enrollee_pin(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_v10_add_enrollee_pin(dev, apdev):
    ssid = "wps-er-add-enrollee-pbc"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "device_name": "Wireless AP", "manufacturer": "Company",
                     "model_name": "WAP", "model_number": "123",
                     "serial_number": "12345", "device_type": "6-0050F204-1",
                     "os_version": "01020300",
                     "config_methods": "label push_button",
                     "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo"})
    logger.info("Learn AP configuration")
    dev[0].request("SET wps_version_number 0x10")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].dump_monitor()
    dev[0].wps_reg(apdev[0]['bssid'], ap_pin)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED' or status['bssid'] != apdev[0]['bssid']:
        raise Exception("Not fully connected")

    logger.info("Start ER")
    dev[0].request("WPS_ER_START ifname=lo")
    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=15)
    if ev is None:
        raise Exception("AP discovery timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not found")

    logger.info("Use learned network configuration on ER")
    dev[0].request("WPS_ER_SET_CONFIG " + ap_uuid + " 0")

    logger.info("Add Enrollee using ER and PIN")
    enrollee = dev[1].p2p_interface_addr()
    pin = dev[1].wps_read_pin()
    dev[0].dump_monitor()
    dev[0].request("WPS_ER_PIN any " + pin + " " + enrollee)
    dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[1].dump_monitor()
    dev[1].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    dev[1].wait_connected(timeout=30)
    ev = dev[0].wait_event(["WPS-SUCCESS"], timeout=15)
    if ev is None:
        raise Exception("WPS ER did not report success")

def test_ap_wps_er_config_ap(dev, apdev):
    """WPS ER configuring AP over UPnP"""
    try:
        _test_ap_wps_er_config_ap(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_config_ap(dev, apdev):
    ssid = "wps-er-ap-config"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "device_name": "Wireless AP", "manufacturer": "Company",
                     "model_name": "WAP", "model_number": "123",
                     "serial_number": "12345", "device_type": "6-0050F204-1",
                     "os_version": "01020300",
                     "config_methods": "label push_button",
                     "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo"})

    logger.info("Connect ER to the AP")
    dev[0].connect(ssid, psk="12345678", scan_freq="2412")

    logger.info("WPS configuration step")
    dev[0].request("WPS_ER_START ifname=lo")
    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=15)
    if ev is None:
        raise Exception("AP discovery timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not found")
    new_passphrase = "1234567890"
    dev[0].request("WPS_ER_CONFIG " + apdev[0]['bssid'] + " " + ap_pin + " " +
                   ssid.encode("hex") + " WPA2PSK CCMP " +
                   new_passphrase.encode("hex"))
    ev = dev[0].wait_event(["WPS-SUCCESS"])
    if ev is None:
        raise Exception("WPS ER configuration operation timed out")
    dev[0].wait_disconnected(timeout=10)
    dev[0].connect(ssid, psk="1234567890", scan_freq="2412")

    logger.info("WPS ER restart")
    dev[0].request("WPS_ER_START")
    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=15)
    if ev is None:
        raise Exception("AP discovery timed out on ER restart")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not found on ER restart")
    if "OK" not in dev[0].request("WPS_ER_STOP"):
        raise Exception("WPS_ER_STOP failed")
    if "OK" not in dev[0].request("WPS_ER_STOP"):
        raise Exception("WPS_ER_STOP failed")

def test_ap_wps_er_cache_ap_settings(dev, apdev):
    """WPS ER caching AP settings"""
    try:
        _test_ap_wps_er_cache_ap_settings(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_cache_ap_settings(dev, apdev):
    ssid = "wps-er-add-enrollee"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
               "device_name": "Wireless AP", "manufacturer": "Company",
               "model_name": "WAP", "model_number": "123",
               "serial_number": "12345", "device_type": "6-0050F204-1",
               "os_version": "01020300",
               "config_methods": "label push_button",
               "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], ap_pin)
    id = int(dev[0].list_networks()[0]['id'])
    dev[0].set_network(id, "scan_freq", "2412")

    dev[0].request("WPS_ER_START ifname=lo")
    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=15)
    if ev is None:
        raise Exception("AP discovery timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not found")

    dev[0].dump_monitor()
    dev[0].request("WPS_ER_LEARN " + ap_uuid + " " + ap_pin)
    ev = dev[0].wait_event(["WPS-ER-AP-SETTINGS"], timeout=15)
    if ev is None:
        raise Exception("AP learn timed out")
    ev = dev[0].wait_event(["WPS-FAIL"], timeout=15)
    if ev is None:
        raise Exception("WPS-FAIL after AP learn timed out")
    time.sleep(0.1)

    hapd.disable()

    for i in range(2):
        ev = dev[0].wait_event([ "WPS-ER-AP-REMOVE",
                                 "CTRL-EVENT-DISCONNECTED" ],
                               timeout=15)
        if ev is None:
            raise Exception("AP removal or disconnection timed out")

    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    for i in range(2):
        ev = dev[0].wait_event([ "WPS-ER-AP-ADD", "CTRL-EVENT-CONNECTED" ],
                               timeout=15)
        if ev is None:
            raise Exception("AP discovery or connection timed out")

    pin = dev[1].wps_read_pin()
    dev[0].dump_monitor()
    dev[0].request("WPS_ER_PIN any " + pin + " " + dev[1].p2p_interface_addr())

    time.sleep(0.2)

    dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[1].dump_monitor()
    dev[1].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    ev = dev[1].wait_event(["WPS-SUCCESS"], timeout=30)
    if ev is None:
        raise Exception("Enrollee did not report success")
    dev[1].wait_connected(timeout=15)
    ev = dev[0].wait_event(["WPS-SUCCESS"], timeout=15)
    if ev is None:
        raise Exception("WPS ER did not report success")

    dev[0].dump_monitor()
    dev[0].request("WPS_ER_STOP")

def test_ap_wps_er_cache_ap_settings_oom(dev, apdev):
    """WPS ER caching AP settings (OOM)"""
    try:
        _test_ap_wps_er_cache_ap_settings_oom(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_cache_ap_settings_oom(dev, apdev):
    ssid = "wps-er-add-enrollee"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
               "device_name": "Wireless AP", "manufacturer": "Company",
               "model_name": "WAP", "model_number": "123",
               "serial_number": "12345", "device_type": "6-0050F204-1",
               "os_version": "01020300",
               "config_methods": "label push_button",
               "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], ap_pin)
    id = int(dev[0].list_networks()[0]['id'])
    dev[0].set_network(id, "scan_freq", "2412")

    dev[0].request("WPS_ER_START ifname=lo")
    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=15)
    if ev is None:
        raise Exception("AP discovery timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not found")

    dev[0].dump_monitor()
    dev[0].request("WPS_ER_LEARN " + ap_uuid + " " + ap_pin)
    ev = dev[0].wait_event(["WPS-ER-AP-SETTINGS"], timeout=15)
    if ev is None:
        raise Exception("AP learn timed out")
    ev = dev[0].wait_event(["WPS-FAIL"], timeout=15)
    if ev is None:
        raise Exception("WPS-FAIL after AP learn timed out")
    time.sleep(0.1)

    with alloc_fail(dev[0], 1, "=wps_er_ap_use_cached_settings"):
        hapd.disable()

        for i in range(2):
            ev = dev[0].wait_event([ "WPS-ER-AP-REMOVE",
                                     "CTRL-EVENT-DISCONNECTED" ],
                                   timeout=15)
            if ev is None:
                raise Exception("AP removal or disconnection timed out")

        hapd = hostapd.add_ap(apdev[0]['ifname'], params)
        for i in range(2):
            ev = dev[0].wait_event([ "WPS-ER-AP-ADD", "CTRL-EVENT-CONNECTED" ],
                                   timeout=15)
            if ev is None:
                raise Exception("AP discovery or connection timed out")

    dev[0].request("WPS_ER_STOP")

def test_ap_wps_er_cache_ap_settings_oom2(dev, apdev):
    """WPS ER caching AP settings (OOM 2)"""
    try:
        _test_ap_wps_er_cache_ap_settings_oom2(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_cache_ap_settings_oom2(dev, apdev):
    ssid = "wps-er-add-enrollee"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
               "device_name": "Wireless AP", "manufacturer": "Company",
               "model_name": "WAP", "model_number": "123",
               "serial_number": "12345", "device_type": "6-0050F204-1",
               "os_version": "01020300",
               "config_methods": "label push_button",
               "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], ap_pin)
    id = int(dev[0].list_networks()[0]['id'])
    dev[0].set_network(id, "scan_freq", "2412")

    dev[0].request("WPS_ER_START ifname=lo")
    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=15)
    if ev is None:
        raise Exception("AP discovery timed out")
    if ap_uuid not in ev:
        raise Exception("Expected AP UUID not found")

    dev[0].dump_monitor()
    dev[0].request("WPS_ER_LEARN " + ap_uuid + " " + ap_pin)
    ev = dev[0].wait_event(["WPS-ER-AP-SETTINGS"], timeout=15)
    if ev is None:
        raise Exception("AP learn timed out")
    ev = dev[0].wait_event(["WPS-FAIL"], timeout=15)
    if ev is None:
        raise Exception("WPS-FAIL after AP learn timed out")
    time.sleep(0.1)

    with alloc_fail(dev[0], 1, "=wps_er_ap_cache_settings"):
        hapd.disable()

        for i in range(2):
            ev = dev[0].wait_event([ "WPS-ER-AP-REMOVE",
                                     "CTRL-EVENT-DISCONNECTED" ],
                                   timeout=15)
            if ev is None:
                raise Exception("AP removal or disconnection timed out")

        hapd = hostapd.add_ap(apdev[0]['ifname'], params)
        for i in range(2):
            ev = dev[0].wait_event([ "WPS-ER-AP-ADD", "CTRL-EVENT-CONNECTED" ],
                                   timeout=15)
            if ev is None:
                raise Exception("AP discovery or connection timed out")

    dev[0].request("WPS_ER_STOP")

def test_ap_wps_er_subscribe_oom(dev, apdev):
    """WPS ER subscribe OOM"""
    try:
        _test_ap_wps_er_subscribe_oom(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_subscribe_oom(dev, apdev):
    ssid = "wps-er-add-enrollee"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
               "device_name": "Wireless AP", "manufacturer": "Company",
               "model_name": "WAP", "model_number": "123",
               "serial_number": "12345", "device_type": "6-0050F204-1",
               "os_version": "01020300",
               "config_methods": "label push_button",
               "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], ap_pin)
    id = int(dev[0].list_networks()[0]['id'])
    dev[0].set_network(id, "scan_freq", "2412")

    with alloc_fail(dev[0], 1, "http_client_addr;wps_er_subscribe"):
        dev[0].request("WPS_ER_START ifname=lo")
        for i in range(50):
            res = dev[0].request("GET_ALLOC_FAIL")
            if res.startswith("0:"):
                break
            time.sleep(0.1)
        ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=0)
        if ev:
            raise Exception("Unexpected AP discovery during OOM")

    dev[0].request("WPS_ER_STOP")

def test_ap_wps_fragmentation(dev, apdev):
    """WPS with fragmentation in EAP-WSC and mixed mode WPA+WPA2"""
    ssid = "test-wps-fragmentation"
    appin = "12345670"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "3",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "wpa_pairwise": "TKIP", "ap_pin": appin,
                     "fragment_size": "50" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step (PBC)")
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].dump_monitor()
    dev[0].request("SET wps_fragment_size 50")
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    dev[0].wait_connected(timeout=30)
    status = dev[0].get_status()
    if status['wpa_state'] != 'COMPLETED':
        raise Exception("Not fully connected")
    if status['pairwise_cipher'] != 'CCMP' or status['group_cipher'] != 'TKIP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

    logger.info("WPS provisioning step (PIN)")
    pin = dev[1].wps_read_pin()
    hapd.request("WPS_PIN any " + pin)
    dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[1].request("SET wps_fragment_size 50")
    dev[1].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    dev[1].wait_connected(timeout=30)
    status = dev[1].get_status()
    if status['wpa_state'] != 'COMPLETED':
        raise Exception("Not fully connected")
    if status['pairwise_cipher'] != 'CCMP' or status['group_cipher'] != 'TKIP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

    logger.info("WPS connection as registrar")
    dev[2].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[2].request("SET wps_fragment_size 50")
    dev[2].wps_reg(apdev[0]['bssid'], appin)
    status = dev[2].get_status()
    if status['wpa_state'] != 'COMPLETED':
        raise Exception("Not fully connected")
    if status['pairwise_cipher'] != 'CCMP' or status['group_cipher'] != 'TKIP':
        raise Exception("Unexpected encryption configuration")
    if status['key_mgmt'] != 'WPA2-PSK':
        raise Exception("Unexpected key_mgmt")

def test_ap_wps_new_version_sta(dev, apdev):
    """WPS compatibility with new version number on the station"""
    ssid = "test-wps-ver"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].dump_monitor()
    dev[0].request("SET wps_version_number 0x43")
    dev[0].request("SET wps_vendor_ext_m1 000137100100020001")
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    dev[0].wait_connected(timeout=30)

def test_ap_wps_new_version_ap(dev, apdev):
    """WPS compatibility with new version number on the AP"""
    ssid = "test-wps-ver"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    if "FAIL" in hapd.request("SET wps_version_number 0x43"):
        raise Exception("Failed to enable test functionality")
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].dump_monitor()
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    dev[0].wait_connected(timeout=30)
    hapd.request("SET wps_version_number 0x20")

def test_ap_wps_check_pin(dev, apdev):
    """Verify PIN checking through control interface"""
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": "wps", "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    for t in [ ("12345670", "12345670"),
               ("12345678", "FAIL-CHECKSUM"),
               ("12345", "FAIL"),
               ("123456789", "FAIL"),
               ("1234-5670", "12345670"),
               ("1234 5670", "12345670"),
               ("1-2.3:4 5670", "12345670") ]:
        res = hapd.request("WPS_CHECK_PIN " + t[0]).rstrip('\n')
        res2 = dev[0].request("WPS_CHECK_PIN " + t[0]).rstrip('\n')
        if res != res2:
            raise Exception("Unexpected difference in WPS_CHECK_PIN responses")
        if res != t[1]:
            raise Exception("Incorrect WPS_CHECK_PIN response {} (expected {})".format(res, t[1]))

    if "FAIL" not in hapd.request("WPS_CHECK_PIN 12345"):
        raise Exception("Unexpected WPS_CHECK_PIN success")
    if "FAIL" not in hapd.request("WPS_CHECK_PIN 123456789"):
        raise Exception("Unexpected WPS_CHECK_PIN success")

    for i in range(0, 10):
        pin = dev[0].request("WPS_PIN get")
        rpin = dev[0].request("WPS_CHECK_PIN " + pin).rstrip('\n')
        if pin != rpin:
            raise Exception("Random PIN validation failed for " + pin)

def test_ap_wps_wep_config(dev, apdev):
    """WPS 2.0 AP rejecting WEP configuration"""
    ssid = "test-wps-config"
    appin = "12345670"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "ap_pin": appin})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].wps_reg(apdev[0]['bssid'], appin, "wps-new-ssid-wep", "OPEN", "WEP",
                   "hello", no_wait=True)
    ev = hapd.wait_event(["WPS-FAIL"], timeout=15)
    if ev is None:
        raise Exception("WPS-FAIL timed out")
    if "reason=2" not in ev:
        raise Exception("Unexpected reason code in WPS-FAIL")
    status = hapd.request("WPS_GET_STATUS")
    if "Last WPS result: Failed" not in status:
        raise Exception("WPS failure result not shown correctly")
    if "Failure Reason: WEP Prohibited" not in status:
        raise Exception("Failure reason not reported correctly")
    if "Peer Address: " + dev[0].p2p_interface_addr() not in status:
        raise Exception("Peer address not shown correctly")

def test_ap_wps_wep_enroll(dev, apdev):
    """WPS 2.0 STA rejecting WEP configuration"""
    ssid = "test-wps-wep"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "skip_cred_build": "1", "extra_cred": "wps-wep-cred" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    ev = dev[0].wait_event(["WPS-FAIL"], timeout=15)
    if ev is None:
        raise Exception("WPS-FAIL event timed out")
    if "msg=12" not in ev or "reason=2 (WEP Prohibited)" not in ev:
        raise Exception("Unexpected WPS-FAIL event: " + ev)

def test_ap_wps_ie_fragmentation(dev, apdev):
    """WPS AP using fragmented WPS IE"""
    ssid = "test-wps-ie-fragmentation"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
               "device_name": "1234567890abcdef1234567890abcdef",
               "manufacturer": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
               "model_name": "1234567890abcdef1234567890abcdef",
               "model_number": "1234567890abcdef1234567890abcdef",
               "serial_number": "1234567890abcdef1234567890abcdef" }
    hostapd.add_ap(apdev[0]['ifname'], params)
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    dev[0].wait_connected(timeout=30)
    bss = dev[0].get_bss(apdev[0]['bssid'])
    if "wps_device_name" not in bss or bss['wps_device_name'] != "1234567890abcdef1234567890abcdef":
        logger.info("Device Name not received correctly")
        logger.info(bss)
        # This can fail if Probe Response frame is missed and Beacon frame was
        # used to fill in the BSS entry. This can happen, e.g., during heavy
        # load every now and then and is not really an error, so try to
        # workaround by runnign another scan.
        dev[0].scan(freq="2412", only_new=True)
        bss = dev[0].get_bss(apdev[0]['bssid'])
        if not bss or "wps_device_name" not in bss or bss['wps_device_name'] != "1234567890abcdef1234567890abcdef":
            logger.info(bss)
            raise Exception("Device Name not received correctly")
    if len(re.findall("dd..0050f204", bss['ie'])) != 2:
        raise Exception("Unexpected number of WPS IEs")

def get_psk(pskfile):
    psks = {}
    with open(pskfile, "r") as f:
        lines = f.read().splitlines()
        for l in lines:
            if l == "# WPA PSKs":
                continue
            (addr,psk) = l.split(' ')
            psks[addr] = psk
    return psks

def test_ap_wps_per_station_psk(dev, apdev):
    """WPS PBC provisioning with per-station PSK"""
    addr0 = dev[0].own_addr()
    addr1 = dev[1].own_addr()
    addr2 = dev[2].own_addr()
    ssid = "wps"
    appin = "12345670"
    pskfile = "/tmp/ap_wps_per_enrollee_psk.psk_file"
    try:
        os.remove(pskfile)
    except:
        pass

    try:
        with open(pskfile, "w") as f:
            f.write("# WPA PSKs\n")

        params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                   "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
                   "rsn_pairwise": "CCMP", "ap_pin": appin,
                   "wpa_psk_file": pskfile }
        hapd = hostapd.add_ap(apdev[0]['ifname'], params)

        logger.info("First enrollee")
        hapd.request("WPS_PBC")
        dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
        dev[0].request("WPS_PBC " + apdev[0]['bssid'])
        dev[0].wait_connected(timeout=30)

        logger.info("Second enrollee")
        hapd.request("WPS_PBC")
        dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
        dev[1].request("WPS_PBC " + apdev[0]['bssid'])
        dev[1].wait_connected(timeout=30)

        logger.info("External registrar")
        dev[2].scan_for_bss(apdev[0]['bssid'], freq=2412)
        dev[2].wps_reg(apdev[0]['bssid'], appin)

        logger.info("Verifying PSK results")
        psks = get_psk(pskfile)
        if addr0 not in psks:
            raise Exception("No PSK recorded for sta0")
        if addr1 not in psks:
            raise Exception("No PSK recorded for sta1")
        if addr2 not in psks:
            raise Exception("No PSK recorded for sta2")
        if psks[addr0] == psks[addr1]:
            raise Exception("Same PSK recorded for sta0 and sta1")
        if psks[addr0] == psks[addr2]:
            raise Exception("Same PSK recorded for sta0 and sta2")
        if psks[addr1] == psks[addr2]:
            raise Exception("Same PSK recorded for sta1 and sta2")

        dev[0].request("REMOVE_NETWORK all")
        logger.info("Second external registrar")
        dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
        dev[0].wps_reg(apdev[0]['bssid'], appin)
        psks2 = get_psk(pskfile)
        if addr0 not in psks2:
            raise Exception("No PSK recorded for sta0(reg)")
        if psks[addr0] == psks2[addr0]:
            raise Exception("Same PSK recorded for sta0(enrollee) and sta0(reg)")
    finally:
        os.remove(pskfile)

def test_ap_wps_per_station_psk_failure(dev, apdev):
    """WPS PBC provisioning with per-station PSK (file not writable)"""
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()
    addr2 = dev[2].p2p_dev_addr()
    ssid = "wps"
    appin = "12345670"
    pskfile = "/tmp/ap_wps_per_enrollee_psk.psk_file"
    try:
        os.remove(pskfile)
    except:
        pass

    try:
        with open(pskfile, "w") as f:
            f.write("# WPA PSKs\n")

        params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                   "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
                   "rsn_pairwise": "CCMP", "ap_pin": appin,
                   "wpa_psk_file": pskfile }
        hapd = hostapd.add_ap(apdev[0]['ifname'], params)
        if "FAIL" in hapd.request("SET wpa_psk_file /tmp/does/not/exists/ap_wps_per_enrollee_psk_failure.psk_file"):
            raise Exception("Failed to set wpa_psk_file")

        logger.info("First enrollee")
        hapd.request("WPS_PBC")
        dev[0].scan_for_bss(apdev[0]['bssid'], freq=2412)
        dev[0].request("WPS_PBC " + apdev[0]['bssid'])
        dev[0].wait_connected(timeout=30)

        logger.info("Second enrollee")
        hapd.request("WPS_PBC")
        dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
        dev[1].request("WPS_PBC " + apdev[0]['bssid'])
        dev[1].wait_connected(timeout=30)

        logger.info("External registrar")
        dev[2].scan_for_bss(apdev[0]['bssid'], freq=2412)
        dev[2].wps_reg(apdev[0]['bssid'], appin)

        logger.info("Verifying PSK results")
        psks = get_psk(pskfile)
        if len(psks) > 0:
            raise Exception("PSK recorded unexpectedly")
    finally:
        os.remove(pskfile)

def test_ap_wps_pin_request_file(dev, apdev):
    """WPS PIN provisioning with configured AP"""
    ssid = "wps"
    pinfile = "/tmp/ap_wps_pin_request_file.log"
    if os.path.exists(pinfile):
        os.remove(pinfile)
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wps_pin_requests": pinfile,
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    uuid = dev[0].get_status_field("uuid")
    pin = dev[0].wps_read_pin()
    try:
        dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
        dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
        ev = hapd.wait_event(["WPS-PIN-NEEDED"], timeout=15)
        if ev is None:
            raise Exception("PIN needed event not shown")
        if uuid not in ev:
            raise Exception("UUID mismatch")
        dev[0].request("WPS_CANCEL")
        success = False
        with open(pinfile, "r") as f:
            lines = f.readlines()
            for l in lines:
                if uuid in l:
                    success = True
                    break
        if not success:
            raise Exception("PIN request entry not in the log file")
    finally:
        try:
            os.remove(pinfile)
        except:
            pass

def test_ap_wps_auto_setup_with_config_file(dev, apdev):
    """WPS auto-setup with configuration file"""
    conffile = "/tmp/ap_wps_auto_setup_with_config_file.conf"
    ifname = apdev[0]['ifname']
    try:
        with open(conffile, "w") as f:
            f.write("driver=nl80211\n")
            f.write("hw_mode=g\n")
            f.write("channel=1\n")
            f.write("ieee80211n=1\n")
            f.write("interface=%s\n" % ifname)
            f.write("ctrl_interface=/var/run/hostapd\n")
            f.write("ssid=wps\n")
            f.write("eap_server=1\n")
            f.write("wps_state=1\n")
        hostapd.add_bss('phy3', ifname, conffile)
        hapd = hostapd.Hostapd(ifname)
        hapd.request("WPS_PBC")
        dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
        dev[0].request("WPS_PBC " + apdev[0]['bssid'])
        dev[0].wait_connected(timeout=30)
        with open(conffile, "r") as f:
            lines = f.read().splitlines()
            vals = dict()
            for l in lines:
                try:
                    [name,value] = l.split('=', 1)
                    vals[name] = value
                except ValueError, e:
                    if "# WPS configuration" in l:
                        pass
                    else:
                        raise Exception("Unexpected configuration line: " + l)
        if vals['ieee80211n'] != '1' or vals['wps_state'] != '2' or "WPA-PSK" not in vals['wpa_key_mgmt']:
            raise Exception("Incorrect configuration: " + str(vals))
    finally:
        try:
            os.remove(conffile)
        except:
            pass

def test_ap_wps_pbc_timeout(dev, apdev, params):
    """wpa_supplicant PBC walk time and WPS ER SelReg timeout [long]"""
    if not params['long']:
        raise HwsimSkip("Skip test case with long duration due to --long not specified")
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hapd = add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    location = ssdp_get_location(ap_uuid)
    urls = upnp_get_urls(location)
    eventurl = urlparse.urlparse(urls['event_sub_url'])
    ctrlurl = urlparse.urlparse(urls['control_url'])

    url = urlparse.urlparse(location)
    conn = httplib.HTTPConnection(url.netloc)

    class WPSERHTTPServer(SocketServer.StreamRequestHandler):
        def handle(self):
            data = self.rfile.readline().strip()
            logger.debug(data)
            self.wfile.write(gen_wps_event())

    server = MyTCPServer(("127.0.0.1", 12345), WPSERHTTPServer)
    server.timeout = 1

    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "NT": "upnp:event",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    sid = resp.getheader("sid")
    logger.debug("Subscription SID " + sid)

    msg = '''<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:SetSelectedRegistrar xmlns:u="urn:schemas-wifialliance-org:service:WFAWLANConfig:1">
<NewMessage>EEoAARAQQQABARASAAIAABBTAAIxSBBJAA4ANyoAASABBv///////xBIABA2LbR7pTpRkYj7
VFi5hrLk
</NewMessage>
</u:SetSelectedRegistrar>
</s:Body>
</s:Envelope>'''
    headers = { "Content-type": 'text/xml; charset="utf-8"' }
    headers["SOAPAction"] = '"urn:schemas-wifialliance-org:service:WFAWLANConfig:1#%s"' % "SetSelectedRegistrar"
    conn.request("POST", ctrlurl.path, msg, headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    server.handle_request()

    logger.info("Start WPS_PBC and wait for PBC walk time expiration")
    if "OK" not in dev[0].request("WPS_PBC"):
        raise Exception("WPS_PBC failed")

    start = os.times()[4]

    server.handle_request()
    dev[1].request("BSS_FLUSH 0")
    dev[1].scan_for_bss(apdev[0]['bssid'], freq="2412", force_scan=True,
                        only_new=True)
    bss = dev[1].get_bss(apdev[0]['bssid'])
    logger.debug("BSS: " + str(bss))
    if '[WPS-AUTH]' not in bss['flags']:
        raise Exception("WPS not indicated authorized")

    server.handle_request()

    wps_timeout_seen = False

    while True:
        hapd.dump_monitor()
        dev[1].dump_monitor()
        if not wps_timeout_seen:
            ev = dev[0].wait_event(["WPS-TIMEOUT"], timeout=0)
            if ev is not None:
                logger.info("PBC timeout seen")
                wps_timeout_seen = True
        else:
            dev[0].dump_monitor()
        now = os.times()[4]
        if now - start > 130:
            raise Exception("Selected registration information not removed")
        dev[1].request("BSS_FLUSH 0")
        dev[1].scan_for_bss(apdev[0]['bssid'], freq="2412", force_scan=True,
                            only_new=True)
        bss = dev[1].get_bss(apdev[0]['bssid'])
        logger.debug("BSS: " + str(bss))
        if '[WPS-AUTH]' not in bss['flags']:
            break
        server.handle_request()

    server.server_close()

    if wps_timeout_seen:
        return

    now = os.times()[4]
    if now < start + 150:
        dur = start + 150 - now
    else:
        dur = 1
    logger.info("Continue waiting for PBC timeout (%d sec)" % dur)
    ev = dev[0].wait_event(["WPS-TIMEOUT"], timeout=dur)
    if ev is None:
        raise Exception("WPS-TIMEOUT not reported")

def add_ssdp_ap(ifname, ap_uuid):
    ssid = "wps-ssdp"
    ap_pin = "12345670"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
               "device_name": "Wireless AP", "manufacturer": "Company",
               "model_name": "WAP", "model_number": "123",
               "serial_number": "12345", "device_type": "6-0050F204-1",
               "os_version": "01020300",
               "config_methods": "label push_button",
               "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo",
               "friendly_name": "WPS Access Point",
               "manufacturer_url": "http://www.example.com/",
               "model_description": "Wireless Access Point",
               "model_url": "http://www.example.com/model/",
               "upc": "123456789012" }
    return hostapd.add_ap(ifname, params)

def ssdp_send(msg, no_recv=False):
    socket.setdefaulttimeout(1)
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
    sock.bind(("127.0.0.1", 0))
    sock.sendto(msg, ("239.255.255.250", 1900))
    if no_recv:
        return None
    return sock.recv(1000)

def ssdp_send_msearch(st, no_recv=False):
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MX: 1',
            'MAN: "ssdp:discover"',
            'ST: ' + st,
            '', ''])
    return ssdp_send(msg, no_recv=no_recv)

def test_ap_wps_ssdp_msearch(dev, apdev):
    """WPS AP and SSDP M-SEARCH messages"""
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'Host: 239.255.255.250:1900',
            'Mx: 1',
            'Man: "ssdp:discover"',
            'St: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    ssdp_send(msg)

    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'host:\t239.255.255.250:1900\t\t\t\t \t\t',
            'mx: \t1\t\t   ',
            'man: \t \t "ssdp:discover"   ',
            'st: urn:schemas-wifialliance-org:device:WFADevice:1\t\t',
            '', ''])
    ssdp_send(msg)

    ssdp_send_msearch("ssdp:all")
    ssdp_send_msearch("upnp:rootdevice")
    ssdp_send_msearch("uuid:" + ap_uuid)
    ssdp_send_msearch("urn:schemas-wifialliance-org:service:WFAWLANConfig:1")
    ssdp_send_msearch("urn:schemas-wifialliance-org:device:WFADevice:1");

    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST:\t239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 130',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    ssdp_send(msg, no_recv=True)

def test_ap_wps_ssdp_invalid_msearch(dev, apdev):
    """WPS AP and invalid SSDP M-SEARCH messages"""
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    socket.setdefaulttimeout(1)
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
    sock.bind(("127.0.0.1", 0))

    logger.debug("Missing MX")
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    logger.debug("Negative MX")
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MX: -1',
            'MAN: "ssdp:discover"',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    logger.debug("Invalid MX")
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MX; 1',
            'MAN: "ssdp:discover"',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    logger.debug("Missing MAN")
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MX: 1',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    logger.debug("Invalid MAN")
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MX: 1',
            'MAN: foo',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MX: 1',
            'MAN; "ssdp:discover"',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    logger.debug("Missing HOST")
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'MAN: "ssdp:discover"',
            'MX: 1',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    logger.debug("Missing ST")
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    logger.debug("Mismatching ST")
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 1',
            'ST: uuid:16d5f8a9-4ee4-4f5e-81f9-cc6e2f47f42d',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 1',
            'ST: foo:bar',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 1',
            'ST: foobar',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    logger.debug("Invalid ST")
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 1',
            'ST; urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    logger.debug("Invalid M-SEARCH")
    msg = '\r\n'.join([
            'M+SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 1',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))
    msg = '\r\n'.join([
            'M-SEARCH-* HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 1',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    logger.debug("Invalid message format")
    sock.sendto("NOTIFY * HTTP/1.1", ("239.255.255.250", 1900))
    msg = '\r'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 1',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    try:
        r = sock.recv(1000)
        raise Exception("Unexpected M-SEARCH response: " + r)
    except socket.timeout:
        pass

    logger.debug("Valid M-SEARCH")
    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 1',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    sock.sendto(msg, ("239.255.255.250", 1900))

    try:
        r = sock.recv(1000)
        pass
    except socket.timeout:
        raise Exception("No SSDP response")

def test_ap_wps_ssdp_burst(dev, apdev):
    """WPS AP and SSDP burst"""
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    msg = '\r\n'.join([
            'M-SEARCH * HTTP/1.1',
            'HOST: 239.255.255.250:1900',
            'MAN: "ssdp:discover"',
            'MX: 1',
            'ST: urn:schemas-wifialliance-org:device:WFADevice:1',
            '', ''])
    socket.setdefaulttimeout(1)
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
    sock.bind(("127.0.0.1", 0))
    for i in range(0, 25):
        sock.sendto(msg, ("239.255.255.250", 1900))
    resp = 0
    while True:
        try:
            r = sock.recv(1000)
            if not r.startswith("HTTP/1.1 200 OK\r\n"):
                raise Exception("Unexpected message: " + r)
            resp += 1
        except socket.timeout:
            break
    if resp < 20:
        raise Exception("Too few SSDP responses")

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
    sock.bind(("127.0.0.1", 0))
    for i in range(0, 25):
        sock.sendto(msg, ("239.255.255.250", 1900))
    while True:
        try:
            r = sock.recv(1000)
            if ap_uuid in r:
                break
        except socket.timeout:
            raise Exception("No SSDP response")

def ssdp_get_location(uuid):
    res = ssdp_send_msearch("uuid:" + uuid)
    location = None
    for l in res.splitlines():
        if l.lower().startswith("location:"):
            location = l.split(':', 1)[1].strip()
            break
    if location is None:
        raise Exception("No UPnP location found")
    return location

def upnp_get_urls(location):
    conn = urllib.urlopen(location)
    tree = ET.parse(conn)
    root = tree.getroot()
    urn = '{urn:schemas-upnp-org:device-1-0}'
    service = root.find("./" + urn + "device/" + urn + "serviceList/" + urn + "service")
    res = {}
    res['scpd_url'] = urlparse.urljoin(location, service.find(urn + 'SCPDURL').text)
    res['control_url'] = urlparse.urljoin(location, service.find(urn + 'controlURL').text)
    res['event_sub_url'] = urlparse.urljoin(location, service.find(urn + 'eventSubURL').text)
    return res

def upnp_soap_action(conn, path, action, include_soap_action=True, soap_action_override=None):
    soapns = 'http://schemas.xmlsoap.org/soap/envelope/'
    wpsns = 'urn:schemas-wifialliance-org:service:WFAWLANConfig:1'
    ET.register_namespace('soapenv', soapns)
    ET.register_namespace('wfa', wpsns)
    attrib = {}
    attrib['{%s}encodingStyle' % soapns] = 'http://schemas.xmlsoap.org/soap/encoding/'
    root = ET.Element("{%s}Envelope" % soapns, attrib=attrib)
    body = ET.SubElement(root, "{%s}Body" % soapns)
    act = ET.SubElement(body, "{%s}%s" % (wpsns, action))
    tree = ET.ElementTree(root)
    soap = StringIO.StringIO()
    tree.write(soap, xml_declaration=True, encoding='utf-8')

    headers = { "Content-type": 'text/xml; charset="utf-8"' }
    if include_soap_action:
        headers["SOAPAction"] = '"urn:schemas-wifialliance-org:service:WFAWLANConfig:1#%s"' % action
    elif soap_action_override:
        headers["SOAPAction"] = soap_action_override
    conn.request("POST", path, soap.getvalue(), headers)
    return conn.getresponse()

def test_ap_wps_upnp(dev, apdev):
    """WPS AP and UPnP operations"""
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    location = ssdp_get_location(ap_uuid)
    urls = upnp_get_urls(location)

    conn = urllib.urlopen(urls['scpd_url'])
    scpd = conn.read()

    conn = urllib.urlopen(urlparse.urljoin(location, "unknown.html"))
    if conn.getcode() != 404:
        raise Exception("Unexpected HTTP response to GET unknown URL")

    url = urlparse.urlparse(location)
    conn = httplib.HTTPConnection(url.netloc)
    #conn.set_debuglevel(1)
    headers = { "Content-type": 'text/xml; charset="utf-8"',
                "SOAPAction": '"urn:schemas-wifialliance-org:service:WFAWLANConfig:1#GetDeviceInfo"' }
    conn.request("POST", "hello", "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 404:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    conn.request("UNKNOWN", "hello", "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 501:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    headers = { "Content-type": 'text/xml; charset="utf-8"',
                "SOAPAction": '"urn:some-unknown-action#GetDeviceInfo"' }
    ctrlurl = urlparse.urlparse(urls['control_url'])
    conn.request("POST", ctrlurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 401:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("GetDeviceInfo without SOAPAction header")
    resp = upnp_soap_action(conn, ctrlurl.path, "GetDeviceInfo",
                            include_soap_action=False)
    if resp.status != 401:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("GetDeviceInfo with invalid SOAPAction header")
    for act in [ "foo",
                 "urn:schemas-wifialliance-org:service:WFAWLANConfig:1#GetDeviceInfo",
                 '"urn:schemas-wifialliance-org:service:WFAWLANConfig:1"',
                 '"urn:schemas-wifialliance-org:service:WFAWLANConfig:123#GetDevice']:
        resp = upnp_soap_action(conn, ctrlurl.path, "GetDeviceInfo",
                                include_soap_action=False,
                                soap_action_override=act)
        if resp.status != 401:
            raise Exception("Unexpected HTTP response: %d" % resp.status)

    resp = upnp_soap_action(conn, ctrlurl.path, "GetDeviceInfo")
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    dev = resp.read()
    if "NewDeviceInfo" not in dev:
        raise Exception("Unexpected GetDeviceInfo response")

    logger.debug("PutMessage without required parameters")
    resp = upnp_soap_action(conn, ctrlurl.path, "PutMessage")
    if resp.status != 600:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("PutWLANResponse without required parameters")
    resp = upnp_soap_action(conn, ctrlurl.path, "PutWLANResponse")
    if resp.status != 600:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("SetSelectedRegistrar from unregistered ER")
    resp = upnp_soap_action(conn, ctrlurl.path, "SetSelectedRegistrar")
    if resp.status != 501:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Unknown action")
    resp = upnp_soap_action(conn, ctrlurl.path, "Unknown")
    if resp.status != 401:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

def test_ap_wps_upnp_subscribe(dev, apdev):
    """WPS AP and UPnP event subscription"""
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hapd = add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    location = ssdp_get_location(ap_uuid)
    urls = upnp_get_urls(location)
    eventurl = urlparse.urlparse(urls['event_sub_url'])

    url = urlparse.urlparse(location)
    conn = httplib.HTTPConnection(url.netloc)
    #conn.set_debuglevel(1)
    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", "hello", "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 412:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 412:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    headers = { "NT": "upnp:event",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 412:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "NT": "upnp:foobar",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 400:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Valid subscription")
    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "NT": "upnp:event",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    sid = resp.getheader("sid")
    logger.debug("Subscription SID " + sid)

    logger.debug("Invalid re-subscription")
    headers = { "NT": "upnp:event",
                "sid": "123456734567854",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 400:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Invalid re-subscription")
    headers = { "NT": "upnp:event",
                "sid": "uuid:123456734567854",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 400:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Invalid re-subscription")
    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "NT": "upnp:event",
                "sid": sid,
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 400:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("SID mismatch in re-subscription")
    headers = { "NT": "upnp:event",
                "sid": "uuid:4c2bca79-1ff4-4e43-85d4-952a2b8a51fb",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 412:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Valid re-subscription")
    headers = { "NT": "upnp:event",
                "sid": sid,
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    sid2 = resp.getheader("sid")
    logger.debug("Subscription SID " + sid2)

    if sid != sid2:
        raise Exception("Unexpected SID change")

    logger.debug("Valid re-subscription")
    headers = { "NT": "upnp:event",
                "sid": "uuid: \t \t" + sid.split(':')[1],
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Invalid unsubscription")
    headers = { "sid": sid }
    conn.request("UNSUBSCRIBE", "/hello", "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 412:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    headers = { "foo": "bar" }
    conn.request("UNSUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 412:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Valid unsubscription")
    headers = { "sid": sid }
    conn.request("UNSUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Unsubscription for not existing SID")
    headers = { "sid": sid }
    conn.request("UNSUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 412:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Invalid unsubscription")
    headers = { "sid": " \t \tfoo" }
    conn.request("UNSUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 400:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Invalid unsubscription")
    headers = { "sid": "uuid:\t \tfoo" }
    conn.request("UNSUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 400:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Invalid unsubscription")
    headers = { "NT": "upnp:event",
                "sid": sid }
    conn.request("UNSUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 400:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "sid": sid }
    conn.request("UNSUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 400:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.debug("Valid subscription with multiple callbacks")
    headers = { "callback": '<http://127.0.0.1:12345/event> <http://127.0.0.1:12345/event>\t<http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event><http://127.0.0.1:12345/event>',
                "NT": "upnp:event",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    sid = resp.getheader("sid")
    logger.debug("Subscription SID " + sid)

    # Force subscription to be deleted due to errors
    dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[2].scan_for_bss(apdev[0]['bssid'], freq=2412)
    with alloc_fail(hapd, 1, "event_build_message"):
        for i in range(10):
            dev[1].dump_monitor()
            dev[2].dump_monitor()
            dev[1].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
            dev[2].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
            dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
            dev[1].request("WPS_CANCEL")
            dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
            dev[2].request("WPS_CANCEL")
            if i % 4 == 1:
                time.sleep(1)
            else:
                time.sleep(0.1)
    time.sleep(0.2)

    headers = { "sid": sid }
    conn.request("UNSUBSCRIBE", eventurl.path, "", headers)
    resp = conn.getresponse()
    if resp.status != 200 and resp.status != 412:
        raise Exception("Unexpected HTTP response for UNSUBSCRIBE: %d" % resp.status)

    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "NT": "upnp:event",
                "timeout": "Second-1234" }
    with alloc_fail(hapd, 1, "http_client_addr;event_send_start"):
        conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
        resp = conn.getresponse()
        if resp.status != 200:
            raise Exception("Unexpected HTTP response for SUBSCRIBE: %d" % resp.status)
        sid = resp.getheader("sid")
        logger.debug("Subscription SID " + sid)

    headers = { "sid": sid }
    conn.request("UNSUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response for UNSUBSCRIBE: %d" % resp.status)

    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "NT": "upnp:event",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    sid = resp.getheader("sid")
    logger.debug("Subscription SID " + sid)

    with alloc_fail(hapd, 1, "=event_add"):
        for i in range(2):
            dev[1].dump_monitor()
            dev[2].dump_monitor()
            dev[1].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
            dev[2].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
            dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
            dev[1].request("WPS_CANCEL")
            dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
            dev[2].request("WPS_CANCEL")
            if i == 0:
                time.sleep(1)
            else:
                time.sleep(0.1)

    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    with alloc_fail(hapd, 1, "wpabuf_dup;event_add"):
        dev[1].dump_monitor()
        dev[2].dump_monitor()
        dev[1].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
        dev[2].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
        dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
        dev[1].request("WPS_CANCEL")
        dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
        dev[2].request("WPS_CANCEL")
        time.sleep(0.1)

    with fail_test(hapd, 1, "os_get_random;uuid_make;subscription_start"):
        conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
        resp = conn.getresponse()
        if resp.status != 500:
            raise Exception("Unexpected HTTP response: %d" % resp.status)

    with alloc_fail(hapd, 1, "=subscription_start"):
        conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
        resp = conn.getresponse()
        if resp.status != 500:
            raise Exception("Unexpected HTTP response: %d" % resp.status)

    headers = { "callback": '',
                "NT": "upnp:event",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 500:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    headers = { "callback": ' <',
                "NT": "upnp:event",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 500:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "NT": "upnp:event",
                "timeout": "Second-1234" }
    with alloc_fail(hapd, 1, "wpabuf_alloc;subscription_first_event"):
        conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
        resp = conn.getresponse()
        if resp.status != 500:
            raise Exception("Unexpected HTTP response: %d" % resp.status)

    with alloc_fail(hapd, 1, "event_add;subscription_first_event"):
        conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
        resp = conn.getresponse()
        if resp.status != 500:
            raise Exception("Unexpected HTTP response: %d" % resp.status)

    with alloc_fail(hapd, 1, "subscr_addr_add_url"):
        conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
        resp = conn.getresponse()
        if resp.status != 500:
            raise Exception("Unexpected HTTP response: %d" % resp.status)

    with alloc_fail(hapd, 2, "subscr_addr_add_url"):
        conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
        resp = conn.getresponse()
        if resp.status != 500:
            raise Exception("Unexpected HTTP response: %d" % resp.status)

    for i in range(6):
        headers = { "callback": '<http://127.0.0.1:%d/event>' % (12345 + i),
                    "NT": "upnp:event",
                    "timeout": "Second-1234" }
        conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
        resp = conn.getresponse()
        if resp.status != 200:
            raise Exception("Unexpected HTTP response: %d" % resp.status)

    with alloc_fail(hapd, 1, "=upnp_wps_device_send_wlan_event"):
        dev[1].dump_monitor()
        dev[1].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
        dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
        dev[1].request("WPS_CANCEL")
        time.sleep(0.1)

    with alloc_fail(hapd, 1, "wpabuf_alloc;upnp_wps_device_send_event"):
        dev[1].dump_monitor()
        dev[1].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
        dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
        dev[1].request("WPS_CANCEL")
        time.sleep(0.1)

    with alloc_fail(hapd, 1, "base64_encode;upnp_wps_device_send_wlan_event"):
        dev[1].dump_monitor()
        dev[1].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
        dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
        dev[1].request("WPS_CANCEL")
        time.sleep(0.1)

    hapd.disable()
    with alloc_fail(hapd, 1, "get_netif_info"):
        if "FAIL" not in hapd.request("ENABLE"):
            raise Exception("ENABLE succeeded during OOM")

def test_ap_wps_upnp_subscribe_events(dev, apdev):
    """WPS AP and UPnP event subscription and many events"""
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hapd = add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    location = ssdp_get_location(ap_uuid)
    urls = upnp_get_urls(location)
    eventurl = urlparse.urlparse(urls['event_sub_url'])

    class WPSERHTTPServer(SocketServer.StreamRequestHandler):
        def handle(self):
            data = self.rfile.readline().strip()
            logger.debug(data)
            self.wfile.write(gen_wps_event())

    server = MyTCPServer(("127.0.0.1", 12345), WPSERHTTPServer)
    server.timeout = 1

    url = urlparse.urlparse(location)
    conn = httplib.HTTPConnection(url.netloc)

    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "NT": "upnp:event",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    sid = resp.getheader("sid")
    logger.debug("Subscription SID " + sid)

    # Fetch the first event message
    server.handle_request()

    # Force subscription event queue to reach the maximum length by generating
    # new proxied events without the ER fetching any of the pending events.
    dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
    dev[2].scan_for_bss(apdev[0]['bssid'], freq=2412)
    for i in range(16):
        dev[1].dump_monitor()
        dev[2].dump_monitor()
        dev[1].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
        dev[2].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
        dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
        dev[1].request("WPS_CANCEL")
        dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5)
        dev[2].request("WPS_CANCEL")
        if i % 4 == 1:
            time.sleep(1)
        else:
            time.sleep(0.1)

    hapd.request("WPS_PIN any 12345670")
    dev[1].dump_monitor()
    dev[1].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
    ev = dev[1].wait_event(["WPS-SUCCESS"], timeout=10)
    if ev is None:
        raise Exception("WPS success not reported")

    # Close the WPS ER HTTP server without fetching all the pending events.
    # This tests hostapd code path that clears subscription and the remaining
    # event queue when the interface is deinitialized.
    server.handle_request()
    server.server_close()

    dev[1].wait_connected()

def test_ap_wps_upnp_http_proto(dev, apdev):
    """WPS AP and UPnP/HTTP protocol testing"""
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    location = ssdp_get_location(ap_uuid)

    url = urlparse.urlparse(location)
    conn = httplib.HTTPConnection(url.netloc, timeout=0.2)
    #conn.set_debuglevel(1)

    conn.request("HEAD", "hello")
    resp = conn.getresponse()
    if resp.status != 501:
        raise Exception("Unexpected response to HEAD: " + str(resp.status))
    conn.close()

    for cmd in [ "PUT", "DELETE", "TRACE", "CONNECT", "M-SEARCH", "M-POST" ]:
        try:
            conn.request(cmd, "hello")
            resp = conn.getresponse()
        except Exception, e:
            pass
        conn.close()

    headers = { "Content-Length": 'abc' }
    conn.request("HEAD", "hello", "\r\n\r\n", headers)
    try:
        resp = conn.getresponse()
    except Exception, e:
        pass
    conn.close()

    headers = { "Content-Length": '-10' }
    conn.request("HEAD", "hello", "\r\n\r\n", headers)
    try:
        resp = conn.getresponse()
    except Exception, e:
        pass
    conn.close()

    headers = { "Content-Length": '10000000000000' }
    conn.request("HEAD", "hello", "\r\n\r\nhello", headers)
    try:
        resp = conn.getresponse()
    except Exception, e:
        pass
    conn.close()

    headers = { "Transfer-Encoding": 'abc' }
    conn.request("HEAD", "hello", "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 501:
        raise Exception("Unexpected response to HEAD: " + str(resp.status))
    conn.close()

    headers = { "Transfer-Encoding": 'chunked' }
    conn.request("HEAD", "hello", "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 501:
        raise Exception("Unexpected response to HEAD: " + str(resp.status))
    conn.close()

    # Too long a header
    conn.request("HEAD", 5000 * 'A')
    try:
        resp = conn.getresponse()
    except Exception, e:
        pass
    conn.close()

    # Long URL but within header length limits
    conn.request("HEAD", 3000 * 'A')
    resp = conn.getresponse()
    if resp.status != 501:
        raise Exception("Unexpected response to HEAD: " + str(resp.status))
    conn.close()

    headers = { "Content-Length": '20' }
    conn.request("POST", "hello", 10 * 'A' + "\r\n\r\n", headers)
    try:
        resp = conn.getresponse()
    except Exception, e:
        pass
    conn.close()

    conn.request("POST", "hello", 5000 * 'A' + "\r\n\r\n")
    resp = conn.getresponse()
    if resp.status != 404:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    conn.close()

    conn.request("POST", "hello", 60000 * 'A' + "\r\n\r\n")
    try:
        resp = conn.getresponse()
    except Exception, e:
        pass
    conn.close()

def test_ap_wps_upnp_http_proto_chunked(dev, apdev):
    """WPS AP and UPnP/HTTP protocol testing for chunked encoding"""
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    location = ssdp_get_location(ap_uuid)

    url = urlparse.urlparse(location)
    conn = httplib.HTTPConnection(url.netloc)
    #conn.set_debuglevel(1)

    headers = { "Transfer-Encoding": 'chunked' }
    conn.request("POST", "hello",
                 "a\r\nabcdefghij\r\n" + "2\r\nkl\r\n" + "0\r\n\r\n",
                 headers)
    resp = conn.getresponse()
    if resp.status != 404:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    conn.close()

    conn.putrequest("POST", "hello")
    conn.putheader('Transfer-Encoding', 'chunked')
    conn.endheaders()
    conn.send("a\r\nabcdefghij\r\n")
    time.sleep(0.1)
    conn.send("2\r\nkl\r\n")
    conn.send("0\r\n\r\n")
    resp = conn.getresponse()
    if resp.status != 404:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    conn.close()

    conn.putrequest("POST", "hello")
    conn.putheader('Transfer-Encoding', 'chunked')
    conn.endheaders()
    completed = False
    try:
        for i in range(20000):
            conn.send("1\r\nZ\r\n")
        conn.send("0\r\n\r\n")
        resp = conn.getresponse()
        completed = True
    except Exception, e:
        pass
    conn.close()
    if completed:
        raise Exception("Too long chunked request did not result in connection reset")

    headers = { "Transfer-Encoding": 'chunked' }
    conn.request("POST", "hello", "80000000\r\na", headers)
    try:
        resp = conn.getresponse()
    except Exception, e:
        pass
    conn.close()

    conn.request("POST", "hello", "10000000\r\na", headers)
    try:
        resp = conn.getresponse()
    except Exception, e:
        pass
    conn.close()

def test_ap_wps_disabled(dev, apdev):
    """WPS operations while WPS is disabled"""
    ssid = "test-wps-disabled"
    hostapd.add_ap(apdev[0]['ifname'], { "ssid": ssid })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    if "FAIL" not in hapd.request("WPS_PBC"):
        raise Exception("WPS_PBC succeeded unexpectedly")
    if "FAIL" not in hapd.request("WPS_CANCEL"):
        raise Exception("WPS_CANCEL succeeded unexpectedly")

def test_ap_wps_mixed_cred(dev, apdev):
    """WPS 2.0 STA merging mixed mode WPA/WPA2 credentials"""
    ssid = "test-wps-wep"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "skip_cred_build": "1", "extra_cred": "wps-mixed-cred" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    ev = dev[0].wait_event(["WPS-SUCCESS"], timeout=30)
    if ev is None:
        raise Exception("WPS-SUCCESS event timed out")
    nets = dev[0].list_networks()
    if len(nets) != 1:
        raise Exception("Unexpected number of network blocks")
    id = nets[0]['id']
    proto = dev[0].get_network(id, "proto")
    if proto != "WPA RSN":
        raise Exception("Unexpected merged proto field value: " + proto)
    pairwise = dev[0].get_network(id, "pairwise")
    if pairwise != "CCMP TKIP" and pairwise != "CCMP GCMP TKIP":
        raise Exception("Unexpected merged pairwise field value: " + pairwise)

def test_ap_wps_while_connected(dev, apdev):
    """WPS PBC provisioning while connected to another AP"""
    ssid = "test-wps-conf"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])

    hostapd.add_ap(apdev[1]['ifname'], { "ssid": "open" })
    dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")

    logger.info("WPS provisioning step")
    hapd.request("WPS_PBC")
    dev[0].dump_monitor()
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])
    dev[0].wait_connected(timeout=30)
    status = dev[0].get_status()
    if status['bssid'] != apdev[0]['bssid']:
        raise Exception("Unexpected BSSID")

def test_ap_wps_while_connected_no_autoconnect(dev, apdev):
    """WPS PBC provisioning while connected to another AP and STA_AUTOCONNECT disabled"""
    ssid = "test-wps-conf"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])

    hostapd.add_ap(apdev[1]['ifname'], { "ssid": "open" })

    try:
        dev[0].request("STA_AUTOCONNECT 0")
        dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")

        logger.info("WPS provisioning step")
        hapd.request("WPS_PBC")
        dev[0].dump_monitor()
        dev[0].request("WPS_PBC " + apdev[0]['bssid'])
        dev[0].wait_connected(timeout=30)
        status = dev[0].get_status()
        if status['bssid'] != apdev[0]['bssid']:
            raise Exception("Unexpected BSSID")
    finally:
        dev[0].request("STA_AUTOCONNECT 1")

def test_ap_wps_from_event(dev, apdev):
    """WPS PBC event on AP to enable PBC"""
    ssid = "test-wps-conf"
    hapd = hostapd.add_ap(apdev[0]['ifname'],
                          { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                            "wpa_passphrase": "12345678", "wpa": "2",
                            "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].dump_monitor()
    hapd.dump_monitor()
    dev[0].request("WPS_PBC " + apdev[0]['bssid'])

    ev = hapd.wait_event(['WPS-ENROLLEE-SEEN'], timeout=15)
    if ev is None:
        raise Exception("No WPS-ENROLLEE-SEEN event on AP")
    vals = ev.split(' ')
    if vals[1] != dev[0].p2p_interface_addr():
        raise Exception("Unexpected enrollee address: " + vals[1])
    if vals[5] != '4':
        raise Exception("Unexpected Device Password Id: " + vals[5])
    hapd.request("WPS_PBC")
    dev[0].wait_connected(timeout=30)

def test_ap_wps_ap_scan_2(dev, apdev):
    """AP_SCAN 2 for WPS"""
    ssid = "test-wps-conf"
    hapd = hostapd.add_ap(apdev[0]['ifname'],
                          { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                            "wpa_passphrase": "12345678", "wpa": "2",
                            "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd.request("WPS_PBC")

    wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
    wpas.interface_add("wlan5", drv_params="force_connect_cmd=1")

    if "OK" not in wpas.request("AP_SCAN 2"):
        raise Exception("Failed to set AP_SCAN 2")

    wpas.flush_scan_cache()
    wpas.scan_for_bss(apdev[0]['bssid'], freq="2412")
    wpas.request("WPS_PBC " + apdev[0]['bssid'])
    ev = wpas.wait_event(["WPS-SUCCESS"], timeout=15)
    if ev is None:
        raise Exception("WPS-SUCCESS event timed out")
    wpas.wait_connected(timeout=30)
    wpas.request("DISCONNECT")
    wpas.request("BSS_FLUSH 0")
    wpas.dump_monitor()
    wpas.request("REASSOCIATE")
    wpas.wait_connected(timeout=30)

def test_ap_wps_eapol_workaround(dev, apdev):
    """EAPOL workaround code path for 802.1X header length mismatch"""
    ssid = "test-wps"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "1" })
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    bssid = apdev[0]['bssid']
    hapd.request("SET ext_eapol_frame_io 1")
    dev[0].request("SET ext_eapol_frame_io 1")
    hapd.request("WPS_PBC")
    dev[0].request("WPS_PBC")

    ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX from hostapd")

    res = dev[0].request("EAPOL_RX " + bssid + " 020000040193000501FFFF")
    if "OK" not in res:
        raise Exception("EAPOL_RX to wpa_supplicant failed")

def test_ap_wps_iteration(dev, apdev):
    """WPS PIN and iterate through APs without selected registrar"""
    ssid = "test-wps-conf"
    hapd = hostapd.add_ap(apdev[0]['ifname'],
                          { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                            "wpa_passphrase": "12345678", "wpa": "2",
                            "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})

    ssid2 = "test-wps-conf2"
    hapd2 = hostapd.add_ap(apdev[1]['ifname'],
                           { "ssid": ssid2, "eap_server": "1", "wps_state": "2",
                             "wpa_passphrase": "12345678", "wpa": "2",
                             "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})

    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].scan_for_bss(apdev[1]['bssid'], freq="2412")
    dev[0].dump_monitor()
    pin = dev[0].request("WPS_PIN any")

    # Wait for iteration through all WPS APs to happen before enabling any
    # Registrar.
    for i in range(2):
        ev = dev[0].wait_event(["Associated with"], timeout=30)
        if ev is None:
            raise Exception("No association seen")
        ev = dev[0].wait_event(["WPS-M2D"], timeout=10)
        if ev is None:
            raise Exception("No M2D from AP")
        dev[0].wait_disconnected()

    # Verify that each AP requested PIN
    ev = hapd.wait_event(["WPS-PIN-NEEDED"], timeout=1)
    if ev is None:
        raise Exception("No WPS-PIN-NEEDED event from AP")
    ev = hapd2.wait_event(["WPS-PIN-NEEDED"], timeout=1)
    if ev is None:
        raise Exception("No WPS-PIN-NEEDED event from AP2")

    # Provide PIN to one of the APs and verify that connection gets formed
    hapd.request("WPS_PIN any " + pin)
    dev[0].wait_connected(timeout=30)

def test_ap_wps_iteration_error(dev, apdev):
    """WPS AP iteration on no Selected Registrar and error case with an AP"""
    ssid = "test-wps-conf-pin"
    hapd = hostapd.add_ap(apdev[0]['ifname'],
                          { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                            "wpa_passphrase": "12345678", "wpa": "2",
                            "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                            "wps_independent": "1" })
    hapd.request("SET ext_eapol_frame_io 1")
    bssid = apdev[0]['bssid']
    pin = dev[0].wps_read_pin()
    dev[0].request("WPS_PIN any " + pin)

    ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
    if ev is None:
        raise Exception("No EAPOL-TX (EAP-Request/Identity) from hostapd")
    dev[0].request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])

    ev = hapd.wait_event(["EAPOL-TX"], timeout=15)
    if ev is None:
        raise Exception("No EAPOL-TX (EAP-WSC/Start) from hostapd")
    ev = dev[0].wait_event(["CTRL-EVENT-EAP-STARTED"], timeout=5)
    if ev is None:
        raise Exception("No CTRL-EVENT-EAP-STARTED")

    # Do not forward any more EAPOL frames to test wpa_supplicant behavior for
    # a case with an incorrectly behaving WPS AP.

    # Start the real target AP and activate registrar on it.
    hapd2 = hostapd.add_ap(apdev[1]['ifname'],
                          { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                            "wpa_passphrase": "12345678", "wpa": "2",
                            "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                            "wps_independent": "1" })
    hapd2.request("WPS_PIN any " + pin)

    dev[0].wait_disconnected(timeout=15)
    ev = dev[0].wait_event(["CTRL-EVENT-EAP-STARTED"], timeout=15)
    if ev is None:
        raise Exception("No CTRL-EVENT-EAP-STARTED for the second AP")
    ev = dev[0].wait_event(["WPS-CRED-RECEIVED"], timeout=15)
    if ev is None:
        raise Exception("No WPS-CRED-RECEIVED for the second AP")
    dev[0].wait_connected(timeout=15)

def test_ap_wps_priority(dev, apdev):
    """WPS PIN provisioning with configured AP and wps_priority"""
    ssid = "test-wps-conf-pin"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])
    logger.info("WPS provisioning step")
    pin = dev[0].wps_read_pin()
    hapd.request("WPS_PIN any " + pin)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].dump_monitor()
    try:
        dev[0].request("SET wps_priority 6")
        dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
        dev[0].wait_connected(timeout=30)
        netw = dev[0].list_networks()
        prio = dev[0].get_network(netw[0]['id'], 'priority')
        if prio != '6':
            raise Exception("Unexpected network priority: " + prio)
    finally:
        dev[0].request("SET wps_priority 0")

def test_ap_wps_and_non_wps(dev, apdev):
    """WPS and non-WPS AP in single hostapd process"""
    params = { "ssid": "wps", "eap_server": "1", "wps_state": "1" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)

    params = { "ssid": "no wps" }
    hapd2 = hostapd.add_ap(apdev[1]['ifname'], params)

    appin = hapd.request("WPS_AP_PIN random")
    if "FAIL" in appin:
        raise Exception("Could not generate random AP PIN")
    if appin not in hapd.request("WPS_AP_PIN get"):
        raise Exception("Could not fetch current AP PIN")

    if "FAIL" in hapd.request("WPS_PBC"):
        raise Exception("WPS_PBC failed")
    if "FAIL" in hapd.request("WPS_CANCEL"):
        raise Exception("WPS_CANCEL failed")

def test_ap_wps_init_oom(dev, apdev):
    """Initial AP configuration and OOM during PSK generation"""
    ssid = "test-wps"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "1" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)

    with alloc_fail(hapd, 1, "base64_encode;wps_build_cred"):
        pin = dev[0].wps_read_pin()
        hapd.request("WPS_PIN any " + pin)
        dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
        dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
        dev[0].wait_disconnected()

    hapd.request("WPS_PIN any " + pin)
    dev[0].wait_connected(timeout=30)

def test_ap_wps_er_oom(dev, apdev):
    """WPS ER OOM in XML processing"""
    try:
        _test_ap_wps_er_oom(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")
        dev[1].request("WPS_CANCEL")
        dev[0].request("DISCONNECT")

def _test_ap_wps_er_oom(dev, apdev):
    ssid = "wps-er-ap-config"
    ap_pin = "12345670"
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
                     "device_name": "Wireless AP", "manufacturer": "Company",
                     "model_name": "WAP", "model_number": "123",
                     "serial_number": "12345", "device_type": "6-0050F204-1",
                     "os_version": "01020300",
                     "config_methods": "label push_button",
                     "ap_pin": ap_pin, "uuid": ap_uuid, "upnp_iface": "lo"})

    dev[0].connect(ssid, psk="12345678", scan_freq="2412")

    with alloc_fail(dev[0], 1, "base64_decode;xml_get_base64_item"):
        dev[0].request("WPS_ER_START ifname=lo")
        ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=3)
        if ev is not None:
            raise Exception("Unexpected AP discovery")

    dev[0].request("WPS_ER_STOP")
    dev[0].request("WPS_ER_START ifname=lo")
    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=10)
    if ev is None:
        raise Exception("AP discovery timed out")

    dev[1].scan_for_bss(apdev[0]['bssid'], freq=2412)
    with alloc_fail(dev[0], 1, "base64_decode;xml_get_base64_item"):
        dev[1].request("WPS_PBC " + apdev[0]['bssid'])
        ev = dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10)
        if ev is None:
            raise Exception("PBC scan failed")
        ev = dev[0].wait_event(["WPS-ER-ENROLLEE-ADD"], timeout=15)
        if ev is None:
            raise Exception("Enrollee discovery timed out")

def test_ap_wps_er_init_oom(dev, apdev):
    """WPS ER and OOM during init"""
    try:
        _test_ap_wps_er_init_oom(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_init_oom(dev, apdev):
    with alloc_fail(dev[0], 1, "wps_er_init"):
        if "FAIL" not in dev[0].request("WPS_ER_START ifname=lo"):
            raise Exception("WPS_ER_START succeeded during OOM")
    with alloc_fail(dev[0], 1, "http_server_init"):
        if "FAIL" not in dev[0].request("WPS_ER_START ifname=lo"):
            raise Exception("WPS_ER_START succeeded during OOM")
    with alloc_fail(dev[0], 2, "http_server_init"):
        if "FAIL" not in dev[0].request("WPS_ER_START ifname=lo"):
            raise Exception("WPS_ER_START succeeded during OOM")
    with alloc_fail(dev[0], 1, "eloop_register_sock;wps_er_ssdp_init"):
        if "FAIL" not in dev[0].request("WPS_ER_START ifname=lo"):
            raise Exception("WPS_ER_START succeeded during OOM")
    with fail_test(dev[0], 1, "os_get_random;wps_er_init"):
        if "FAIL" not in dev[0].request("WPS_ER_START ifname=lo"):
            raise Exception("WPS_ER_START succeeded during os_get_random failure")

def test_ap_wps_er_init_fail(dev, apdev):
    """WPS ER init failure"""
    if "FAIL" not in dev[0].request("WPS_ER_START ifname=does-not-exist"):
        dev[0].request("WPS_ER_STOP")
        raise Exception("WPS_ER_START with non-existing ifname succeeded")

def test_ap_wps_wpa_cli_action(dev, apdev, test_params):
    """WPS events and wpa_cli action script"""
    logdir = os.path.abspath(test_params['logdir'])
    pidfile = os.path.join(logdir, 'ap_wps_wpa_cli_action.wpa_cli.pid')
    logfile = os.path.join(logdir, 'ap_wps_wpa_cli_action.wpa_cli.res')
    actionfile = os.path.join(logdir, 'ap_wps_wpa_cli_action.wpa_cli.action.sh')

    with open(actionfile, 'w') as f:
        f.write('#!/bin/sh\n')
        f.write('echo $* >> %s\n' % logfile)
        # Kill the process and wait some time before returning to allow all the
        # pending events to be processed with some of this happening after the
        # eloop SIGALRM signal has been scheduled.
        f.write('if [ $2 = "WPS-SUCCESS" -a -r %s ]; then kill `cat %s`; sleep 1; fi\n' % (pidfile, pidfile))

    os.chmod(actionfile, stat.S_IREAD | stat.S_IWRITE | stat.S_IEXEC |
             stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH)

    ssid = "test-wps-conf"
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                     "wpa_passphrase": "12345678", "wpa": "2",
                     "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"})
    hapd = hostapd.Hostapd(apdev[0]['ifname'])

    prg = os.path.join(test_params['logdir'],
                       'alt-wpa_supplicant/wpa_supplicant/wpa_cli')
    if not os.path.exists(prg):
        prg = '../../wpa_supplicant/wpa_cli'
    arg = [ prg, '-P', pidfile, '-B', '-i', dev[0].ifname, '-a', actionfile ]
    subprocess.call(arg)

    arg = [ 'ps', 'ax' ]
    cmd = subprocess.Popen(arg, stdout=subprocess.PIPE)
    out = cmd.communicate()[0]
    cmd.wait()
    logger.debug("Processes:\n" + out)
    if "wpa_cli -P %s -B -i %s" % (pidfile, dev[0].ifname) not in out:
        raise Exception("Did not see wpa_cli running")

    hapd.request("WPS_PIN any 12345670")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].dump_monitor()
    dev[0].request("WPS_PIN " + apdev[0]['bssid'] + " 12345670")
    dev[0].wait_connected(timeout=30)

    for i in range(30):
        if not os.path.exists(pidfile):
            break
        time.sleep(0.1)

    if not os.path.exists(logfile):
        raise Exception("wpa_cli action results file not found")
    with open(logfile, 'r') as f:
        res = f.read()
    if "WPS-SUCCESS" not in res:
        raise Exception("WPS-SUCCESS event not seen in action file")

    arg = [ 'ps', 'ax' ]
    cmd = subprocess.Popen(arg, stdout=subprocess.PIPE)
    out = cmd.communicate()[0]
    cmd.wait()
    logger.debug("Remaining processes:\n" + out)
    if "wpa_cli -P %s -B -i %s" % (pidfile, dev[0].ifname) in out:
        raise Exception("wpa_cli still running")

    if os.path.exists(pidfile):
        raise Exception("PID file not removed")

def test_ap_wps_er_ssdp_proto(dev, apdev):
    """WPS ER SSDP protocol testing"""
    try:
        _test_ap_wps_er_ssdp_proto(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_ssdp_proto(dev, apdev):
    socket.setdefaulttimeout(1)
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(("239.255.255.250", 1900))
    if "FAIL" not in dev[0].request("WPS_ER_START ifname=lo foo"):
        raise Exception("Invalid filter accepted")
    if "OK" not in dev[0].request("WPS_ER_START ifname=lo 1.2.3.4"):
        raise Exception("WPS_ER_START with filter failed")
    (msg,addr) = sock.recvfrom(1000)
    logger.debug("Received SSDP message from %s: %s" % (str(addr), msg))
    if "M-SEARCH" not in msg:
        raise Exception("Not an M-SEARCH")
    sock.sendto("FOO", addr)
    time.sleep(0.1)
    dev[0].request("WPS_ER_STOP")

    dev[0].request("WPS_ER_START ifname=lo")
    (msg,addr) = sock.recvfrom(1000)
    logger.debug("Received SSDP message from %s: %s" % (str(addr), msg))
    if "M-SEARCH" not in msg:
        raise Exception("Not an M-SEARCH")
    sock.sendto("FOO", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nFOO\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nNTS:foo\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nNTS:ssdp:byebye\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\ncache-control:   foo=1\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\ncache-control:   max-age=1\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nusn:\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nusn:foo\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nusn:   uuid:\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nusn:   uuid:     \r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nusn:   uuid:     foo\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nNTS:ssdp:byebye\r\n\r\n", addr)
    sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nlocation:foo\r\n\r\n", addr)
    with alloc_fail(dev[0], 1, "wps_er_ap_add"):
        sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nlocation:foo\r\ncache-control:max-age=1\r\n\r\n", addr)
        time.sleep(0.1)
    with alloc_fail(dev[0], 2, "wps_er_ap_add"):
        sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nlocation:foo\r\ncache-control:max-age=1\r\n\r\n", addr)
        time.sleep(0.1)

    # Add an AP with bogus URL
    sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nlocation:foo\r\ncache-control:max-age=1\r\n\r\n", addr)
    # Update timeout on AP without updating URL
    sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nlocation:http://127.0.0.1:12345/foo.xml\r\ncache-control:max-age=1\r\n\r\n", addr)
    ev = dev[0].wait_event(["WPS-ER-AP-REMOVE"], timeout=5)
    if ev is None:
        raise Exception("No WPS-ER-AP-REMOVE event on max-age timeout")

    # Add an AP with a valid URL (but no server listing to it)
    sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nlocation:http://127.0.0.1:12345/foo.xml\r\ncache-control:max-age=1\r\n\r\n", addr)
    ev = dev[0].wait_event(["WPS-ER-AP-REMOVE"], timeout=5)
    if ev is None:
        raise Exception("No WPS-ER-AP-REMOVE event on max-age timeout")

    sock.close()

wps_event_url = None

def gen_upnp_info(eventSubURL='wps_event', controlURL='wps_control',
                  udn='uuid:27ea801a-9e5c-4e73-bd82-f89cbcd10d7e'):
    payload = '''<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-wifialliance-org:device:WFADevice:1</deviceType>
<friendlyName>WPS Access Point</friendlyName>
<manufacturer>Company</manufacturer>
<modelName>WAP</modelName>
<modelNumber>123</modelNumber>
<serialNumber>12345</serialNumber>
'''
    if udn:
        payload += '<UDN>' + udn + '</UDN>'
    payload += '''<serviceList>
<service>
<serviceType>urn:schemas-wifialliance-org:service:WFAWLANConfig:1</serviceType>
<serviceId>urn:wifialliance-org:serviceId:WFAWLANConfig1</serviceId>
<SCPDURL>wps_scpd.xml</SCPDURL>
'''
    if controlURL:
        payload += '<controlURL>' + controlURL + '</controlURL>\n'
    if eventSubURL:
        payload += '<eventSubURL>' + eventSubURL + '</eventSubURL>\n'
    payload += '''</service>
</serviceList>
</device>
</root>
'''
    hdr = 'HTTP/1.1 200 OK\r\n' + \
          'Content-Type: text/xml; charset="utf-8"\r\n' + \
          'Server: Unspecified, UPnP/1.0, Unspecified\r\n' + \
          'Connection: close\r\n' + \
          'Content-Length: ' + str(len(payload)) + '\r\n' + \
          'Date: Sat, 15 Aug 2015 18:55:08 GMT\r\n\r\n'
    return hdr + payload

def gen_wps_control(payload_override=None):
    payload = '''<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:GetDeviceInfoResponse xmlns:u="urn:schemas-wifialliance-org:service:WFAWLANConfig:1">
<NewDeviceInfo>EEoAARAQIgABBBBHABAn6oAanlxOc72C+Jy80Q1+ECAABgIAAAADABAaABCJZ7DPtbU3Ust9
Z3wJF07WEDIAwH45D3i1OqB7eJGwTzqeapS71h3KyXncK2xJZ+xqScrlorNEg6LijBJzG2Ca
+FZli0iliDJd397yAx/jk4nFXco3q5ylBSvSw9dhJ5u1xBKSnTilKGlUHPhLP75PUqM3fot9
7zwtFZ4bx6x1sBA6oEe2d0aUJmLumQGCiKEIWlnxs44zego/2tAe81bDzdPBM7o5HH/FUhD+
KoGzFXp51atP+1n9Vta6AkI0Vye99JKLcC6Md9dMJltSVBgd4Xc4lRAEAAIAIxAQAAIADRAN
AAEBEAgAAgAEEEQAAQIQIQAHQ29tcGFueRAjAANXQVAQJAADMTIzEEIABTEyMzQ1EFQACAAG
AFDyBAABEBEAC1dpcmVsZXNzIEFQEDwAAQEQAgACAAAQEgACAAAQCQACAAAQLQAEgQIDABBJ
AAYANyoAASA=
</NewDeviceInfo>
</u:GetDeviceInfoResponse>
</s:Body>
</s:Envelope>
'''
    if payload_override:
        payload = payload_override
    hdr = 'HTTP/1.1 200 OK\r\n' + \
          'Content-Type: text/xml; charset="utf-8"\r\n' + \
          'Server: Unspecified, UPnP/1.0, Unspecified\r\n' + \
          'Connection: close\r\n' + \
          'Content-Length: ' + str(len(payload)) + '\r\n' + \
          'Date: Sat, 15 Aug 2015 18:55:08 GMT\r\n\r\n'
    return hdr + payload

def gen_wps_event(sid='uuid:7eb3342a-8a5f-47fe-a585-0785bfec6d8a'):
    payload = ""
    hdr = 'HTTP/1.1 200 OK\r\n' + \
          'Content-Type: text/xml; charset="utf-8"\r\n' + \
          'Server: Unspecified, UPnP/1.0, Unspecified\r\n' + \
          'Connection: close\r\n' + \
          'Content-Length: ' + str(len(payload)) + '\r\n'
    if sid:
        hdr += 'SID: ' + sid + '\r\n'
    hdr += 'Timeout: Second-1801\r\n' + \
          'Date: Sat, 15 Aug 2015 18:55:08 GMT\r\n\r\n'
    return hdr + payload

class WPSAPHTTPServer(SocketServer.StreamRequestHandler):
    def handle(self):
        data = self.rfile.readline().strip()
        logger.info("HTTP server received: " + data)
        while True:
            hdr = self.rfile.readline().strip()
            if len(hdr) == 0:
                break
            logger.info("HTTP header: " + hdr)
            if "CALLBACK:" in hdr:
                global wps_event_url
                wps_event_url = hdr.split(' ')[1].strip('<>')

        if "GET /foo.xml" in data:
            self.handle_upnp_info()
        elif "POST /wps_control" in data:
            self.handle_wps_control()
        elif "SUBSCRIBE /wps_event" in data:
            self.handle_wps_event()
        else:
            self.handle_others(data)

    def handle_upnp_info(self):
        self.wfile.write(gen_upnp_info())

    def handle_wps_control(self):
        self.wfile.write(gen_wps_control())

    def handle_wps_event(self):
        self.wfile.write(gen_wps_event())

    def handle_others(self, data):
        logger.info("Ignore HTTP request: " + data)

class MyTCPServer(SocketServer.TCPServer):
    def __init__(self, addr, handler):
        self.allow_reuse_address = True
        SocketServer.TCPServer.__init__(self, addr, handler)

def wps_er_start(dev, http_server, max_age=1, wait_m_search=False,
                 location_url=None):
    socket.setdefaulttimeout(1)
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(("239.255.255.250", 1900))
    dev.request("WPS_ER_START ifname=lo")
    for i in range(100):
        (msg,addr) = sock.recvfrom(1000)
        logger.debug("Received SSDP message from %s: %s" % (str(addr), msg))
        if "M-SEARCH" in msg:
            break
        if not wait_m_search:
            raise Exception("Not an M-SEARCH")
        if i == 99:
            raise Exception("No M-SEARCH seen")

    # Add an AP with a valid URL and server listing to it
    server = MyTCPServer(("127.0.0.1", 12345), http_server)
    if not location_url:
        location_url = 'http://127.0.0.1:12345/foo.xml'
    sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nlocation:%s\r\ncache-control:max-age=%d\r\n\r\n" % (location_url, max_age), addr)
    server.timeout = 1
    return server,sock

def wps_er_stop(dev, sock, server, on_alloc_fail=False):
    sock.close()
    server.server_close()

    if on_alloc_fail:
        done = False
        for i in range(50):
            res = dev.request("GET_ALLOC_FAIL")
            if res.startswith("0:"):
                done = True
                break
            time.sleep(0.1)
        if not done:
            raise Exception("No allocation failure reported")
    else:
        ev = dev.wait_event(["WPS-ER-AP-REMOVE"], timeout=5)
        if ev is None:
            raise Exception("No WPS-ER-AP-REMOVE event on max-age timeout")
    dev.request("WPS_ER_STOP")

def run_wps_er_proto_test(dev, handler, no_event_url=False, location_url=None):
    try:
        uuid = '27ea801a-9e5c-4e73-bd82-f89cbcd10d7e'
        server,sock = wps_er_start(dev, handler, location_url=location_url)
        global wps_event_url
        wps_event_url = None
        server.handle_request()
        server.handle_request()
        server.handle_request()
        server.server_close()
        if no_event_url:
            if wps_event_url:
                raise Exception("Received event URL unexpectedly")
            return
        if wps_event_url is None:
            raise Exception("Did not get event URL")
        logger.info("Event URL: " + wps_event_url)
    finally:
            dev.request("WPS_ER_STOP")

def send_wlanevent(url, uuid, data):
    conn = httplib.HTTPConnection(url.netloc)
    payload = '''<?xml version="1.0" encoding="utf-8"?>
<e:propertyset xmlns:e="urn:schemas-upnp-org:event-1-0">
<e:property><STAStatus>1</STAStatus></e:property>
<e:property><APStatus>1</APStatus></e:property>
<e:property><WLANEvent>'''
    payload += base64.b64encode(data)
    payload += '</WLANEvent></e:property></e:propertyset>'
    headers = { "Content-type": 'text/xml; charset="utf-8"',
                "Server": "Unspecified, UPnP/1.0, Unspecified",
                "HOST": url.netloc,
                "NT": "upnp:event",
                "SID": "uuid:" + uuid,
                "SEQ": "0",
                "Content-Length": str(len(payload)) }
    conn.request("NOTIFY", url.path, payload, headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

def test_ap_wps_er_http_proto(dev, apdev):
    """WPS ER HTTP protocol testing"""
    try:
        _test_ap_wps_er_http_proto(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_http_proto(dev, apdev):
    uuid = '27ea801a-9e5c-4e73-bd82-f89cbcd10d7e'
    server,sock = wps_er_start(dev[0], WPSAPHTTPServer, max_age=15)
    global wps_event_url
    wps_event_url = None
    server.handle_request()
    server.handle_request()
    server.handle_request()
    server.server_close()
    if wps_event_url is None:
        raise Exception("Did not get event URL")
    logger.info("Event URL: " + wps_event_url)

    ev = dev[0].wait_event(["WPS-ER-AP-ADD"], timeout=10)
    if ev is None:
        raise Exception("No WPS-ER-AP-ADD event")
    if uuid not in ev:
        raise Exception("UUID mismatch")

    sock.close()

    logger.info("Valid Probe Request notification")
    url = urlparse.urlparse(wps_event_url)
    conn = httplib.HTTPConnection(url.netloc)
    payload = '''<?xml version="1.0" encoding="utf-8"?>
<e:propertyset xmlns:e="urn:schemas-upnp-org:event-1-0">
<e:property><STAStatus>1</STAStatus></e:property>
<e:property><APStatus>1</APStatus></e:property>
<e:property><WLANEvent>ATAyOjAwOjAwOjAwOjAwOjAwEEoAARAQOgABAhAIAAIxSBBHABA2LbR7pTpRkYj7VFi5hrLk
EFQACAAAAAAAAAAAEDwAAQMQAgACAAAQCQACAAAQEgACAAAQIQABIBAjAAEgECQAASAQEQAI
RGV2aWNlIEEQSQAGADcqAAEg
</WLANEvent></e:property>
</e:propertyset>
'''
    headers = { "Content-type": 'text/xml; charset="utf-8"',
                "Server": "Unspecified, UPnP/1.0, Unspecified",
                "HOST": url.netloc,
                "NT": "upnp:event",
                "SID": "uuid:" + uuid,
                "SEQ": "0",
                "Content-Length": str(len(payload)) }
    conn.request("NOTIFY", url.path, payload, headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    ev = dev[0].wait_event(["WPS-ER-ENROLLEE-ADD"], timeout=5)
    if ev is None:
        raise Exception("No WPS-ER-ENROLLEE-ADD event")
    if "362db47b-a53a-5191-88fb-5458b986b2e4" not in ev:
        raise Exception("No Enrollee UUID match")

    logger.info("Incorrect event URL AP id")
    conn = httplib.HTTPConnection(url.netloc)
    conn.request("NOTIFY", url.path + '123', payload, headers)
    resp = conn.getresponse()
    if resp.status != 404:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.info("Missing AP id")
    conn = httplib.HTTPConnection(url.netloc)
    conn.request("NOTIFY", '/event/' + url.path.split('/')[2],
                 payload, headers)
    time.sleep(0.1)

    logger.info("Incorrect event URL event id")
    conn = httplib.HTTPConnection(url.netloc)
    conn.request("NOTIFY", '/event/123456789/123', payload, headers)
    time.sleep(0.1)

    logger.info("Incorrect event URL prefix")
    conn = httplib.HTTPConnection(url.netloc)
    conn.request("NOTIFY", '/foobar/123456789/123', payload, headers)
    resp = conn.getresponse()
    if resp.status != 404:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.info("Unsupported request")
    conn = httplib.HTTPConnection(url.netloc)
    conn.request("FOOBAR", '/foobar/123456789/123', payload, headers)
    resp = conn.getresponse()
    if resp.status != 501:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    logger.info("Unsupported request and OOM")
    with alloc_fail(dev[0], 1, "wps_er_http_req"):
        conn = httplib.HTTPConnection(url.netloc)
        conn.request("FOOBAR", '/foobar/123456789/123', payload, headers)
        time.sleep(0.5)

    logger.info("Too short WLANEvent")
    data = '\x00'
    send_wlanevent(url, uuid, data)

    logger.info("Invalid WLANEventMAC")
    data = '\x00qwertyuiopasdfghjklzxcvbnm'
    send_wlanevent(url, uuid, data)

    logger.info("Unknown WLANEventType")
    data = '\xff02:00:00:00:00:00'
    send_wlanevent(url, uuid, data)

    logger.info("Probe Request notification without any attributes")
    data = '\x0102:00:00:00:00:00'
    send_wlanevent(url, uuid, data)

    logger.info("Probe Request notification with invalid attribute")
    data = '\x0102:00:00:00:00:00\xff'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message without any attributes")
    data = '\x0202:00:00:00:00:00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message with invalid attribute")
    data = '\x0202:00:00:00:00:00\xff'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message from new STA and not M1")
    data = '\x0202:ff:ff:ff:ff:ff' + '\x10\x22\x00\x01\x05'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1")
    data = '\x0202:00:00:00:00:00'
    data += '\x10\x22\x00\x01\x04'
    data += '\x10\x47\x00\x10' + 16*'\x00'
    data += '\x10\x20\x00\x06\x02\x00\x00\x00\x00\x00'
    data += '\x10\x1a\x00\x10' + 16*'\x00'
    data += '\x10\x32\x00\xc0' + 192*'\x00'
    data += '\x10\x04\x00\x02\x00\x00'
    data += '\x10\x10\x00\x02\x00\x00'
    data += '\x10\x0d\x00\x01\x00'
    data += '\x10\x08\x00\x02\x00\x00'
    data += '\x10\x44\x00\x01\x00'
    data += '\x10\x21\x00\x00'
    data += '\x10\x23\x00\x00'
    data += '\x10\x24\x00\x00'
    data += '\x10\x42\x00\x00'
    data += '\x10\x54\x00\x08' + 8*'\x00'
    data += '\x10\x11\x00\x00'
    data += '\x10\x3c\x00\x01\x00'
    data += '\x10\x02\x00\x02\x00\x00'
    data += '\x10\x12\x00\x02\x00\x00'
    data += '\x10\x09\x00\x02\x00\x00'
    data += '\x10\x2d\x00\x04\x00\x00\x00\x00'
    m1 = data
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: WSC_ACK")
    data = '\x0202:00:00:00:00:00' + '\x10\x22\x00\x01\x0d'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1")
    send_wlanevent(url, uuid, m1)

    logger.info("EAP message: WSC_NACK")
    data = '\x0202:00:00:00:00:00' + '\x10\x22\x00\x01\x0e'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 - Too long attribute values")
    data = '\x0202:00:00:00:00:00'
    data += '\x10\x11\x00\x21' + 33*'\x00'
    data += '\x10\x45\x00\x21' + 33*'\x00'
    data += '\x10\x42\x00\x21' + 33*'\x00'
    data += '\x10\x24\x00\x21' + 33*'\x00'
    data += '\x10\x23\x00\x21' + 33*'\x00'
    data += '\x10\x21\x00\x41' + 65*'\x00'
    data += '\x10\x49\x00\x09\x00\x37\x2a\x05\x02\x00\x00\x05\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing UUID-E")
    data = '\x0202:00:00:00:00:00'
    data += '\x10\x22\x00\x01\x04'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing MAC Address")
    data += '\x10\x47\x00\x10' + 16*'\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Enrollee Nonce")
    data += '\x10\x20\x00\x06\x02\x00\x00\x00\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Public Key")
    data += '\x10\x1a\x00\x10' + 16*'\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Authentication Type flags")
    data += '\x10\x32\x00\xc0' + 192*'\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Encryption Type Flags")
    data += '\x10\x04\x00\x02\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Connection Type flags")
    data += '\x10\x10\x00\x02\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Config Methods")
    data += '\x10\x0d\x00\x01\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Wi-Fi Protected Setup State")
    data += '\x10\x08\x00\x02\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Manufacturer")
    data += '\x10\x44\x00\x01\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Model Name")
    data += '\x10\x21\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Model Number")
    data += '\x10\x23\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Serial Number")
    data += '\x10\x24\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Primary Device Type")
    data += '\x10\x42\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Device Name")
    data += '\x10\x54\x00\x08' + 8*'\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing RF Bands")
    data += '\x10\x11\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Association State")
    data += '\x10\x3c\x00\x01\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Device Password ID")
    data += '\x10\x02\x00\x02\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing Configuration Error")
    data += '\x10\x12\x00\x02\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("EAP message: M1 missing OS Version")
    data += '\x10\x09\x00\x02\x00\x00'
    send_wlanevent(url, uuid, data)

    logger.info("Check max concurrent requests")
    addr = (url.hostname, url.port)
    socks = {}
    for i in range(20):
        socks[i] = socket.socket(socket.AF_INET, socket.SOCK_STREAM,
                                 socket.IPPROTO_TCP)
        socks[i].connect(addr)
    for i in range(20):
        socks[i].send("GET / HTTP/1.1\r\n\r\n")
    count = 0
    for i in range(20):
        try:
            res = socks[i].recv(100)
            if "HTTP/1" in res:
                count += 1
        except:
            pass
        socks[i].close()
    logger.info("%d concurrent HTTP GET operations returned response" % count)
    if count < 10:
        raise Exception("Too few concurrent HTTP connections accepted")

    logger.info("OOM in HTTP server")
    for func in [ "http_request_init", "httpread_create",
                  "eloop_register_timeout;httpread_create",
                  "eloop_register_sock;httpread_create",
                  "httpread_hdr_analyze" ]:
        with alloc_fail(dev[0], 1, func):
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM,
                                 socket.IPPROTO_TCP)
            sock.connect(addr)
            sock.send("GET / HTTP/1.1\r\n\r\n")
            try:
                sock.recv(100)
            except:
                pass
            sock.close()

    logger.info("Invalid HTTP header")
    for req in [ " GET / HTTP/1.1\r\n\r\n",
                 "HTTP/1.1 200 OK\r\n\r\n",
                 "HTTP/\r\n\r\n",
                 "GET %%a%aa% HTTP/1.1\r\n\r\n",
                 "GET / HTTP/1.1\r\n FOO\r\n\r\n",
                 "NOTIFY / HTTP/1.1\r\n" + 4097*'a' + '\r\n\r\n',
                 "NOTIFY / HTTP/1.1\r\n\r\n" + 8193*'a',
                 "POST / HTTP/1.1\r\nTransfer-Encoding: CHUNKED\r\n\r\n foo\r\n",
                 "POST / HTTP/1.1\r\nTransfer-Encoding: CHUNKED\r\n\r\n1\r\nfoo\r\n",
                 "POST / HTTP/1.1\r\nTransfer-Encoding: CHUNKED\r\n\r\n0\r\n",
                 "POST / HTTP/1.1\r\nTransfer-Encoding: CHUNKED\r\n\r\n0\r\naa\ra\r\n\ra" ]:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM,
                             socket.IPPROTO_TCP)
        sock.settimeout(0.1)
        sock.connect(addr)
        sock.send(req)
        try:
            sock.recv(100)
        except:
            pass
        sock.close()

    with alloc_fail(dev[0], 2, "httpread_read_handler"):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM,
                             socket.IPPROTO_TCP)
        sock.connect(addr)
        sock.send("NOTIFY / HTTP/1.1\r\n\r\n" + 4500*'a')
        try:
            sock.recv(100)
        except:
            pass
        sock.close()

    conn = httplib.HTTPConnection(url.netloc)
    payload = '<foo'
    headers = { "Content-type": 'text/xml; charset="utf-8"',
                "Server": "Unspecified, UPnP/1.0, Unspecified",
                "HOST": url.netloc,
                "NT": "upnp:event",
                "SID": "uuid:" + uuid,
                "SEQ": "0",
                "Content-Length": str(len(payload)) }
    conn.request("NOTIFY", url.path, payload, headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    conn = httplib.HTTPConnection(url.netloc)
    payload = '<WLANEvent foo></WLANEvent>'
    headers = { "Content-type": 'text/xml; charset="utf-8"',
                "Server": "Unspecified, UPnP/1.0, Unspecified",
                "HOST": url.netloc,
                "NT": "upnp:event",
                "SID": "uuid:" + uuid,
                "SEQ": "0",
                "Content-Length": str(len(payload)) }
    conn.request("NOTIFY", url.path, payload, headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)

    with alloc_fail(dev[0], 1, "xml_get_first_item"):
        send_wlanevent(url, uuid, '')

    with alloc_fail(dev[0], 1, "wpabuf_alloc_ext_data;xml_get_base64_item"):
        send_wlanevent(url, uuid, 'foo')

    for func in [ "wps_init",
                  "wps_process_manufacturer",
                  "wps_process_model_name",
                  "wps_process_model_number",
                  "wps_process_serial_number",
                  "wps_process_dev_name" ]:
        with alloc_fail(dev[0], 1, func):
            send_wlanevent(url, uuid, m1)

def test_ap_wps_er_http_proto_no_event_sub_url(dev, apdev):
    """WPS ER HTTP protocol testing - no eventSubURL"""
    class WPSAPHTTPServer_no_event_sub_url(WPSAPHTTPServer):
        def handle_upnp_info(self):
            self.wfile.write(gen_upnp_info(eventSubURL=None))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_no_event_sub_url,
                          no_event_url=True)

def test_ap_wps_er_http_proto_event_sub_url_dns(dev, apdev):
    """WPS ER HTTP protocol testing - DNS name in eventSubURL"""
    class WPSAPHTTPServer_event_sub_url_dns(WPSAPHTTPServer):
        def handle_upnp_info(self):
            self.wfile.write(gen_upnp_info(eventSubURL='http://example.com/wps_event'))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_event_sub_url_dns,
                          no_event_url=True)

def test_ap_wps_er_http_proto_subscribe_oom(dev, apdev):
    """WPS ER HTTP protocol testing - subscribe OOM"""
    try:
        _test_ap_wps_er_http_proto_subscribe_oom(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_http_proto_subscribe_oom(dev, apdev):
    tests = [ (1, "http_client_url_parse"),
              (1, "wpabuf_alloc;wps_er_subscribe"),
              (1, "http_client_addr"),
              (1, "eloop_register_sock;http_client_addr"),
              (1, "eloop_register_timeout;http_client_addr") ]
    for count,func in tests:
        with alloc_fail(dev[0], count, func):
            server,sock = wps_er_start(dev[0], WPSAPHTTPServer)
            server.handle_request()
            server.handle_request()
            wps_er_stop(dev[0], sock, server, on_alloc_fail=True)

def test_ap_wps_er_http_proto_no_sid(dev, apdev):
    """WPS ER HTTP protocol testing - no SID"""
    class WPSAPHTTPServer_no_sid(WPSAPHTTPServer):
        def handle_wps_event(self):
            self.wfile.write(gen_wps_event(sid=None))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_no_sid)

def test_ap_wps_er_http_proto_invalid_sid_no_uuid(dev, apdev):
    """WPS ER HTTP protocol testing - invalid SID - no UUID"""
    class WPSAPHTTPServer_invalid_sid_no_uuid(WPSAPHTTPServer):
        def handle_wps_event(self):
            self.wfile.write(gen_wps_event(sid='FOO'))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_invalid_sid_no_uuid)

def test_ap_wps_er_http_proto_invalid_sid_uuid(dev, apdev):
    """WPS ER HTTP protocol testing - invalid SID UUID"""
    class WPSAPHTTPServer_invalid_sid_uuid(WPSAPHTTPServer):
        def handle_wps_event(self):
            self.wfile.write(gen_wps_event(sid='uuid:FOO'))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_invalid_sid_uuid)

def test_ap_wps_er_http_proto_subscribe_failing(dev, apdev):
    """WPS ER HTTP protocol testing - SUBSCRIBE failing"""
    class WPSAPHTTPServer_fail_subscribe(WPSAPHTTPServer):
        def handle_wps_event(self):
            payload = ""
            hdr = 'HTTP/1.1 404 Not Found\r\n' + \
                  'Content-Type: text/xml; charset="utf-8"\r\n' + \
                  'Server: Unspecified, UPnP/1.0, Unspecified\r\n' + \
                  'Connection: close\r\n' + \
                  'Content-Length: ' + str(len(payload)) + '\r\n' + \
                  'Timeout: Second-1801\r\n' + \
                  'Date: Sat, 15 Aug 2015 18:55:08 GMT\r\n\r\n'
            self.wfile.write(hdr + payload)
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_fail_subscribe)

def test_ap_wps_er_http_proto_subscribe_invalid_response(dev, apdev):
    """WPS ER HTTP protocol testing - SUBSCRIBE and invalid response"""
    class WPSAPHTTPServer_subscribe_invalid_response(WPSAPHTTPServer):
        def handle_wps_event(self):
            payload = ""
            hdr = 'HTTP/1.1 FOO\r\n' + \
                  'Content-Type: text/xml; charset="utf-8"\r\n' + \
                  'Server: Unspecified, UPnP/1.0, Unspecified\r\n' + \
                  'Connection: close\r\n' + \
                  'Content-Length: ' + str(len(payload)) + '\r\n' + \
                  'Timeout: Second-1801\r\n' + \
                  'Date: Sat, 15 Aug 2015 18:55:08 GMT\r\n\r\n'
            self.wfile.write(hdr + payload)
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_subscribe_invalid_response)

def test_ap_wps_er_http_proto_subscribe_invalid_response(dev, apdev):
    """WPS ER HTTP protocol testing - SUBSCRIBE and invalid response"""
    class WPSAPHTTPServer_invalid_m1(WPSAPHTTPServer):
        def handle_wps_control(self):
            payload = '''<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:GetDeviceInfoResponse xmlns:u="urn:schemas-wifialliance-org:service:WFAWLANConfig:1">
<NewDeviceInfo>Rk9P</NewDeviceInfo>
</u:GetDeviceInfoResponse>
</s:Body>
</s:Envelope>
'''
            self.wfile.write(gen_wps_control(payload_override=payload))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_invalid_m1, no_event_url=True)

def test_ap_wps_er_http_proto_upnp_info_no_device(dev, apdev):
    """WPS ER HTTP protocol testing - No device in UPnP info"""
    class WPSAPHTTPServer_no_device(WPSAPHTTPServer):
        def handle_upnp_info(self):
            payload = '''<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
</root>
'''
            hdr = 'HTTP/1.1 200 OK\r\n' + \
                  'Content-Type: text/xml; charset="utf-8"\r\n' + \
                  'Server: Unspecified, UPnP/1.0, Unspecified\r\n' + \
                  'Connection: close\r\n' + \
                  'Content-Length: ' + str(len(payload)) + '\r\n' + \
                  'Date: Sat, 15 Aug 2015 18:55:08 GMT\r\n\r\n'
            self.wfile.write(hdr + payload)
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_no_device, no_event_url=True)

def test_ap_wps_er_http_proto_upnp_info_no_device_type(dev, apdev):
    """WPS ER HTTP protocol testing - No deviceType in UPnP info"""
    class WPSAPHTTPServer_no_device(WPSAPHTTPServer):
        def handle_upnp_info(self):
            payload = '''<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
</device>
</root>
'''
            hdr = 'HTTP/1.1 200 OK\r\n' + \
                  'Content-Type: text/xml; charset="utf-8"\r\n' + \
                  'Server: Unspecified, UPnP/1.0, Unspecified\r\n' + \
                  'Connection: close\r\n' + \
                  'Content-Length: ' + str(len(payload)) + '\r\n' + \
                  'Date: Sat, 15 Aug 2015 18:55:08 GMT\r\n\r\n'
            self.wfile.write(hdr + payload)
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_no_device, no_event_url=True)

def test_ap_wps_er_http_proto_upnp_info_invalid_udn_uuid(dev, apdev):
    """WPS ER HTTP protocol testing - Invalid UDN UUID"""
    class WPSAPHTTPServer_invalid_udn_uuid(WPSAPHTTPServer):
        def handle_upnp_info(self):
            self.wfile.write(gen_upnp_info(udn='uuid:foo'))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_invalid_udn_uuid)

def test_ap_wps_er_http_proto_no_control_url(dev, apdev):
    """WPS ER HTTP protocol testing - no controlURL"""
    class WPSAPHTTPServer_no_control_url(WPSAPHTTPServer):
        def handle_upnp_info(self):
            self.wfile.write(gen_upnp_info(controlURL=None))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_no_control_url,
                          no_event_url=True)

def test_ap_wps_er_http_proto_control_url_dns(dev, apdev):
    """WPS ER HTTP protocol testing - DNS name in controlURL"""
    class WPSAPHTTPServer_control_url_dns(WPSAPHTTPServer):
        def handle_upnp_info(self):
            self.wfile.write(gen_upnp_info(controlURL='http://example.com/wps_control'))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_control_url_dns,
                          no_event_url=True)

def test_ap_wps_http_timeout(dev, apdev):
    """WPS AP/ER and HTTP timeout"""
    try:
        _test_ap_wps_http_timeout(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_http_timeout(dev, apdev):
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    location = ssdp_get_location(ap_uuid)
    url = urlparse.urlparse(location)
    addr = (url.hostname, url.port)
    logger.debug("Open HTTP connection to hostapd, but do not complete request")
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM,
                         socket.IPPROTO_TCP)
    sock.connect(addr)
    sock.send("G")

    class DummyServer(SocketServer.StreamRequestHandler):
        def handle(self):
            logger.debug("DummyServer - start 31 sec wait")
            time.sleep(31)
            logger.debug("DummyServer - wait done")

    logger.debug("Start WPS ER")
    server,sock2 = wps_er_start(dev[0], DummyServer, max_age=40,
                                wait_m_search=True)

    logger.debug("Start server to accept, but not complete, HTTP connection from WPS ER")
    # This will wait for 31 seconds..
    server.handle_request()

    logger.debug("Complete HTTP connection with hostapd (that should have already closed the connection)")
    try:
        sock.send("ET / HTTP/1.1\r\n\r\n")
        res = sock.recv(100)
        sock.close()
    except:
        pass

def test_ap_wps_er_url_parse(dev, apdev):
    """WPS ER and URL parsing special cases"""
    try:
        _test_ap_wps_er_url_parse(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_url_parse(dev, apdev):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.settimeout(1)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(("239.255.255.250", 1900))
    dev[0].request("WPS_ER_START ifname=lo")
    (msg,addr) = sock.recvfrom(1000)
    logger.debug("Received SSDP message from %s: %s" % (str(addr), msg))
    if "M-SEARCH" not in msg:
        raise Exception("Not an M-SEARCH")
    sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nlocation:http://127.0.0.1\r\ncache-control:max-age=1\r\n\r\n", addr)
    ev = dev[0].wait_event(["WPS-ER-AP-REMOVE"], timeout=2)
    sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nlocation:http://127.0.0.1/:foo\r\ncache-control:max-age=1\r\n\r\n", addr)
    ev = dev[0].wait_event(["WPS-ER-AP-REMOVE"], timeout=2)
    sock.sendto("HTTP/1.1 200 OK\r\nST: urn:schemas-wifialliance-org:device:WFADevice:1\r\nlocation:http://255.255.255.255:0/foo.xml\r\ncache-control:max-age=1\r\n\r\n", addr)
    ev = dev[0].wait_event(["WPS-ER-AP-REMOVE"], timeout=2)

    sock.close()

def test_ap_wps_er_link_update(dev, apdev):
    """WPS ER and link update special cases"""
    class WPSAPHTTPServer_link_update(WPSAPHTTPServer):
        def handle_upnp_info(self):
            self.wfile.write(gen_upnp_info(controlURL='/wps_control'))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_link_update)

    class WPSAPHTTPServer_link_update2(WPSAPHTTPServer):
        def handle_others(self, data):
            if "GET / " in data:
                self.wfile.write(gen_upnp_info(controlURL='/wps_control'))
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_link_update2,
                          location_url='http://127.0.0.1:12345')

def test_ap_wps_er_http_client(dev, apdev):
    """WPS ER and HTTP client special cases"""
    with alloc_fail(dev[0], 1, "http_link_update"):
        run_wps_er_proto_test(dev[0], WPSAPHTTPServer)

    with alloc_fail(dev[0], 1, "wpabuf_alloc;http_client_url"):
        run_wps_er_proto_test(dev[0], WPSAPHTTPServer, no_event_url=True)

    with alloc_fail(dev[0], 1, "httpread_create;http_client_tx_ready"):
        run_wps_er_proto_test(dev[0], WPSAPHTTPServer, no_event_url=True)

    class WPSAPHTTPServer_req_as_resp(WPSAPHTTPServer):
        def handle_upnp_info(self):
            self.wfile.write("GET / HTTP/1.1\r\n\r\n")
    run_wps_er_proto_test(dev[0], WPSAPHTTPServer_req_as_resp,
                          no_event_url=True)

def test_ap_wps_init_oom(dev, apdev):
    """wps_init OOM cases"""
    ssid = "test-wps"
    appin = "12345670"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "ap_pin": appin }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    pin = dev[0].wps_read_pin()

    with alloc_fail(hapd, 1, "wps_init"):
        hapd.request("WPS_PIN any " + pin)
        dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
        dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
        ev = hapd.wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
        if ev is None:
            raise Exception("No EAP failure reported")
        dev[0].request("WPS_CANCEL")

    with alloc_fail(dev[0], 2, "wps_init"):
        hapd.request("WPS_PIN any " + pin)
        dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
        dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
        ev = hapd.wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
        if ev is None:
            raise Exception("No EAP failure reported")
        dev[0].request("WPS_CANCEL")

    with alloc_fail(dev[0], 2, "wps_init"):
        hapd.request("WPS_PBC")
        dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
        dev[0].request("WPS_PBC %s" % (apdev[0]['bssid']))
        ev = hapd.wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
        if ev is None:
            raise Exception("No EAP failure reported")
        dev[0].request("WPS_CANCEL")

    dev[0].dump_monitor()
    new_ssid = "wps-new-ssid"
    new_passphrase = "1234567890"
    with alloc_fail(dev[0], 3, "wps_init"):
        dev[0].wps_reg(apdev[0]['bssid'], appin, new_ssid, "WPA2PSK", "CCMP",
                       new_passphrase, no_wait=True)
        ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
        if ev is None:
            raise Exception("No EAP failure reported")

    dev[0].flush_scan_cache()

def test_ap_wps_invalid_assoc_req_elem(dev, apdev):
    """WPS and invalid IE in Association Request frame"""
    ssid = "test-wps"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    pin = "12345670"
    hapd.request("WPS_PIN any " + pin)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    try:
        dev[0].request("VENDOR_ELEM_ADD 13 dd050050f20410")
        dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
        for i in range(5):
            ev = hapd.wait_event(["CTRL-EVENT-EAP-PROPOSED-METHOD"], timeout=10)
            if ev and "vendor=14122" in ev:
                break
        if ev is None or "vendor=14122" not in ev:
            raise Exception("EAP-WSC not started")
        dev[0].request("WPS_CANCEL")
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 13 *")

def test_ap_wps_pbc_pin_mismatch(dev, apdev):
    """WPS PBC/PIN mismatch"""
    ssid = "test-wps"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    hapd.request("SET wps_version_number 0x10")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    hapd.request("WPS_PBC")
    pin = dev[0].wps_read_pin()
    dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"])
    if ev is None:
        raise Exception("Scan did not complete")
    dev[0].request("WPS_CANCEL")

    hapd.request("WPS_CANCEL")
    dev[0].flush_scan_cache()

def test_ap_wps_ie_invalid(dev, apdev):
    """WPS PIN attempt with AP that has invalid WSC IE"""
    ssid = "test-wps"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "vendor_elements": "dd050050f20410" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    params = { 'ssid': "another", "vendor_elements": "dd050050f20410" }
    hostapd.add_ap(apdev[1]['ifname'], params)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    pin = dev[0].wps_read_pin()
    dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"])
    if ev is None:
        raise Exception("Scan did not complete")
    dev[0].request("WPS_CANCEL")

def test_ap_wps_scan_prio_order(dev, apdev):
    """WPS scan priority ordering"""
    ssid = "test-wps"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    params = { 'ssid': "another", "vendor_elements": "dd050050f20410" }
    hostapd.add_ap(apdev[1]['ifname'], params)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].scan_for_bss(apdev[1]['bssid'], freq="2412")
    pin = dev[0].wps_read_pin()
    dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
    ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"])
    if ev is None:
        raise Exception("Scan did not complete")
    dev[0].request("WPS_CANCEL")

def test_ap_wps_probe_req_ie_oom(dev, apdev):
    """WPS ProbeReq IE OOM"""
    ssid = "test-wps"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    pin = dev[0].wps_read_pin()
    hapd.request("WPS_PIN any " + pin)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    with alloc_fail(dev[0], 1, "wps_build_probe_req_ie"):
        dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
        ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=10)
        if ev is None:
            raise Exception("Association not seen")
    dev[0].request("WPS_CANCEL")

    with alloc_fail(dev[0], 1, "wps_ie_encapsulate"):
        dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
        ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=10)
        if ev is None:
            raise Exception("Association not seen")
    dev[0].request("WPS_CANCEL")

def test_ap_wps_assoc_req_ie_oom(dev, apdev):
    """WPS AssocReq IE OOM"""
    ssid = "test-wps"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    pin = dev[0].wps_read_pin()
    hapd.request("WPS_PIN any " + pin)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    with alloc_fail(dev[0], 1, "wps_build_assoc_req_ie"):
        dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
        ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=10)
        if ev is None:
            raise Exception("Association not seen")
    dev[0].request("WPS_CANCEL")

def test_ap_wps_assoc_resp_ie_oom(dev, apdev):
    """WPS AssocResp IE OOM"""
    ssid = "test-wps"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    pin = dev[0].wps_read_pin()
    hapd.request("WPS_PIN any " + pin)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    with alloc_fail(hapd, 1, "wps_build_assoc_resp_ie"):
        dev[0].request("WPS_PIN %s %s" % (apdev[0]['bssid'], pin))
        ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=10)
        if ev is None:
            raise Exception("Association not seen")
    dev[0].request("WPS_CANCEL")

def test_ap_wps_bss_info_errors(dev, apdev):
    """WPS BSS info errors"""
    params = { "ssid": "1",
               "vendor_elements": "dd0e0050f20410440001ff101100010a" }
    hostapd.add_ap(apdev[0]['ifname'], params)
    params = { 'ssid': "2", "vendor_elements": "dd050050f20410" }
    hostapd.add_ap(apdev[1]['ifname'], params)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    dev[0].scan_for_bss(apdev[1]['bssid'], freq="2412")
    bss = dev[0].get_bss(apdev[0]['bssid'])
    logger.info("BSS: " + str(bss))
    if "wps_state" in bss:
        raise Exception("Unexpected wps_state in BSS info")
    if 'wps_device_name' not in bss:
        raise Exception("No wps_device_name in BSS info")
    if bss['wps_device_name'] != '_':
        raise Exception("Unexpected wps_device_name value")
    bss = dev[0].get_bss(apdev[1]['bssid'])
    logger.info("BSS: " + str(bss))

    with alloc_fail(dev[0], 1, "=wps_attr_text"):
        bss = dev[0].get_bss(apdev[0]['bssid'])
        logger.info("BSS(OOM): " + str(bss))

def wps_run_pbc_fail_ap(apdev, dev, hapd):
    hapd.request("WPS_PBC")
    dev.scan_for_bss(apdev['bssid'], freq="2412")
    dev.request("WPS_PBC " + apdev['bssid'])
    ev = dev.wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
    if ev is None:
        raise Exception("No EAP failure reported")
    dev.request("WPS_CANCEL")
    dev.wait_disconnected()
    for i in range(5):
        try:
            dev.flush_scan_cache()
            break
        except Exception, e:
            if str(e).startswith("Failed to trigger scan"):
                # Try again
                time.sleep(1)
            else:
                raise

def wps_run_pbc_fail(apdev, dev):
    hapd = wps_start_ap(apdev)
    wps_run_pbc_fail_ap(apdev, dev, hapd)

def test_ap_wps_pk_oom(dev, apdev):
    """WPS and public key OOM"""
    with alloc_fail(dev[0], 1, "wps_build_public_key"):
        wps_run_pbc_fail(apdev[0], dev[0])

def test_ap_wps_pk_oom_ap(dev, apdev):
    """WPS and public key OOM on AP"""
    hapd = wps_start_ap(apdev[0])
    with alloc_fail(hapd, 1, "wps_build_public_key"):
        wps_run_pbc_fail_ap(apdev[0], dev[0], hapd)

def test_ap_wps_encr_oom_ap(dev, apdev):
    """WPS and encrypted settings decryption OOM on AP"""
    hapd = wps_start_ap(apdev[0])
    pin = dev[0].wps_read_pin()
    hapd.request("WPS_PIN any " + pin)
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    with alloc_fail(hapd, 1, "wps_decrypt_encr_settings"):
        dev[0].request("WPS_PIN " + apdev[0]['bssid'] + " " + pin)
        ev = hapd.wait_event(["WPS-FAIL"], timeout=10)
        if ev is None:
            raise Exception("No WPS-FAIL reported")
        dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()

def test_ap_wps_encr_no_random_ap(dev, apdev):
    """WPS and no random data available for encryption on AP"""
    hapd = wps_start_ap(apdev[0])
    with fail_test(hapd, 1, "os_get_random;wps_build_encr_settings"):
        wps_run_pbc_fail_ap(apdev[0], dev[0], hapd)

def test_ap_wps_e_hash_no_random_sta(dev, apdev):
    """WPS and no random data available for e-hash on STA"""
    with fail_test(dev[0], 1, "os_get_random;wps_build_e_hash"):
        wps_run_pbc_fail(apdev[0], dev[0])

def test_ap_wps_m1_no_random(dev, apdev):
    """WPS and no random for M1 on STA"""
    with fail_test(dev[0], 1, "os_get_random;wps_build_m1"):
        wps_run_pbc_fail(apdev[0], dev[0])

def test_ap_wps_m1_oom(dev, apdev):
    """WPS and OOM for M1 on STA"""
    with alloc_fail(dev[0], 1, "wps_build_m1"):
        wps_run_pbc_fail(apdev[0], dev[0])

def test_ap_wps_m3_oom(dev, apdev):
    """WPS and OOM for M3 on STA"""
    with alloc_fail(dev[0], 1, "wps_build_m3"):
        wps_run_pbc_fail(apdev[0], dev[0])

def test_ap_wps_m5_oom(dev, apdev):
    """WPS and OOM for M5 on STA"""
    hapd = wps_start_ap(apdev[0])
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    for i in range(1, 3):
        with alloc_fail(dev[0], i, "wps_build_m5"):
            dev[0].request("WPS_PBC " + apdev[0]['bssid'])
            ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
            if ev is None:
                raise Exception("No EAP failure reported")
            dev[0].request("WPS_CANCEL")
            dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_ap_wps_m5_no_random(dev, apdev):
    """WPS and no random for M5 on STA"""
    with fail_test(dev[0], 1,
                   "os_get_random;wps_build_encr_settings;wps_build_m5"):
        wps_run_pbc_fail(apdev[0], dev[0])

def test_ap_wps_m7_oom(dev, apdev):
    """WPS and OOM for M7 on STA"""
    hapd = wps_start_ap(apdev[0])
    hapd.request("WPS_PBC")
    dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
    for i in range(1, 3):
        with alloc_fail(dev[0], i, "wps_build_m7"):
            dev[0].request("WPS_PBC " + apdev[0]['bssid'])
            ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
            if ev is None:
                raise Exception("No EAP failure reported")
            dev[0].request("WPS_CANCEL")
            dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_ap_wps_m7_no_random(dev, apdev):
    """WPS and no random for M7 on STA"""
    with fail_test(dev[0], 1,
                   "os_get_random;wps_build_encr_settings;wps_build_m7"):
        wps_run_pbc_fail(apdev[0], dev[0])

def test_ap_wps_wsc_done_oom(dev, apdev):
    """WPS and OOM for WSC_Done on STA"""
    with alloc_fail(dev[0], 1, "wps_build_wsc_done"):
        wps_run_pbc_fail(apdev[0], dev[0])

def test_ap_wps_random_psk_fail(dev, apdev):
    """WPS and no random for PSK on AP"""
    ssid = "test-wps"
    pskfile = "/tmp/ap_wps_per_enrollee_psk.psk_file"
    appin = "12345670"
    try:
        os.remove(pskfile)
    except:
        pass

    try:
        with open(pskfile, "w") as f:
            f.write("# WPA PSKs\n")

        params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
                   "wpa": "2", "wpa_key_mgmt": "WPA-PSK",
                   "rsn_pairwise": "CCMP", "ap_pin": appin,
                   "wpa_psk_file": pskfile }
        hapd = hostapd.add_ap(apdev[0]['ifname'], params)

        dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
        with fail_test(hapd, 1, "os_get_random;wps_build_cred_network_key"):
            dev[0].request("WPS_REG " + apdev[0]['bssid'] + " " + appin)
            ev = dev[0].wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=10)
            if ev is None:
                raise Exception("No EAP failure reported")
            dev[0].request("WPS_CANCEL")
        dev[0].wait_disconnected()

        with fail_test(hapd, 1, "os_get_random;wps_build_cred"):
            wps_run_pbc_fail_ap(apdev[0], dev[0], hapd)

        with alloc_fail(hapd, 1, "wps_build_cred"):
            wps_run_pbc_fail_ap(apdev[0], dev[0], hapd)

        with alloc_fail(hapd, 2, "wps_build_cred"):
            wps_run_pbc_fail_ap(apdev[0], dev[0], hapd)
    finally:
        os.remove(pskfile)

def wps_ext_eap_identity_req(dev, hapd, bssid):
    logger.debug("EAP-Identity/Request")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX from hostapd")
    res = dev.request("EAPOL_RX " + bssid + " " + ev.split(' ')[2])
    if "OK" not in res:
        raise Exception("EAPOL_RX to wpa_supplicant failed")

def wps_ext_eap_identity_resp(hapd, dev, addr):
    ev = dev.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX from wpa_supplicant")
    res = hapd.request("EAPOL_RX " + addr + " " + ev.split(' ')[2])
    if "OK" not in res:
        raise Exception("EAPOL_RX to hostapd failed")

def wps_ext_eap_wsc(dst, src, src_addr, msg):
    logger.debug(msg)
    ev = src.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    res = dst.request("EAPOL_RX " + src_addr + " " + ev.split(' ')[2])
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")

def wps_start_ext(apdev, dev, pbc=False, pin=None):
    addr = dev.own_addr()
    bssid = apdev['bssid']
    ssid = "test-wps-conf"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"}
    hapd = hostapd.add_ap(apdev['ifname'], params)

    if pbc:
        hapd.request("WPS_PBC")
    else:
        if pin is None:
            pin = dev.wps_read_pin()
        hapd.request("WPS_PIN any " + pin)
    dev.scan_for_bss(bssid, freq="2412")
    hapd.request("SET ext_eapol_frame_io 1")
    dev.request("SET ext_eapol_frame_io 1")

    if pbc:
        dev.request("WPS_PBC " + bssid)
    else:
        dev.request("WPS_PIN " + bssid + " " + pin)
    return addr,bssid,hapd

def wps_auth_corrupt(dst, src, addr):
    ev = src.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    src.request("SET ext_eapol_frame_io 0")
    dst.request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[-24:-16] != '10050008':
        raise Exception("Could not find Authenticator attribute")
    # Corrupt Authenticator value
    msg = msg[:-1] + '%x' % ((int(msg[-1], 16) + 1) % 16)
    res = dst.request("EAPOL_RX " + addr + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")

def wps_fail_finish(hapd, dev, fail_str):
    ev = hapd.wait_event(["WPS-FAIL"], timeout=5)
    if ev is None:
        raise Exception("WPS-FAIL not indicated")
    if fail_str not in ev:
        raise Exception("Unexpected WPS-FAIL value: " + ev)
    dev.request("WPS_CANCEL")
    dev.wait_disconnected()

def wps_auth_corrupt_from_ap(dev, hapd, bssid, fail_str):
    wps_auth_corrupt(dev, hapd, bssid)
    wps_fail_finish(hapd, dev, fail_str)

def wps_auth_corrupt_to_ap(dev, hapd, addr, fail_str):
    wps_auth_corrupt(hapd, dev, addr)
    wps_fail_finish(hapd, dev, fail_str)

def test_ap_wps_authenticator_mismatch_m2(dev, apdev):
    """WPS and Authenticator attribute mismatch in M2"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    wps_auth_corrupt_from_ap(dev[0], hapd, bssid, "msg=5")

def test_ap_wps_authenticator_mismatch_m3(dev, apdev):
    """WPS and Authenticator attribute mismatch in M3"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M2")
    logger.debug("M3")
    wps_auth_corrupt_to_ap(dev[0], hapd, addr, "msg=7")

def test_ap_wps_authenticator_mismatch_m4(dev, apdev):
    """WPS and Authenticator attribute mismatch in M4"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M2")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M3")
    logger.debug("M4")
    wps_auth_corrupt_from_ap(dev[0], hapd, bssid, "msg=8")

def test_ap_wps_authenticator_mismatch_m5(dev, apdev):
    """WPS and Authenticator attribute mismatch in M5"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M2")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M3")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M4")
    logger.debug("M5")
    wps_auth_corrupt_to_ap(dev[0], hapd, addr, "msg=9")

def test_ap_wps_authenticator_mismatch_m6(dev, apdev):
    """WPS and Authenticator attribute mismatch in M6"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M2")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M3")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M4")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M5")
    logger.debug("M6")
    wps_auth_corrupt_from_ap(dev[0], hapd, bssid, "msg=10")

def test_ap_wps_authenticator_mismatch_m7(dev, apdev):
    """WPS and Authenticator attribute mismatch in M7"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M2")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M3")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M4")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M5")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M6")
    logger.debug("M7")
    wps_auth_corrupt_to_ap(dev[0], hapd, addr, "msg=11")

def test_ap_wps_authenticator_mismatch_m8(dev, apdev):
    """WPS and Authenticator attribute mismatch in M8"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M2")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M3")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M4")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M5")
    wps_ext_eap_wsc(dev[0], hapd, bssid, "M6")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M7")
    logger.debug("M8")
    wps_auth_corrupt_from_ap(dev[0], hapd, bssid, "msg=12")

def test_ap_wps_authenticator_missing_m2(dev, apdev):
    """WPS and Authenticator attribute missing from M2"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[-24:-16] != '10050008':
        raise Exception("Could not find Authenticator attribute")
    # Remove Authenticator value
    msg = msg[:-24]
    mlen = "%04x" % (int(msg[4:8], 16) - 12)
    msg = msg[0:4] + mlen + msg[8:12] + mlen + msg[16:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    wps_fail_finish(hapd, dev[0], "msg=5")

def test_ap_wps_m2_dev_passwd_id_p2p(dev, apdev):
    """WPS and M2 with different Device Password ID (P2P)"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[722:730] != '10120002':
        raise Exception("Could not find Device Password ID attribute")
    # Replace Device Password ID value. This will fail Authenticator check, but
    # allows the code path in wps_process_dev_pw_id() to be checked from debug
    # log.
    msg = msg[0:730] + "0005" + msg[734:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    wps_fail_finish(hapd, dev[0], "msg=5")

def test_ap_wps_m2_dev_passwd_id_change_pin_to_pbc(dev, apdev):
    """WPS and M2 with different Device Password ID (PIN to PBC)"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[722:730] != '10120002':
        raise Exception("Could not find Device Password ID attribute")
    # Replace Device Password ID value (PIN --> PBC). This will be rejected.
    msg = msg[0:730] + "0004" + msg[734:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    wps_fail_finish(hapd, dev[0], "msg=5")

def test_ap_wps_m2_dev_passwd_id_change_pbc_to_pin(dev, apdev):
    """WPS and M2 with different Device Password ID (PBC to PIN)"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[722:730] != '10120002':
        raise Exception("Could not find Device Password ID attribute")
    # Replace Device Password ID value. This will fail Authenticator check, but
    # allows the code path in wps_process_dev_pw_id() to be checked from debug
    # log.
    msg = msg[0:730] + "0000" + msg[734:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    wps_fail_finish(hapd, dev[0], "msg=5")
    dev[0].flush_scan_cache()

def test_ap_wps_m2_missing_dev_passwd_id(dev, apdev):
    """WPS and M2 without Device Password ID"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[722:730] != '10120002':
        raise Exception("Could not find Device Password ID attribute")
    # Remove Device Password ID value. This will fail Authenticator check, but
    # allows the code path in wps_process_dev_pw_id() to be checked from debug
    # log.
    mlen = "%04x" % (int(msg[4:8], 16) - 6)
    msg = msg[0:4] + mlen + msg[8:12] + mlen + msg[16:722] + msg[734:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    wps_fail_finish(hapd, dev[0], "msg=5")

def test_ap_wps_m2_missing_registrar_nonce(dev, apdev):
    """WPS and M2 without Registrar Nonce"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[96:104] != '10390010':
        raise Exception("Could not find Registrar Nonce attribute")
    # Remove Registrar Nonce. This will fail Authenticator check, but
    # allows the code path in wps_process_registrar_nonce() to be checked from
    # the debug log.
    mlen = "%04x" % (int(msg[4:8], 16) - 20)
    msg = msg[0:4] + mlen + msg[8:12] + mlen + msg[16:96] + msg[136:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECT"], timeout=5)
    if ev is None:
        raise Exception("Disconnect event not seen")
    dev[0].request("WPS_CANCEL")
    dev[0].flush_scan_cache()

def test_ap_wps_m2_missing_enrollee_nonce(dev, apdev):
    """WPS and M2 without Enrollee Nonce"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[56:64] != '101a0010':
        raise Exception("Could not find enrollee Nonce attribute")
    # Remove Enrollee Nonce. This will fail Authenticator check, but
    # allows the code path in wps_process_enrollee_nonce() to be checked from
    # the debug log.
    mlen = "%04x" % (int(msg[4:8], 16) - 20)
    msg = msg[0:4] + mlen + msg[8:12] + mlen + msg[16:56] + msg[96:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECT"], timeout=5)
    if ev is None:
        raise Exception("Disconnect event not seen")
    dev[0].request("WPS_CANCEL")
    dev[0].flush_scan_cache()

def test_ap_wps_m2_missing_uuid_r(dev, apdev):
    """WPS and M2 without UUID-R"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[136:144] != '10480010':
        raise Exception("Could not find enrollee Nonce attribute")
    # Remove UUID-R. This will fail Authenticator check, but allows the code
    # path in wps_process_uuid_r() to be checked from the debug log.
    mlen = "%04x" % (int(msg[4:8], 16) - 20)
    msg = msg[0:4] + mlen + msg[8:12] + mlen + msg[16:136] + msg[176:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECT"], timeout=5)
    if ev is None:
        raise Exception("Disconnect event not seen")
    dev[0].request("WPS_CANCEL")
    dev[0].flush_scan_cache()

def test_ap_wps_m2_invalid(dev, apdev):
    """WPS and M2 parsing failure"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[136:144] != '10480010':
        raise Exception("Could not find enrollee Nonce attribute")
    # Remove UUID-R. This will fail Authenticator check, but allows the code
    # path in wps_process_uuid_r() to be checked from the debug log.
    mlen = "%04x" % (int(msg[4:8], 16) - 1)
    msg = msg[0:4] + mlen + msg[8:12] + mlen + msg[16:-2]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECT"], timeout=5)
    if ev is None:
        raise Exception("Disconnect event not seen")
    dev[0].request("WPS_CANCEL")
    dev[0].flush_scan_cache()

def test_ap_wps_m2_missing_msg_type(dev, apdev):
    """WPS and M2 without Message Type"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[46:54] != '10220001':
        raise Exception("Could not find Message Type attribute")
    # Remove Message Type. This will fail Authenticator check, but allows the
    # code path in wps_process_wsc_msg() to be checked from the debug log.
    mlen = "%04x" % (int(msg[4:8], 16) - 5)
    msg = msg[0:4] + mlen + msg[8:12] + mlen + msg[16:46] + msg[56:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECT"], timeout=5)
    if ev is None:
        raise Exception("Disconnect event not seen")
    dev[0].request("WPS_CANCEL")
    dev[0].flush_scan_cache()

def test_ap_wps_m2_unknown_msg_type(dev, apdev):
    """WPS and M2 but unknown Message Type"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[46:54] != '10220001':
        raise Exception("Could not find Message Type attribute")
    # Replace Message Type value. This will be rejected.
    msg = msg[0:54] + "00" + msg[56:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECT"], timeout=5)
    if ev is None:
        raise Exception("Disconnect event not seen")
    dev[0].request("WPS_CANCEL")
    dev[0].flush_scan_cache()

def test_ap_wps_m2_unknown_opcode(dev, apdev):
    """WPS and M2 but unknown opcode"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    # Replace opcode. This will be discarded in EAP-WSC processing.
    msg = msg[0:32] + "00" + msg[34:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_ap_wps_m2_unknown_opcode2(dev, apdev):
    """WPS and M2 but unknown opcode (WSC_Start)"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    # Replace opcode. This will be discarded in EAP-WSC processing.
    msg = msg[0:32] + "01" + msg[34:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_ap_wps_m2_unknown_opcode3(dev, apdev):
    """WPS and M2 but unknown opcode (WSC_Done)"""
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev[0], addr, "M1")
    logger.debug("M2")
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    # Replace opcode. This will be discarded in WPS Enrollee processing.
    msg = msg[0:32] + "05" + msg[34:]
    res = dev[0].request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def wps_m2_but_other(dev, apdev, title, msgtype):
    addr,bssid,hapd = wps_start_ext(apdev, dev)
    wps_ext_eap_identity_req(dev, hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev, addr)
    wps_ext_eap_wsc(dev, hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev, addr, "M1")
    logger.debug(title)
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev.request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[46:54] != '10220001':
        raise Exception("Could not find Message Type attribute")
    # Replace Message Type value. This will be rejected.
    msg = msg[0:54] + msgtype + msg[56:]
    res = dev.request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    ev = dev.wait_event(["WPS-FAIL"], timeout=5)
    if ev is None:
        raise Exception("WPS-FAIL event not seen")
    dev.request("WPS_CANCEL")
    dev.wait_disconnected()

def wps_m4_but_other(dev, apdev, title, msgtype):
    addr,bssid,hapd = wps_start_ext(apdev, dev)
    wps_ext_eap_identity_req(dev, hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev, addr)
    wps_ext_eap_wsc(dev, hapd, bssid, "EAP-WSC/Start")
    wps_ext_eap_wsc(hapd, dev, addr, "M1")
    wps_ext_eap_wsc(dev, hapd, bssid, "M2")
    wps_ext_eap_wsc(hapd, dev, addr, "M3")
    logger.debug(title)
    ev = hapd.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    hapd.request("SET ext_eapol_frame_io 0")
    dev.request("SET ext_eapol_frame_io 0")
    msg = ev.split(' ')[2]
    if msg[46:54] != '10220001':
        raise Exception("Could not find Message Type attribute")
    # Replace Message Type value. This will be rejected.
    msg = msg[0:54] + msgtype + msg[56:]
    res = dev.request("EAPOL_RX " + bssid + " " + msg)
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")
    ev = hapd.wait_event(["WPS-FAIL"], timeout=5)
    if ev is None:
        raise Exception("WPS-FAIL event not seen")
    dev.request("WPS_CANCEL")
    dev.wait_disconnected()

def test_ap_wps_m2_msg_type_m4(dev, apdev):
    """WPS and M2 but Message Type M4"""
    wps_m2_but_other(dev[0], apdev[0], "M2/M4", "08")

def test_ap_wps_m2_msg_type_m6(dev, apdev):
    """WPS and M2 but Message Type M6"""
    wps_m2_but_other(dev[0], apdev[0], "M2/M6", "0a")

def test_ap_wps_m2_msg_type_m8(dev, apdev):
    """WPS and M2 but Message Type M8"""
    wps_m2_but_other(dev[0], apdev[0], "M2/M8", "0c")

def test_ap_wps_m4_msg_type_m2(dev, apdev):
    """WPS and M4 but Message Type M2"""
    wps_m4_but_other(dev[0], apdev[0], "M4/M2", "05")

def test_ap_wps_m4_msg_type_m2d(dev, apdev):
    """WPS and M4 but Message Type M2D"""
    wps_m4_but_other(dev[0], apdev[0], "M4/M2D", "06")

def test_ap_wps_config_methods(dev, apdev):
    """WPS configuration method parsing"""
    ssid = "test-wps-conf"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
               "config_methods": "ethernet display ext_nfc_token int_nfc_token physical_display physical_push_button" }
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
               "config_methods": "display push_button" }
    hapd2 = hostapd.add_ap(apdev[1]['ifname'], params)

def test_ap_wps_set_selected_registrar_proto(dev, apdev):
    """WPS UPnP SetSelectedRegistrar protocol testing"""
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hapd = add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    location = ssdp_get_location(ap_uuid)
    urls = upnp_get_urls(location)
    eventurl = urlparse.urlparse(urls['event_sub_url'])
    ctrlurl = urlparse.urlparse(urls['control_url'])
    url = urlparse.urlparse(location)
    conn = httplib.HTTPConnection(url.netloc)

    class WPSERHTTPServer(SocketServer.StreamRequestHandler):
        def handle(self):
            data = self.rfile.readline().strip()
            logger.debug(data)
            self.wfile.write(gen_wps_event())

    server = MyTCPServer(("127.0.0.1", 12345), WPSERHTTPServer)
    server.timeout = 1

    headers = { "callback": '<http://127.0.0.1:12345/event>',
                "NT": "upnp:event",
                "timeout": "Second-1234" }
    conn.request("SUBSCRIBE", eventurl.path, "\r\n\r\n", headers)
    resp = conn.getresponse()
    if resp.status != 200:
        raise Exception("Unexpected HTTP response: %d" % resp.status)
    sid = resp.getheader("sid")
    logger.debug("Subscription SID " + sid)
    server.handle_request()

    tests = [ (500, "10"),
              (200, "104a000110" + "1041000101" + "101200020000" +
               "105300023148" +
               "1049002c00372a0001200124111111111111222222222222333333333333444444444444555555555555666666666666" +
               "10480010362db47ba53a519188fb5458b986b2e4"),
              (200, "104a000110" + "1041000100" + "101200020000" +
               "105300020000"),
              (200, "104a000110" + "1041000100"),
              (200, "104a000110") ]
    for status,test in tests:
        tlvs = binascii.unhexlify(test)
        newmsg = base64.b64encode(tlvs)
        msg = '<?xml version="1.0"?>\n'
        msg += '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">'
        msg += '<s:Body>'
        msg += '<u:SetSelectedRegistrar xmlns:u="urn:schemas-wifialliance-org:service:WFAWLANConfig:1">'
        msg += '<NewMessage>'
        msg += newmsg
        msg += "</NewMessage></u:SetSelectedRegistrar></s:Body></s:Envelope>"
        headers = { "Content-type": 'text/xml; charset="utf-8"' }
        headers["SOAPAction"] = '"urn:schemas-wifialliance-org:service:WFAWLANConfig:1#%s"' % "SetSelectedRegistrar"
        conn.request("POST", ctrlurl.path, msg, headers)
        resp = conn.getresponse()
        if resp.status != status:
            raise Exception("Unexpected HTTP response: %d (expected %d)" % (resp.status, status))

def test_ap_wps_adv_oom(dev, apdev):
    """WPS AP and advertisement OOM"""
    ap_uuid = "27ea801a-9e5c-4e73-bd82-f89cbcd10d7e"
    hapd = add_ssdp_ap(apdev[0]['ifname'], ap_uuid)

    with alloc_fail(hapd, 1, "=msearchreply_state_machine_start"):
        ssdp_send_msearch("urn:schemas-wifialliance-org:service:WFAWLANConfig:1",
                          no_recv=True)
        time.sleep(0.2)

    with alloc_fail(hapd, 1, "eloop_register_timeout;msearchreply_state_machine_start"):
        ssdp_send_msearch("urn:schemas-wifialliance-org:service:WFAWLANConfig:1",
                          no_recv=True)
        time.sleep(0.2)

    with alloc_fail(hapd, 1,
                    "next_advertisement;advertisement_state_machine_stop"):
        hapd.disable()

    with alloc_fail(hapd, 1, "ssdp_listener_start"):
        if "FAIL" not in hapd.request("ENABLE"):
            raise Exception("ENABLE succeeded during OOM")

def test_wps_config_methods(dev):
    """WPS config method update"""
    wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
    wpas.interface_add("wlan5")
    if "OK" not in wpas.request("SET config_methods display label"):
        raise Exception("Failed to set config_methods")
    if wpas.request("GET config_methods").strip() != "display label":
        raise Exception("config_methods were not updated")
    if "OK" not in wpas.request("SET config_methods "):
        raise Exception("Failed to clear config_methods")
    if wpas.request("GET config_methods").strip() != "":
        raise Exception("config_methods were not cleared")

WPS_VENDOR_ID_WFA = 14122
WPS_VENDOR_TYPE = 1

# EAP-WSC Op-Code values
WSC_Start = 0x01
WSC_ACK = 0x02
WSC_NACK = 0x03
WSC_MSG = 0x04
WSC_Done = 0x05
WSC_FRAG_ACK = 0x06

ATTR_AP_CHANNEL = 0x1001
ATTR_ASSOC_STATE = 0x1002
ATTR_AUTH_TYPE = 0x1003
ATTR_AUTH_TYPE_FLAGS = 0x1004
ATTR_AUTHENTICATOR = 0x1005
ATTR_CONFIG_METHODS = 0x1008
ATTR_CONFIG_ERROR = 0x1009
ATTR_CONFIRM_URL4 = 0x100a
ATTR_CONFIRM_URL6 = 0x100b
ATTR_CONN_TYPE = 0x100c
ATTR_CONN_TYPE_FLAGS = 0x100d
ATTR_CRED = 0x100e
ATTR_ENCR_TYPE = 0x100f
ATTR_ENCR_TYPE_FLAGS = 0x1010
ATTR_DEV_NAME = 0x1011
ATTR_DEV_PASSWORD_ID = 0x1012
ATTR_E_HASH1 = 0x1014
ATTR_E_HASH2 = 0x1015
ATTR_E_SNONCE1 = 0x1016
ATTR_E_SNONCE2 = 0x1017
ATTR_ENCR_SETTINGS = 0x1018
ATTR_ENROLLEE_NONCE = 0x101a
ATTR_FEATURE_ID = 0x101b
ATTR_IDENTITY = 0x101c
ATTR_IDENTITY_PROOF = 0x101d
ATTR_KEY_WRAP_AUTH = 0x101e
ATTR_KEY_ID = 0x101f
ATTR_MAC_ADDR = 0x1020
ATTR_MANUFACTURER = 0x1021
ATTR_MSG_TYPE = 0x1022
ATTR_MODEL_NAME = 0x1023
ATTR_MODEL_NUMBER = 0x1024
ATTR_NETWORK_INDEX = 0x1026
ATTR_NETWORK_KEY = 0x1027
ATTR_NETWORK_KEY_INDEX = 0x1028
ATTR_NEW_DEVICE_NAME = 0x1029
ATTR_NEW_PASSWORD = 0x102a
ATTR_OOB_DEVICE_PASSWORD = 0x102c
ATTR_OS_VERSION = 0x102d
ATTR_POWER_LEVEL = 0x102f
ATTR_PSK_CURRENT = 0x1030
ATTR_PSK_MAX = 0x1031
ATTR_PUBLIC_KEY = 0x1032
ATTR_RADIO_ENABLE = 0x1033
ATTR_REBOOT = 0x1034
ATTR_REGISTRAR_CURRENT = 0x1035
ATTR_REGISTRAR_ESTABLISHED = 0x1036
ATTR_REGISTRAR_LIST = 0x1037
ATTR_REGISTRAR_MAX = 0x1038
ATTR_REGISTRAR_NONCE = 0x1039
ATTR_REQUEST_TYPE = 0x103a
ATTR_RESPONSE_TYPE = 0x103b
ATTR_RF_BANDS = 0x103c
ATTR_R_HASH1 = 0x103d
ATTR_R_HASH2 = 0x103e
ATTR_R_SNONCE1 = 0x103f
ATTR_R_SNONCE2 = 0x1040
ATTR_SELECTED_REGISTRAR = 0x1041
ATTR_SERIAL_NUMBER = 0x1042
ATTR_WPS_STATE = 0x1044
ATTR_SSID = 0x1045
ATTR_TOTAL_NETWORKS = 0x1046
ATTR_UUID_E = 0x1047
ATTR_UUID_R = 0x1048
ATTR_VENDOR_EXT = 0x1049
ATTR_VERSION = 0x104a
ATTR_X509_CERT_REQ = 0x104b
ATTR_X509_CERT = 0x104c
ATTR_EAP_IDENTITY = 0x104d
ATTR_MSG_COUNTER = 0x104e
ATTR_PUBKEY_HASH = 0x104f
ATTR_REKEY_KEY = 0x1050
ATTR_KEY_LIFETIME = 0x1051
ATTR_PERMITTED_CFG_METHODS = 0x1052
ATTR_SELECTED_REGISTRAR_CONFIG_METHODS = 0x1053
ATTR_PRIMARY_DEV_TYPE = 0x1054
ATTR_SECONDARY_DEV_TYPE_LIST = 0x1055
ATTR_PORTABLE_DEV = 0x1056
ATTR_AP_SETUP_LOCKED = 0x1057
ATTR_APPLICATION_EXT = 0x1058
ATTR_EAP_TYPE = 0x1059
ATTR_IV = 0x1060
ATTR_KEY_PROVIDED_AUTO = 0x1061
ATTR_802_1X_ENABLED = 0x1062
ATTR_APPSESSIONKEY = 0x1063
ATTR_WEPTRANSMITKEY = 0x1064
ATTR_REQUESTED_DEV_TYPE = 0x106a

# Message Type
WPS_Beacon = 0x01
WPS_ProbeRequest = 0x02
WPS_ProbeResponse = 0x03
WPS_M1 = 0x04
WPS_M2 = 0x05
WPS_M2D = 0x06
WPS_M3 = 0x07
WPS_M4 = 0x08
WPS_M5 = 0x09
WPS_M6 = 0x0a
WPS_M7 = 0x0b
WPS_M8 = 0x0c
WPS_WSC_ACK = 0x0d
WPS_WSC_NACK = 0x0e
WPS_WSC_DONE = 0x0f

def get_wsc_msg(dev):
    ev = dev.wait_event(["EAPOL-TX"], timeout=10)
    if ev is None:
        raise Exception("Timeout on EAPOL-TX")
    data = binascii.unhexlify(ev.split(' ')[2])
    msg = {}

    # Parse EAPOL header
    if len(data) < 4:
        raise Exception("No room for EAPOL header")
    version,type,length = struct.unpack('>BBH', data[0:4])
    msg['eapol_version'] = version
    msg['eapol_type'] = type
    msg['eapol_length'] = length
    data = data[4:]
    if length != len(data):
        raise Exception("EAPOL header length mismatch (%d != %d)" % (length, len(data)))
    if type != 0:
        raise Exception("Unexpected EAPOL header type: %d" % type)

    # Parse EAP header
    if len(data) < 4:
        raise Exception("No room for EAP header")
    code,identifier,length = struct.unpack('>BBH', data[0:4])
    msg['eap_code'] = code
    msg['eap_identifier'] = identifier
    msg['eap_length'] = length
    data = data[4:]
    if msg['eapol_length'] != msg['eap_length']:
        raise Exception("EAP header length mismatch (%d != %d)" % (msg['eapol_length'], length))

    # Parse EAP expanded header
    if len(data) < 1:
        raise Exception("No EAP type included")
    msg['eap_type'], = struct.unpack('B', data[0])
    data = data[1:]

    if msg['eap_type'] == 254:
        if len(data) < 3 + 4:
            raise Exception("Truncated EAP expanded header")
        msg['eap_vendor_id'], msg['eap_vendor_type'] = struct.unpack('>LL', '\0' + data[0:7])
        data = data[7:]
    else:
        raise Exception("Unexpected EAP type")

    if msg['eap_vendor_id'] != WPS_VENDOR_ID_WFA:
        raise Exception("Unexpected Vendor-Id")
    if msg['eap_vendor_type'] != WPS_VENDOR_TYPE:
        raise Exception("Unexpected Vendor-Type")

    # Parse EAP-WSC header
    if len(data) < 2:
        raise Exception("Truncated EAP-WSC header")
    msg['wsc_opcode'], msg['wsc_flags'] = struct.unpack('BB', data[0:2])
    data = data[2:]

    # Parse WSC attributes
    msg['raw_attrs'] = data
    attrs = {}
    while len(data) > 0:
        if len(data) < 4:
            raise Exception("Truncated attribute header")
        attr,length = struct.unpack('>HH', data[0:4])
        data = data[4:]
        if length > len(data):
            raise Exception("Truncated attribute 0x%04x" % attr)
        attrs[attr] = data[0:length]
        data = data[length:]
    msg['wsc_attrs'] = attrs

    if ATTR_MSG_TYPE in attrs:
        msg['wsc_msg_type'], = struct.unpack('B', attrs[ATTR_MSG_TYPE])

    return msg

def recv_wsc_msg(dev, opcode, msg_type):
    msg = get_wsc_msg(dev)
    if msg['wsc_opcode'] != opcode or msg['wsc_msg_type'] != msg_type:
        raise Exception("Unexpected Op-Code/MsgType")
    return msg, msg['wsc_attrs'], msg['raw_attrs']

def build_wsc_attr(attr, payload):
    return struct.pack('>HH', attr, len(payload)) + payload

def build_attr_msg_type(msg_type):
    return build_wsc_attr(ATTR_MSG_TYPE, struct.pack('B', msg_type))

def build_eap_wsc(eap_code, eap_id, payload, opcode=WSC_MSG):
    length = 4 + 8 + 2 + len(payload)
    # EAPOL header
    msg = struct.pack('>BBH', 2, 0, length)
    # EAP header
    msg += struct.pack('>BBH', eap_code, eap_id, length)
    # EAP expanded header for EAP-WSC
    msg += struct.pack('B', 254)
    msg += struct.pack('>L', WPS_VENDOR_ID_WFA)[1:4]
    msg += struct.pack('>L', WPS_VENDOR_TYPE)
    # EAP-WSC header
    msg += struct.pack('BB', opcode, 0)
    # WSC attributes
    msg += payload
    return msg

def build_eap_success(eap_id):
    length = 4
    # EAPOL header
    msg = struct.pack('>BBH', 2, 0, length)
    # EAP header
    msg += struct.pack('>BBH', 3, eap_id, length)
    return msg

def build_eap_failure(eap_id):
    length = 4
    # EAPOL header
    msg = struct.pack('>BBH', 2, 0, length)
    # EAP header
    msg += struct.pack('>BBH', 4, eap_id, length)
    return msg

def send_wsc_msg(dev, src, msg):
    res = dev.request("EAPOL_RX " + src + " " + binascii.hexlify(msg))
    if "OK" not in res:
        raise Exception("EAPOL_RX failed")

group_5_prime = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF
group_5_generator = 2

def wsc_kdf(key, label, bits):
    result = ''
    i = 1
    while len(result) * 8 < bits:
        data = struct.pack('>L', i) + label + struct.pack('>L', bits)
        m = hmac.new(key, data, hashlib.sha256)
        result += m.digest()
        i += 1
    return result[0:bits / 8]

def wsc_keys(kdk):
    keys = wsc_kdf(kdk, "Wi-Fi Easy and Secure Key Derivation", 640)
    authkey = keys[0:32]
    keywrapkey = keys[32:48]
    emsk = keys[48:80]
    return authkey,keywrapkey,emsk

def wsc_dev_pw_half_psk(authkey, dev_pw):
    m = hmac.new(authkey, dev_pw, hashlib.sha256)
    return m.digest()[0:16]

def wsc_dev_pw_psk(authkey, dev_pw):
    dev_pw_1 = dev_pw[0:len(dev_pw) / 2]
    dev_pw_2 = dev_pw[len(dev_pw) / 2:]
    psk1 = wsc_dev_pw_half_psk(authkey, dev_pw_1)
    psk2 = wsc_dev_pw_half_psk(authkey, dev_pw_2)
    return psk1,psk2

def build_attr_authenticator(authkey, prev_msg, curr_msg):
    m = hmac.new(authkey, prev_msg + curr_msg, hashlib.sha256)
    auth = m.digest()[0:8]
    return build_wsc_attr(ATTR_AUTHENTICATOR, auth)

def build_attr_encr_settings(authkey, keywrapkey, data):
    m = hmac.new(authkey, data, hashlib.sha256)
    kwa = m.digest()[0:8]
    data += build_wsc_attr(ATTR_KEY_WRAP_AUTH, kwa)
    iv = 16*'\x99'
    aes = AES.new(keywrapkey, AES.MODE_CBC, iv)
    pad_len = 16 - len(data) % 16
    ps = pad_len * struct.pack('B', pad_len)
    data += ps
    wrapped = aes.encrypt(data)
    return build_wsc_attr(ATTR_ENCR_SETTINGS, iv + wrapped)

def decrypt_attr_encr_settings(authkey, keywrapkey, data):
    if len(data) < 32 or len(data) % 16 != 0:
        raise Exception("Unexpected Encrypted Settings length: %d" % len(data))
    iv = data[0:16]
    encr = data[16:]
    aes = AES.new(keywrapkey, AES.MODE_CBC, iv)
    decrypted = aes.decrypt(encr)
    pad_len, = struct.unpack('B', decrypted[-1])
    if pad_len > len(decrypted):
        raise Exception("Invalid padding in Encrypted Settings")
    for i in range(-pad_len, -1):
        if decrypted[i] != decrypted[-1]:
            raise Exception("Invalid PS value in Encrypted Settings")
    
    decrypted = decrypted[0:len(decrypted) - pad_len]
    if len(decrypted) < 12:
        raise Exception("Truncated Encrypted Settings plaintext")
    kwa = decrypted[-12:]
    attr,length = struct.unpack(">HH", kwa[0:4])
    if attr != ATTR_KEY_WRAP_AUTH or length != 8:
        raise Exception("Invalid KWA header")
    kwa = kwa[4:]
    decrypted = decrypted[0:len(decrypted) - 12]

    m = hmac.new(authkey, decrypted, hashlib.sha256)
    calc_kwa = m.digest()[0:8]
    if kwa != calc_kwa:
        raise Exception("KWA mismatch")

    return decrypted

def zeropad_str(val, pad_len):
    while len(val) < pad_len * 2:
        val = '0' + val
    return val

def wsc_dh_init():
    # For now, use a hardcoded private key. In theory, this is supposed to be
    # randomly selected.
    own_private = 0x123456789
    own_public = pow(group_5_generator, own_private, group_5_prime)
    pk = binascii.unhexlify(zeropad_str(format(own_public, '02x'), 192))
    return own_private, pk

def wsc_dh_kdf(peer_pk, own_private, mac_addr, e_nonce, r_nonce):
    peer_public = long(binascii.hexlify(peer_pk), 16)
    if peer_public < 2 or peer_public >= group_5_prime:
        raise Exception("Invalid peer public key")
    if pow(peer_public, (group_5_prime - 1) / 2, group_5_prime) != 1:
        raise Exception("Unexpected Legendre symbol for peer public key")

    shared_secret = pow(peer_public, own_private, group_5_prime)
    ss = zeropad_str(format(shared_secret, "02x"), 192)
    logger.debug("DH shared secret: " + ss)

    dhkey = hashlib.sha256(binascii.unhexlify(ss)).digest()
    logger.debug("DHKey: " + binascii.hexlify(dhkey))

    m = hmac.new(dhkey, e_nonce + mac_addr + r_nonce, hashlib.sha256)
    kdk = m.digest()
    logger.debug("KDK: " + binascii.hexlify(kdk))
    authkey,keywrapkey,emsk = wsc_keys(kdk)
    logger.debug("AuthKey: " + binascii.hexlify(authkey))
    logger.debug("KeyWrapKey: " + binascii.hexlify(keywrapkey))
    logger.debug("EMSK: " + binascii.hexlify(emsk))
    return authkey,keywrapkey

def wsc_dev_pw_hash(authkey, dev_pw, e_pk, r_pk):
    psk1,psk2 = wsc_dev_pw_psk(authkey, dev_pw)
    logger.debug("PSK1: " + binascii.hexlify(psk1))
    logger.debug("PSK2: " + binascii.hexlify(psk2))

    # Note: Secret values are supposed to be random, but hardcoded values are
    # fine for testing.
    s1 = 16*'\x77'
    m = hmac.new(authkey, s1 + psk1 + e_pk + r_pk, hashlib.sha256)
    hash1 = m.digest()
    logger.debug("Hash1: " + binascii.hexlify(hash1))

    s2 = 16*'\x88'
    m = hmac.new(authkey, s2 + psk2 + e_pk + r_pk, hashlib.sha256)
    hash2 = m.digest()
    logger.debug("Hash2: " + binascii.hexlify(hash2))
    return s1,s2,hash1,hash2

def build_m1(eap_id, uuid_e, mac_addr, e_nonce, e_pk,
             manufacturer='', model_name='', config_methods='\x00\x00'):
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M1)
    attrs += build_wsc_attr(ATTR_UUID_E, uuid_e)
    attrs += build_wsc_attr(ATTR_MAC_ADDR, mac_addr)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_PUBLIC_KEY, e_pk)
    attrs += build_wsc_attr(ATTR_AUTH_TYPE_FLAGS, '\x00\x00')
    attrs += build_wsc_attr(ATTR_ENCR_TYPE_FLAGS, '\x00\x00')
    attrs += build_wsc_attr(ATTR_CONN_TYPE_FLAGS, '\x00')
    attrs += build_wsc_attr(ATTR_CONFIG_METHODS, config_methods)
    attrs += build_wsc_attr(ATTR_WPS_STATE, '\x00')
    attrs += build_wsc_attr(ATTR_MANUFACTURER, manufacturer)
    attrs += build_wsc_attr(ATTR_MODEL_NAME, model_name)
    attrs += build_wsc_attr(ATTR_MODEL_NUMBER, '')
    attrs += build_wsc_attr(ATTR_SERIAL_NUMBER, '')
    attrs += build_wsc_attr(ATTR_PRIMARY_DEV_TYPE, 8*'\x00')
    attrs += build_wsc_attr(ATTR_DEV_NAME, '')
    attrs += build_wsc_attr(ATTR_RF_BANDS, '\x00')
    attrs += build_wsc_attr(ATTR_ASSOC_STATE, '\x00\x00')
    attrs += build_wsc_attr(ATTR_DEV_PASSWORD_ID, '\x00\x00')
    attrs += build_wsc_attr(ATTR_CONFIG_ERROR, '\x00\x00')
    attrs += build_wsc_attr(ATTR_OS_VERSION, '\x00\x00\x00\x00')
    m1 = build_eap_wsc(2, eap_id, attrs)
    return m1, attrs

def build_m2(authkey, m1, eap_id, e_nonce, r_nonce, uuid_r, r_pk,
             dev_pw_id='\x00\x00', eap_code=1):
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M2)
    if e_nonce:
        attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    if r_nonce:
        attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_UUID_R, uuid_r)
    if r_pk:
        attrs += build_wsc_attr(ATTR_PUBLIC_KEY, r_pk)
    attrs += build_wsc_attr(ATTR_AUTH_TYPE_FLAGS, '\x00\x00')
    attrs += build_wsc_attr(ATTR_ENCR_TYPE_FLAGS, '\x00\x00')
    attrs += build_wsc_attr(ATTR_CONN_TYPE_FLAGS, '\x00')
    attrs += build_wsc_attr(ATTR_CONFIG_METHODS, '\x00\x00')
    attrs += build_wsc_attr(ATTR_MANUFACTURER, '')
    attrs += build_wsc_attr(ATTR_MODEL_NAME, '')
    attrs += build_wsc_attr(ATTR_MODEL_NUMBER, '')
    attrs += build_wsc_attr(ATTR_SERIAL_NUMBER, '')
    attrs += build_wsc_attr(ATTR_PRIMARY_DEV_TYPE, 8*'\x00')
    attrs += build_wsc_attr(ATTR_DEV_NAME, '')
    attrs += build_wsc_attr(ATTR_RF_BANDS, '\x00')
    attrs += build_wsc_attr(ATTR_ASSOC_STATE, '\x00\x00')
    attrs += build_wsc_attr(ATTR_CONFIG_ERROR, '\x00\x00')
    attrs += build_wsc_attr(ATTR_DEV_PASSWORD_ID, dev_pw_id)
    attrs += build_wsc_attr(ATTR_OS_VERSION, '\x00\x00\x00\x00')
    attrs += build_attr_authenticator(authkey, m1, attrs)
    m2 = build_eap_wsc(eap_code, eap_id, attrs)
    return m2, attrs

def build_m2d(m1, eap_id, e_nonce, r_nonce, uuid_r, dev_pw_id=None, eap_code=1):
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M2D)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_UUID_R, uuid_r)
    attrs += build_wsc_attr(ATTR_AUTH_TYPE_FLAGS, '\x00\x00')
    attrs += build_wsc_attr(ATTR_ENCR_TYPE_FLAGS, '\x00\x00')
    attrs += build_wsc_attr(ATTR_CONN_TYPE_FLAGS, '\x00')
    attrs += build_wsc_attr(ATTR_CONFIG_METHODS, '\x00\x00')
    attrs += build_wsc_attr(ATTR_MANUFACTURER, '')
    attrs += build_wsc_attr(ATTR_MODEL_NAME, '')
    #attrs += build_wsc_attr(ATTR_MODEL_NUMBER, '')
    attrs += build_wsc_attr(ATTR_SERIAL_NUMBER, '')
    attrs += build_wsc_attr(ATTR_PRIMARY_DEV_TYPE, 8*'\x00')
    attrs += build_wsc_attr(ATTR_DEV_NAME, '')
    attrs += build_wsc_attr(ATTR_RF_BANDS, '\x00')
    attrs += build_wsc_attr(ATTR_ASSOC_STATE, '\x00\x00')
    attrs += build_wsc_attr(ATTR_CONFIG_ERROR, '\x00\x00')
    attrs += build_wsc_attr(ATTR_OS_VERSION, '\x00\x00\x00\x00')
    if dev_pw_id:
        attrs += build_wsc_attr(ATTR_DEV_PASSWORD_ID, dev_pw_id)
    m2d = build_eap_wsc(eap_code, eap_id, attrs)
    return m2d, attrs

def build_ack(eap_id, e_nonce, r_nonce, msg_type=WPS_WSC_ACK, eap_code=1):
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    if msg_type is not None:
        attrs += build_attr_msg_type(msg_type)
    if e_nonce:
        attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    if r_nonce:
        attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    msg = build_eap_wsc(eap_code, eap_id, attrs, opcode=WSC_ACK)
    return msg, attrs

def build_nack(eap_id, e_nonce, r_nonce, config_error='\x00\x00',
               msg_type=WPS_WSC_NACK, eap_code=1):
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    if msg_type is not None:
        attrs += build_attr_msg_type(msg_type)
    if e_nonce:
        attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    if r_nonce:
        attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    if config_error:
        attrs += build_wsc_attr(ATTR_CONFIG_ERROR, config_error)
    msg = build_eap_wsc(eap_code, eap_id, attrs, opcode=WSC_NACK)
    return msg, attrs

def test_wps_ext(dev, apdev):
    """WPS against external implementation"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")
    wsc_start_id = msg['eap_identifier']

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)

    authkey,keywrapkey = wsc_dh_kdf(m2_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, e_nonce,
                                    m2_attrs[ATTR_REGISTRAR_NONCE])
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk,
                                                m2_attrs[ATTR_PUBLIC_KEY])

    logger.debug("Send M3 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE,
                            m2_attrs[ATTR_REGISTRAR_NONCE])
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    logger.debug("Receive M4 from AP")
    msg, m4_attrs, raw_m4_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M4)

    logger.debug("Send M5 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M5)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE,
                            m2_attrs[ATTR_REGISTRAR_NONCE])
    data = build_wsc_attr(ATTR_E_SNONCE1, e_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m4_attrs, attrs)
    raw_m5_attrs = attrs
    m5 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m5)

    logger.debug("Receive M6 from AP")
    msg, m6_attrs, raw_m6_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M6)

    logger.debug("Send M7 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M7)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE,
                            m2_attrs[ATTR_REGISTRAR_NONCE])
    data = build_wsc_attr(ATTR_E_SNONCE2, e_s2)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m6_attrs, attrs)
    m7 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    raw_m7_attrs = attrs
    send_wsc_msg(hapd, addr, m7)

    logger.debug("Receive M8 from AP")
    msg, m8_attrs, raw_m8_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M8)
    m8_cred = decrypt_attr_encr_settings(authkey, keywrapkey,
                                         m8_attrs[ATTR_ENCR_SETTINGS])
    logger.debug("M8 Credential: " + binascii.hexlify(m8_cred))

    logger.debug("Prepare WSC_Done")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_WSC_DONE)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE,
                            m2_attrs[ATTR_REGISTRAR_NONCE])
    wsc_done = build_eap_wsc(2, msg['eap_identifier'], attrs, opcode=WSC_Done)
    # Do not send WSC_Done yet to allow exchangw with STA complete before the
    # AP disconnects.

    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'

    eap_id = wsc_start_id
    logger.debug("Send WSC/Start to STA")
    wsc_start = build_eap_wsc(1, eap_id, "", opcode=WSC_Start)
    send_wsc_msg(dev[0], bssid, wsc_start)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M1 from STA")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M1)

    authkey,keywrapkey = wsc_dh_kdf(m1_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, m1_attrs[ATTR_ENROLLEE_NONCE],
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, pin,
                                                m1_attrs[ATTR_PUBLIC_KEY], e_pk)

    logger.debug("Send M2 to STA")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, eap_id,
                                m1_attrs[ATTR_ENROLLEE_NONCE],
                                r_nonce, uuid_r, e_pk)
    send_wsc_msg(dev[0], bssid, m2)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M3 from STA")
    msg, m3_attrs, raw_m3_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M3)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, m1_attrs[ATTR_ENROLLEE_NONCE])
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m3_attrs, attrs)
    raw_m4_attrs = attrs
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 from STA")
    msg, m5_attrs, raw_m5_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M5)

    logger.debug("Send M6 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M6)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE,
                            m1_attrs[ATTR_ENROLLEE_NONCE])
    data = build_wsc_attr(ATTR_R_SNONCE2, r_s2)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m5_attrs, attrs)
    raw_m6_attrs = attrs
    m6 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m6)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M7 from STA")
    msg, m7_attrs, raw_m7_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M7)

    logger.debug("Send M8 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M8)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE,
                            m1_attrs[ATTR_ENROLLEE_NONCE])
    attrs += build_attr_encr_settings(authkey, keywrapkey, m8_cred)
    attrs += build_attr_authenticator(authkey, raw_m7_attrs, attrs)
    raw_m8_attrs = attrs
    m8 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m8)
    eap_id = (eap_id + 1) % 256

    ev = dev[0].wait_event(["WPS-CRED-RECEIVED"], timeout=5)
    if ev is None:
        raise Exception("wpa_supplicant did not report credential")

    logger.debug("Receive WSC_Done from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_Done or msg['wsc_msg_type'] != WPS_WSC_DONE:
        raise Exception("Unexpected Op-Code/MsgType for WSC_Done")

    logger.debug("Send WSC_Done to AP")
    hapd.request("SET ext_eapol_frame_io 0")
    dev[0].request("SET ext_eapol_frame_io 0")
    send_wsc_msg(hapd, addr, wsc_done)

    ev = hapd.wait_event(["WPS-REG-SUCCESS"], timeout=5)
    if ev is None:
        raise Exception("hostapd did not report WPS success")

    dev[0].wait_connected()

def wps_start_kwa(dev, apdev):
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Receive M1 from STA")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M1)
    eap_id = (msg['eap_identifier'] + 1) % 256

    authkey,keywrapkey = wsc_dh_kdf(m1_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, m1_attrs[ATTR_ENROLLEE_NONCE],
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, pin,
                                                m1_attrs[ATTR_PUBLIC_KEY], e_pk)

    logger.debug("Send M2 to STA")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, eap_id,
                                m1_attrs[ATTR_ENROLLEE_NONCE],
                                r_nonce, uuid_r, e_pk)
    send_wsc_msg(dev[0], bssid, m2)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M3 from STA")
    msg, m3_attrs, raw_m3_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M3)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, m1_attrs[ATTR_ENROLLEE_NONCE])
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)

    return r_s1, keywrapkey, authkey, raw_m3_attrs, eap_id, bssid, attrs

def wps_stop_kwa(dev, bssid, attrs, authkey, raw_m3_attrs, eap_id):
    attrs += build_attr_authenticator(authkey, raw_m3_attrs, attrs)
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")

    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_kwa_proto_no_kwa(dev, apdev):
    """WPS and KWA error: No KWA attribute"""
    r_s1,keywrapkey,authkey,raw_m3_attrs,eap_id,bssid,attrs = wps_start_kwa(dev, apdev)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    # Encrypted Settings without KWA
    iv = 16*'\x99'
    aes = AES.new(keywrapkey, AES.MODE_CBC, iv)
    pad_len = 16 - len(data) % 16
    ps = pad_len * struct.pack('B', pad_len)
    data += ps
    wrapped = aes.encrypt(data)
    attrs += build_wsc_attr(ATTR_ENCR_SETTINGS, iv + wrapped)
    wps_stop_kwa(dev, bssid, attrs, authkey, raw_m3_attrs, eap_id)

def test_wps_ext_kwa_proto_data_after_kwa(dev, apdev):
    """WPS and KWA error: Data after KWA"""
    r_s1,keywrapkey,authkey,raw_m3_attrs,eap_id,bssid,attrs = wps_start_kwa(dev, apdev)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    # Encrypted Settings and data after KWA
    m = hmac.new(authkey, data, hashlib.sha256)
    kwa = m.digest()[0:8]
    data += build_wsc_attr(ATTR_KEY_WRAP_AUTH, kwa)
    data += build_wsc_attr(ATTR_VENDOR_EXT, "1234567890")
    iv = 16*'\x99'
    aes = AES.new(keywrapkey, AES.MODE_CBC, iv)
    pad_len = 16 - len(data) % 16
    ps = pad_len * struct.pack('B', pad_len)
    data += ps
    wrapped = aes.encrypt(data)
    attrs += build_wsc_attr(ATTR_ENCR_SETTINGS, iv + wrapped)
    wps_stop_kwa(dev, bssid, attrs, authkey, raw_m3_attrs, eap_id)

def test_wps_ext_kwa_proto_kwa_mismatch(dev, apdev):
    """WPS and KWA error: KWA mismatch"""
    r_s1,keywrapkey,authkey,raw_m3_attrs,eap_id,bssid,attrs = wps_start_kwa(dev, apdev)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    # Encrypted Settings and KWA with incorrect value
    data += build_wsc_attr(ATTR_KEY_WRAP_AUTH, 8*'\x00')
    iv = 16*'\x99'
    aes = AES.new(keywrapkey, AES.MODE_CBC, iv)
    pad_len = 16 - len(data) % 16
    ps = pad_len * struct.pack('B', pad_len)
    data += ps
    wrapped = aes.encrypt(data)
    attrs += build_wsc_attr(ATTR_ENCR_SETTINGS, iv + wrapped)
    wps_stop_kwa(dev, bssid, attrs, authkey, raw_m3_attrs, eap_id)

def wps_run_cred_proto(dev, apdev, m8_cred, connect=False, no_connect=False):
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Receive M1 from STA")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M1)
    eap_id = (msg['eap_identifier'] + 1) % 256

    authkey,keywrapkey = wsc_dh_kdf(m1_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, m1_attrs[ATTR_ENROLLEE_NONCE],
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, pin,
                                                m1_attrs[ATTR_PUBLIC_KEY], e_pk)

    logger.debug("Send M2 to STA")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, eap_id,
                                m1_attrs[ATTR_ENROLLEE_NONCE],
                                r_nonce, uuid_r, e_pk)
    send_wsc_msg(dev[0], bssid, m2)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M3 from STA")
    msg, m3_attrs, raw_m3_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M3)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, m1_attrs[ATTR_ENROLLEE_NONCE])
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m3_attrs, attrs)
    raw_m4_attrs = attrs
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 from STA")
    msg, m5_attrs, raw_m5_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M5)

    logger.debug("Send M6 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M6)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE,
                            m1_attrs[ATTR_ENROLLEE_NONCE])
    data = build_wsc_attr(ATTR_R_SNONCE2, r_s2)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m5_attrs, attrs)
    raw_m6_attrs = attrs
    m6 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m6)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M7 from STA")
    msg, m7_attrs, raw_m7_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M7)

    logger.debug("Send M8 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M8)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE,
                            m1_attrs[ATTR_ENROLLEE_NONCE])
    attrs += build_attr_encr_settings(authkey, keywrapkey, m8_cred)
    attrs += build_attr_authenticator(authkey, raw_m7_attrs, attrs)
    raw_m8_attrs = attrs
    m8 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m8)
    eap_id = (eap_id + 1) % 256

    if no_connect:
        logger.debug("Receive WSC_Done from STA")
        msg = get_wsc_msg(dev[0])
        if msg['wsc_opcode'] != WSC_Done or msg['wsc_msg_type'] != WPS_WSC_DONE:
            raise Exception("Unexpected Op-Code/MsgType for WSC_Done")

        hapd.request("SET ext_eapol_frame_io 0")
        dev[0].request("SET ext_eapol_frame_io 0")

        send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))

        dev[0].wait_disconnected()
        dev[0].request("REMOVE_NETWORK all")
    elif connect:
        logger.debug("Receive WSC_Done from STA")
        msg = get_wsc_msg(dev[0])
        if msg['wsc_opcode'] != WSC_Done or msg['wsc_msg_type'] != WPS_WSC_DONE:
            raise Exception("Unexpected Op-Code/MsgType for WSC_Done")

        hapd.request("SET ext_eapol_frame_io 0")
        dev[0].request("SET ext_eapol_frame_io 0")

        send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))

        dev[0].wait_connected()
    else:
        # Verify STA NACK's the credential
        msg = get_wsc_msg(dev[0])
        if msg['wsc_opcode'] != WSC_NACK:
            raise Exception("Unexpected message - expected WSC_Nack")
        dev[0].request("WPS_CANCEL")
        send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
        dev[0].wait_disconnected()

def build_cred(nw_idx='\x01', ssid='test-wps-conf', auth_type='\x00\x20',
               encr_type='\x00\x08', nw_key="12345678",
               mac_addr='\x00\x00\x00\x00\x00\x00'):
    attrs = ''
    if nw_idx is not None:
        attrs += build_wsc_attr(ATTR_NETWORK_INDEX, nw_idx)
    if ssid is not None:
        attrs += build_wsc_attr(ATTR_SSID, ssid)
    if auth_type is not None:
        attrs += build_wsc_attr(ATTR_AUTH_TYPE, auth_type)
    if encr_type is not None:
        attrs += build_wsc_attr(ATTR_ENCR_TYPE, encr_type)
    if nw_key is not None:
        attrs += build_wsc_attr(ATTR_NETWORK_KEY, nw_key)
    if mac_addr is not None:
        attrs += build_wsc_attr(ATTR_MAC_ADDR, mac_addr)
    return build_wsc_attr(ATTR_CRED, attrs)

def test_wps_ext_cred_proto_success(dev, apdev):
    """WPS and Credential: success"""
    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    m8_cred = build_cred(mac_addr=mac_addr)
    wps_run_cred_proto(dev, apdev, m8_cred, connect=True)

def test_wps_ext_cred_proto_mac_addr_mismatch(dev, apdev):
    """WPS and Credential: MAC Address mismatch"""
    m8_cred = build_cred()
    wps_run_cred_proto(dev, apdev, m8_cred, connect=True)

def test_wps_ext_cred_proto_zero_padding(dev, apdev):
    """WPS and Credential: zeropadded attributes"""
    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    m8_cred = build_cred(mac_addr=mac_addr, ssid='test-wps-conf\x00',
                         nw_key="12345678\x00")
    wps_run_cred_proto(dev, apdev, m8_cred, connect=True)

def test_wps_ext_cred_proto_ssid_missing(dev, apdev):
    """WPS and Credential: SSID missing"""
    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    m8_cred = build_cred(mac_addr=mac_addr, ssid=None)
    wps_run_cred_proto(dev, apdev, m8_cred)

def test_wps_ext_cred_proto_ssid_zero_len(dev, apdev):
    """WPS and Credential: Zero-length SSID"""
    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    m8_cred = build_cred(mac_addr=mac_addr, ssid="")
    wps_run_cred_proto(dev, apdev, m8_cred, no_connect=True)

def test_wps_ext_cred_proto_auth_type_missing(dev, apdev):
    """WPS and Credential: Auth Type missing"""
    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    m8_cred = build_cred(mac_addr=mac_addr, auth_type=None)
    wps_run_cred_proto(dev, apdev, m8_cred)

def test_wps_ext_cred_proto_encr_type_missing(dev, apdev):
    """WPS and Credential: Encr Type missing"""
    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    m8_cred = build_cred(mac_addr=mac_addr, encr_type=None)
    wps_run_cred_proto(dev, apdev, m8_cred)

def test_wps_ext_cred_proto_network_key_missing(dev, apdev):
    """WPS and Credential: Network Key missing"""
    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    m8_cred = build_cred(mac_addr=mac_addr, nw_key=None)
    wps_run_cred_proto(dev, apdev, m8_cred)

def test_wps_ext_cred_proto_network_key_missing_open(dev, apdev):
    """WPS and Credential: Network Key missing (open)"""
    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    m8_cred = build_cred(mac_addr=mac_addr, auth_type='\x00\x01',
                         encr_type='\x00\x01', nw_key=None, ssid="foo")
    wps_run_cred_proto(dev, apdev, m8_cred, no_connect=True)

def test_wps_ext_cred_proto_mac_addr_missing(dev, apdev):
    """WPS and Credential: MAC Address missing"""
    m8_cred = build_cred(mac_addr=None)
    wps_run_cred_proto(dev, apdev, m8_cred)

def test_wps_ext_cred_proto_invalid_encr_type(dev, apdev):
    """WPS and Credential: Invalid Encr Type"""
    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    m8_cred = build_cred(mac_addr=mac_addr, encr_type='\x00\x00')
    wps_run_cred_proto(dev, apdev, m8_cred)

def test_wps_ext_cred_proto_missing_cred(dev, apdev):
    """WPS and Credential: Missing Credential"""
    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    m8_cred = ''
    wps_run_cred_proto(dev, apdev, m8_cred)

def test_wps_ext_proto_m2_no_public_key(dev, apdev):
    """WPS and no Public Key in M2"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Receive M1 from STA")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M1)
    eap_id = (msg['eap_identifier'] + 1) % 256

    authkey,keywrapkey = wsc_dh_kdf(m1_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, m1_attrs[ATTR_ENROLLEE_NONCE],
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, pin,
                                                m1_attrs[ATTR_PUBLIC_KEY], e_pk)

    logger.debug("Send M2 to STA")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, eap_id,
                                m1_attrs[ATTR_ENROLLEE_NONCE],
                                r_nonce, uuid_r, None)
    send_wsc_msg(dev[0], bssid, m2)
    eap_id = (eap_id + 1) % 256

    # Verify STA NACK's the credential
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")
    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_proto_m2_invalid_public_key(dev, apdev):
    """WPS and invalid Public Key in M2"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Receive M1 from STA")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M1)
    eap_id = (msg['eap_identifier'] + 1) % 256

    authkey,keywrapkey = wsc_dh_kdf(m1_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, m1_attrs[ATTR_ENROLLEE_NONCE],
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, pin,
                                                m1_attrs[ATTR_PUBLIC_KEY], e_pk)

    logger.debug("Send M2 to STA")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, eap_id,
                                m1_attrs[ATTR_ENROLLEE_NONCE],
                                r_nonce, uuid_r, 192*'\xff')
    send_wsc_msg(dev[0], bssid, m2)
    eap_id = (eap_id + 1) % 256

    # Verify STA NACK's the credential
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")
    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_proto_m2_public_key_oom(dev, apdev):
    """WPS and Public Key OOM in M2"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Receive M1 from STA")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M1)
    eap_id = (msg['eap_identifier'] + 1) % 256

    authkey,keywrapkey = wsc_dh_kdf(m1_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, m1_attrs[ATTR_ENROLLEE_NONCE],
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, pin,
                                                m1_attrs[ATTR_PUBLIC_KEY], e_pk)

    logger.debug("Send M2 to STA")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, eap_id,
                                m1_attrs[ATTR_ENROLLEE_NONCE],
                                r_nonce, uuid_r, e_pk)
    with alloc_fail(dev[0], 1, "wpabuf_alloc_copy;wps_process_pubkey"):
        send_wsc_msg(dev[0], bssid, m2)
        eap_id = (eap_id + 1) % 256

        # Verify STA NACK's the credential
        msg = get_wsc_msg(dev[0])
        if msg['wsc_opcode'] != WSC_NACK:
            raise Exception("Unexpected message - expected WSC_Nack")
        dev[0].request("WPS_CANCEL")
        send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
        dev[0].wait_disconnected()

def test_wps_ext_proto_nack_m3(dev, apdev):
    """WPS and NACK M3"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Receive M1 from STA")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M1)
    eap_id = (msg['eap_identifier'] + 1) % 256

    authkey,keywrapkey = wsc_dh_kdf(m1_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, m1_attrs[ATTR_ENROLLEE_NONCE],
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, pin,
                                                m1_attrs[ATTR_PUBLIC_KEY], e_pk)

    logger.debug("Send M2 to STA")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, eap_id,
                                m1_attrs[ATTR_ENROLLEE_NONCE],
                                r_nonce, uuid_r, e_pk)
    send_wsc_msg(dev[0], bssid, m2)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M3 from STA")
    msg, m3_attrs, raw_m3_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M3)

    logger.debug("Send NACK to STA")
    msg, attrs = build_nack(eap_id, m1_attrs[ATTR_ENROLLEE_NONCE],
                            r_nonce, config_error='\x01\x23')
    send_wsc_msg(dev[0], bssid, msg)
    ev = dev[0].wait_event(["WPS-FAIL"], timeout=5)
    if ev is None:
        raise Exception("Failure not reported")
    if "msg=7 config_error=291" not in ev:
        raise Exception("Unexpected failure reason: " + ev)

def test_wps_ext_proto_nack_m5(dev, apdev):
    """WPS and NACK M5"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Receive M1 from STA")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M1)
    eap_id = (msg['eap_identifier'] + 1) % 256

    authkey,keywrapkey = wsc_dh_kdf(m1_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, m1_attrs[ATTR_ENROLLEE_NONCE],
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, pin,
                                                m1_attrs[ATTR_PUBLIC_KEY], e_pk)

    logger.debug("Send M2 to STA")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, eap_id,
                                m1_attrs[ATTR_ENROLLEE_NONCE],
                                r_nonce, uuid_r, e_pk)
    send_wsc_msg(dev[0], bssid, m2)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M3 from STA")
    msg, m3_attrs, raw_m3_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M3)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, m1_attrs[ATTR_ENROLLEE_NONCE])
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m3_attrs, attrs)
    raw_m4_attrs = attrs
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 from STA")
    msg, m5_attrs, raw_m5_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M5)

    logger.debug("Send NACK to STA")
    msg, attrs = build_nack(eap_id, m1_attrs[ATTR_ENROLLEE_NONCE],
                            r_nonce, config_error='\x01\x24')
    send_wsc_msg(dev[0], bssid, msg)
    ev = dev[0].wait_event(["WPS-FAIL"], timeout=5)
    if ev is None:
        raise Exception("Failure not reported")
    if "msg=9 config_error=292" not in ev:
        raise Exception("Unexpected failure reason: " + ev)

def wps_nack_m3(dev, apdev):
    pin = "00000000"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pbc=True)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Receive M1 from STA")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M1)
    eap_id = (msg['eap_identifier'] + 1) % 256

    authkey,keywrapkey = wsc_dh_kdf(m1_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, m1_attrs[ATTR_ENROLLEE_NONCE],
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, pin,
                                                m1_attrs[ATTR_PUBLIC_KEY], e_pk)

    logger.debug("Send M2 to STA")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, eap_id,
                                m1_attrs[ATTR_ENROLLEE_NONCE],
                                r_nonce, uuid_r, e_pk, dev_pw_id='\x00\x04')
    send_wsc_msg(dev[0], bssid, m2)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M3 from STA")
    msg, m3_attrs, raw_m3_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M3)
    return eap_id, m1_attrs[ATTR_ENROLLEE_NONCE], r_nonce, bssid

def test_wps_ext_proto_nack_m3_no_config_error(dev, apdev):
    """WPS and NACK M3 missing Config Error"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_nack(eap_id, e_nonce, r_nonce, config_error=None)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_nack_m3_no_e_nonce(dev, apdev):
    """WPS and NACK M3 missing E-Nonce"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_nack(eap_id, None, r_nonce)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_nack_m3_e_nonce_mismatch(dev, apdev):
    """WPS and NACK M3 E-Nonce mismatch"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_nack(eap_id, 16*'\x00', r_nonce)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_nack_m3_no_r_nonce(dev, apdev):
    """WPS and NACK M3 missing R-Nonce"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_nack(eap_id, e_nonce, None)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_nack_m3_r_nonce_mismatch(dev, apdev):
    """WPS and NACK M3 R-Nonce mismatch"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_nack(eap_id, e_nonce, 16*'\x00')
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_nack_m3_no_msg_type(dev, apdev):
    """WPS and NACK M3 no Message Type"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_nack(eap_id, e_nonce, r_nonce, msg_type=None)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_nack_m3_invalid_msg_type(dev, apdev):
    """WPS and NACK M3 invalid Message Type"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_nack(eap_id, e_nonce, r_nonce, msg_type=123)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_nack_m3_invalid_attr(dev, apdev):
    """WPS and NACK M3 invalid attribute"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    attrs = '\x10\x10\x00'
    msg = build_eap_wsc(1, eap_id, attrs, opcode=WSC_NACK)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_ack_m3_no_e_nonce(dev, apdev):
    """WPS and ACK M3 missing E-Nonce"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_ack(eap_id, None, r_nonce)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_ack_m3_e_nonce_mismatch(dev, apdev):
    """WPS and ACK M3 E-Nonce mismatch"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_ack(eap_id, 16*'\x00', r_nonce)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_ack_m3_no_r_nonce(dev, apdev):
    """WPS and ACK M3 missing R-Nonce"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_ack(eap_id, e_nonce, None)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_ack_m3_r_nonce_mismatch(dev, apdev):
    """WPS and ACK M3 R-Nonce mismatch"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_ack(eap_id, e_nonce, 16*'\x00')
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_ack_m3_no_msg_type(dev, apdev):
    """WPS and ACK M3 no Message Type"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_ack(eap_id, e_nonce, r_nonce, msg_type=None)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_ack_m3_invalid_msg_type(dev, apdev):
    """WPS and ACK M3 invalid Message Type"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send NACK to STA")
    msg, attrs = build_ack(eap_id, e_nonce, r_nonce, msg_type=123)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_ack_m3_invalid_attr(dev, apdev):
    """WPS and ACK M3 invalid attribute"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send ACK to STA")
    attrs = '\x10\x10\x00'
    msg = build_eap_wsc(1, eap_id, attrs, opcode=WSC_ACK)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def test_wps_ext_proto_ack_m3(dev, apdev):
    """WPS and ACK M3"""
    eap_id, e_nonce, r_nonce, bssid = wps_nack_m3(dev, apdev)
    logger.debug("Send ACK to STA")
    msg, attrs = build_ack(eap_id, e_nonce, r_nonce)
    send_wsc_msg(dev[0], bssid, msg)
    dev[0].request("WPS_CANCEL")
    dev[0].wait_disconnected()
    dev[0].flush_scan_cache()

def wps_to_m3_helper(dev, apdev):
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)
    wps_ext_eap_wsc(dev[0], hapd, bssid, "EAP-WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Receive M1 from STA")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M1)
    eap_id = (msg['eap_identifier'] + 1) % 256

    authkey,keywrapkey = wsc_dh_kdf(m1_attrs[ATTR_PUBLIC_KEY], own_private,
                                    mac_addr, m1_attrs[ATTR_ENROLLEE_NONCE],
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, pin,
                                                m1_attrs[ATTR_PUBLIC_KEY], e_pk)

    logger.debug("Send M2 to STA")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, eap_id,
                                m1_attrs[ATTR_ENROLLEE_NONCE],
                                r_nonce, uuid_r, e_pk)
    send_wsc_msg(dev[0], bssid, m2)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M3 from STA")
    msg, m3_attrs, raw_m3_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M3)
    return eap_id, m1_attrs, r_nonce, bssid, r_hash1, r_hash2, r_s1, r_s2, raw_m3_attrs, authkey, keywrapkey

def wps_to_m3(dev, apdev):
    eap_id, m1_attrs, r_nonce, bssid, r_hash1, r_hash2, r_s1, r_s2, raw_m3_attrs, authkey, keywrapkey = wps_to_m3_helper(dev, apdev)
    return eap_id, m1_attrs[ATTR_ENROLLEE_NONCE], r_nonce, bssid, r_hash1, r_hash2, r_s1, raw_m3_attrs, authkey, keywrapkey

def wps_to_m5(dev, apdev):
    eap_id, m1_attrs, r_nonce, bssid, r_hash1, r_hash2, r_s1, r_s2, raw_m3_attrs, authkey, keywrapkey = wps_to_m3_helper(dev, apdev)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, m1_attrs[ATTR_ENROLLEE_NONCE])
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m3_attrs, attrs)
    raw_m4_attrs = attrs
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 from STA")
    msg, m5_attrs, raw_m5_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M5)

    return eap_id, m1_attrs[ATTR_ENROLLEE_NONCE], r_nonce, bssid, r_hash1, r_hash2, r_s2, raw_m5_attrs, authkey, keywrapkey

def test_wps_ext_proto_m4_missing_r_hash1(dev, apdev):
    """WPS and no R-Hash1 in M4"""
    eap_id, e_nonce, r_nonce, bssid, r_hash1, r_hash2, r_s1, m3, authkey, keywrapkey = wps_to_m3(dev, apdev)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    #attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, m3, attrs)
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 (NACK) from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")

    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_proto_m4_missing_r_hash2(dev, apdev):
    """WPS and no R-Hash2 in M4"""
    eap_id, e_nonce, r_nonce, bssid, r_hash1, r_hash2, r_s1, m3, authkey, keywrapkey = wps_to_m3(dev, apdev)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    #attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, m3, attrs)
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 (NACK) from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")

    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_proto_m4_missing_r_snonce1(dev, apdev):
    """WPS and no R-SNonce1 in M4"""
    eap_id, e_nonce, r_nonce, bssid, r_hash1, r_hash2, r_s1, m3, authkey, keywrapkey = wps_to_m3(dev, apdev)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    #data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    data = ''
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, m3, attrs)
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 (NACK) from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")

    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_proto_m4_invalid_pad_string(dev, apdev):
    """WPS and invalid pad string in M4"""
    eap_id, e_nonce, r_nonce, bssid, r_hash1, r_hash2, r_s1, m3, authkey, keywrapkey = wps_to_m3(dev, apdev)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)

    m = hmac.new(authkey, data, hashlib.sha256)
    kwa = m.digest()[0:8]
    data += build_wsc_attr(ATTR_KEY_WRAP_AUTH, kwa)
    iv = 16*'\x99'
    aes = AES.new(keywrapkey, AES.MODE_CBC, iv)
    pad_len = 16 - len(data) % 16
    ps = (pad_len - 1) * struct.pack('B', pad_len) + struct.pack('B', pad_len - 1)
    data += ps
    wrapped = aes.encrypt(data)
    attrs += build_wsc_attr(ATTR_ENCR_SETTINGS, iv + wrapped)

    attrs += build_attr_authenticator(authkey, m3, attrs)
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 (NACK) from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")

    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_proto_m4_invalid_pad_value(dev, apdev):
    """WPS and invalid pad value in M4"""
    eap_id, e_nonce, r_nonce, bssid, r_hash1, r_hash2, r_s1, m3, authkey, keywrapkey = wps_to_m3(dev, apdev)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)

    m = hmac.new(authkey, data, hashlib.sha256)
    kwa = m.digest()[0:8]
    data += build_wsc_attr(ATTR_KEY_WRAP_AUTH, kwa)
    iv = 16*'\x99'
    aes = AES.new(keywrapkey, AES.MODE_CBC, iv)
    pad_len = 16 - len(data) % 16
    ps = (pad_len - 1) * struct.pack('B', pad_len) + struct.pack('B', 255)
    data += ps
    wrapped = aes.encrypt(data)
    attrs += build_wsc_attr(ATTR_ENCR_SETTINGS, iv + wrapped)

    attrs += build_attr_authenticator(authkey, m3, attrs)
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 (NACK) from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")

    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_proto_m4_no_encr_settings(dev, apdev):
    """WPS and no Encr Settings in M4"""
    eap_id, e_nonce, r_nonce, bssid, r_hash1, r_hash2, r_s1, m3, authkey, keywrapkey = wps_to_m3(dev, apdev)

    logger.debug("Send M4 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    attrs += build_attr_authenticator(authkey, m3, attrs)
    m4 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m4)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M5 (NACK) from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")

    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_proto_m6_missing_r_snonce2(dev, apdev):
    """WPS and no R-SNonce2 in M6"""
    eap_id, e_nonce, r_nonce, bssid, r_hash1, r_hash2, r_s2, m5, authkey, keywrapkey = wps_to_m5(dev, apdev)

    logger.debug("Send M6 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M6)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    #data = build_wsc_attr(ATTR_R_SNONCE2, r_s2)
    data = ''
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, m5, attrs)
    m6 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m6)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M7 (NACK) from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")

    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_proto_m6_no_encr_settings(dev, apdev):
    """WPS and no Encr Settings in M6"""
    eap_id, e_nonce, r_nonce, bssid, r_hash1, r_hash2, r_s2, m5, authkey, keywrapkey = wps_to_m5(dev, apdev)

    logger.debug("Send M6 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M6)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    data = build_wsc_attr(ATTR_R_SNONCE2, r_s2)
    #attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, m5, attrs)
    m6 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m6)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M7 (NACK) from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")

    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def test_wps_ext_proto_m8_no_encr_settings(dev, apdev):
    """WPS and no Encr Settings in M6"""
    eap_id, e_nonce, r_nonce, bssid, r_hash1, r_hash2, r_s2, m5, authkey, keywrapkey = wps_to_m5(dev, apdev)

    logger.debug("Send M6 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M6)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    data = build_wsc_attr(ATTR_R_SNONCE2, r_s2)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, m5, attrs)
    raw_m6_attrs = attrs
    m6 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m6)
    eap_id = (eap_id + 1) % 256

    logger.debug("Receive M7 from STA")
    msg, m7_attrs, raw_m7_attrs = recv_wsc_msg(dev[0], WSC_MSG, WPS_M7)

    logger.debug("Send M8 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M8)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    #attrs += build_attr_encr_settings(authkey, keywrapkey, m8_cred)
    attrs += build_attr_authenticator(authkey, raw_m7_attrs, attrs)
    raw_m8_attrs = attrs
    m8 = build_eap_wsc(1, eap_id, attrs)
    send_wsc_msg(dev[0], bssid, m8)

    logger.debug("Receive WSC_Done (NACK) from STA")
    msg = get_wsc_msg(dev[0])
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_Nack")

    dev[0].request("WPS_CANCEL")
    send_wsc_msg(dev[0], bssid, build_eap_failure(eap_id))
    dev[0].wait_disconnected()

def wps_start_ext_reg(apdev, dev):
    addr = dev.own_addr()
    bssid = apdev['bssid']
    ssid = "test-wps-conf"
    appin = "12345670"
    params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
               "wpa_passphrase": "12345678", "wpa": "2",
               "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
               "ap_pin": appin }
    hapd = hostapd.add_ap(apdev['ifname'], params)

    dev.scan_for_bss(bssid, freq="2412")
    hapd.request("SET ext_eapol_frame_io 1")
    dev.request("SET ext_eapol_frame_io 1")

    dev.request("WPS_REG " + bssid + " " + appin)

    return addr,bssid,hapd

def wps_run_ap_settings_proto(dev, apdev, ap_settings, success):
    addr,bssid,hapd = wps_start_ext_reg(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive M1 from AP")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M1)
    mac_addr = m1_attrs[ATTR_MAC_ADDR]
    e_nonce = m1_attrs[ATTR_ENROLLEE_NONCE]
    e_pk = m1_attrs[ATTR_PUBLIC_KEY]

    appin = '12345670'
    uuid_r = 16*'\x33'
    r_nonce = 16*'\x44'
    own_private, r_pk = wsc_dh_init()
    authkey,keywrapkey = wsc_dh_kdf(e_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    r_s1,r_s2,r_hash1,r_hash2 = wsc_dev_pw_hash(authkey, appin, e_pk, r_pk)

    logger.debug("Send M2 to AP")
    m2, raw_m2_attrs = build_m2(authkey, raw_m1_attrs, msg['eap_identifier'],
                                e_nonce, r_nonce, uuid_r, r_pk, eap_code=2)
    send_wsc_msg(hapd, addr, m2)

    logger.debug("Receive M3 from AP")
    msg, m3_attrs, raw_m3_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M3)

    logger.debug("Send M4 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M4)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_R_HASH1, r_hash1)
    attrs += build_wsc_attr(ATTR_R_HASH2, r_hash2)
    data = build_wsc_attr(ATTR_R_SNONCE1, r_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m3_attrs, attrs)
    raw_m4_attrs = attrs
    m4 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m4)

    logger.debug("Receive M5 from AP")
    msg, m5_attrs, raw_m5_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M5)

    logger.debug("Send M6 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M6)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    data = build_wsc_attr(ATTR_R_SNONCE2, r_s2)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m5_attrs, attrs)
    raw_m6_attrs = attrs
    m6 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m6)

    logger.debug("Receive M7 from AP")
    msg, m7_attrs, raw_m7_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M7)

    logger.debug("Send M8 to STA")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M8)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    if ap_settings:
        attrs += build_attr_encr_settings(authkey, keywrapkey, ap_settings)
    attrs += build_attr_authenticator(authkey, raw_m7_attrs, attrs)
    raw_m8_attrs = attrs
    m8 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m8)

    if success:
        ev = hapd.wait_event(["WPS-NEW-AP-SETTINGS"], timeout=5)
        if ev is None:
            raise Exception("New AP settings not reported")
        logger.debug("Receive WSC_Done from AP")
        msg = get_wsc_msg(hapd)
        if msg['wsc_opcode'] != WSC_Done:
            raise Exception("Unexpected message - expected WSC_Done")

        logger.debug("Send WSC_ACK to AP")
        ack,attrs = build_ack(msg['eap_identifier'], e_nonce, r_nonce,
                              eap_code=2)
        send_wsc_msg(hapd, addr, ack)
        dev[0].wait_disconnected()
    else:
        ev = hapd.wait_event(["WPS-FAIL"], timeout=5)
        if ev is None:
            raise Exception("WPS failure not reported")
        logger.debug("Receive WSC_NACK from AP")
        msg = get_wsc_msg(hapd)
        if msg['wsc_opcode'] != WSC_NACK:
            raise Exception("Unexpected message - expected WSC_NACK")

        logger.debug("Send WSC_NACK to AP")
        nack,attrs = build_nack(msg['eap_identifier'], e_nonce, r_nonce,
                                eap_code=2)
        send_wsc_msg(hapd, addr, nack)
        dev[0].wait_disconnected()

def test_wps_ext_ap_settings_success(dev, apdev):
    """WPS and AP Settings: success"""
    ap_settings = build_wsc_attr(ATTR_NETWORK_INDEX, '\x01')
    ap_settings += build_wsc_attr(ATTR_SSID, "test")
    ap_settings += build_wsc_attr(ATTR_AUTH_TYPE, '\x00\x01')
    ap_settings += build_wsc_attr(ATTR_ENCR_TYPE, '\x00\x01')
    ap_settings += build_wsc_attr(ATTR_NETWORK_KEY, '')
    ap_settings += build_wsc_attr(ATTR_MAC_ADDR, binascii.unhexlify(apdev[0]['bssid'].replace(':', '')))
    wps_run_ap_settings_proto(dev, apdev, ap_settings, True)

def test_wps_ext_ap_settings_missing(dev, apdev):
    """WPS and AP Settings: missing"""
    wps_run_ap_settings_proto(dev, apdev, None, False)

def test_wps_ext_ap_settings_mac_addr_mismatch(dev, apdev):
    """WPS and AP Settings: MAC Address mismatch"""
    ap_settings = build_wsc_attr(ATTR_NETWORK_INDEX, '\x01')
    ap_settings += build_wsc_attr(ATTR_SSID, "test")
    ap_settings += build_wsc_attr(ATTR_AUTH_TYPE, '\x00\x01')
    ap_settings += build_wsc_attr(ATTR_ENCR_TYPE, '\x00\x01')
    ap_settings += build_wsc_attr(ATTR_NETWORK_KEY, '')
    ap_settings += build_wsc_attr(ATTR_MAC_ADDR, '\x00\x00\x00\x00\x00\x00')
    wps_run_ap_settings_proto(dev, apdev, ap_settings, True)

def test_wps_ext_ap_settings_mac_addr_missing(dev, apdev):
    """WPS and AP Settings: missing MAC Address"""
    ap_settings = build_wsc_attr(ATTR_NETWORK_INDEX, '\x01')
    ap_settings += build_wsc_attr(ATTR_SSID, "test")
    ap_settings += build_wsc_attr(ATTR_AUTH_TYPE, '\x00\x01')
    ap_settings += build_wsc_attr(ATTR_ENCR_TYPE, '\x00\x01')
    ap_settings += build_wsc_attr(ATTR_NETWORK_KEY, '')
    wps_run_ap_settings_proto(dev, apdev, ap_settings, False)

def test_wps_ext_ap_settings_reject_encr_type(dev, apdev):
    """WPS and AP Settings: reject Encr Type"""
    ap_settings = build_wsc_attr(ATTR_NETWORK_INDEX, '\x01')
    ap_settings += build_wsc_attr(ATTR_SSID, "test")
    ap_settings += build_wsc_attr(ATTR_AUTH_TYPE, '\x00\x01')
    ap_settings += build_wsc_attr(ATTR_ENCR_TYPE, '\x00\x00')
    ap_settings += build_wsc_attr(ATTR_NETWORK_KEY, '')
    ap_settings += build_wsc_attr(ATTR_MAC_ADDR, binascii.unhexlify(apdev[0]['bssid'].replace(':', '')))
    wps_run_ap_settings_proto(dev, apdev, ap_settings, False)

def test_wps_ext_ap_settings_m2d(dev, apdev):
    """WPS and AP Settings: M2D"""
    addr,bssid,hapd = wps_start_ext_reg(apdev[0], dev[0])
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive M1 from AP")
    msg, m1_attrs, raw_m1_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M1)
    e_nonce = m1_attrs[ATTR_ENROLLEE_NONCE]

    r_nonce = 16*'\x44'
    uuid_r = 16*'\x33'

    logger.debug("Send M2D to AP")
    m2d, raw_m2d_attrs = build_m2d(raw_m1_attrs, msg['eap_identifier'],
                                   e_nonce, r_nonce, uuid_r,
                                   dev_pw_id='\x00\x00', eap_code=2)
    send_wsc_msg(hapd, addr, m2d)

    ev = hapd.wait_event(["WPS-M2D"], timeout=5)
    if ev is None:
        raise Exception("M2D not reported")

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def wps_wait_ap_nack(hapd, dev, e_nonce, r_nonce):
    logger.debug("Receive WSC_NACK from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_NACK:
        raise Exception("Unexpected message - expected WSC_NACK")

    logger.debug("Send WSC_NACK to AP")
    nack,attrs = build_nack(msg['eap_identifier'], e_nonce, r_nonce,
                            eap_code=2)
    send_wsc_msg(hapd, dev.own_addr(), nack)
    dev.wait_disconnected()

def test_wps_ext_m3_missing_e_hash1(dev, apdev):
    """WPS proto: M3 missing E-Hash1"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    #attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def test_wps_ext_m3_missing_e_hash2(dev, apdev):
    """WPS proto: M3 missing E-Hash2"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    #attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def test_wps_ext_m5_missing_e_snonce1(dev, apdev):
    """WPS proto: M5 missing E-SNonce1"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    logger.debug("Receive M4 from AP")
    msg, m4_attrs, raw_m4_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M4)

    logger.debug("Send M5 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M5)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    #data = build_wsc_attr(ATTR_E_SNONCE1, e_s1)
    data = ''
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m4_attrs, attrs)
    raw_m5_attrs = attrs
    m5 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m5)

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def test_wps_ext_m5_e_snonce1_mismatch(dev, apdev):
    """WPS proto: M5 E-SNonce1 mismatch"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    logger.debug("Receive M4 from AP")
    msg, m4_attrs, raw_m4_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M4)

    logger.debug("Send M5 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M5)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    data = build_wsc_attr(ATTR_E_SNONCE1, 16*'\x00')
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m4_attrs, attrs)
    raw_m5_attrs = attrs
    m5 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m5)

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def test_wps_ext_m7_missing_e_snonce2(dev, apdev):
    """WPS proto: M7 missing E-SNonce2"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    logger.debug("Receive M4 from AP")
    msg, m4_attrs, raw_m4_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M4)

    logger.debug("Send M5 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M5)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    data = build_wsc_attr(ATTR_E_SNONCE1, e_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m4_attrs, attrs)
    raw_m5_attrs = attrs
    m5 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m5)

    logger.debug("Receive M6 from AP")
    msg, m6_attrs, raw_m6_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M6)

    logger.debug("Send M7 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M7)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    #data = build_wsc_attr(ATTR_E_SNONCE2, e_s2)
    data = ''
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m6_attrs, attrs)
    m7 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    raw_m7_attrs = attrs
    send_wsc_msg(hapd, addr, m7)

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def test_wps_ext_m7_e_snonce2_mismatch(dev, apdev):
    """WPS proto: M7 E-SNonce2 mismatch"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    logger.debug("Receive M4 from AP")
    msg, m4_attrs, raw_m4_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M4)

    logger.debug("Send M5 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M5)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    data = build_wsc_attr(ATTR_E_SNONCE1, e_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m4_attrs, attrs)
    raw_m5_attrs = attrs
    m5 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m5)

    logger.debug("Receive M6 from AP")
    msg, m6_attrs, raw_m6_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M6)

    logger.debug("Send M7 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M7)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    data = build_wsc_attr(ATTR_E_SNONCE2, 16*'\x00')
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m6_attrs, attrs)
    m7 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    raw_m7_attrs = attrs
    send_wsc_msg(hapd, addr, m7)

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def test_wps_ext_m1_pubkey_oom(dev, apdev):
    """WPS proto: M1 PubKey OOM"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    with alloc_fail(hapd, 1, "wpabuf_alloc_copy;wps_process_pubkey"):
        m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                    e_nonce, e_pk)
        send_wsc_msg(hapd, addr, m1)
        wps_wait_eap_failure(hapd, dev[0])

def wps_wait_eap_failure(hapd, dev):
    ev = hapd.wait_event(["CTRL-EVENT-EAP-FAILURE"], timeout=5)
    if ev is None:
        raise Exception("EAP-Failure not reported")
    dev.wait_disconnected()

def test_wps_ext_m3_m1(dev, apdev):
    """WPS proto: M3 replaced with M1"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3(M1) to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M1)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m5_m3(dev, apdev):
    """WPS proto: M5 replaced with M3"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    logger.debug("Receive M4 from AP")
    msg, m4_attrs, raw_m4_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M4)

    logger.debug("Send M5(M3) to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    data = build_wsc_attr(ATTR_E_SNONCE1, e_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m4_attrs, attrs)
    raw_m5_attrs = attrs
    m5 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m5)

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def test_wps_ext_m3_m2(dev, apdev):
    """WPS proto: M3 replaced with M2"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3(M2) to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M2)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m3_m5(dev, apdev):
    """WPS proto: M3 replaced with M5"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3(M5) to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M5)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def test_wps_ext_m3_m7(dev, apdev):
    """WPS proto: M3 replaced with M7"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3(M7) to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M7)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def test_wps_ext_m3_done(dev, apdev):
    """WPS proto: M3 replaced with WSC_Done"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3(WSC_Done) to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_WSC_DONE)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs, opcode=WSC_Done)
    send_wsc_msg(hapd, addr, m3)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m2_nack_invalid(dev, apdev):
    """WPS proto: M2 followed by invalid NACK"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send WSC_NACK to AP")
    attrs = '\x10\x00\x00'
    nack = build_eap_wsc(2, msg['eap_identifier'], attrs, opcode=WSC_NACK)
    send_wsc_msg(hapd, addr, nack)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m2_nack_no_msg_type(dev, apdev):
    """WPS proto: M2 followed by NACK without Msg Type"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send WSC_NACK to AP")
    nack,attrs = build_nack(msg['eap_identifier'], e_nonce, r_nonce,
                            msg_type=None, eap_code=2)
    send_wsc_msg(hapd, addr, nack)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m2_nack_invalid_msg_type(dev, apdev):
    """WPS proto: M2 followed by NACK with invalid Msg Type"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send WSC_NACK to AP")
    nack,attrs = build_nack(msg['eap_identifier'], e_nonce, r_nonce,
                            msg_type=WPS_WSC_ACK, eap_code=2)
    send_wsc_msg(hapd, addr, nack)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m2_nack_e_nonce_mismatch(dev, apdev):
    """WPS proto: M2 followed by NACK with e-nonce mismatch"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send WSC_NACK to AP")
    nack,attrs = build_nack(msg['eap_identifier'], 16*'\x00', r_nonce,
                            eap_code=2)
    send_wsc_msg(hapd, addr, nack)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m2_nack_no_config_error(dev, apdev):
    """WPS proto: M2 followed by NACK without Config Error"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send WSC_NACK to AP")
    nack,attrs = build_nack(msg['eap_identifier'], e_nonce, r_nonce,
                            config_error=None, eap_code=2)
    send_wsc_msg(hapd, addr, nack)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m2_ack_invalid(dev, apdev):
    """WPS proto: M2 followed by invalid ACK"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send WSC_ACK to AP")
    attrs = '\x10\x00\x00'
    ack = build_eap_wsc(2, msg['eap_identifier'], attrs, opcode=WSC_ACK)
    send_wsc_msg(hapd, addr, ack)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m2_ack(dev, apdev):
    """WPS proto: M2 followed by ACK"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send WSC_ACK to AP")
    ack,attrs = build_ack(msg['eap_identifier'], e_nonce, r_nonce, eap_code=2)
    send_wsc_msg(hapd, addr, ack)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m2_ack_no_msg_type(dev, apdev):
    """WPS proto: M2 followed by ACK missing Msg Type"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send WSC_ACK to AP")
    ack,attrs = build_ack(msg['eap_identifier'], e_nonce, r_nonce,
                          msg_type=None, eap_code=2)
    send_wsc_msg(hapd, addr, ack)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m2_ack_invalid_msg_type(dev, apdev):
    """WPS proto: M2 followed by ACK with invalid Msg Type"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send WSC_ACK to AP")
    ack,attrs = build_ack(msg['eap_identifier'], e_nonce, r_nonce,
                          msg_type=WPS_WSC_NACK, eap_code=2)
    send_wsc_msg(hapd, addr, ack)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m2_ack_e_nonce_mismatch(dev, apdev):
    """WPS proto: M2 followed by ACK with e-nonce mismatch"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send WSC_ACK to AP")
    ack,attrs = build_ack(msg['eap_identifier'], 16*'\x00', r_nonce,
                          eap_code=2)
    send_wsc_msg(hapd, addr, ack)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m1_invalid(dev, apdev):
    """WPS proto: M1 failing parsing"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    logger.debug("Send M1 to AP")
    attrs = '\x10\x00\x00'
    m1 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m1)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m1_missing_msg_type(dev, apdev):
    """WPS proto: M1 missing Msg Type"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    logger.debug("Send M1 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    m1 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m1)

    wps_wait_ap_nack(hapd, dev[0], 16*'\x00', 16*'\x00')

def wps_ext_wsc_done(dev, apdev):
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    logger.debug("Receive M4 from AP")
    msg, m4_attrs, raw_m4_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M4)

    logger.debug("Send M5 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M5)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    data = build_wsc_attr(ATTR_E_SNONCE1, e_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m4_attrs, attrs)
    raw_m5_attrs = attrs
    m5 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m5)

    logger.debug("Receive M6 from AP")
    msg, m6_attrs, raw_m6_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M6)

    logger.debug("Send M7 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M7)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    data = build_wsc_attr(ATTR_E_SNONCE2, e_s2)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m6_attrs, attrs)
    m7 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    raw_m7_attrs = attrs
    send_wsc_msg(hapd, addr, m7)

    logger.debug("Receive M8 from AP")
    msg, m8_attrs, raw_m8_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M8)
    return hapd, msg, e_nonce, r_nonce

def test_wps_ext_wsc_done_invalid(dev, apdev):
    """WPS proto: invalid WSC_Done"""
    hapd, msg, e_nonce, r_nonce = wps_ext_wsc_done(dev, apdev)

    logger.debug("Send WSC_Done to AP")
    attrs = '\x10\x00\x00'
    wsc_done = build_eap_wsc(2, msg['eap_identifier'], attrs, opcode=WSC_Done)
    send_wsc_msg(hapd, dev[0].own_addr(), wsc_done)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_wsc_done_no_msg_type(dev, apdev):
    """WPS proto: invalid WSC_Done"""
    hapd, msg, e_nonce, r_nonce = wps_ext_wsc_done(dev, apdev)

    logger.debug("Send WSC_Done to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    #attrs += build_attr_msg_type(WPS_WSC_DONE)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    wsc_done = build_eap_wsc(2, msg['eap_identifier'], attrs, opcode=WSC_Done)
    send_wsc_msg(hapd, dev[0].own_addr(), wsc_done)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_wsc_done_wrong_msg_type(dev, apdev):
    """WPS proto: WSC_Done with wrong Msg Type"""
    hapd, msg, e_nonce, r_nonce = wps_ext_wsc_done(dev, apdev)

    logger.debug("Send WSC_Done to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_WSC_ACK)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    wsc_done = build_eap_wsc(2, msg['eap_identifier'], attrs, opcode=WSC_Done)
    send_wsc_msg(hapd, dev[0].own_addr(), wsc_done)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_wsc_done_no_e_nonce(dev, apdev):
    """WPS proto: WSC_Done without e_nonce"""
    hapd, msg, e_nonce, r_nonce = wps_ext_wsc_done(dev, apdev)

    logger.debug("Send WSC_Done to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_WSC_DONE)
    #attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    wsc_done = build_eap_wsc(2, msg['eap_identifier'], attrs, opcode=WSC_Done)
    send_wsc_msg(hapd, dev[0].own_addr(), wsc_done)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_wsc_done_no_r_nonce(dev, apdev):
    """WPS proto: WSC_Done without r_nonce"""
    hapd, msg, e_nonce, r_nonce = wps_ext_wsc_done(dev, apdev)

    logger.debug("Send WSC_Done to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_WSC_DONE)
    attrs += build_wsc_attr(ATTR_ENROLLEE_NONCE, e_nonce)
    #attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    wsc_done = build_eap_wsc(2, msg['eap_identifier'], attrs, opcode=WSC_Done)
    send_wsc_msg(hapd, dev[0].own_addr(), wsc_done)

    wps_wait_eap_failure(hapd, dev[0])

def test_wps_ext_m7_no_encr_settings(dev, apdev):
    """WPS proto: M7 without Encr Settings"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk)
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
    r_nonce = m2_attrs[ATTR_REGISTRAR_NONCE]
    r_pk = m2_attrs[ATTR_PUBLIC_KEY]

    authkey,keywrapkey = wsc_dh_kdf(r_pk, own_private, mac_addr, e_nonce,
                                    r_nonce)
    e_s1,e_s2,e_hash1,e_hash2 = wsc_dev_pw_hash(authkey, pin, e_pk, r_pk)

    logger.debug("Send M3 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M3)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    attrs += build_wsc_attr(ATTR_E_HASH1, e_hash1)
    attrs += build_wsc_attr(ATTR_E_HASH2, e_hash2)
    attrs += build_attr_authenticator(authkey, raw_m2_attrs, attrs)
    raw_m3_attrs = attrs
    m3 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m3)

    logger.debug("Receive M4 from AP")
    msg, m4_attrs, raw_m4_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M4)

    logger.debug("Send M5 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M5)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    data = build_wsc_attr(ATTR_E_SNONCE1, e_s1)
    attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m4_attrs, attrs)
    raw_m5_attrs = attrs
    m5 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    send_wsc_msg(hapd, addr, m5)

    logger.debug("Receive M6 from AP")
    msg, m6_attrs, raw_m6_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M6)

    logger.debug("Send M7 to AP")
    attrs = build_wsc_attr(ATTR_VERSION, '\x10')
    attrs += build_attr_msg_type(WPS_M7)
    attrs += build_wsc_attr(ATTR_REGISTRAR_NONCE, r_nonce)
    #data = build_wsc_attr(ATTR_E_SNONCE2, e_s2)
    #attrs += build_attr_encr_settings(authkey, keywrapkey, data)
    attrs += build_attr_authenticator(authkey, raw_m6_attrs, attrs)
    m7 = build_eap_wsc(2, msg['eap_identifier'], attrs)
    raw_m7_attrs = attrs
    send_wsc_msg(hapd, addr, m7)

    wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce)

def test_wps_ext_m1_workaround(dev, apdev):
    """WPS proto: M1 Manufacturer/Model workaround"""
    pin = "12345670"
    addr,bssid,hapd = wps_start_ext(apdev[0], dev[0], pin=pin)
    wps_ext_eap_identity_req(dev[0], hapd, bssid)
    wps_ext_eap_identity_resp(hapd, dev[0], addr)

    logger.debug("Receive WSC/Start from AP")
    msg = get_wsc_msg(hapd)
    if msg['wsc_opcode'] != WSC_Start:
        raise Exception("Unexpected Op-Code for WSC/Start")

    mac_addr = binascii.unhexlify(dev[0].own_addr().replace(':', ''))
    uuid_e = 16*'\x11'
    e_nonce = 16*'\x22'
    own_private, e_pk = wsc_dh_init()

    logger.debug("Send M1 to AP")
    m1, raw_m1_attrs = build_m1(msg['eap_identifier'], uuid_e, mac_addr,
                                e_nonce, e_pk, manufacturer='Apple TEST',
                                model_name='AirPort', config_methods='\xff\xff')
    send_wsc_msg(hapd, addr, m1)

    logger.debug("Receive M2 from AP")
    msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2)
