• Home
  • Raw
  • Download

Lines Matching refs:wps

143 	struct wps_context *wps;  member
478 static int wps_build_wps_state(struct wps_context *wps, struct wpabuf *msg) in wps_build_wps_state() argument
481 wps->wps_state); in wps_build_wps_state()
484 wpabuf_put_u8(msg, wps->wps_state); in wps_build_wps_state()
490 static void wps_registrar_free_pending_m2(struct wps_context *wps) in wps_registrar_free_pending_m2() argument
493 p = wps->upnp_msgs; in wps_registrar_free_pending_m2()
497 wps->upnp_msgs = p->next; in wps_registrar_free_pending_m2()
514 static int wps_build_ap_setup_locked(struct wps_context *wps, in wps_build_ap_setup_locked() argument
517 if (wps->ap_setup_locked && wps->ap_setup_locked != 2) { in wps_build_ap_setup_locked()
566 return wps_build_uuid_e(msg, reg->wps->uuid); in wps_build_sel_pbc_reg_uuid_e()
599 methods = reg->wps->config_methods; in wps_build_sel_reg_config_methods()
604 wps_set_pushbutton(&methods, reg->wps->config_methods); in wps_build_sel_reg_config_methods()
624 methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON; in wps_build_probe_config_methods()
638 return wps_build_config_methods(msg, reg->wps->config_methods); in wps_build_config_methods_r()
669 wps_registrar_init(struct wps_context *wps, in wps_registrar_init() argument
678 reg->wps = wps; in wps_registrar_init()
1027 wps_pbc_timeout_event(reg->wps); in wps_registrar_pbc_timeout()
1053 wps_pbc_overlap_event(reg->wps); in wps_registrar_button_pushed()
1068 wps_pbc_active_event(reg->wps); in wps_registrar_button_pushed()
1082 wps_pbc_disable_event(reg->wps); in wps_registrar_pbc_completed()
1225 wps_pbc_overlap_event(reg->wps); in wps_registrar_probe_req_rx()
1276 methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON; in wps_cb_set_sel_reg()
1280 wps_set_pushbutton(&methods, reg->wps->config_methods); in wps_cb_set_sel_reg()
1285 reg->selected_registrar, reg->wps->config_methods, in wps_cb_set_sel_reg()
1316 if (reg->wps->dev.vendor_ext[i]) { in wps_set_ie()
1318 vendor_len += wpabuf_len(reg->wps->dev.vendor_ext[i]); in wps_set_ie()
1336 wps_build_wps_state(reg->wps, beacon) || in wps_set_ie()
1337 wps_build_ap_setup_locked(reg->wps, beacon) || in wps_set_ie()
1342 (reg->dualband && wps_build_rf_bands(&reg->wps->dev, beacon, 0)) || in wps_set_ie()
1344 wps_build_vendor_ext(&reg->wps->dev, beacon) || in wps_set_ie()
1345 wps_build_application_ext(&reg->wps->dev, beacon)) { in wps_set_ie()
1352 if (wps_build_dev_name(&reg->wps->dev, beacon) || in wps_set_ie()
1353 wps_build_primary_dev_type(&reg->wps->dev, beacon)) { in wps_set_ie()
1363 wps_build_wps_state(reg->wps, probe) || in wps_set_ie()
1364 wps_build_ap_setup_locked(reg->wps, probe) || in wps_set_ie()
1368 wps_build_resp_type(probe, reg->wps->ap ? WPS_RESP_AP : in wps_set_ie()
1370 wps_build_uuid_e(probe, reg->wps->uuid) || in wps_set_ie()
1371 wps_build_device_attrs(&reg->wps->dev, probe) || in wps_set_ie()
1373 (reg->dualband && wps_build_rf_bands(&reg->wps->dev, probe, 0)) || in wps_set_ie()
1375 wps_build_vendor_ext(&reg->wps->dev, probe) || in wps_set_ie()
1376 wps_build_application_ext(&reg->wps->dev, probe)) { in wps_set_ie()
1395 static int wps_get_dev_password(struct wps_data *wps) in wps_get_dev_password() argument
1400 bin_clear_free(wps->dev_password, wps->dev_password_len); in wps_get_dev_password()
1401 wps->dev_password = NULL; in wps_get_dev_password()
1403 if (wps->pbc) { in wps_get_dev_password()
1408 } else if (wps->nfc_pw_token) { in wps_get_dev_password()
1409 if (wps->nfc_pw_token->pw_id == DEV_PW_NFC_CONNECTION_HANDOVER) in wps_get_dev_password()
1418 pin = wps->nfc_pw_token->dev_pw; in wps_get_dev_password()
1419 pin_len = wps->nfc_pw_token->dev_pw_len; in wps_get_dev_password()
1420 } else if (wps->dev_pw_id >= 0x10 && in wps_get_dev_password()
1421 wps->wps->ap_nfc_dev_pw_id == wps->dev_pw_id && in wps_get_dev_password()
1422 wps->wps->ap_nfc_dev_pw) { in wps_get_dev_password()
1424 pin = wpabuf_head(wps->wps->ap_nfc_dev_pw); in wps_get_dev_password()
1425 pin_len = wpabuf_len(wps->wps->ap_nfc_dev_pw); in wps_get_dev_password()
1428 pin = wps_registrar_get_pin(wps->wps->registrar, wps->uuid_e, in wps_get_dev_password()
1430 if (pin && wps->dev_pw_id >= 0x10) { in wps_get_dev_password()
1436 wps->dev_pw_id = DEV_PW_DEFAULT; in wps_get_dev_password()
1442 wps->wps, wps->wps->registrar); in wps_get_dev_password()
1443 wps_cb_pin_needed(wps->wps->registrar, wps->uuid_e, in wps_get_dev_password()
1444 &wps->peer_dev); in wps_get_dev_password()
1448 wps->dev_password = os_memdup(pin, pin_len); in wps_get_dev_password()
1449 if (wps->dev_password == NULL) in wps_get_dev_password()
1451 wps->dev_password_len = pin_len; in wps_get_dev_password()
1457 static int wps_build_uuid_r(struct wps_data *wps, struct wpabuf *msg) in wps_build_uuid_r() argument
1462 wpabuf_put_data(msg, wps->uuid_r, WPS_UUID_LEN); in wps_build_uuid_r()
1467 static int wps_build_r_hash(struct wps_data *wps, struct wpabuf *msg) in wps_build_r_hash() argument
1473 if (random_get_bytes(wps->snonce, 2 * WPS_SECRET_NONCE_LEN) < 0) in wps_build_r_hash()
1475 wpa_hexdump(MSG_DEBUG, "WPS: R-S1", wps->snonce, WPS_SECRET_NONCE_LEN); in wps_build_r_hash()
1477 wps->snonce + WPS_SECRET_NONCE_LEN, WPS_SECRET_NONCE_LEN); in wps_build_r_hash()
1479 if (wps->dh_pubkey_e == NULL || wps->dh_pubkey_r == NULL) { in wps_build_r_hash()
1490 addr[0] = wps->snonce; in wps_build_r_hash()
1492 addr[1] = wps->psk1; in wps_build_r_hash()
1494 addr[2] = wpabuf_head(wps->dh_pubkey_e); in wps_build_r_hash()
1495 len[2] = wpabuf_len(wps->dh_pubkey_e); in wps_build_r_hash()
1496 addr[3] = wpabuf_head(wps->dh_pubkey_r); in wps_build_r_hash()
1497 len[3] = wpabuf_len(wps->dh_pubkey_r); in wps_build_r_hash()
1498 hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash); in wps_build_r_hash()
1506 addr[0] = wps->snonce + WPS_SECRET_NONCE_LEN; in wps_build_r_hash()
1507 addr[1] = wps->psk2; in wps_build_r_hash()
1508 hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash); in wps_build_r_hash()
1515 static int wps_build_r_snonce1(struct wps_data *wps, struct wpabuf *msg) in wps_build_r_snonce1() argument
1520 wpabuf_put_data(msg, wps->snonce, WPS_SECRET_NONCE_LEN); in wps_build_r_snonce1()
1525 static int wps_build_r_snonce2(struct wps_data *wps, struct wpabuf *msg) in wps_build_r_snonce2() argument
1530 wpabuf_put_data(msg, wps->snonce + WPS_SECRET_NONCE_LEN, in wps_build_r_snonce2()
1631 int wps_build_cred(struct wps_data *wps, struct wpabuf *msg) in wps_build_cred() argument
1634 struct wps_registrar *reg = wps->wps->registrar; in wps_build_cred()
1638 if (wps->wps->registrar->skip_cred_build) in wps_build_cred()
1642 if (wps->use_cred) { in wps_build_cred()
1643 os_memcpy(&wps->cred, wps->use_cred, sizeof(wps->cred)); in wps_build_cred()
1646 os_memset(&wps->cred, 0, sizeof(wps->cred)); in wps_build_cred()
1648 if (wps->peer_dev.multi_ap_ext == MULTI_AP_BACKHAUL_STA && in wps_build_cred()
1651 os_memcpy(wps->cred.ssid, reg->multi_ap_backhaul_ssid, in wps_build_cred()
1653 wps->cred.ssid_len = reg->multi_ap_backhaul_ssid_len; in wps_build_cred()
1655 wps->cred.auth_type = WPS_AUTH_WPA2PSK; in wps_build_cred()
1656 wps->cred.encr_type = WPS_ENCR_AES; in wps_build_cred()
1660 os_memcpy(wps->cred.mac_addr, wps->mac_addr_e, ETH_ALEN); in wps_build_cred()
1662 os_memcpy(wps->cred.key, in wps_build_cred()
1665 wps->cred.key_len = in wps_build_cred()
1671 os_memcpy(wps->cred.ssid, wps->wps->ssid, wps->wps->ssid_len); in wps_build_cred()
1672 wps->cred.ssid_len = wps->wps->ssid_len; in wps_build_cred()
1677 wps->wps->auth_types, wps->auth_type); in wps_build_cred()
1678 if (wps->auth_type & WPS_AUTH_WPA2PSK) in wps_build_cred()
1679 wps->auth_type = WPS_AUTH_WPA2PSK; in wps_build_cred()
1681 else if (wps->auth_type & WPS_AUTH_WPAPSK) in wps_build_cred()
1682 wps->auth_type = WPS_AUTH_WPAPSK; in wps_build_cred()
1684 else if (wps->auth_type & WPS_AUTH_OPEN) in wps_build_cred()
1685 wps->auth_type = WPS_AUTH_OPEN; in wps_build_cred()
1688 wps->auth_type); in wps_build_cred()
1691 wps->cred.auth_type = wps->auth_type; in wps_build_cred()
1695 wps->wps->encr_types, wps->wps->encr_types_rsn, in wps_build_cred()
1696 wps->wps->encr_types_wpa, wps->encr_type); in wps_build_cred()
1697 if (wps->wps->ap && wps->auth_type == WPS_AUTH_WPA2PSK) in wps_build_cred()
1698 wps->encr_type &= wps->wps->encr_types_rsn; in wps_build_cred()
1699 else if (wps->wps->ap && wps->auth_type == WPS_AUTH_WPAPSK) in wps_build_cred()
1700 wps->encr_type &= wps->wps->encr_types_wpa; in wps_build_cred()
1701 if (wps->auth_type == WPS_AUTH_WPA2PSK || in wps_build_cred()
1702 wps->auth_type == WPS_AUTH_WPAPSK) { in wps_build_cred()
1703 if (wps->encr_type & WPS_ENCR_AES) in wps_build_cred()
1704 wps->encr_type = WPS_ENCR_AES; in wps_build_cred()
1706 else if (wps->encr_type & WPS_ENCR_TKIP) in wps_build_cred()
1707 wps->encr_type = WPS_ENCR_TKIP; in wps_build_cred()
1715 if (wps->encr_type & WPS_ENCR_NONE) in wps_build_cred()
1716 wps->encr_type = WPS_ENCR_NONE; in wps_build_cred()
1718 else if (wps->encr_type & WPS_ENCR_WEP) in wps_build_cred()
1719 wps->encr_type = WPS_ENCR_WEP; in wps_build_cred()
1727 wps->cred.encr_type = wps->encr_type; in wps_build_cred()
1731 os_memcpy(wps->cred.mac_addr, wps->mac_addr_e, ETH_ALEN); in wps_build_cred()
1733 if (wps->wps->wps_state == WPS_STATE_NOT_CONFIGURED && wps->wps->ap && in wps_build_cred()
1734 !wps->wps->registrar->disable_auto_conf) { in wps_build_cred()
1743 os_free(wps->new_psk); in wps_build_cred()
1744 wps->new_psk = (u8 *) base64_encode(r, sizeof(r), in wps_build_cred()
1745 &wps->new_psk_len); in wps_build_cred()
1746 if (wps->new_psk == NULL) in wps_build_cred()
1748 wps->new_psk_len--; /* remove newline */ in wps_build_cred()
1749 while (wps->new_psk_len && in wps_build_cred()
1750 wps->new_psk[wps->new_psk_len - 1] == '=') in wps_build_cred()
1751 wps->new_psk_len--; in wps_build_cred()
1753 wps->new_psk, wps->new_psk_len); in wps_build_cred()
1754 os_memcpy(wps->cred.key, wps->new_psk, wps->new_psk_len); in wps_build_cred()
1755 wps->cred.key_len = wps->new_psk_len; in wps_build_cred()
1756 } else if (wps_cp_lookup_pskfile(reg, wps->mac_addr_e, &pskfile_psk)) { in wps_build_cred()
1760 os_memcpy(wps->cred.key, hex, PMK_LEN * 2); in wps_build_cred()
1761 wps->cred.key_len = PMK_LEN * 2; in wps_build_cred()
1762 } else if (!wps->wps->registrar->force_per_enrollee_psk && in wps_build_cred()
1763 wps->use_psk_key && wps->wps->psk_set) { in wps_build_cred()
1765 wpa_snprintf_hex(hex, sizeof(hex), wps->wps->psk, PMK_LEN); in wps_build_cred()
1766 os_memcpy(wps->cred.key, hex, PMK_LEN * 2); in wps_build_cred()
1767 wps->cred.key_len = PMK_LEN * 2; in wps_build_cred()
1768 } else if (!wps->wps->registrar->force_per_enrollee_psk && in wps_build_cred()
1769 wps->wps->network_key) { in wps_build_cred()
1770 os_memcpy(wps->cred.key, wps->wps->network_key, in wps_build_cred()
1771 wps->wps->network_key_len); in wps_build_cred()
1772 wps->cred.key_len = wps->wps->network_key_len; in wps_build_cred()
1773 } else if (wps->auth_type & (WPS_AUTH_WPAPSK | WPS_AUTH_WPA2PSK)) { in wps_build_cred()
1775 os_free(wps->new_psk); in wps_build_cred()
1776 wps->new_psk_len = PMK_LEN; in wps_build_cred()
1777 wps->new_psk = os_malloc(wps->new_psk_len); in wps_build_cred()
1778 if (wps->new_psk == NULL) in wps_build_cred()
1781 random_get_bytes(wps->new_psk, wps->new_psk_len) < 0) { in wps_build_cred()
1784 os_free(wps->new_psk); in wps_build_cred()
1785 wps->new_psk = NULL; in wps_build_cred()
1789 wps->new_psk, wps->new_psk_len); in wps_build_cred()
1790 wpa_snprintf_hex(hex, sizeof(hex), wps->new_psk, in wps_build_cred()
1791 wps->new_psk_len); in wps_build_cred()
1792 os_memcpy(wps->cred.key, hex, wps->new_psk_len * 2); in wps_build_cred()
1793 wps->cred.key_len = wps->new_psk_len * 2; in wps_build_cred()
1812 os_memcpy(dummy.mac_addr, wps->mac_addr_e, ETH_ALEN); in wps_build_cred()
1828 if (wps_build_credential(cred, &wps->cred)) { in wps_build_cred()
1839 if (wps->wps->registrar->extra_cred) { in wps_build_cred()
1841 wpabuf_put_buf(msg, wps->wps->registrar->extra_cred); in wps_build_cred()
1848 static int wps_build_ap_settings(struct wps_data *wps, struct wpabuf *msg) in wps_build_ap_settings() argument
1852 if (wps_build_credential(msg, &wps->cred)) in wps_build_ap_settings()
1859 static struct wpabuf * wps_build_ap_cred(struct wps_data *wps) in wps_build_ap_cred() argument
1873 if (wps_build_ap_settings(wps, plain)) { in wps_build_ap_cred()
1888 static struct wpabuf * wps_build_m2(struct wps_data *wps) in wps_build_m2() argument
1893 if (random_get_bytes(wps->nonce_r, WPS_NONCE_LEN) < 0) in wps_build_m2()
1896 wps->nonce_r, WPS_NONCE_LEN); in wps_build_m2()
1897 wpa_hexdump(MSG_DEBUG, "WPS: UUID-R", wps->uuid_r, WPS_UUID_LEN); in wps_build_m2()
1906 wps_build_enrollee_nonce(wps, msg) || in wps_build_m2()
1907 wps_build_registrar_nonce(wps, msg) || in wps_build_m2()
1908 wps_build_uuid_r(wps, msg) || in wps_build_m2()
1909 wps_build_public_key(wps, msg) || in wps_build_m2()
1910 wps_derive_keys(wps) || in wps_build_m2()
1911 wps_build_auth_type_flags(wps, msg) || in wps_build_m2()
1912 wps_build_encr_type_flags(wps, msg) || in wps_build_m2()
1913 wps_build_conn_type_flags(wps, msg) || in wps_build_m2()
1914 wps_build_config_methods_r(wps->wps->registrar, msg) || in wps_build_m2()
1915 wps_build_device_attrs(&wps->wps->dev, msg) || in wps_build_m2()
1916 wps_build_rf_bands(&wps->wps->dev, msg, in wps_build_m2()
1917 wps->wps->rf_band_cb(wps->wps->cb_ctx)) || in wps_build_m2()
1918 wps_build_assoc_state(wps, msg) || in wps_build_m2()
1920 wps_build_dev_password_id(msg, wps->dev_pw_id) || in wps_build_m2()
1921 wps_build_os_version(&wps->wps->dev, msg) || in wps_build_m2()
1928 if (wps->nfc_pw_token && wps->nfc_pw_token->pk_hash_provided_oob && in wps_build_m2()
1929 wps->nfc_pw_token->pw_id == DEV_PW_NFC_CONNECTION_HANDOVER) { in wps_build_m2()
1938 wps_build_cred(wps, plain) || in wps_build_m2()
1939 wps_build_key_wrap_auth(wps, plain) || in wps_build_m2()
1940 wps_build_encr_settings(wps, msg, plain)) { in wps_build_m2()
1950 if (wps_build_authenticator(wps, msg)) { in wps_build_m2()
1955 wps->int_reg = 1; in wps_build_m2()
1956 wps->state = config_in_m2 ? RECV_DONE : RECV_M3; in wps_build_m2()
1961 static struct wpabuf * wps_build_m2d(struct wps_data *wps) in wps_build_m2d() argument
1964 u16 err = wps->config_error; in wps_build_m2d()
1971 if (wps->wps->ap && wps->wps->ap_setup_locked && in wps_build_m2d()
1977 wps_build_enrollee_nonce(wps, msg) || in wps_build_m2d()
1978 wps_build_registrar_nonce(wps, msg) || in wps_build_m2d()
1979 wps_build_uuid_r(wps, msg) || in wps_build_m2d()
1980 wps_build_auth_type_flags(wps, msg) || in wps_build_m2d()
1981 wps_build_encr_type_flags(wps, msg) || in wps_build_m2d()
1982 wps_build_conn_type_flags(wps, msg) || in wps_build_m2d()
1983 wps_build_config_methods_r(wps->wps->registrar, msg) || in wps_build_m2d()
1984 wps_build_device_attrs(&wps->wps->dev, msg) || in wps_build_m2d()
1985 wps_build_rf_bands(&wps->wps->dev, msg, in wps_build_m2d()
1986 wps->wps->rf_band_cb(wps->wps->cb_ctx)) || in wps_build_m2d()
1987 wps_build_assoc_state(wps, msg) || in wps_build_m2d()
1989 wps_build_os_version(&wps->wps->dev, msg) || in wps_build_m2d()
1995 wps->state = RECV_M2D_ACK; in wps_build_m2d()
2000 static struct wpabuf * wps_build_m4(struct wps_data *wps) in wps_build_m4() argument
2006 if (wps_derive_psk(wps, wps->dev_password, wps->dev_password_len) < 0) in wps_build_m4()
2021 wps_build_enrollee_nonce(wps, msg) || in wps_build_m4()
2022 wps_build_r_hash(wps, msg) || in wps_build_m4()
2023 wps_build_r_snonce1(wps, plain) || in wps_build_m4()
2024 wps_build_key_wrap_auth(wps, plain) || in wps_build_m4()
2025 wps_build_encr_settings(wps, msg, plain) || in wps_build_m4()
2027 wps_build_authenticator(wps, msg)) { in wps_build_m4()
2034 wps->state = RECV_M5; in wps_build_m4()
2039 static struct wpabuf * wps_build_m6(struct wps_data *wps) in wps_build_m6() argument
2057 wps_build_enrollee_nonce(wps, msg) || in wps_build_m6()
2058 wps_build_r_snonce2(wps, plain) || in wps_build_m6()
2059 wps_build_key_wrap_auth(wps, plain) || in wps_build_m6()
2060 wps_build_encr_settings(wps, msg, plain) || in wps_build_m6()
2062 wps_build_authenticator(wps, msg)) { in wps_build_m6()
2069 wps->wps_pin_revealed = 1; in wps_build_m6()
2070 wps->state = RECV_M7; in wps_build_m6()
2075 static struct wpabuf * wps_build_m8(struct wps_data *wps) in wps_build_m8() argument
2093 wps_build_enrollee_nonce(wps, msg) || in wps_build_m8()
2094 ((wps->wps->ap || wps->er) && wps_build_cred(wps, plain)) || in wps_build_m8()
2095 (!wps->wps->ap && !wps->er && wps_build_ap_settings(wps, plain)) || in wps_build_m8()
2096 wps_build_key_wrap_auth(wps, plain) || in wps_build_m8()
2097 wps_build_encr_settings(wps, msg, plain) || in wps_build_m8()
2099 wps_build_authenticator(wps, msg)) { in wps_build_m8()
2106 wps->state = RECV_DONE; in wps_build_m8()
2111 struct wpabuf * wps_registrar_get_msg(struct wps_data *wps, in wps_registrar_get_msg() argument
2117 if (!wps->int_reg && wps->wps->wps_upnp) { in wps_registrar_get_msg()
2119 if (wps->ext_reg > 1) in wps_registrar_get_msg()
2120 wps_registrar_free_pending_m2(wps->wps); in wps_registrar_get_msg()
2121 p = wps->wps->upnp_msgs; in wps_registrar_get_msg()
2133 wps->wps->upnp_msgs = NULL; in wps_registrar_get_msg()
2147 if (wps->ext_reg == 0) in wps_registrar_get_msg()
2148 wps->ext_reg = 1; in wps_registrar_get_msg()
2152 if (wps->ext_reg) { in wps_registrar_get_msg()
2159 switch (wps->state) { in wps_registrar_get_msg()
2161 if (wps_get_dev_password(wps) < 0) in wps_registrar_get_msg()
2162 msg = wps_build_m2d(wps); in wps_registrar_get_msg()
2164 msg = wps_build_m2(wps); in wps_registrar_get_msg()
2168 msg = wps_build_m2d(wps); in wps_registrar_get_msg()
2172 msg = wps_build_m4(wps); in wps_registrar_get_msg()
2176 msg = wps_build_m6(wps); in wps_registrar_get_msg()
2180 msg = wps_build_m8(wps); in wps_registrar_get_msg()
2184 msg = wps_build_wsc_ack(wps); in wps_registrar_get_msg()
2188 msg = wps_build_wsc_nack(wps); in wps_registrar_get_msg()
2193 "a message", wps->state); in wps_registrar_get_msg()
2201 wpabuf_free(wps->last_msg); in wps_registrar_get_msg()
2202 wps->last_msg = wpabuf_dup(msg); in wps_registrar_get_msg()
2209 static int wps_process_enrollee_nonce(struct wps_data *wps, const u8 *e_nonce) in wps_process_enrollee_nonce() argument
2216 os_memcpy(wps->nonce_e, e_nonce, WPS_NONCE_LEN); in wps_process_enrollee_nonce()
2218 wps->nonce_e, WPS_NONCE_LEN); in wps_process_enrollee_nonce()
2224 static int wps_process_registrar_nonce(struct wps_data *wps, const u8 *r_nonce) in wps_process_registrar_nonce() argument
2231 if (os_memcmp(wps->nonce_r, r_nonce, WPS_NONCE_LEN) != 0) { in wps_process_registrar_nonce()
2240 static int wps_process_uuid_e(struct wps_data *wps, const u8 *uuid_e) in wps_process_uuid_e() argument
2247 os_memcpy(wps->uuid_e, uuid_e, WPS_UUID_LEN); in wps_process_uuid_e()
2248 wpa_hexdump(MSG_DEBUG, "WPS: UUID-E", wps->uuid_e, WPS_UUID_LEN); in wps_process_uuid_e()
2254 static int wps_process_dev_password_id(struct wps_data *wps, const u8 *pw_id) in wps_process_dev_password_id() argument
2261 wps->dev_pw_id = WPA_GET_BE16(pw_id); in wps_process_dev_password_id()
2262 wpa_printf(MSG_DEBUG, "WPS: Device Password ID %d", wps->dev_pw_id); in wps_process_dev_password_id()
2268 static int wps_process_e_hash1(struct wps_data *wps, const u8 *e_hash1) in wps_process_e_hash1() argument
2275 os_memcpy(wps->peer_hash1, e_hash1, WPS_HASH_LEN); in wps_process_e_hash1()
2276 wpa_hexdump(MSG_DEBUG, "WPS: E-Hash1", wps->peer_hash1, WPS_HASH_LEN); in wps_process_e_hash1()
2282 static int wps_process_e_hash2(struct wps_data *wps, const u8 *e_hash2) in wps_process_e_hash2() argument
2289 os_memcpy(wps->peer_hash2, e_hash2, WPS_HASH_LEN); in wps_process_e_hash2()
2290 wpa_hexdump(MSG_DEBUG, "WPS: E-Hash2", wps->peer_hash2, WPS_HASH_LEN); in wps_process_e_hash2()
2296 static int wps_process_e_snonce1(struct wps_data *wps, const u8 *e_snonce1) in wps_process_e_snonce1() argument
2313 addr[1] = wps->psk1; in wps_process_e_snonce1()
2315 addr[2] = wpabuf_head(wps->dh_pubkey_e); in wps_process_e_snonce1()
2316 len[2] = wpabuf_len(wps->dh_pubkey_e); in wps_process_e_snonce1()
2317 addr[3] = wpabuf_head(wps->dh_pubkey_r); in wps_process_e_snonce1()
2318 len[3] = wpabuf_len(wps->dh_pubkey_r); in wps_process_e_snonce1()
2319 hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash); in wps_process_e_snonce1()
2321 if (os_memcmp_const(wps->peer_hash1, hash, WPS_HASH_LEN) != 0) { in wps_process_e_snonce1()
2324 wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE; in wps_process_e_snonce1()
2325 wps_pwd_auth_fail_event(wps->wps, 0, 1, wps->mac_addr_e); in wps_process_e_snonce1()
2336 static int wps_process_e_snonce2(struct wps_data *wps, const u8 *e_snonce2) in wps_process_e_snonce2() argument
2353 addr[1] = wps->psk2; in wps_process_e_snonce2()
2355 addr[2] = wpabuf_head(wps->dh_pubkey_e); in wps_process_e_snonce2()
2356 len[2] = wpabuf_len(wps->dh_pubkey_e); in wps_process_e_snonce2()
2357 addr[3] = wpabuf_head(wps->dh_pubkey_r); in wps_process_e_snonce2()
2358 len[3] = wpabuf_len(wps->dh_pubkey_r); in wps_process_e_snonce2()
2359 hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash); in wps_process_e_snonce2()
2361 if (os_memcmp_const(wps->peer_hash2, hash, WPS_HASH_LEN) != 0) { in wps_process_e_snonce2()
2364 wps_registrar_invalidate_pin(wps->wps->registrar, wps->uuid_e); in wps_process_e_snonce2()
2365 wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE; in wps_process_e_snonce2()
2366 wps_pwd_auth_fail_event(wps->wps, 0, 2, wps->mac_addr_e); in wps_process_e_snonce2()
2372 wps->wps_pin_revealed = 0; in wps_process_e_snonce2()
2373 wps_registrar_unlock_pin(wps->wps->registrar, wps->uuid_e); in wps_process_e_snonce2()
2380 wps_registrar_invalidate_pin(wps->wps->registrar, wps->uuid_e); in wps_process_e_snonce2()
2386 static int wps_process_mac_addr(struct wps_data *wps, const u8 *mac_addr) in wps_process_mac_addr() argument
2395 os_memcpy(wps->mac_addr_e, mac_addr, ETH_ALEN); in wps_process_mac_addr()
2396 os_memcpy(wps->peer_dev.mac_addr, mac_addr, ETH_ALEN); in wps_process_mac_addr()
2402 static int wps_process_pubkey(struct wps_data *wps, const u8 *pk, in wps_process_pubkey() argument
2410 wpabuf_free(wps->dh_pubkey_e); in wps_process_pubkey()
2411 wps->dh_pubkey_e = wpabuf_alloc_copy(pk, pk_len); in wps_process_pubkey()
2412 if (wps->dh_pubkey_e == NULL) in wps_process_pubkey()
2419 static int wps_process_auth_type_flags(struct wps_data *wps, const u8 *auth) in wps_process_auth_type_flags() argument
2450 wps->auth_type = wps->wps->auth_types & auth_types; in wps_process_auth_type_flags()
2451 if (wps->auth_type == 0) { in wps_process_auth_type_flags()
2454 wps->wps->auth_types, auth_types); in wps_process_auth_type_flags()
2466 wps->auth_type = wps->wps->auth_types; in wps_process_auth_type_flags()
2476 static int wps_process_encr_type_flags(struct wps_data *wps, const u8 *encr) in wps_process_encr_type_flags() argument
2490 wps->encr_type = wps->wps->encr_types & encr_types; in wps_process_encr_type_flags()
2491 if (wps->encr_type == 0) { in wps_process_encr_type_flags()
2494 wps->wps->encr_types, encr_types); in wps_process_encr_type_flags()
2506 wps->encr_type = wps->wps->encr_types; in wps_process_encr_type_flags()
2516 static int wps_process_conn_type_flags(struct wps_data *wps, const u8 *conn) in wps_process_conn_type_flags() argument
2531 static int wps_process_config_methods(struct wps_data *wps, const u8 *methods) in wps_process_config_methods() argument
2554 if (!(m & WPS_CONFIG_DISPLAY) && !wps->use_psk_key) { in wps_process_config_methods()
2562 wps->use_psk_key = 1; in wps_process_config_methods()
2569 static int wps_process_wps_state(struct wps_data *wps, const u8 *state) in wps_process_wps_state() argument
2584 static int wps_process_assoc_state(struct wps_data *wps, const u8 *assoc) in wps_process_assoc_state() argument
2600 static int wps_process_config_error(struct wps_data *wps, const u8 *err) in wps_process_config_error() argument
2616 static int wps_registrar_p2p_dev_addr_match(struct wps_data *wps) in wps_registrar_p2p_dev_addr_match() argument
2619 struct wps_registrar *reg = wps->wps->registrar; in wps_registrar_p2p_dev_addr_match()
2624 if (os_memcmp(reg->p2p_dev_addr, wps->p2p_dev_addr, ETH_ALEN) != 0) { in wps_registrar_p2p_dev_addr_match()
2629 MAC2STR(wps->p2p_dev_addr)); in wps_registrar_p2p_dev_addr_match()
2637 static int wps_registrar_skip_overlap(struct wps_data *wps) in wps_registrar_skip_overlap() argument
2640 struct wps_registrar *reg = wps->wps->registrar; in wps_registrar_skip_overlap()
2645 if (os_memcmp(reg->p2p_dev_addr, wps->p2p_dev_addr, ETH_ALEN) == 0) { in wps_registrar_skip_overlap()
2655 static enum wps_process_res wps_process_m1(struct wps_data *wps, in wps_process_m1() argument
2660 if (wps->state != RECV_M1) { in wps_process_m1()
2662 "receiving M1", wps->state); in wps_process_m1()
2666 if (wps_process_uuid_e(wps, attr->uuid_e) || in wps_process_m1()
2667 wps_process_mac_addr(wps, attr->mac_addr) || in wps_process_m1()
2668 wps_process_enrollee_nonce(wps, attr->enrollee_nonce) || in wps_process_m1()
2669 wps_process_pubkey(wps, attr->public_key, attr->public_key_len) || in wps_process_m1()
2670 wps_process_auth_type_flags(wps, attr->auth_type_flags) || in wps_process_m1()
2671 wps_process_encr_type_flags(wps, attr->encr_type_flags) || in wps_process_m1()
2672 wps_process_conn_type_flags(wps, attr->conn_type_flags) || in wps_process_m1()
2673 wps_process_config_methods(wps, attr->config_methods) || in wps_process_m1()
2674 wps_process_wps_state(wps, attr->wps_state) || in wps_process_m1()
2675 wps_process_device_attrs(&wps->peer_dev, attr) || in wps_process_m1()
2676 wps_process_rf_bands(&wps->peer_dev, attr->rf_bands) || in wps_process_m1()
2677 wps_process_assoc_state(wps, attr->assoc_state) || in wps_process_m1()
2678 wps_process_dev_password_id(wps, attr->dev_password_id) || in wps_process_m1()
2679 wps_process_config_error(wps, attr->config_error) || in wps_process_m1()
2680 wps_process_os_version(&wps->peer_dev, attr->os_version)) in wps_process_m1()
2683 if (wps->dev_pw_id < 0x10 && in wps_process_m1()
2684 wps->dev_pw_id != DEV_PW_DEFAULT && in wps_process_m1()
2685 wps->dev_pw_id != DEV_PW_P2PS_DEFAULT && in wps_process_m1()
2686 wps->dev_pw_id != DEV_PW_USER_SPECIFIED && in wps_process_m1()
2687 wps->dev_pw_id != DEV_PW_MACHINE_SPECIFIED && in wps_process_m1()
2688 wps->dev_pw_id != DEV_PW_REGISTRAR_SPECIFIED && in wps_process_m1()
2690 wps->dev_pw_id != DEV_PW_NFC_CONNECTION_HANDOVER && in wps_process_m1()
2692 (wps->dev_pw_id != DEV_PW_PUSHBUTTON || in wps_process_m1()
2693 !wps->wps->registrar->pbc)) { in wps_process_m1()
2695 wps->dev_pw_id); in wps_process_m1()
2696 wps->state = SEND_M2D; in wps_process_m1()
2701 if (wps->dev_pw_id >= 0x10 || in wps_process_m1()
2702 wps->dev_pw_id == DEV_PW_NFC_CONNECTION_HANDOVER) { in wps_process_m1()
2708 wps->dev_pw_id, wps->wps, wps->wps->registrar); in wps_process_m1()
2710 &wps->wps->registrar->nfc_pw_tokens, wps->dev_pw_id); in wps_process_m1()
2717 wps->nfc_pw_token = token; in wps_process_m1()
2723 wps->nfc_pw_token->pubkey_hash, in wps_process_m1()
2727 wps->state = SEND_M2D; in wps_process_m1()
2728 wps->config_error = in wps_process_m1()
2735 wps->nfc_pw_token = token; in wps_process_m1()
2736 } else if (wps->dev_pw_id >= 0x10 && in wps_process_m1()
2737 wps->wps->ap_nfc_dev_pw_id == wps->dev_pw_id && in wps_process_m1()
2738 wps->wps->ap_nfc_dev_pw) { in wps_process_m1()
2744 if (wps->dev_pw_id == DEV_PW_PUSHBUTTON) { in wps_process_m1()
2745 if ((wps->wps->registrar->force_pbc_overlap || in wps_process_m1()
2746 wps_registrar_pbc_overlap(wps->wps->registrar, in wps_process_m1()
2747 wps->mac_addr_e, wps->uuid_e) || in wps_process_m1()
2748 !wps_registrar_p2p_dev_addr_match(wps)) && in wps_process_m1()
2749 !wps_registrar_skip_overlap(wps)) { in wps_process_m1()
2752 wps->state = SEND_M2D; in wps_process_m1()
2753 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED; in wps_process_m1()
2754 wps_pbc_overlap_event(wps->wps); in wps_process_m1()
2755 wps_fail_event(wps->wps, WPS_M1, in wps_process_m1()
2757 WPS_EI_NO_ERROR, wps->mac_addr_e); in wps_process_m1()
2758 wps->wps->registrar->force_pbc_overlap = 1; in wps_process_m1()
2761 wps_registrar_add_pbc_session(wps->wps->registrar, in wps_process_m1()
2762 wps->mac_addr_e, wps->uuid_e); in wps_process_m1()
2763 wps->pbc = 1; in wps_process_m1()
2772 if (!wps->use_psk_key && in wps_process_m1()
2773 wps->peer_dev.manufacturer && in wps_process_m1()
2774 os_strncmp(wps->peer_dev.manufacturer, "Apple ", 6) == 0 && in wps_process_m1()
2775 wps->peer_dev.model_name && in wps_process_m1()
2776 os_strcmp(wps->peer_dev.model_name, "AirPort") == 0) { in wps_process_m1()
2779 wps->use_psk_key = 1; in wps_process_m1()
2782 wps_process_vendor_ext_m1(&wps->peer_dev, attr->multi_ap_ext); in wps_process_m1()
2784 wps->state = SEND_M2; in wps_process_m1()
2789 static enum wps_process_res wps_process_m3(struct wps_data *wps, in wps_process_m3() argument
2795 if (wps->state != RECV_M3) { in wps_process_m3()
2797 "receiving M3", wps->state); in wps_process_m3()
2798 wps->state = SEND_WSC_NACK; in wps_process_m3()
2802 if (wps->pbc && wps->wps->registrar->force_pbc_overlap && in wps_process_m3()
2803 !wps_registrar_skip_overlap(wps)) { in wps_process_m3()
2806 wps->state = SEND_WSC_NACK; in wps_process_m3()
2807 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED; in wps_process_m3()
2811 if (wps_process_registrar_nonce(wps, attr->registrar_nonce) || in wps_process_m3()
2812 wps_process_authenticator(wps, attr->authenticator, msg) || in wps_process_m3()
2813 wps_process_e_hash1(wps, attr->e_hash1) || in wps_process_m3()
2814 wps_process_e_hash2(wps, attr->e_hash2)) { in wps_process_m3()
2815 wps->state = SEND_WSC_NACK; in wps_process_m3()
2819 wps->state = SEND_M4; in wps_process_m3()
2824 static enum wps_process_res wps_process_m5(struct wps_data *wps, in wps_process_m5() argument
2833 if (wps->state != RECV_M5) { in wps_process_m5()
2835 "receiving M5", wps->state); in wps_process_m5()
2836 wps->state = SEND_WSC_NACK; in wps_process_m5()
2840 if (wps->pbc && wps->wps->registrar->force_pbc_overlap && in wps_process_m5()
2841 !wps_registrar_skip_overlap(wps)) { in wps_process_m5()
2844 wps->state = SEND_WSC_NACK; in wps_process_m5()
2845 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED; in wps_process_m5()
2849 if (wps_process_registrar_nonce(wps, attr->registrar_nonce) || in wps_process_m5()
2850 wps_process_authenticator(wps, attr->authenticator, msg)) { in wps_process_m5()
2851 wps->state = SEND_WSC_NACK; in wps_process_m5()
2855 decrypted = wps_decrypt_encr_settings(wps, attr->encr_settings, in wps_process_m5()
2860 wps->state = SEND_WSC_NACK; in wps_process_m5()
2866 wps->state = SEND_WSC_NACK; in wps_process_m5()
2873 wps_process_key_wrap_auth(wps, decrypted, eattr.key_wrap_auth) || in wps_process_m5()
2874 wps_process_e_snonce1(wps, eattr.e_snonce1)) { in wps_process_m5()
2876 wps->state = SEND_WSC_NACK; in wps_process_m5()
2881 wps->state = SEND_M6; in wps_process_m5()
2886 static void wps_sta_cred_cb(struct wps_data *wps) in wps_sta_cred_cb() argument
2893 if (wps->cred.auth_type & WPS_AUTH_WPA2PSK) in wps_sta_cred_cb()
2894 wps->cred.auth_type = WPS_AUTH_WPA2PSK; in wps_sta_cred_cb()
2895 else if (wps->cred.auth_type & WPS_AUTH_WPAPSK) in wps_sta_cred_cb()
2896 wps->cred.auth_type = WPS_AUTH_WPAPSK; in wps_sta_cred_cb()
2897 if (wps->cred.encr_type & WPS_ENCR_AES) in wps_sta_cred_cb()
2898 wps->cred.encr_type = WPS_ENCR_AES; in wps_sta_cred_cb()
2899 else if (wps->cred.encr_type & WPS_ENCR_TKIP) in wps_sta_cred_cb()
2900 wps->cred.encr_type = WPS_ENCR_TKIP; in wps_sta_cred_cb()
2903 if (wps->wps->cred_cb) in wps_sta_cred_cb()
2904 wps->wps->cred_cb(wps->wps->cb_ctx, &wps->cred); in wps_sta_cred_cb()
2921 static int wps_process_ap_settings_r(struct wps_data *wps, in wps_process_ap_settings_r() argument
2926 if (wps->wps->ap || wps->er) in wps_process_ap_settings_r()
2930 if (wps_process_ap_settings(attr, &wps->cred) < 0) in wps_process_ap_settings_r()
2935 if (wps->new_ap_settings) { in wps_process_ap_settings_r()
2938 wps_cred_update(&wps->cred, wps->new_ap_settings); in wps_process_ap_settings_r()
2950 wps_registrar_pin_completed(wps->wps->registrar); in wps_process_ap_settings_r()
2952 msg = wps_build_ap_cred(wps); in wps_process_ap_settings_r()
2955 wps->cred.cred_attr = wpabuf_head(msg); in wps_process_ap_settings_r()
2956 wps->cred.cred_attr_len = wpabuf_len(msg); in wps_process_ap_settings_r()
2958 if (wps->ap_settings_cb) { in wps_process_ap_settings_r()
2959 wps->ap_settings_cb(wps->ap_settings_cb_ctx, in wps_process_ap_settings_r()
2960 &wps->cred); in wps_process_ap_settings_r()
2964 wps_sta_cred_cb(wps); in wps_process_ap_settings_r()
2966 wps->cred.cred_attr = NULL; in wps_process_ap_settings_r()
2967 wps->cred.cred_attr_len = 0; in wps_process_ap_settings_r()
2975 static enum wps_process_res wps_process_m7(struct wps_data *wps, in wps_process_m7() argument
2984 if (wps->state != RECV_M7) { in wps_process_m7()
2986 "receiving M7", wps->state); in wps_process_m7()
2987 wps->state = SEND_WSC_NACK; in wps_process_m7()
2991 if (wps->pbc && wps->wps->registrar->force_pbc_overlap && in wps_process_m7()
2992 !wps_registrar_skip_overlap(wps)) { in wps_process_m7()
2995 wps->state = SEND_WSC_NACK; in wps_process_m7()
2996 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED; in wps_process_m7()
3000 if (wps_process_registrar_nonce(wps, attr->registrar_nonce) || in wps_process_m7()
3001 wps_process_authenticator(wps, attr->authenticator, msg)) { in wps_process_m7()
3002 wps->state = SEND_WSC_NACK; in wps_process_m7()
3006 decrypted = wps_decrypt_encr_settings(wps, attr->encr_settings, in wps_process_m7()
3011 wps->state = SEND_WSC_NACK; in wps_process_m7()
3015 if (wps_validate_m7_encr(decrypted, wps->wps->ap || wps->er, in wps_process_m7()
3018 wps->state = SEND_WSC_NACK; in wps_process_m7()
3025 wps_process_key_wrap_auth(wps, decrypted, eattr.key_wrap_auth) || in wps_process_m7()
3026 wps_process_e_snonce2(wps, eattr.e_snonce2) || in wps_process_m7()
3027 wps_process_ap_settings_r(wps, &eattr)) { in wps_process_m7()
3029 wps->state = SEND_WSC_NACK; in wps_process_m7()
3035 wps->state = SEND_M8; in wps_process_m7()
3040 static enum wps_process_res wps_process_wsc_msg(struct wps_data *wps, in wps_process_wsc_msg() argument
3053 wps->state = SEND_WSC_NACK; in wps_process_wsc_msg()
3059 os_memcmp(wps->nonce_r, attr.registrar_nonce, in wps_process_wsc_msg()
3070 if (wps->wps->wps_upnp && attr.mac_addr) { in wps_process_wsc_msg()
3072 wps_free_pending_msgs(wps->wps->upnp_msgs); in wps_process_wsc_msg()
3073 wps->wps->upnp_msgs = NULL; in wps_process_wsc_msg()
3076 wps->wps->wps_upnp, attr.mac_addr, in wps_process_wsc_msg()
3080 ret = wps_process_m1(wps, &attr); in wps_process_wsc_msg()
3085 ret = wps_process_m3(wps, msg, &attr); in wps_process_wsc_msg()
3086 if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) in wps_process_wsc_msg()
3087 wps_fail_event(wps->wps, WPS_M3, wps->config_error, in wps_process_wsc_msg()
3088 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_msg()
3093 ret = wps_process_m5(wps, msg, &attr); in wps_process_wsc_msg()
3094 if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) in wps_process_wsc_msg()
3095 wps_fail_event(wps->wps, WPS_M5, wps->config_error, in wps_process_wsc_msg()
3096 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_msg()
3101 ret = wps_process_m7(wps, msg, &attr); in wps_process_wsc_msg()
3102 if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) in wps_process_wsc_msg()
3103 wps_fail_event(wps->wps, WPS_M7, wps->config_error, in wps_process_wsc_msg()
3104 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_msg()
3115 wpabuf_free(wps->last_msg); in wps_process_wsc_msg()
3116 wps->last_msg = wpabuf_dup(msg); in wps_process_wsc_msg()
3123 static enum wps_process_res wps_process_wsc_ack(struct wps_data *wps, in wps_process_wsc_ack() argument
3145 if (wps->wps->wps_upnp && wps->ext_reg && wps->state == RECV_M2D_ACK && in wps_process_wsc_ack()
3146 upnp_wps_subscribers(wps->wps->wps_upnp)) { in wps_process_wsc_ack()
3147 if (wps->wps->upnp_msgs) in wps_process_wsc_ack()
3156 os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN) != 0) in wps_process_wsc_ack()
3163 os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN) != 0) { in wps_process_wsc_ack()
3168 if (wps->state == RECV_M2D_ACK) { in wps_process_wsc_ack()
3170 if (wps->wps->wps_upnp && in wps_process_wsc_ack()
3171 upnp_wps_subscribers(wps->wps->wps_upnp)) { in wps_process_wsc_ack()
3172 if (wps->wps->upnp_msgs) in wps_process_wsc_ack()
3174 if (wps->ext_reg == 0) in wps_process_wsc_ack()
3175 wps->ext_reg = 1; in wps_process_wsc_ack()
3190 static enum wps_process_res wps_process_wsc_nack(struct wps_data *wps, in wps_process_wsc_nack() argument
3199 old_state = wps->state; in wps_process_wsc_nack()
3200 wps->state = SEND_WSC_NACK; in wps_process_wsc_nack()
3217 if (wps->wps->wps_upnp && wps->ext_reg) { in wps_process_wsc_nack()
3225 os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN) != 0) in wps_process_wsc_nack()
3232 os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN) != 0) { in wps_process_wsc_nack()
3249 wps_fail_event(wps->wps, WPS_M2, config_error, in wps_process_wsc_nack()
3250 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_nack()
3253 wps_fail_event(wps->wps, WPS_M4, config_error, in wps_process_wsc_nack()
3254 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_nack()
3257 wps_fail_event(wps->wps, WPS_M6, config_error, in wps_process_wsc_nack()
3258 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_nack()
3261 wps_fail_event(wps->wps, WPS_M8, config_error, in wps_process_wsc_nack()
3262 wps->error_indication, wps->mac_addr_e); in wps_process_wsc_nack()
3272 static enum wps_process_res wps_process_wsc_done(struct wps_data *wps, in wps_process_wsc_done() argument
3279 if (wps->state != RECV_DONE && in wps_process_wsc_done()
3280 (!wps->wps->wps_upnp || !wps->ext_reg)) { in wps_process_wsc_done()
3282 "receiving WSC_Done", wps->state); in wps_process_wsc_done()
3301 if (wps->wps->wps_upnp && wps->ext_reg) { in wps_process_wsc_done()
3304 wps_device_store(wps->wps->registrar, &wps->peer_dev, in wps_process_wsc_done()
3305 wps->uuid_e); in wps_process_wsc_done()
3311 os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN) != 0) in wps_process_wsc_done()
3318 os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN) != 0) { in wps_process_wsc_done()
3324 wps_device_store(wps->wps->registrar, &wps->peer_dev, in wps_process_wsc_done()
3325 wps->uuid_e); in wps_process_wsc_done()
3327 if (wps->wps->wps_state == WPS_STATE_NOT_CONFIGURED && wps->new_psk && in wps_process_wsc_done()
3328 wps->wps->ap && !wps->wps->registrar->disable_auto_conf) { in wps_process_wsc_done()
3335 os_memcpy(cred.ssid, wps->wps->ssid, wps->wps->ssid_len); in wps_process_wsc_done()
3336 cred.ssid_len = wps->wps->ssid_len; in wps_process_wsc_done()
3337 if (wps->wps->rf_band_cb(wps->wps->cb_ctx) == WPS_RF_60GHZ) { in wps_process_wsc_done()
3344 os_memcpy(cred.key, wps->new_psk, wps->new_psk_len); in wps_process_wsc_done()
3345 cred.key_len = wps->new_psk_len; in wps_process_wsc_done()
3347 wps->wps->wps_state = WPS_STATE_CONFIGURED; in wps_process_wsc_done()
3350 wps->new_psk, wps->new_psk_len); in wps_process_wsc_done()
3351 if (wps->wps->cred_cb) in wps_process_wsc_done()
3352 wps->wps->cred_cb(wps->wps->cb_ctx, &cred); in wps_process_wsc_done()
3354 os_free(wps->new_psk); in wps_process_wsc_done()
3355 wps->new_psk = NULL; in wps_process_wsc_done()
3358 if (!wps->wps->ap && !wps->er) in wps_process_wsc_done()
3359 wps_sta_cred_cb(wps); in wps_process_wsc_done()
3361 if (wps->new_psk) { in wps_process_wsc_done()
3362 if (wps_cb_new_psk(wps->wps->registrar, wps->mac_addr_e, in wps_process_wsc_done()
3363 wps->p2p_dev_addr, wps->new_psk, in wps_process_wsc_done()
3364 wps->new_psk_len)) { in wps_process_wsc_done()
3368 os_free(wps->new_psk); in wps_process_wsc_done()
3369 wps->new_psk = NULL; in wps_process_wsc_done()
3372 wps_cb_reg_success(wps->wps->registrar, wps->mac_addr_e, wps->uuid_e, in wps_process_wsc_done()
3373 wps->dev_password, wps->dev_password_len); in wps_process_wsc_done()
3375 if (wps->pbc) { in wps_process_wsc_done()
3376 wps_registrar_remove_pbc_session(wps->wps->registrar, in wps_process_wsc_done()
3377 wps->uuid_e, in wps_process_wsc_done()
3378 wps->p2p_dev_addr); in wps_process_wsc_done()
3379 wps_registrar_pbc_completed(wps->wps->registrar); in wps_process_wsc_done()
3381 os_get_reltime(&wps->wps->registrar->pbc_ignore_start); in wps_process_wsc_done()
3383 os_memcpy(wps->wps->registrar->pbc_ignore_uuid, wps->uuid_e, in wps_process_wsc_done()
3386 wps_registrar_pin_completed(wps->wps->registrar); in wps_process_wsc_done()
3391 wps_success_event(wps->wps, wps->mac_addr_e); in wps_process_wsc_done()
3397 enum wps_process_res wps_registrar_process_msg(struct wps_data *wps, in wps_registrar_process_msg() argument
3408 if (wps->wps->wps_upnp && op_code == WSC_MSG && wps->ext_reg == 1) { in wps_registrar_process_msg()
3412 wps->ext_reg = 2; /* past M2/M2D phase */ in wps_registrar_process_msg()
3414 if (wps->ext_reg > 1) in wps_registrar_process_msg()
3415 wps_registrar_free_pending_m2(wps->wps); in wps_registrar_process_msg()
3416 if (wps->wps->wps_upnp && wps->ext_reg && in wps_registrar_process_msg()
3417 wps->wps->upnp_msgs == NULL && in wps_registrar_process_msg()
3428 upnp_wps_device_send_wlan_event(wps->wps->wps_upnp, in wps_registrar_process_msg()
3429 wps->mac_addr_e, in wps_registrar_process_msg()
3434 } else if (wps->wps->wps_upnp && wps->ext_reg && op_code == WSC_MSG) { in wps_registrar_process_msg()
3443 return wps_process_wsc_msg(wps, msg); in wps_registrar_process_msg()
3447 return wps_process_wsc_ack(wps, msg); in wps_registrar_process_msg()
3451 return wps_process_wsc_nack(wps, msg); in wps_registrar_process_msg()
3455 ret = wps_process_wsc_done(wps, msg); in wps_registrar_process_msg()
3457 wps->state = SEND_WSC_NACK; in wps_registrar_process_msg()
3458 wps_fail_event(wps->wps, WPS_WSC_DONE, in wps_registrar_process_msg()
3459 wps->config_error, in wps_registrar_process_msg()
3460 wps->error_indication, wps->mac_addr_e); in wps_registrar_process_msg()
3529 if (reg->wps->wps_upnp == NULL) in wps_registrar_sel_reg_union()
3532 dl_list_for_each(s, &reg->wps->wps_upnp->subscriptions, in wps_registrar_sel_reg_union()
3574 methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON; in wps_registrar_selected_registrar_changed()
3580 wps_set_pushbutton(&methods, reg->wps->config_methods); in wps_registrar_selected_registrar_changed()
3665 if (reg->wps->cred_cb) in wps_registrar_config_ap()
3666 return reg->wps->cred_cb(reg->wps->cb_ctx, cred); in wps_registrar_config_ap()