]> git.ipfire.org Git - thirdparty/hostap.git/blobdiff - src/wps/wps.c
P2P NFC: Report connection handover as trigger for P2P
[thirdparty/hostap.git] / src / wps / wps.c
index 4c2322df8f0b25eff5a50079f354134172ef90e4..b40a68aeb73f71e52f8b609c2f63f29ceb3e6dda 100644 (file)
@@ -45,8 +45,7 @@ struct wps_data * wps_init(const struct wps_config *cfg)
                os_memcpy(data->uuid_e, cfg->wps->uuid, WPS_UUID_LEN);
        }
        if (cfg->pin) {
-               data->dev_pw_id = data->wps->oob_dev_pw_id == 0 ?
-                       cfg->dev_pw_id : data->wps->oob_dev_pw_id;
+               data->dev_pw_id = cfg->dev_pw_id;
                data->dev_password = os_malloc(cfg->pin_len);
                if (data->dev_password == NULL) {
                        os_free(data);
@@ -54,12 +53,22 @@ struct wps_data * wps_init(const struct wps_config *cfg)
                }
                os_memcpy(data->dev_password, cfg->pin, cfg->pin_len);
                data->dev_password_len = cfg->pin_len;
+               wpa_hexdump_key(MSG_DEBUG, "WPS: AP PIN dev_password",
+                               data->dev_password, data->dev_password_len);
        }
 
 #ifdef CONFIG_WPS_NFC
+       if (cfg->pin == NULL &&
+           cfg->dev_pw_id == DEV_PW_NFC_CONNECTION_HANDOVER)
+               data->dev_pw_id = cfg->dev_pw_id;
+
        if (cfg->wps->ap && !cfg->registrar && cfg->wps->ap_nfc_dev_pw_id) {
+               /* Keep AP PIN as alternative Device Password */
+               data->alt_dev_pw_id = data->dev_pw_id;
+               data->alt_dev_password = data->dev_password;
+               data->alt_dev_password_len = data->dev_password_len;
+
                data->dev_pw_id = cfg->wps->ap_nfc_dev_pw_id;
-               os_free(data->dev_password);
                data->dev_password =
                        os_malloc(wpabuf_len(cfg->wps->ap_nfc_dev_pw));
                if (data->dev_password == NULL) {
@@ -70,6 +79,8 @@ struct wps_data * wps_init(const struct wps_config *cfg)
                          wpabuf_head(cfg->wps->ap_nfc_dev_pw),
                          wpabuf_len(cfg->wps->ap_nfc_dev_pw));
                data->dev_password_len = wpabuf_len(cfg->wps->ap_nfc_dev_pw);
+               wpa_hexdump_key(MSG_DEBUG, "WPS: NFC dev_password",
+                           data->dev_password, data->dev_password_len);
        }
 #endif /* CONFIG_WPS_NFC */
 
@@ -110,6 +121,7 @@ struct wps_data * wps_init(const struct wps_config *cfg)
                data->new_ap_settings =
                        os_malloc(sizeof(*data->new_ap_settings));
                if (data->new_ap_settings == NULL) {
+                       os_free(data->dev_password);
                        os_free(data);
                        return NULL;
                }
@@ -125,6 +137,12 @@ struct wps_data * wps_init(const struct wps_config *cfg)
        data->use_psk_key = cfg->use_psk_key;
        data->pbc_in_m1 = cfg->pbc_in_m1;
 
+       if (cfg->peer_pubkey_hash) {
+               os_memcpy(data->peer_pubkey_hash, cfg->peer_pubkey_hash,
+                         WPS_OOB_PUBKEY_HASH_LEN);
+               data->peer_pubkey_hash_set = 1;
+       }
+
        return data;
 }
 
@@ -155,11 +173,11 @@ void wps_deinit(struct wps_data *data)
        wpabuf_free(data->dh_pubkey_r);
        wpabuf_free(data->last_msg);
        os_free(data->dev_password);
+       os_free(data->alt_dev_password);
        os_free(data->new_psk);
        wps_device_data_free(&data->peer_dev);
        os_free(data->new_ap_settings);
        dh5_free(data->dh_ctx);
-       os_free(data->nfc_pw_token);
        os_free(data);
 }
 
@@ -488,7 +506,7 @@ struct wpabuf * wps_build_probe_req_ie(u16 pw_id, struct wps_device_data *dev,
            wps_build_config_methods(ie, dev->config_methods) ||
            wps_build_uuid_e(ie, uuid) ||
            wps_build_primary_dev_type(dev, ie) ||
-           wps_build_rf_bands(dev, ie) ||
+           wps_build_rf_bands(dev, ie, 0) ||
            wps_build_assoc_state(NULL, ie) ||
            wps_build_config_error(ie, WPS_CFG_NO_ERROR) ||
            wps_build_dev_password_id(ie, pw_id) ||
@@ -631,3 +649,20 @@ int wps_attr_text(struct wpabuf *data, char *buf, char *end)
 
        return pos - buf;
 }
+
+
+const char * wps_ei_str(enum wps_error_indication ei)
+{
+       switch (ei) {
+       case WPS_EI_NO_ERROR:
+               return "No Error";
+       case WPS_EI_SECURITY_TKIP_ONLY_PROHIBITED:
+               return "TKIP Only Prohibited";
+       case WPS_EI_SECURITY_WEP_PROHIBITED:
+               return "WEP Prohibited";
+       case WPS_EI_AUTH_FAILURE:
+               return "Authentication Failure";
+       default:
+               return "Unknown";
+       }
+}