# 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_er_set_sel_reg_oom(dev, apdev):
    """WPS ER SetSelectedRegistrar OOM"""
    try:
        _test_ap_wps_er_set_sel_reg_oom(dev, apdev)
    finally:
        dev[0].request("WPS_ER_STOP")

def _test_ap_wps_er_set_sel_reg_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)

    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 not discovered")

    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 timed out")
    time.sleep(0.1)

    for func in [ "http_client_url_parse;wps_er_send_set_sel_reg",
                  "wps_er_soap_hdr;wps_er_send_set_sel_reg",
                  "http_client_addr;wps_er_send_set_sel_reg",
                  "wpabuf_alloc;wps_er_set_sel_reg" ]:
        with alloc_fail(dev[0], 1, func):
            if "OK" not in dev[0].request("WPS_ER_PBC " + ap_uuid):
                raise Exception("WPS_ER_PBC failed")
            ev = dev[0].wait_event(["WPS-PBC-ACTIVE"], timeout=3)
            if ev is None:
                raise Exception("WPS-PBC-ACTIVE not seen")

    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, no_response=False):
    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)
    if no_response:
        try:
            conn.getresponse()
        except Exception, e:
            pass
        return
    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)

    with alloc_fail(dev[0], 1, "wps_er_http_resp_ok"):
        send_wlanevent(url, uuid, m1, no_response=True)

    with alloc_fail(dev[0], 1, "wps_er_http_resp_not_found"):
        url2 = urlparse.urlparse(wps_event_url.replace('/event/', '/notfound/'))
        send_wlanevent(url2, uuid, m1, no_response=True)

    logger.info("EAP message: M1")
    data = '\x0202:11:22: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'
    dev[0].dump_monitor()
    with alloc_fail(dev[0], 1, "wps_er_add_sta_data"):
        send_wlanevent(url, uuid, data)
        ev = dev[0].wait_event(["WPS-ER-ENROLLEE-ADD"], timeout=0.1)
        if ev is not None:
            raise Exception("Unexpected enrollee add event")
    send_wlanevent(url, uuid, data)
    ev = dev[0].wait_event(["WPS-ER-ENROLLEE-ADD"], timeout=2)
    if ev is None:
        raise Exception("Enrollee add event not seen")

    with alloc_fail(dev[0], 1, "base64_encode;wps_er_soap_hdr"):
        send_wlanevent(url, uuid, data)

    with alloc_fail(dev[0], 1, "wpabuf_alloc;wps_er_soap_hdr"):
        send_wlanevent(url, uuid, data)

    with alloc_fail(dev[0], 1, "http_client_url_parse;wps_er_sta_send_msg"):
        send_wlanevent(url, uuid, data)

    with alloc_fail(dev[0], 1, "http_client_addr;wps_er_sta_send_msg"):
        send_wlanevent(url, uuid, data)

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)
