]> git.ipfire.org Git - thirdparty/hostap.git/blobdiff - src/ap/ap_config.c
WPS: Make it possible to use PSKs loaded from the PSK file
[thirdparty/hostap.git] / src / ap / ap_config.c
index 58fc3e9880236a4c685c15cd0a6856ac9658f232..d4d098b38c84b4715ae99154dbfeadb93230c4b8 100644 (file)
@@ -301,6 +301,7 @@ static int hostapd_config_read_wpa_psk(const char *fname,
 
        while (fgets(buf, sizeof(buf), f)) {
                int vlan_id = 0;
+               int wps = 0;
 
                line++;
 
@@ -331,6 +332,8 @@ static int hostapd_config_read_wpa_psk(const char *fname,
                                value = "";
                        if (!os_strcmp(name, "keyid")) {
                                keyid = value;
+                       } else if (!os_strcmp(name, "wps")) {
+                               wps = atoi(value);
                        } else if (!os_strcmp(name, "vlanid")) {
                                vlan_id = atoi(value);
                        } else {
@@ -348,8 +351,9 @@ static int hostapd_config_read_wpa_psk(const char *fname,
                if (!token)
                        token = "";
                if (hwaddr_aton(token, addr)) {
-                       wpa_printf(MSG_ERROR, "Invalid MAC address '%s' on "
-                                  "line %d in '%s'", token, line, fname);
+                       wpa_printf(MSG_ERROR,
+                                  "Invalid MAC address '%s' on line %d in '%s'",
+                                  token, line, fname);
                        ret = -1;
                        break;
                }
@@ -377,16 +381,17 @@ static int hostapd_config_read_wpa_psk(const char *fname,
 
                ok = 0;
                len = os_strlen(pos);
-               if (len == 64 && hexstr2bin(pos, psk->psk, PMK_LEN) == 0)
+               if (len == 2 * PMK_LEN &&
+                   hexstr2bin(pos, psk->psk, PMK_LEN) == 0)
                        ok = 1;
-               else if (len >= 8 && len < 64) {
-                       pbkdf2_sha1(pos, ssid->ssid, ssid->ssid_len,
-                                   4096, psk->psk, PMK_LEN);
+               else if (len >= 8 && len < 64 &&
+                        pbkdf2_sha1(pos, ssid->ssid, ssid->ssid_len,
+                                    4096, psk->psk, PMK_LEN) == 0)
                        ok = 1;
-               }
                if (!ok) {
-                       wpa_printf(MSG_ERROR, "Invalid PSK '%s' on line %d in "
-                                  "'%s'", pos, line, fname);
+                       wpa_printf(MSG_ERROR,
+                                  "Invalid PSK '%s' on line %d in '%s'",
+                                  pos, line, fname);
                        os_free(psk);
                        ret = -1;
                        break;
@@ -404,6 +409,8 @@ static int hostapd_config_read_wpa_psk(const char *fname,
                        }
                }
 
+               psk->wps = wps;
+
                psk->next = ssid->wpa_psk;
                ssid->wpa_psk = psk;
        }
@@ -441,7 +448,9 @@ int hostapd_setup_sae_pt(struct hostapd_bss_config *conf)
        struct hostapd_ssid *ssid = &conf->ssid;
        struct sae_password_entry *pw;
 
-       if (conf->sae_pwe == 0)
+       if ((conf->sae_pwe == 0 && !hostapd_sae_pw_id_in_use(conf)) ||
+           conf->sae_pwe == 3 ||
+           !wpa_key_mgmt_sae(conf->wpa_key_mgmt))
                return 0; /* PT not needed */
 
        sae_deinit_pt(ssid->pt);
@@ -813,6 +822,7 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)
        os_free(conf->upc);
        for (i = 0; i < MAX_WPS_VENDOR_EXTENSIONS; i++)
                wpabuf_free(conf->wps_vendor_ext[i]);
+       wpabuf_free(conf->wps_application_ext);
        wpabuf_free(conf->wps_nfc_dh_pubkey);
        wpabuf_free(conf->wps_nfc_dh_privkey);
        wpabuf_free(conf->wps_nfc_dev_pw);
@@ -880,6 +890,9 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)
 #ifdef CONFIG_TESTING_OPTIONS
        wpabuf_free(conf->own_ie_override);
        wpabuf_free(conf->sae_commit_override);
+       wpabuf_free(conf->rsnxe_override_eapol);
+       wpabuf_free(conf->gtk_rsc_override);
+       wpabuf_free(conf->igtk_rsc_override);
 #endif /* CONFIG_TESTING_OPTIONS */
 
        os_free(conf->no_probe_resp_if_seen_on);
@@ -935,6 +948,7 @@ void hostapd_config_free(struct hostapd_config *conf)
        os_free(conf->supported_rates);
        os_free(conf->basic_rates);
        os_free(conf->acs_ch_list.range);
+       os_free(conf->acs_freq_list.range);
        os_free(conf->driver_params);
 #ifdef CONFIG_ACS
        os_free(conf->acs_chan_bias);