Lines Matching refs:wps
141 struct wps_context *wps; member
477 static int wps_build_wps_state(struct wps_context *wps, struct wpabuf *msg) in wps_build_wps_state() argument
480 wps->wps_state); in wps_build_wps_state()
483 wpabuf_put_u8(msg, wps->wps_state); in wps_build_wps_state()
489 static void wps_registrar_free_pending_m2(struct wps_context *wps) in wps_registrar_free_pending_m2() argument
492 p = wps->upnp_msgs; in wps_registrar_free_pending_m2()
496 wps->upnp_msgs = p->next; in wps_registrar_free_pending_m2()
513 static int wps_build_ap_setup_locked(struct wps_context *wps, in wps_build_ap_setup_locked() argument
516 if (wps->ap_setup_locked && wps->ap_setup_locked != 2) { in wps_build_ap_setup_locked()
565 return wps_build_uuid_e(msg, reg->wps->uuid); in wps_build_sel_pbc_reg_uuid_e()
598 methods = reg->wps->config_methods; in wps_build_sel_reg_config_methods()
603 wps_set_pushbutton(&methods, reg->wps->config_methods); in wps_build_sel_reg_config_methods()
623 methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON; in wps_build_probe_config_methods()
637 return wps_build_config_methods(msg, reg->wps->config_methods); in wps_build_config_methods_r()
668 wps_registrar_init(struct wps_context *wps, in wps_registrar_init() argument
679 reg->wps = wps; in wps_registrar_init()
1029 wps_pbc_timeout_event(reg->wps); in wps_registrar_pbc_timeout()
1055 wps_pbc_overlap_event(reg->wps); in wps_registrar_button_pushed()
1070 wps_pbc_active_event(reg->wps); in wps_registrar_button_pushed()
1084 wps_pbc_disable_event(reg->wps); in wps_registrar_pbc_completed()
1227 wps_pbc_overlap_event(reg->wps); in wps_registrar_probe_req_rx()
1232 bool esp_wps_registrar_check_pbc_overlap(struct wps_context *wps) in esp_wps_registrar_check_pbc_overlap() argument
1235 if (wps_registrar_pbc_overlap(wps->registrar, NULL, NULL)) { in esp_wps_registrar_check_pbc_overlap()
1236 wps->registrar->force_pbc_overlap = 1; in esp_wps_registrar_check_pbc_overlap()
1237 wps_pbc_overlap_event(wps); in esp_wps_registrar_check_pbc_overlap()
1291 methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON; in wps_cb_set_sel_reg()
1295 wps_set_pushbutton(&methods, reg->wps->config_methods); in wps_cb_set_sel_reg()
1300 reg->selected_registrar, reg->wps->config_methods, in wps_cb_set_sel_reg()
1332 if (reg->wps->dev.vendor_ext[i]) { in wps_set_ie()
1334 vendor_len += wpabuf_len(reg->wps->dev.vendor_ext[i]); in wps_set_ie()
1348 wps_build_wps_state(reg->wps, beacon) || in wps_set_ie()
1349 wps_build_ap_setup_locked(reg->wps, beacon) || in wps_set_ie()
1354 (reg->dualband && wps_build_rf_bands(®->wps->dev, beacon, 0)) || in wps_set_ie()
1356 wps_build_vendor_ext(®->wps->dev, beacon) || in wps_set_ie()
1357 wps_build_application_ext(®->wps->dev, beacon)) in wps_set_ie()
1361 if (wps_build_dev_name(®->wps->dev, beacon) || in wps_set_ie()
1362 wps_build_primary_dev_type(®->wps->dev, beacon)) in wps_set_ie()
1369 wps_build_wps_state(reg->wps, probe) || in wps_set_ie()
1370 wps_build_ap_setup_locked(reg->wps, probe) || in wps_set_ie()
1374 wps_build_resp_type(probe, reg->wps->ap ? WPS_RESP_AP : in wps_set_ie()
1376 wps_build_uuid_e(probe, reg->wps->uuid) || in wps_set_ie()
1377 wps_build_device_attrs(®->wps->dev, probe) || in wps_set_ie()
1379 (reg->dualband && wps_build_rf_bands(®->wps->dev, probe, 0)) || in wps_set_ie()
1381 wps_build_vendor_ext(®->wps->dev, probe) || in wps_set_ie()
1382 wps_build_application_ext(®->wps->dev, probe)) in wps_set_ie()
1399 static int wps_get_dev_password(struct wps_data *wps) in wps_get_dev_password() argument
1404 bin_clear_free(wps->dev_password, wps->dev_password_len); in wps_get_dev_password()
1405 wps->dev_password = NULL; in wps_get_dev_password()
1407 if (wps->pbc) { in wps_get_dev_password()
1412 } else if (wps->nfc_pw_token) { in wps_get_dev_password()
1413 if (wps->nfc_pw_token->pw_id == DEV_PW_NFC_CONNECTION_HANDOVER) in wps_get_dev_password()
1422 pin = wps->nfc_pw_token->dev_pw; in wps_get_dev_password()
1423 pin_len = wps->nfc_pw_token->dev_pw_len; in wps_get_dev_password()
1424 } else if (wps->dev_pw_id >= 0x10 && in wps_get_dev_password()
1425 wps->wps->ap_nfc_dev_pw_id == wps->dev_pw_id && in wps_get_dev_password()
1426 wps->wps->ap_nfc_dev_pw) { in wps_get_dev_password()
1428 pin = wpabuf_head(wps->wps->ap_nfc_dev_pw); in wps_get_dev_password()
1429 pin_len = wpabuf_len(wps->wps->ap_nfc_dev_pw); in wps_get_dev_password()
1432 pin = wps_registrar_get_pin(wps->wps->registrar, wps->uuid_e, in wps_get_dev_password()
1434 if (pin && wps->dev_pw_id >= 0x10) { in wps_get_dev_password()
1440 wps->dev_pw_id = DEV_PW_DEFAULT; in wps_get_dev_password()
1446 wps->wps, wps->wps->registrar); in wps_get_dev_password()
1447 wps_cb_pin_needed(wps->wps->registrar, wps->uuid_e, in wps_get_dev_password()
1448 &wps->peer_dev); in wps_get_dev_password()
1452 wps->dev_password = os_memdup(pin, pin_len); in wps_get_dev_password()
1453 if (wps->dev_password == NULL) in wps_get_dev_password()
1455 wps->dev_password_len = pin_len; in wps_get_dev_password()
1461 static int wps_build_uuid_r(struct wps_data *wps, struct wpabuf *msg) in wps_build_uuid_r() argument
1466 wpabuf_put_data(msg, wps->uuid_r, WPS_UUID_LEN); in wps_build_uuid_r()
1471 static int wps_build_r_hash(struct wps_data *wps, struct wpabuf *msg) in wps_build_r_hash() argument
1477 if (random_get_bytes(wps->snonce, 2 * WPS_SECRET_NONCE_LEN) < 0) in wps_build_r_hash()
1479 wpa_hexdump(MSG_DEBUG, "WPS: R-S1", wps->snonce, WPS_SECRET_NONCE_LEN); in wps_build_r_hash()
1481 wps->snonce + WPS_SECRET_NONCE_LEN, WPS_SECRET_NONCE_LEN); in wps_build_r_hash()
1483 if (wps->dh_pubkey_e == NULL || wps->dh_pubkey_r == NULL) { in wps_build_r_hash()
1494 addr[0] = wps->snonce; in wps_build_r_hash()
1496 addr[1] = wps->psk1; in wps_build_r_hash()
1498 addr[2] = wpabuf_head(wps->dh_pubkey_e); in wps_build_r_hash()
1499 len[2] = wpabuf_len(wps->dh_pubkey_e); in wps_build_r_hash()
1500 addr[3] = wpabuf_head(wps->dh_pubkey_r); in wps_build_r_hash()
1501 len[3] = wpabuf_len(wps->dh_pubkey_r); in wps_build_r_hash()
1502 hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash); in wps_build_r_hash()
1510 addr[0] = wps->snonce + WPS_SECRET_NONCE_LEN; in wps_build_r_hash()
1511 addr[1] = wps->psk2; in wps_build_r_hash()
1512 hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash); in wps_build_r_hash()
1519 static int wps_build_r_snonce1(struct wps_data *wps, struct wpabuf *msg) in wps_build_r_snonce1() argument
1524 wpabuf_put_data(msg, wps->snonce, WPS_SECRET_NONCE_LEN); in wps_build_r_snonce1()
1529 static int wps_build_r_snonce2(struct wps_data *wps, struct wpabuf *msg) in wps_build_r_snonce2() argument
1534 wpabuf_put_data(msg, wps->snonce + WPS_SECRET_NONCE_LEN, in wps_build_r_snonce2()
1635 int wps_build_cred(struct wps_data *wps, struct wpabuf *msg) in wps_build_cred() argument
1639 struct wps_registrar *reg = wps->wps->registrar; in wps_build_cred()
1644 if (wps->wps->registrar->skip_cred_build) in wps_build_cred()
1648 if (wps->use_cred) { in wps_build_cred()
1649 os_memcpy(&wps->cred, wps->use_cred, sizeof(wps->cred)); in wps_build_cred()
1653 os_memset(&wps->cred, 0, sizeof(wps->cred)); in wps_build_cred()
1655 if (wps->peer_dev.multi_ap_ext == MULTI_AP_BACKHAUL_STA && in wps_build_cred()
1658 os_memcpy(wps->cred.ssid, reg->multi_ap_backhaul_ssid, in wps_build_cred()
1660 wps->cred.ssid_len = reg->multi_ap_backhaul_ssid_len; in wps_build_cred()
1662 wps->cred.auth_type = WPS_AUTH_WPA2PSK; in wps_build_cred()
1663 wps->cred.encr_type = WPS_ENCR_AES; in wps_build_cred()
1667 os_memcpy(wps->cred.mac_addr, wps->mac_addr_e, ETH_ALEN); in wps_build_cred()
1669 os_memcpy(wps->cred.key, in wps_build_cred()
1672 wps->cred.key_len = in wps_build_cred()
1678 os_memcpy(wps->cred.ssid, wps->wps->ssid, wps->wps->ssid_len); in wps_build_cred()
1679 wps->cred.ssid_len = wps->wps->ssid_len; in wps_build_cred()
1684 wps->wps->auth_types, wps->auth_type); in wps_build_cred()
1685 if (wps->auth_type & WPS_AUTH_WPA2PSK) in wps_build_cred()
1686 wps->auth_type = WPS_AUTH_WPA2PSK; in wps_build_cred()
1688 else if (wps->auth_type & WPS_AUTH_WPAPSK) in wps_build_cred()
1689 wps->auth_type = WPS_AUTH_WPAPSK; in wps_build_cred()
1691 else if (wps->auth_type & WPS_AUTH_OPEN) in wps_build_cred()
1692 wps->auth_type = WPS_AUTH_OPEN; in wps_build_cred()
1695 wps->auth_type); in wps_build_cred()
1698 wps->cred.auth_type = wps->auth_type; in wps_build_cred()
1702 wps->wps->encr_types, wps->wps->encr_types_rsn, in wps_build_cred()
1703 wps->wps->encr_types_wpa, wps->encr_type); in wps_build_cred()
1704 if (wps->wps->ap && wps->auth_type == WPS_AUTH_WPA2PSK) in wps_build_cred()
1705 wps->encr_type &= wps->wps->encr_types_rsn; in wps_build_cred()
1706 else if (wps->wps->ap && wps->auth_type == WPS_AUTH_WPAPSK) in wps_build_cred()
1707 wps->encr_type &= wps->wps->encr_types_wpa; in wps_build_cred()
1708 if (wps->auth_type == WPS_AUTH_WPA2PSK || in wps_build_cred()
1709 wps->auth_type == WPS_AUTH_WPAPSK) { in wps_build_cred()
1710 if (wps->encr_type & WPS_ENCR_AES) in wps_build_cred()
1711 wps->encr_type = WPS_ENCR_AES; in wps_build_cred()
1713 else if (wps->encr_type & WPS_ENCR_TKIP) in wps_build_cred()
1714 wps->encr_type = WPS_ENCR_TKIP; in wps_build_cred()
1722 if (wps->encr_type & WPS_ENCR_NONE) in wps_build_cred()
1723 wps->encr_type = WPS_ENCR_NONE; in wps_build_cred()
1725 else if (wps->encr_type & WPS_ENCR_WEP) in wps_build_cred()
1726 wps->encr_type = WPS_ENCR_WEP; in wps_build_cred()
1734 wps->cred.encr_type = wps->encr_type; in wps_build_cred()
1738 os_memcpy(wps->cred.mac_addr, wps->mac_addr_e, ETH_ALEN); in wps_build_cred()
1740 if (wps->wps->wps_state == WPS_STATE_NOT_CONFIGURED && wps->wps->ap && in wps_build_cred()
1741 !wps->wps->registrar->disable_auto_conf) { in wps_build_cred()
1750 os_free(wps->new_psk); in wps_build_cred()
1751 wps->new_psk = (u8 *) base64_encode(r, sizeof(r), in wps_build_cred()
1752 &wps->new_psk_len); in wps_build_cred()
1753 if (wps->new_psk == NULL) in wps_build_cred()
1755 wps->new_psk_len--; /* remove newline */ in wps_build_cred()
1756 while (wps->new_psk_len && in wps_build_cred()
1757 wps->new_psk[wps->new_psk_len - 1] == '=') in wps_build_cred()
1758 wps->new_psk_len--; in wps_build_cred()
1760 wps->new_psk, wps->new_psk_len); in wps_build_cred()
1761 os_memcpy(wps->cred.key, wps->new_psk, wps->new_psk_len); in wps_build_cred()
1762 wps->cred.key_len = wps->new_psk_len; in wps_build_cred()
1763 } else if (wps_cp_lookup_pskfile(reg, wps->mac_addr_e, &pskfile_psk)) { in wps_build_cred()
1767 os_memcpy(wps->cred.key, hex, PMK_LEN * 2); in wps_build_cred()
1768 wps->cred.key_len = PMK_LEN * 2; in wps_build_cred()
1769 } else if (!wps->wps->registrar->force_per_enrollee_psk && in wps_build_cred()
1770 wps->use_psk_key && wps->wps->psk_set) { in wps_build_cred()
1772 wpa_snprintf_hex(hex, sizeof(hex), wps->wps->psk, PMK_LEN); in wps_build_cred()
1773 os_memcpy(wps->cred.key, hex, PMK_LEN * 2); in wps_build_cred()
1774 wps->cred.key_len = PMK_LEN * 2; in wps_build_cred()
1776 if ((!wps->wps->registrar->force_per_enrollee_psk || in wps_build_cred()
1777 wps->wps->use_passphrase) && wps->wps->network_key) { in wps_build_cred()
1780 os_memcpy(wps->cred.key, wps->wps->network_key, in wps_build_cred()
1781 wps->wps->network_key_len); in wps_build_cred()
1782 wps->cred.key_len = wps->wps->network_key_len; in wps_build_cred()
1783 } else if (wps->auth_type & (WPS_AUTH_WPAPSK | WPS_AUTH_WPA2PSK)) { in wps_build_cred()
1785 os_free(wps->new_psk); in wps_build_cred()
1786 wps->new_psk_len = PMK_LEN; in wps_build_cred()
1787 wps->new_psk = os_malloc(wps->new_psk_len); in wps_build_cred()
1788 if (wps->new_psk == NULL) in wps_build_cred()
1791 random_get_bytes(wps->new_psk, wps->new_psk_len) < 0) { in wps_build_cred()
1794 os_free(wps->new_psk); in wps_build_cred()
1795 wps->new_psk = NULL; in wps_build_cred()
1799 wps->new_psk, wps->new_psk_len); in wps_build_cred()
1800 wpa_snprintf_hex(hex, sizeof(hex), wps->new_psk, in wps_build_cred()
1801 wps->new_psk_len); in wps_build_cred()
1802 os_memcpy(wps->cred.key, hex, wps->new_psk_len * 2); in wps_build_cred()
1803 wps->cred.key_len = wps->new_psk_len * 2; in wps_build_cred()
1823 os_memcpy(stub.mac_addr, wps->mac_addr_e, ETH_ALEN); in wps_build_cred()
1839 if (wps_build_credential(cred, &wps->cred)) { in wps_build_cred()
1850 if (wps->wps->registrar->extra_cred) { in wps_build_cred()
1852 wpabuf_put_buf(msg, wps->wps->registrar->extra_cred); in wps_build_cred()
1859 static int wps_build_ap_settings(struct wps_data *wps, struct wpabuf *msg) in wps_build_ap_settings() argument
1863 if (wps_build_credential(msg, &wps->cred)) in wps_build_ap_settings()
1871 static struct wpabuf * wps_build_ap_cred(struct wps_data *wps) in wps_build_ap_cred() argument
1885 if (wps_build_ap_settings(wps, plain)) { in wps_build_ap_cred()
1901 static struct wpabuf * wps_build_m2(struct wps_data *wps) in wps_build_m2() argument
1906 if (random_get_bytes(wps->nonce_r, WPS_NONCE_LEN) < 0) in wps_build_m2()
1909 wps->nonce_r, WPS_NONCE_LEN); in wps_build_m2()
1910 wpa_hexdump(MSG_DEBUG, "WPS: UUID-R", wps->uuid_r, WPS_UUID_LEN); in wps_build_m2()
1919 wps_build_enrollee_nonce(wps, msg) || in wps_build_m2()
1920 wps_build_registrar_nonce(wps, msg) || in wps_build_m2()
1921 wps_build_uuid_r(wps, msg) || in wps_build_m2()
1922 wps_build_public_key(wps, msg) || in wps_build_m2()
1923 wps_derive_keys(wps) || in wps_build_m2()
1924 wps_build_auth_type_flags(wps, msg) || in wps_build_m2()
1925 wps_build_encr_type_flags(wps, msg) || in wps_build_m2()
1926 wps_build_conn_type_flags(wps, msg) || in wps_build_m2()
1927 wps_build_config_methods_r(wps->wps->registrar, msg) || in wps_build_m2()
1928 wps_build_device_attrs(&wps->wps->dev, msg) || in wps_build_m2()
1929 wps_build_rf_bands(&wps->wps->dev, msg, in wps_build_m2()
1930 wps->wps->rf_band_cb(wps->wps->cb_ctx)) || in wps_build_m2()
1931 wps_build_assoc_state(wps, msg) || in wps_build_m2()
1933 wps_build_dev_password_id(msg, wps->dev_pw_id) || in wps_build_m2()
1934 wps_build_os_version(&wps->wps->dev, msg) || in wps_build_m2()
1941 if (wps->nfc_pw_token && wps->nfc_pw_token->pk_hash_provided_oob && in wps_build_m2()
1942 wps->nfc_pw_token->pw_id == DEV_PW_NFC_CONNECTION_HANDOVER) { in wps_build_m2()
1951 wps_build_cred(wps, plain) || in wps_build_m2()
1952 wps_build_key_wrap_auth(wps, plain) || in wps_build_m2()
1953 wps_build_encr_settings(wps, msg, plain)) { in wps_build_m2()
1963 if (wps_build_authenticator(wps, msg)) { in wps_build_m2()
1968 wps->int_reg = 1; in wps_build_m2()
1969 wps->state = config_in_m2 ? RECV_DONE : RECV_M3; in wps_build_m2()
1974 static struct wpabuf * wps_build_m2d(struct wps_data *wps) in wps_build_m2d() argument
1977 u16 err = wps->config_error; in wps_build_m2d()
1984 if (wps->wps->ap && wps->wps->ap_setup_locked && in wps_build_m2d()
1990 wps_build_enrollee_nonce(wps, msg) || in wps_build_m2d()
1991 wps_build_registrar_nonce(wps, msg) || in wps_build_m2d()
1992 wps_build_uuid_r(wps, msg) || in wps_build_m2d()
1993 wps_build_auth_type_flags(wps, msg) || in wps_build_m2d()
1994 wps_build_encr_type_flags(wps, msg) || in wps_build_m2d()
1995 wps_build_conn_type_flags(wps, msg) || in wps_build_m2d()
1996 wps_build_config_methods_r(wps->wps->registrar, msg) || in wps_build_m2d()
1997 wps_build_device_attrs(&wps->wps->dev, msg) || in wps_build_m2d()
1998 wps_build_rf_bands(&wps->wps->dev, msg, in wps_build_m2d()
1999 wps->wps->rf_band_cb(wps->wps->cb_ctx)) || in wps_build_m2d()
2000 wps_build_assoc_state(wps, msg) || in wps_build_m2d()
2002 wps_build_os_version(&wps->wps->dev, msg) || in wps_build_m2d()
2008 wps->state = RECV_M2D_ACK; in wps_build_m2d()
2013 static struct wpabuf * wps_build_m4(struct wps_data *wps) in wps_build_m4() argument
2019 if (wps_derive_psk(wps, wps->dev_password, wps->dev_password_len) < 0) in wps_build_m4()
2034 wps_build_enrollee_nonce(wps, msg) || in wps_build_m4()
2035 wps_build_r_hash(wps, msg) || in wps_build_m4()
2036 wps_build_r_snonce1(wps, plain) || in wps_build_m4()
2037 wps_build_key_wrap_auth(wps, plain) || in wps_build_m4()
2038 wps_build_encr_settings(wps, msg, plain) || in wps_build_m4()
2040 wps_build_authenticator(wps, msg)) { in wps_build_m4()
2047 wps->state = RECV_M5; in wps_build_m4()
2052 static struct wpabuf * wps_build_m6(struct wps_data *wps) in wps_build_m6() argument
2070 wps_build_enrollee_nonce(wps, msg) || in wps_build_m6()
2071 wps_build_r_snonce2(wps, plain) || in wps_build_m6()
2072 wps_build_key_wrap_auth(wps, plain) || in wps_build_m6()
2073 wps_build_encr_settings(wps, msg, plain) || in wps_build_m6()
2075 wps_build_authenticator(wps, msg)) { in wps_build_m6()
2082 wps->wps_pin_revealed = 1; in wps_build_m6()
2083 wps->state = RECV_M7; in wps_build_m6()
2088 static struct wpabuf * wps_build_m8(struct wps_data *wps) in wps_build_m8() argument
2106 wps_build_enrollee_nonce(wps, msg) || in wps_build_m8()
2107 ((wps->wps->ap || wps->er) && wps_build_cred(wps, plain)) || in wps_build_m8()
2108 (!wps->wps->ap && !wps->er && wps_build_ap_settings(wps, plain)) || in wps_build_m8()
2109 wps_build_key_wrap_auth(wps, plain) || in wps_build_m8()
2110 wps_build_encr_settings(wps, msg, plain) || in wps_build_m8()
2112 wps_build_authenticator(wps, msg)) { in wps_build_m8()
2119 wps->state = RECV_DONE; in wps_build_m8()
2124 struct wpabuf * wps_registrar_get_msg(struct wps_data *wps, in wps_registrar_get_msg() argument
2130 if (!wps->int_reg && wps->wps->wps_upnp) { in wps_registrar_get_msg()
2132 if (wps->ext_reg > 1) in wps_registrar_get_msg()
2133 wps_registrar_free_pending_m2(wps->wps); in wps_registrar_get_msg()
2134 p = wps->wps->upnp_msgs; in wps_registrar_get_msg()
2146 wps->wps->upnp_msgs = NULL; in wps_registrar_get_msg()
2160 if (wps->ext_reg == 0) in wps_registrar_get_msg()
2161 wps->ext_reg = 1; in wps_registrar_get_msg()
2165 if (wps->ext_reg) { in wps_registrar_get_msg()
2172 switch (wps->state) { in wps_registrar_get_msg()
2174 if (wps_get_dev_password(wps) < 0) in wps_registrar_get_msg()
2175 msg = wps_build_m2d(wps); in wps_registrar_get_msg()
2177 msg = wps_build_m2(wps); in wps_registrar_get_msg()
2181 msg = wps_build_m2d(wps); in wps_registrar_get_msg()
2185 msg = wps_build_m4(wps); in wps_registrar_get_msg()
2189 msg = wps_build_m6(wps); in wps_registrar_get_msg()
2193 msg = wps_build_m8(wps); in wps_registrar_get_msg()
2197 msg = wps_build_wsc_ack(wps); in wps_registrar_get_msg()
2201 msg = wps_build_wsc_nack(wps); in wps_registrar_get_msg()
2206 "a message", wps->state); in wps_registrar_get_msg()
2214 wpabuf_free(wps->last_msg); in wps_registrar_get_msg()
2215 wps->last_msg = wpabuf_dup(msg); in wps_registrar_get_msg()
2222 static int wps_process_enrollee_nonce(struct wps_data *wps, const u8 *e_nonce) in wps_process_enrollee_nonce() argument
2229 os_memcpy(wps->nonce_e, e_nonce, WPS_NONCE_LEN); in wps_process_enrollee_nonce()
2231 wps->nonce_e, WPS_NONCE_LEN); in wps_process_enrollee_nonce()
2237 static int wps_process_registrar_nonce(struct wps_data *wps, const u8 *r_nonce) in wps_process_registrar_nonce() argument
2244 if (os_memcmp(wps->nonce_r, r_nonce, WPS_NONCE_LEN) != 0) { in wps_process_registrar_nonce()
2253 static int wps_process_uuid_e(struct wps_data *wps, const u8 *uuid_e) in wps_process_uuid_e() argument
2260 os_memcpy(wps->uuid_e, uuid_e, WPS_UUID_LEN); in wps_process_uuid_e()
2261 wpa_hexdump(MSG_DEBUG, "WPS: UUID-E", wps->uuid_e, WPS_UUID_LEN); in wps_process_uuid_e()
2267 static int wps_process_dev_password_id(struct wps_data *wps, const u8 *pw_id) in wps_process_dev_password_id() argument
2274 wps->dev_pw_id = WPA_GET_BE16(pw_id); in wps_process_dev_password_id()
2275 wpa_printf(MSG_DEBUG, "WPS: Device Password ID %d", wps->dev_pw_id); in wps_process_dev_password_id()
2281 static int wps_process_e_hash1(struct wps_data *wps, const u8 *e_hash1) in wps_process_e_hash1() argument
2288 os_memcpy(wps->peer_hash1, e_hash1, WPS_HASH_LEN); in wps_process_e_hash1()
2289 wpa_hexdump(MSG_DEBUG, "WPS: E-Hash1", wps->peer_hash1, WPS_HASH_LEN); in wps_process_e_hash1()
2295 static int wps_process_e_hash2(struct wps_data *wps, const u8 *e_hash2) in wps_process_e_hash2() argument
2302 os_memcpy(wps->peer_hash2, e_hash2, WPS_HASH_LEN); in wps_process_e_hash2()
2303 wpa_hexdump(MSG_DEBUG, "WPS: E-Hash2", wps->peer_hash2, WPS_HASH_LEN); in wps_process_e_hash2()
2309 static int wps_process_e_snonce1(struct wps_data *wps, const u8 *e_snonce1) in wps_process_e_snonce1() argument
2326 addr[1] = wps->psk1; in wps_process_e_snonce1()
2328 addr[2] = wpabuf_head(wps->dh_pubkey_e); in wps_process_e_snonce1()
2329 len[2] = wpabuf_len(wps->dh_pubkey_e); in wps_process_e_snonce1()
2330 addr[3] = wpabuf_head(wps->dh_pubkey_r); in wps_process_e_snonce1()
2331 len[3] = wpabuf_len(wps->dh_pubkey_r); in wps_process_e_snonce1()
2332 hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash); in wps_process_e_snonce1()
2334 if (os_memcmp_const(wps->peer_hash1, hash, WPS_HASH_LEN) != 0) { in wps_process_e_snonce1()
2337 wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE; in wps_process_e_snonce1()
2338 wps_pwd_auth_fail_event(wps->wps, 0, 1, wps->mac_addr_e); in wps_process_e_snonce1()
2349 static int wps_process_e_snonce2(struct wps_data *wps, const u8 *e_snonce2) in wps_process_e_snonce2() argument
2366 addr[1] = wps->psk2; in wps_process_e_snonce2()
2368 addr[2] = wpabuf_head(wps->dh_pubkey_e); in wps_process_e_snonce2()
2369 len[2] = wpabuf_len(wps->dh_pubkey_e); in wps_process_e_snonce2()
2370 addr[3] = wpabuf_head(wps->dh_pubkey_r); in wps_process_e_snonce2()
2371 len[3] = wpabuf_len(wps->dh_pubkey_r); in wps_process_e_snonce2()
2372 hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash); in wps_process_e_snonce2()
2374 if (os_memcmp_const(wps->peer_hash2, hash, WPS_HASH_LEN) != 0) { in wps_process_e_snonce2()
2377 wps_registrar_invalidate_pin(wps->wps->registrar, wps->uuid_e); in wps_process_e_snonce2()
2378 wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE; in wps_process_e_snonce2()
2379 wps_pwd_auth_fail_event(wps->wps, 0, 2, wps->mac_addr_e); in wps_process_e_snonce2()
2385 wps->wps_pin_revealed = 0; in wps_process_e_snonce2()
2386 wps_registrar_unlock_pin(wps->wps->registrar, wps->uuid_e); in wps_process_e_snonce2()
2393 wps_registrar_invalidate_pin(wps->wps->registrar, wps->uuid_e); in wps_process_e_snonce2()
2399 static int wps_process_mac_addr(struct wps_data *wps, const u8 *mac_addr) in wps_process_mac_addr() argument
2408 os_memcpy(wps->mac_addr_e, mac_addr, ETH_ALEN); in wps_process_mac_addr()
2409 os_memcpy(wps->peer_dev.mac_addr, mac_addr, ETH_ALEN); in wps_process_mac_addr()
2415 static int wps_process_pubkey(struct wps_data *wps, const u8 *pk, in wps_process_pubkey() argument
2423 wpabuf_free(wps->dh_pubkey_e); in wps_process_pubkey()
2424 wps->dh_pubkey_e = wpabuf_alloc_copy(pk, pk_len); in wps_process_pubkey()
2425 if (wps->dh_pubkey_e == NULL) in wps_process_pubkey()
2432 static int wps_process_auth_type_flags(struct wps_data *wps, const u8 *auth) in wps_process_auth_type_flags() argument
2463 wps->auth_type = wps->wps->auth_types & auth_types; in wps_process_auth_type_flags()
2464 if (wps->auth_type == 0) { in wps_process_auth_type_flags()
2467 wps->wps->auth_types, auth_types); in wps_process_auth_type_flags()
2479 wps->auth_type = wps->wps->auth_types; in wps_process_auth_type_flags()
2489 static int wps_process_encr_type_flags(struct wps_data *wps, const u8 *encr) in wps_process_encr_type_flags() argument
2503 wps->encr_type = wps->wps->encr_types & encr_types; in wps_process_encr_type_flags()
2504 if (wps->encr_type == 0) { in wps_process_encr_type_flags()
2507 wps->wps->encr_types, encr_types); in wps_process_encr_type_flags()
2519 wps->encr_type = wps->wps->encr_types; in wps_process_encr_type_flags()
2529 static int wps_process_conn_type_flags(struct wps_data *wps, const u8 *conn) in wps_process_conn_type_flags() argument
2544 static int wps_process_config_methods(struct wps_data *wps, const u8 *methods) in wps_process_config_methods() argument
2567 if (!(m & WPS_CONFIG_DISPLAY) && !wps->use_psk_key) { in wps_process_config_methods()
2575 wps->use_psk_key = 1; in wps_process_config_methods()
2582 static int wps_process_wps_state(struct wps_data *wps, const u8 *state) in wps_process_wps_state() argument
2597 static int wps_process_assoc_state(struct wps_data *wps, const u8 *assoc) in wps_process_assoc_state() argument
2608 static int wps_process_config_error(struct wps_data *wps, const u8 *err) in wps_process_config_error() argument
2619 static int wps_registrar_p2p_dev_addr_match(struct wps_data *wps) in wps_registrar_p2p_dev_addr_match() argument
2622 struct wps_registrar *reg = wps->wps->registrar; in wps_registrar_p2p_dev_addr_match()
2627 if (os_memcmp(reg->p2p_dev_addr, wps->p2p_dev_addr, ETH_ALEN) != 0) { in wps_registrar_p2p_dev_addr_match()
2632 MAC2STR(wps->p2p_dev_addr)); in wps_registrar_p2p_dev_addr_match()
2640 static int wps_registrar_skip_overlap(struct wps_data *wps) in wps_registrar_skip_overlap() argument
2643 struct wps_registrar *reg = wps->wps->registrar; in wps_registrar_skip_overlap()
2648 if (os_memcmp(reg->p2p_dev_addr, wps->p2p_dev_addr, ETH_ALEN) == 0) { in wps_registrar_skip_overlap()
2658 static enum wps_process_res wps_process_m1(struct wps_data *wps, in wps_process_m1() argument
2663 if (wps->state != RECV_M1) { in wps_process_m1()
2665 "receiving M1", wps->state); in wps_process_m1()
2669 if (wps_process_uuid_e(wps, attr->uuid_e) || in wps_process_m1()
2670 wps_process_mac_addr(wps, attr->mac_addr) || in wps_process_m1()
2671 wps_process_enrollee_nonce(wps, attr->enrollee_nonce) || in wps_process_m1()
2672 wps_process_pubkey(wps, attr->public_key, attr->public_key_len) || in wps_process_m1()
2673 wps_process_auth_type_flags(wps, attr->auth_type_flags) || in wps_process_m1()
2674 wps_process_encr_type_flags(wps, attr->encr_type_flags) || in wps_process_m1()
2675 wps_process_conn_type_flags(wps, attr->conn_type_flags) || in wps_process_m1()
2676 wps_process_config_methods(wps, attr->config_methods) || in wps_process_m1()
2677 wps_process_wps_state(wps, attr->wps_state) || in wps_process_m1()
2678 wps_process_device_attrs(&wps->peer_dev, attr) || in wps_process_m1()
2679 wps_process_rf_bands(&wps->peer_dev, attr->rf_bands) || in wps_process_m1()
2680 wps_process_assoc_state(wps, attr->assoc_state) || in wps_process_m1()
2681 wps_process_dev_password_id(wps, attr->dev_password_id) || in wps_process_m1()
2682 wps_process_config_error(wps, attr->config_error) || in wps_process_m1()
2683 wps_process_os_version(&wps->peer_dev, attr->os_version)) in wps_process_m1()
2686 if (wps->dev_pw_id < 0x10 && in wps_process_m1()
2687 wps->dev_pw_id != DEV_PW_DEFAULT && in wps_process_m1()
2688 wps->dev_pw_id != DEV_PW_P2PS_DEFAULT && in wps_process_m1()
2689 wps->dev_pw_id != DEV_PW_USER_SPECIFIED && in wps_process_m1()
2690 wps->dev_pw_id != DEV_PW_MACHINE_SPECIFIED && in wps_process_m1()
2691 wps->dev_pw_id != DEV_PW_REGISTRAR_SPECIFIED && in wps_process_m1()
2693 wps->dev_pw_id != DEV_PW_NFC_CONNECTION_HANDOVER && in wps_process_m1()
2695 (wps->dev_pw_id != DEV_PW_PUSHBUTTON || in wps_process_m1()
2696 !wps->wps->registrar->pbc)) { in wps_process_m1()
2698 wps->dev_pw_id); in wps_process_m1()
2699 wps->state = SEND_M2D; in wps_process_m1()
2704 if (wps->dev_pw_id >= 0x10 || in wps_process_m1()
2705 wps->dev_pw_id == DEV_PW_NFC_CONNECTION_HANDOVER) { in wps_process_m1()
2711 wps->dev_pw_id, wps->wps, wps->wps->registrar); in wps_process_m1()
2713 &wps->wps->registrar->nfc_pw_tokens, wps->dev_pw_id); in wps_process_m1()
2720 wps->nfc_pw_token = token; in wps_process_m1()
2726 wps->nfc_pw_token->pubkey_hash, in wps_process_m1()
2730 wps->state = SEND_M2D; in wps_process_m1()
2731 wps->config_error = in wps_process_m1()
2738 wps->nfc_pw_token = token; in wps_process_m1()
2739 } else if (wps->dev_pw_id >= 0x10 && in wps_process_m1()
2740 wps->wps->ap_nfc_dev_pw_id == wps->dev_pw_id && in wps_process_m1()
2741 wps->wps->ap_nfc_dev_pw) { in wps_process_m1()
2747 if (wps->dev_pw_id == DEV_PW_PUSHBUTTON) { in wps_process_m1()
2748 if ((wps->wps->registrar->force_pbc_overlap || in wps_process_m1()
2749 wps_registrar_pbc_overlap(wps->wps->registrar, in wps_process_m1()
2750 wps->mac_addr_e, wps->uuid_e) || in wps_process_m1()
2751 !wps_registrar_p2p_dev_addr_match(wps)) && in wps_process_m1()
2752 !wps_registrar_skip_overlap(wps)) { in wps_process_m1()
2755 wps->state = SEND_M2D; in wps_process_m1()
2756 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED; in wps_process_m1()
2757 wps_pbc_overlap_event(wps->wps); in wps_process_m1()
2758 wps_fail_event(wps->wps, WPS_M1, in wps_process_m1()
2760 WPS_EI_NO_ERROR, wps->mac_addr_e); in wps_process_m1()
2761 wps->wps->registrar->force_pbc_overlap = 1; in wps_process_m1()
2764 wps_registrar_add_pbc_session(wps->wps->registrar, in wps_process_m1()
2765 wps->mac_addr_e, wps->uuid_e); in wps_process_m1()
2766 wps->pbc = 1; in wps_process_m1()
2775 if (!wps->use_psk_key && in wps_process_m1()
2776 wps->peer_dev.manufacturer && in wps_process_m1()
2777 os_strncmp(wps->peer_dev.manufacturer, "Apple ", 6) == 0 && in wps_process_m1()
2778 wps->peer_dev.model_name && in wps_process_m1()
2779 os_strcmp(wps->peer_dev.model_name, "AirPort") == 0) { in wps_process_m1()
2782 wps->use_psk_key = 1; in wps_process_m1()
2785 wps_process_vendor_ext_m1(&wps->peer_dev, attr->multi_ap_ext); in wps_process_m1()
2787 wps->state = SEND_M2; in wps_process_m1()
2792 static enum wps_process_res wps_process_m3(struct wps_data *wps, in wps_process_m3() argument
2798 if (wps->state != RECV_M3) { in wps_process_m3()
2800 "receiving M3", wps->state); in wps_process_m3()
2801 wps->state = SEND_WSC_NACK; in wps_process_m3()
2805 if (wps->pbc && wps->wps->registrar->force_pbc_overlap && in wps_process_m3()
2806 !wps_registrar_skip_overlap(wps)) { in wps_process_m3()
2809 wps->state = SEND_WSC_NACK; in wps_process_m3()
2810 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED; in wps_process_m3()
2814 if (wps_process_registrar_nonce(wps, attr->registrar_nonce) || in wps_process_m3()
2815 wps_process_authenticator(wps, attr->authenticator, msg) || in wps_process_m3()
2816 wps_process_e_hash1(wps, attr->e_hash1) || in wps_process_m3()
2817 wps_process_e_hash2(wps, attr->e_hash2)) { in wps_process_m3()
2818 wps->state = SEND_WSC_NACK; in wps_process_m3()
2822 wps->state = SEND_M4; in wps_process_m3()
2827 static enum wps_process_res wps_process_m5(struct wps_data *wps, in wps_process_m5() argument
2836 if (wps->state != RECV_M5) { in wps_process_m5()
2838 "receiving M5", wps->state); in wps_process_m5()
2839 wps->state = SEND_WSC_NACK; in wps_process_m5()
2843 if (wps->pbc && wps->wps->registrar->force_pbc_overlap && in wps_process_m5()
2844 !wps_registrar_skip_overlap(wps)) { in wps_process_m5()
2847 wps->state = SEND_WSC_NACK; in wps_process_m5()
2848 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED; in wps_process_m5()
2852 if (wps_process_registrar_nonce(wps, attr->registrar_nonce) || in wps_process_m5()
2853 wps_process_authenticator(wps, attr->authenticator, msg)) { in wps_process_m5()
2854 wps->state = SEND_WSC_NACK; in wps_process_m5()
2858 decrypted = wps_decrypt_encr_settings(wps, attr->encr_settings, in wps_process_m5()
2863 wps->state = SEND_WSC_NACK; in wps_process_m5()
2869 wps->state = SEND_WSC_NACK; in wps_process_m5()
2876 wps_process_key_wrap_auth(wps, decrypted, eattr.key_wrap_auth) || in wps_process_m5()
2877 wps_process_e_snonce1(wps, eattr.e_snonce1)) { in wps_process_m5()
2879 wps->state = SEND_WSC_NACK; in wps_process_m5()
2884 wps->state = SEND_M6; in wps_process_m5()
2890 static void wps_sta_cred_cb(struct wps_data *wps) in wps_sta_cred_cb() argument
2897 if (wps->cred.auth_type & WPS_AUTH_WPA2PSK) in wps_sta_cred_cb()
2898 wps->cred.auth_type = WPS_AUTH_WPA2PSK; in wps_sta_cred_cb()
2899 else if (wps->cred.auth_type & WPS_AUTH_WPAPSK) in wps_sta_cred_cb()
2900 wps->cred.auth_type = WPS_AUTH_WPAPSK; in wps_sta_cred_cb()
2901 if (wps->cred.encr_type & WPS_ENCR_AES) in wps_sta_cred_cb()
2902 wps->cred.encr_type = WPS_ENCR_AES; in wps_sta_cred_cb()
2903 else if (wps->cred.encr_type & WPS_ENCR_TKIP) in wps_sta_cred_cb()
2904 wps->cred.encr_type = WPS_ENCR_TKIP; in wps_sta_cred_cb()
2907 if (wps->wps->cred_cb) in wps_sta_cred_cb()
2908 wps->wps->cred_cb(wps->wps->cb_ctx, &wps->cred); in wps_sta_cred_cb()
2925 static int wps_process_ap_settings_r(struct wps_data *wps, in wps_process_ap_settings_r() argument
2930 if (wps->wps->ap || wps->er) in wps_process_ap_settings_r()
2934 if (wps_process_ap_settings(attr, &wps->cred) < 0) in wps_process_ap_settings_r()
2939 if (wps->new_ap_settings) { in wps_process_ap_settings_r()
2942 wps_cred_update(&wps->cred, wps->new_ap_settings); in wps_process_ap_settings_r()
2954 wps_registrar_pin_completed(wps->wps->registrar); in wps_process_ap_settings_r()
2956 msg = wps_build_ap_cred(wps); in wps_process_ap_settings_r()
2959 wps->cred.cred_attr = wpabuf_head(msg); in wps_process_ap_settings_r()
2960 wps->cred.cred_attr_len = wpabuf_len(msg); in wps_process_ap_settings_r()
2962 if (wps->ap_settings_cb) { in wps_process_ap_settings_r()
2963 wps->ap_settings_cb(wps->ap_settings_cb_ctx, in wps_process_ap_settings_r()
2964 &wps->cred); in wps_process_ap_settings_r()
2968 wps_sta_cred_cb(wps); in wps_process_ap_settings_r()
2970 wps->cred.cred_attr = NULL; in wps_process_ap_settings_r()
2971 wps->cred.cred_attr_len = 0; in wps_process_ap_settings_r()
2979 static int wps_process_ap_settings_r(struct wps_data *wps, in wps_process_ap_settings_r() argument
2986 static enum wps_process_res wps_process_m7(struct wps_data *wps, in wps_process_m7() argument
2995 if (wps->state != RECV_M7) { in wps_process_m7()
2997 "receiving M7", wps->state); in wps_process_m7()
2998 wps->state = SEND_WSC_NACK; in wps_process_m7()
3002 if (wps->pbc && wps->wps->registrar->force_pbc_overlap && in wps_process_m7()
3003 !wps_registrar_skip_overlap(wps)) { in wps_process_m7()
3006 wps->state = SEND_WSC_NACK; in wps_process_m7()
3007 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED; in wps_process_m7()
3011 if (wps_process_registrar_nonce(wps, attr->registrar_nonce) || in wps_process_m7()
3012 wps_process_authenticator(wps, attr->authenticator, msg)) { in wps_process_m7()
3013 wps->state = SEND_WSC_NACK; in wps_process_m7()
3017 decrypted = wps_decrypt_encr_settings(wps, attr->encr_settings, in wps_process_m7()
3022 wps->state = SEND_WSC_NACK; in wps_process_m7()
3026 if (wps_validate_m7_encr(decrypted, wps->wps->ap || wps->er, in wps_process_m7()
3029 wps->state = SEND_WSC_NACK; in wps_process_m7()
3036 wps_process_key_wrap_auth(wps, decrypted, eattr.key_wrap_auth) || in wps_process_m7()
3037 wps_process_e_snonce2(wps, eattr.e_snonce2) || in wps_process_m7()
3038 wps_process_ap_settings_r(wps, &eattr)) { in wps_process_m7()
3040 wps->state = SEND_WSC_NACK; in wps_process_m7()
3046 wps->state = SEND_M8; in wps_process_m7()
3051 static enum wps_process_res wps_process_wsc_msg(struct wps_data *wps, in wps_process_wsc_msg() argument
3064 wps->state = SEND_WSC_NACK; in wps_process_wsc_msg()
3070 os_memcmp(wps->nonce_r, attr.registrar_nonce, in wps_process_wsc_msg()
3081 if (wps->wps->wps_upnp && attr.mac_addr) { in wps_process_wsc_msg()
3083 wps_free_pending_msgs(wps->wps->upnp_msgs); in wps_process_wsc_msg()
3084 wps->wps->upnp_msgs = NULL; in wps_process_wsc_msg()
3087 wps->wps->wps_upnp, attr.mac_addr, in wps_process_wsc_msg()
3091 ret = wps_process_m1(wps, &attr); in wps_process_wsc_msg()
3096 ret = wps_process_m3(wps, msg, &attr); in wps_process_wsc_msg()
3097 if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) in wps_process_wsc_msg()
3098 wps_fail_event(wps->wps, WPS_M3, wps->config_error, in wps_process_wsc_msg()
3099 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_msg()
3104 ret = wps_process_m5(wps, msg, &attr); in wps_process_wsc_msg()
3105 if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) in wps_process_wsc_msg()
3106 wps_fail_event(wps->wps, WPS_M5, wps->config_error, in wps_process_wsc_msg()
3107 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_msg()
3112 ret = wps_process_m7(wps, msg, &attr); in wps_process_wsc_msg()
3113 if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) in wps_process_wsc_msg()
3114 wps_fail_event(wps->wps, WPS_M7, wps->config_error, in wps_process_wsc_msg()
3115 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_msg()
3126 wpabuf_free(wps->last_msg); in wps_process_wsc_msg()
3127 wps->last_msg = wpabuf_dup(msg); in wps_process_wsc_msg()
3134 static enum wps_process_res wps_process_wsc_ack(struct wps_data *wps, in wps_process_wsc_ack() argument
3156 if (wps->wps->wps_upnp && wps->ext_reg && wps->state == RECV_M2D_ACK && in wps_process_wsc_ack()
3157 upnp_wps_subscribers(wps->wps->wps_upnp)) { in wps_process_wsc_ack()
3158 if (wps->wps->upnp_msgs) in wps_process_wsc_ack()
3167 os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN) != 0) in wps_process_wsc_ack()
3174 os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN) != 0) { in wps_process_wsc_ack()
3179 if (wps->state == RECV_M2D_ACK) { in wps_process_wsc_ack()
3181 if (wps->wps->wps_upnp && in wps_process_wsc_ack()
3182 upnp_wps_subscribers(wps->wps->wps_upnp)) { in wps_process_wsc_ack()
3183 if (wps->wps->upnp_msgs) in wps_process_wsc_ack()
3185 if (wps->ext_reg == 0) in wps_process_wsc_ack()
3186 wps->ext_reg = 1; in wps_process_wsc_ack()
3201 static enum wps_process_res wps_process_wsc_nack(struct wps_data *wps, in wps_process_wsc_nack() argument
3210 old_state = wps->state; in wps_process_wsc_nack()
3211 wps->state = SEND_WSC_NACK; in wps_process_wsc_nack()
3228 if (wps->wps->wps_upnp && wps->ext_reg) { in wps_process_wsc_nack()
3236 os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN) != 0) in wps_process_wsc_nack()
3243 os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN) != 0) { in wps_process_wsc_nack()
3260 wps_fail_event(wps->wps, WPS_M2, config_error, in wps_process_wsc_nack()
3261 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_nack()
3264 wps_fail_event(wps->wps, WPS_M4, config_error, in wps_process_wsc_nack()
3265 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_nack()
3268 wps_fail_event(wps->wps, WPS_M6, config_error, in wps_process_wsc_nack()
3269 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_nack()
3272 wps_fail_event(wps->wps, WPS_M8, config_error, in wps_process_wsc_nack()
3273 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_nack()
3283 static enum wps_process_res wps_process_wsc_done(struct wps_data *wps, in wps_process_wsc_done() argument
3290 if (wps->state != RECV_DONE && in wps_process_wsc_done()
3291 (!wps->wps->wps_upnp || !wps->ext_reg)) { in wps_process_wsc_done()
3293 "receiving WSC_Done", wps->state); in wps_process_wsc_done()
3312 if (wps->wps->wps_upnp && wps->ext_reg) { in wps_process_wsc_done()
3315 wps_device_store(wps->wps->registrar, &wps->peer_dev, in wps_process_wsc_done()
3316 wps->uuid_e); in wps_process_wsc_done()
3322 os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN) != 0) in wps_process_wsc_done()
3329 os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN) != 0) { in wps_process_wsc_done()
3336 wps_device_store(wps->wps->registrar, &wps->peer_dev, in wps_process_wsc_done()
3337 wps->uuid_e); in wps_process_wsc_done()
3339 if (wps->wps->wps_state == WPS_STATE_NOT_CONFIGURED && wps->new_psk && in wps_process_wsc_done()
3340 wps->wps->ap && !wps->wps->registrar->disable_auto_conf) { in wps_process_wsc_done()
3347 os_memcpy(cred.ssid, wps->wps->ssid, wps->wps->ssid_len); in wps_process_wsc_done()
3348 cred.ssid_len = wps->wps->ssid_len; in wps_process_wsc_done()
3349 if (wps->wps->rf_band_cb(wps->wps->cb_ctx) == WPS_RF_60GHZ) { in wps_process_wsc_done()
3356 os_memcpy(cred.key, wps->new_psk, wps->new_psk_len); in wps_process_wsc_done()
3357 cred.key_len = wps->new_psk_len; in wps_process_wsc_done()
3359 wps->wps->wps_state = WPS_STATE_CONFIGURED; in wps_process_wsc_done()
3362 wps->new_psk, wps->new_psk_len); in wps_process_wsc_done()
3363 if (wps->wps->cred_cb) in wps_process_wsc_done()
3364 wps->wps->cred_cb(wps->wps->cb_ctx, &cred); in wps_process_wsc_done()
3366 os_free(wps->new_psk); in wps_process_wsc_done()
3367 wps->new_psk = NULL; in wps_process_wsc_done()
3370 if (!wps->wps->ap && !wps->er) in wps_process_wsc_done()
3371 wps_sta_cred_cb(wps); in wps_process_wsc_done()
3373 if (wps->new_psk) { in wps_process_wsc_done()
3374 if (wps_cb_new_psk(wps->wps->registrar, wps->mac_addr_e, in wps_process_wsc_done()
3375 wps->p2p_dev_addr, wps->new_psk, in wps_process_wsc_done()
3376 wps->new_psk_len)) { in wps_process_wsc_done()
3380 os_free(wps->new_psk); in wps_process_wsc_done()
3381 wps->new_psk = NULL; in wps_process_wsc_done()
3385 wps_cb_reg_success(wps->wps->registrar, wps->mac_addr_e, wps->uuid_e, in wps_process_wsc_done()
3386 wps->dev_password, wps->dev_password_len); in wps_process_wsc_done()
3388 if (wps->pbc) { in wps_process_wsc_done()
3389 wps_registrar_remove_pbc_session(wps->wps->registrar, in wps_process_wsc_done()
3390 wps->uuid_e, in wps_process_wsc_done()
3391 wps->p2p_dev_addr); in wps_process_wsc_done()
3392 wps_registrar_pbc_completed(wps->wps->registrar); in wps_process_wsc_done()
3394 os_get_reltime(&wps->wps->registrar->pbc_ignore_start); in wps_process_wsc_done()
3396 os_memcpy(wps->wps->registrar->pbc_ignore_uuid, wps->uuid_e, in wps_process_wsc_done()
3399 wps_registrar_pin_completed(wps->wps->registrar); in wps_process_wsc_done()
3404 wps_success_event(wps->wps, wps->mac_addr_e); in wps_process_wsc_done()
3410 enum wps_process_res wps_registrar_process_msg(struct wps_data *wps, in wps_registrar_process_msg() argument
3421 if (wps->wps->wps_upnp && op_code == WSC_MSG && wps->ext_reg == 1) { in wps_registrar_process_msg()
3425 wps->ext_reg = 2; /* past M2/M2D phase */ in wps_registrar_process_msg()
3427 if (wps->ext_reg > 1) in wps_registrar_process_msg()
3428 wps_registrar_free_pending_m2(wps->wps); in wps_registrar_process_msg()
3429 if (wps->wps->wps_upnp && wps->ext_reg && in wps_registrar_process_msg()
3430 wps->wps->upnp_msgs == NULL && in wps_registrar_process_msg()
3441 upnp_wps_device_send_wlan_event(wps->wps->wps_upnp, in wps_registrar_process_msg()
3442 wps->mac_addr_e, in wps_registrar_process_msg()
3447 } else if (wps->wps->wps_upnp && wps->ext_reg && op_code == WSC_MSG) { in wps_registrar_process_msg()
3456 return wps_process_wsc_msg(wps, msg); in wps_registrar_process_msg()
3460 return wps_process_wsc_ack(wps, msg); in wps_registrar_process_msg()
3464 return wps_process_wsc_nack(wps, msg); in wps_registrar_process_msg()
3468 ret = wps_process_wsc_done(wps, msg); in wps_registrar_process_msg()
3470 wps->state = SEND_WSC_NACK; in wps_registrar_process_msg()
3471 wps_fail_event(wps->wps, WPS_WSC_DONE, in wps_registrar_process_msg()
3472 wps->config_error, in wps_registrar_process_msg()
3473 wps->error_indication, wps->mac_addr_e); in wps_registrar_process_msg()
3500 wps_selected_registrar_timeout_event(reg->wps); in wps_registrar_set_selected_timeout()
3543 if (reg->wps->wps_upnp == NULL) in wps_registrar_sel_reg_union()
3546 dl_list_for_each(s, ®->wps->wps_upnp->subscriptions, in wps_registrar_sel_reg_union()
3588 methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON; in wps_registrar_selected_registrar_changed()
3594 wps_set_pushbutton(&methods, reg->wps->config_methods); in wps_registrar_selected_registrar_changed()
3679 if (reg->wps->cred_cb) in wps_registrar_config_ap()
3680 return reg->wps->cred_cb(reg->wps->cb_ctx, cred); in wps_registrar_config_ap()