Beispiel #1
0
static struct wpabuf * wps_build_wsc_done(struct wps_data *wps)
{
	struct wpabuf *msg;

	wpa_printf(MSG_DEBUG, "WPS: Building Message WSC_Done");

	msg = wpabuf_alloc(1000);
	if (msg == NULL)
		return NULL;

	if (wps_build_version(msg) ||
	    wps_build_msg_type(msg, WPS_WSC_DONE) ||
	    wps_build_enrollee_nonce(wps, msg) ||
	    wps_build_registrar_nonce(wps, msg) ||
	    wps_build_wfa_ext(msg, 0, NULL, 0)) {
		wpabuf_free(msg);
		return NULL;
	}

	if (wps->wps->ap)
		wps->state = RECV_ACK;
	else {
		wps_success_event(wps->wps);
		wps->state = WPS_FINISHED;
	}
	return msg;
}
static enum wps_process_res wps_process_wsc_ack(struct wps_data *wps,
                        const struct wpabuf *msg)
{
    struct wps_parse_attr attr;

    wpa_printf(MSG_DEBUG, "WPS: Received WSC_ACK");

    if (wps_parse_msg(msg, &attr) < 0)
        return WPS_FAILURE;

    if (!wps_version_supported(attr.version)) {
        wpa_printf(MSG_DEBUG, "WPS: Unsupported message version 0x%x",
               attr.version ? *attr.version : 0);
        return WPS_FAILURE;
    }

    if (attr.msg_type == NULL) {
        wpa_printf(MSG_DEBUG, "WPS: No Message Type attribute");
        return WPS_FAILURE;
    }

    if (*attr.msg_type != WPS_WSC_ACK) {
        wpa_printf(MSG_DEBUG, "WPS: Invalid Message Type %d",
               *attr.msg_type);
        return WPS_FAILURE;
    }

    if (attr.registrar_nonce == NULL ||
        os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN != 0))
    {
        wpa_printf(MSG_DEBUG, "WPS: Mismatch in registrar nonce");
        return WPS_FAILURE;
    }

    if (attr.enrollee_nonce == NULL ||
        os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN != 0)) {
        wpa_printf(MSG_DEBUG, "WPS: Mismatch in enrollee nonce");
        return WPS_FAILURE;
    }

    if (wps->state == RECV_ACK && wps->wps->ap) {
        wpa_printf(MSG_DEBUG, "WPS: External Registrar registration "
               "completed successfully");
        wps_success_event(wps->wps);
        wps->state = WPS_FINISHED;
        return WPS_DONE;
    }

    return WPS_FAILURE;
}