]> git.ipfire.org Git - thirdparty/hostap.git/blobdiff - wpa_supplicant/config.c
EAP: Increase the maximum number of message exchanges
[thirdparty/hostap.git] / wpa_supplicant / config.c
index 0f71e9fb610cb8925b199f17fd786a2e34b651b3..fc1ed4f9047c9320227ddf8d612bf36707554f72 100644 (file)
@@ -2002,16 +2002,21 @@ static int wpa_config_parse_mka_cak(const struct parse_data *data,
                                    struct wpa_ssid *ssid, int line,
                                    const char *value)
 {
-       if (hexstr2bin(value, ssid->mka_cak, MACSEC_CAK_LEN) ||
-           value[MACSEC_CAK_LEN * 2] != '\0') {
+       size_t len;
+
+       len = os_strlen(value);
+       if (len > 2 * MACSEC_CAK_MAX_LEN ||
+           (len != 2 * 16 && len != 2 * 32) ||
+           hexstr2bin(value, ssid->mka_cak, len / 2)) {
                wpa_printf(MSG_ERROR, "Line %d: Invalid MKA-CAK '%s'.",
                           line, value);
                return -1;
        }
-
+       ssid->mka_cak_len = len / 2;
        ssid->mka_psk_set |= MKA_PSK_SET_CAK;
 
-       wpa_hexdump_key(MSG_MSGDUMP, "MKA-CAK", ssid->mka_cak, MACSEC_CAK_LEN);
+       wpa_hexdump_key(MSG_MSGDUMP, "MKA-CAK", ssid->mka_cak,
+                       ssid->mka_cak_len);
        return 0;
 }
 
@@ -2020,8 +2025,18 @@ static int wpa_config_parse_mka_ckn(const struct parse_data *data,
                                    struct wpa_ssid *ssid, int line,
                                    const char *value)
 {
-       if (hexstr2bin(value, ssid->mka_ckn, MACSEC_CKN_LEN) ||
-           value[MACSEC_CKN_LEN * 2] != '\0') {
+       size_t len;
+
+       len = os_strlen(value);
+       if (len > 2 * MACSEC_CKN_MAX_LEN || /* too long */
+           len < 2 || /* too short */
+           len % 2 != 0 /* not an integral number of bytes */) {
+               wpa_printf(MSG_ERROR, "Line %d: Invalid MKA-CKN '%s'.",
+                          line, value);
+               return -1;
+       }
+       ssid->mka_ckn_len = len / 2;
+       if (hexstr2bin(value, ssid->mka_ckn, ssid->mka_ckn_len)) {
                wpa_printf(MSG_ERROR, "Line %d: Invalid MKA-CKN '%s'.",
                           line, value);
                return -1;
@@ -2029,7 +2044,8 @@ static int wpa_config_parse_mka_ckn(const struct parse_data *data,
 
        ssid->mka_psk_set |= MKA_PSK_SET_CKN;
 
-       wpa_hexdump_key(MSG_MSGDUMP, "MKA-CKN", ssid->mka_ckn, MACSEC_CKN_LEN);
+       wpa_hexdump_key(MSG_MSGDUMP, "MKA-CKN", ssid->mka_ckn,
+                       ssid->mka_ckn_len);
        return 0;
 }
 
@@ -2042,7 +2058,7 @@ static char * wpa_config_write_mka_cak(const struct parse_data *data,
        if (!(ssid->mka_psk_set & MKA_PSK_SET_CAK))
                return NULL;
 
-       return wpa_config_write_string_hex(ssid->mka_cak, MACSEC_CAK_LEN);
+       return wpa_config_write_string_hex(ssid->mka_cak, ssid->mka_cak_len);
 }
 
 
@@ -2051,7 +2067,7 @@ static char * wpa_config_write_mka_ckn(const struct parse_data *data,
 {
        if (!(ssid->mka_psk_set & MKA_PSK_SET_CKN))
                return NULL;
-       return wpa_config_write_string_hex(ssid->mka_ckn, MACSEC_CKN_LEN);
+       return wpa_config_write_string_hex(ssid->mka_ckn, ssid->mka_ckn_len);
 }
 
 #endif /* NO_CONFIG_WRITE */
@@ -2224,8 +2240,8 @@ static const struct parse_data ssid_fields[] = {
        { INT_RANGE(ht, 0, 1) },
        { INT_RANGE(vht, 0, 1) },
        { INT_RANGE(ht40, -1, 1) },
-       { INT_RANGE(max_oper_chwidth, VHT_CHANWIDTH_USE_HT,
-                   VHT_CHANWIDTH_80P80MHZ) },
+       { INT_RANGE(max_oper_chwidth, CHANWIDTH_USE_HT,
+                   CHANWIDTH_80P80MHZ) },
        { INT(vht_center_freq1) },
        { INT(vht_center_freq2) },
 #ifdef IEEE8021X_EAPOL
@@ -2241,6 +2257,7 @@ static const struct parse_data ssid_fields[] = {
        { STR_KEYe(private_key_passwd) },
        { STRe(dh_file) },
        { STRe(subject_match) },
+       { STRe(check_cert_subject) },
        { STRe(altsubject_match) },
        { STRe(domain_suffix_match) },
        { STRe(domain_match) },
@@ -2251,6 +2268,7 @@ static const struct parse_data ssid_fields[] = {
        { STR_KEYe(private_key2_passwd) },
        { STRe(dh_file2) },
        { STRe(subject_match2) },
+       { STRe(check_cert_subject2) },
        { STRe(altsubject_match2) },
        { STRe(domain_suffix_match2) },
        { STRe(domain_match2) },
@@ -2331,6 +2349,8 @@ static const struct parse_data ssid_fields[] = {
        { INT_RANGE(disable_sgi, 0, 1) },
        { INT_RANGE(disable_ldpc, 0, 1) },
        { INT_RANGE(ht40_intolerant, 0, 1) },
+       { INT_RANGE(tx_stbc, -1, 1) },
+       { INT_RANGE(rx_stbc, -1, 3) },
        { INT_RANGE(disable_max_amsdu, -1, 1) },
        { INT_RANGE(ampdu_factor, -1, 3) },
        { INT_RANGE(ampdu_density, -1, 7) },
@@ -2363,6 +2383,8 @@ static const struct parse_data ssid_fields[] = {
 #ifdef CONFIG_MACSEC
        { INT_RANGE(macsec_policy, 0, 1) },
        { INT_RANGE(macsec_integ_only, 0, 1) },
+       { INT_RANGE(macsec_replay_protect, 0, 1) },
+       { INT(macsec_replay_window) },
        { INT_RANGE(macsec_port, 1, 65534) },
        { INT_RANGE(mka_priority, 0, 255) },
        { FUNC_KEY(mka_cak) },
@@ -2385,6 +2407,7 @@ static const struct parse_data ssid_fields[] = {
        { INT_RANGE(owe_group, 0, 65535) },
        { INT_RANGE(owe_only, 0, 1) },
        { INT_RANGE(multi_ap_backhaul_sta, 0, 1) },
+       { INT_RANGE(ft_eap_pmksa_caching, 0, 1) },
 };
 
 #undef OFFSET
@@ -2505,6 +2528,7 @@ static void eap_peer_config_free(struct eap_peer_config *eap)
        str_clear_free(eap->private_key_passwd);
        os_free(eap->dh_file);
        os_free(eap->subject_match);
+       os_free(eap->check_cert_subject);
        os_free(eap->altsubject_match);
        os_free(eap->domain_suffix_match);
        os_free(eap->domain_match);
@@ -2515,6 +2539,7 @@ static void eap_peer_config_free(struct eap_peer_config *eap)
        str_clear_free(eap->private_key2_passwd);
        os_free(eap->dh_file2);
        os_free(eap->subject_match2);
+       os_free(eap->check_cert_subject2);
        os_free(eap->altsubject_match2);
        os_free(eap->domain_suffix_match2);
        os_free(eap->domain_match2);
@@ -2851,6 +2876,8 @@ void wpa_config_set_network_defaults(struct wpa_ssid *ssid)
        ssid->disable_ht40 = DEFAULT_DISABLE_HT40;
        ssid->disable_sgi = DEFAULT_DISABLE_SGI;
        ssid->disable_ldpc = DEFAULT_DISABLE_LDPC;
+       ssid->tx_stbc = DEFAULT_TX_STBC;
+       ssid->rx_stbc = DEFAULT_RX_STBC;
        ssid->disable_max_amsdu = DEFAULT_DISABLE_MAX_AMSDU;
        ssid->ampdu_factor = DEFAULT_AMPDU_FACTOR;
        ssid->ampdu_density = DEFAULT_AMPDU_DENSITY;
@@ -2881,6 +2908,7 @@ void wpa_config_set_network_defaults(struct wpa_ssid *ssid)
        ssid->mka_priority = DEFAULT_PRIO_NOT_KEY_SERVER;
 #endif /* CONFIG_MACSEC */
        ssid->mac_addr = -1;
+       ssid->max_oper_chwidth = DEFAULT_MAX_OPER_CHWIDTH;
 }
 
 
@@ -4505,6 +4533,21 @@ static int wpa_config_process_p2p_no_go_freq(
        return 0;
 }
 
+
+static int wpa_config_process_p2p_device_persistent_mac_addr(
+       const struct global_parse_data *data,
+       struct wpa_config *config, int line, const char *pos)
+{
+       if (hwaddr_aton2(pos, config->p2p_device_persistent_mac_addr) < 0) {
+               wpa_printf(MSG_ERROR,
+                          "Line %d: Invalid p2p_device_persistent_mac_addr '%s'",
+                          line, pos);
+               return -1;
+       }
+
+       return 0;
+}
+
 #endif /* CONFIG_P2P */
 
 
@@ -4715,6 +4758,7 @@ static const struct global_parse_data global_fields[] = {
        { FUNC(os_version), CFG_CHANGED_OS_VERSION },
        { STR(config_methods), CFG_CHANGED_CONFIG_METHODS },
        { INT_RANGE(wps_cred_processing, 0, 2), 0 },
+       { INT_RANGE(wps_cred_add_sae, 0, 1), 0 },
        { FUNC(wps_vendor_ext_m1), CFG_CHANGED_VENDOR_EXTENSION },
 #endif /* CONFIG_WPS */
 #ifdef CONFIG_P2P
@@ -4737,6 +4781,7 @@ static const struct global_parse_data global_fields[] = {
        { INT_RANGE(p2p_optimize_listen_chan, 0, 1), 0 },
        { INT(p2p_go_ht40), 0 },
        { INT(p2p_go_vht), 0 },
+       { INT(p2p_go_he), 0 },
        { INT(p2p_disabled), 0 },
        { INT_RANGE(p2p_go_ctwindow, 0, 127), 0 },
        { INT(p2p_no_group_iface), 0 },
@@ -4746,6 +4791,9 @@ static const struct global_parse_data global_fields[] = {
        { IPV4(ip_addr_start), 0 },
        { IPV4(ip_addr_end), 0 },
        { INT_RANGE(p2p_cli_probe, 0, 1), 0 },
+       { INT(p2p_device_random_mac_addr), 0 },
+       { FUNC(p2p_device_persistent_mac_addr), 0 },
+       { INT(p2p_interface_random_mac_addr), 0 },
 #endif /* CONFIG_P2P */
        { FUNC(country), CFG_CHANGED_COUNTRY },
        { INT(bss_max_count), 0 },
@@ -4780,6 +4828,7 @@ static const struct global_parse_data global_fields[] = {
        { INT(okc), 0 },
        { INT(pmf), 0 },
        { FUNC(sae_groups), 0 },
+       { INT_RANGE(sae_pmkid_in_assoc, 0, 1), 0 },
        { INT(dtim_period), 0 },
        { INT(beacon_int), 0 },
        { FUNC(ap_vendor_elements), 0 },
@@ -4821,6 +4870,9 @@ static const struct global_parse_data global_fields[] = {
        { INT_RANGE(gas_rand_mac_addr, 0, 2), 0 },
        { INT_RANGE(dpp_config_processing, 0, 2), 0 },
        { INT_RANGE(coloc_intf_reporting, 0, 1), 0 },
+#ifdef CONFIG_WNM
+       { INT_RANGE(disable_btm, 0, 1), CFG_CHANGED_DISABLE_BTM },
+#endif /* CONFIG_WNM */
 };
 
 #undef FUNC