EAP peer: Add framework for external SIM/USIM processing
[mech_eap.git] / wpa_supplicant / config_file.c
index bd9c17f..b8fff70 100644 (file)
@@ -17,6 +17,8 @@
 #include "base64.h"
 #include "uuid.h"
 #include "p2p/p2p.h"
+#include "eap_peer/eap_methods.h"
+#include "eap_peer/eap.h"
 
 
 static int newline_terminated(const char *buf, size_t buflen)
@@ -156,6 +158,7 @@ static struct wpa_ssid * wpa_config_read_network(FILE *f, int *line, int id)
        ssid = os_zalloc(sizeof(*ssid));
        if (ssid == NULL)
                return NULL;
+       dl_list_init(&ssid->psk_list);
        ssid->id = id;
 
        wpa_config_set_network_defaults(ssid);
@@ -343,7 +346,7 @@ static int wpa_config_process_blob(struct wpa_config *config, FILE *f,
 #endif /* CONFIG_NO_CONFIG_BLOBS */
 
 
-struct wpa_config * wpa_config_read(const char *name)
+struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp)
 {
        FILE *f;
        char buf[512], *pos;
@@ -354,12 +357,19 @@ struct wpa_config * wpa_config_read(const char *name)
        int id = 0;
        int cred_id = 0;
 
-       config = wpa_config_alloc_empty(NULL, NULL);
+       if (name == NULL)
+               return NULL;
+       if (cfgp)
+               config = cfgp;
+       else
+               config = wpa_config_alloc_empty(NULL, NULL);
        if (config == NULL) {
                wpa_printf(MSG_ERROR, "Failed to allocate config file "
                           "structure");
                return NULL;
        }
+       head = config->ssid;
+       cred_head = config->cred;
 
        wpa_printf(MSG_DEBUG, "Reading configuration file '%s'", name);
        f = fopen(name, "r");
@@ -595,6 +605,7 @@ static void write_wep_key(FILE *f, int idx, struct wpa_ssid *ssid)
 
 
 #ifdef CONFIG_P2P
+
 static void write_p2p_client_list(FILE *f, struct wpa_ssid *ssid)
 {
        char *value = wpa_config_get(ssid, "p2p_client_list");
@@ -603,6 +614,20 @@ static void write_p2p_client_list(FILE *f, struct wpa_ssid *ssid)
        fprintf(f, "\tp2p_client_list=%s\n", value);
        os_free(value);
 }
+
+
+static void write_psk_list(FILE *f, struct wpa_ssid *ssid)
+{
+       struct psk_list_entry *psk;
+       char hex[32 * 2 + 1];
+
+       dl_list_for_each(psk, &ssid->psk_list, struct psk_list_entry, list) {
+               wpa_snprintf_hex(hex, sizeof(hex), psk->psk, sizeof(psk->psk));
+               fprintf(f, "\tpsk_list=%s" MACSTR "-%s\n",
+                       psk->p2p ? "P2P-" : "", MAC2STR(psk->addr), hex);
+       }
+}
+
 #endif /* CONFIG_P2P */
 
 
@@ -628,6 +653,7 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
        write_auth_alg(f, ssid);
        STR(bgscan);
        STR(autoscan);
+       STR(scan_freq);
 #ifdef IEEE8021X_EAPOL
        write_eap(f, ssid);
        STR(identity);
@@ -641,6 +667,7 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
        STR(dh_file);
        STR(subject_match);
        STR(altsubject_match);
+       STR(domain_suffix_match);
        STR(ca_cert2);
        STR(ca_path2);
        STR(client_cert2);
@@ -649,6 +676,7 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
        STR(dh_file2);
        STR(subject_match2);
        STR(altsubject_match2);
+       STR(domain_suffix_match2);
        STR(phase1);
        STR(phase2);
        STR(pcsc);
@@ -676,16 +704,21 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
        INT_DEFe(fragment_size, DEFAULT_FRAGMENT_SIZE);
 #endif /* IEEE8021X_EAPOL */
        INT(mode);
-       INT(proactive_key_caching);
+       INT(frequency);
+       write_int(f, "proactive_key_caching", ssid->proactive_key_caching, -1);
        INT(disabled);
        INT(peerkey);
 #ifdef CONFIG_IEEE80211W
-       INT(ieee80211w);
+       write_int(f, "ieee80211w", ssid->ieee80211w,
+                 MGMT_FRAME_PROTECTION_DEFAULT);
 #endif /* CONFIG_IEEE80211W */
        STR(id_str);
 #ifdef CONFIG_P2P
        write_p2p_client_list(f, ssid);
+       write_psk_list(f, ssid);
 #endif /* CONFIG_P2P */
+       INT(dtim_period);
+       INT(beacon_int);
 
 #undef STR
 #undef INT
@@ -695,6 +728,8 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
 
 static void wpa_config_write_cred(FILE *f, struct wpa_cred *cred)
 {
+       size_t i;
+
        if (cred->priority)
                fprintf(f, "\tpriority=%d\n", cred->priority);
        if (cred->pcsc)
@@ -703,16 +738,54 @@ static void wpa_config_write_cred(FILE *f, struct wpa_cred *cred)
                fprintf(f, "\trealm=\"%s\"\n", cred->realm);
        if (cred->username)
                fprintf(f, "\tusername=\"%s\"\n", cred->username);
-       if (cred->password)
+       if (cred->password && cred->ext_password)
+               fprintf(f, "\tpassword=ext:%s\n", cred->password);
+       else if (cred->password)
                fprintf(f, "\tpassword=\"%s\"\n", cred->password);
        if (cred->ca_cert)
                fprintf(f, "\tca_cert=\"%s\"\n", cred->ca_cert);
+       if (cred->client_cert)
+               fprintf(f, "\tclient_cert=\"%s\"\n", cred->client_cert);
+       if (cred->private_key)
+               fprintf(f, "\tprivate_key=\"%s\"\n", cred->private_key);
+       if (cred->private_key_passwd)
+               fprintf(f, "\tprivate_key_passwd=\"%s\"\n",
+                       cred->private_key_passwd);
        if (cred->imsi)
                fprintf(f, "\timsi=\"%s\"\n", cred->imsi);
        if (cred->milenage)
                fprintf(f, "\tmilenage=\"%s\"\n", cred->milenage);
-       if (cred->domain)
-               fprintf(f, "\tdomain=\"%s\"\n", cred->domain);
+       for (i = 0; i < cred->num_domain; i++)
+               fprintf(f, "\tdomain=\"%s\"\n", cred->domain[i]);
+       if (cred->domain_suffix_match)
+               fprintf(f, "\tdomain_suffix_match=\"%s\"",
+                       cred->domain_suffix_match);
+       if (cred->roaming_consortium_len) {
+               fprintf(f, "\troaming_consortium=");
+               for (i = 0; i < cred->roaming_consortium_len; i++)
+                       fprintf(f, "%02x", cred->roaming_consortium[i]);
+               fprintf(f, "\n");
+       }
+       if (cred->eap_method) {
+               const char *name;
+               name = eap_get_name(cred->eap_method[0].vendor,
+                                   cred->eap_method[0].method);
+               fprintf(f, "\teap=%s\n", name);
+       }
+       if (cred->phase1)
+               fprintf(f, "\tphase1=\"%s\"\n", cred->phase1);
+       if (cred->phase2)
+               fprintf(f, "\tphase2=\"%s\"\n", cred->phase2);
+       if (cred->excluded_ssid) {
+               size_t j;
+               for (i = 0; i < cred->num_excluded_ssid; i++) {
+                       struct excluded_ssid *e = &cred->excluded_ssid[i];
+                       fprintf(f, "\texcluded_ssid=");
+                       for (j = 0; j < e->ssid_len; j++)
+                               fprintf(f, "%02x", e->ssid[j]);
+                       fprintf(f, "\n");
+               }
+       }
 }
 
 
@@ -870,6 +943,14 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
        }
        if (config->p2p_go_ht40)
                fprintf(f, "p2p_go_ht40=%u\n", config->p2p_go_ht40);
+       if (config->p2p_disabled)
+               fprintf(f, "p2p_disabled=%u\n", config->p2p_disabled);
+       if (config->p2p_no_group_iface)
+               fprintf(f, "p2p_no_group_iface=%u\n",
+                       config->p2p_no_group_iface);
+       if (config->p2p_ignore_shared_freq)
+               fprintf(f, "p2p_ignore_shared_freq=%u\n",
+                       config->p2p_ignore_shared_freq);
 #endif /* CONFIG_P2P */
        if (config->country[0] && config->country[1]) {
                fprintf(f, "country=%c%c\n",
@@ -905,12 +986,16 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
 #endif /* CONFIG_INTERWORKING */
        if (config->pbc_in_m1)
                fprintf(f, "pbc_in_m1=%u\n", config->pbc_in_m1);
-       if (config->wps_nfc_dev_pw_id)
-               fprintf(f, "wps_nfc_dev_pw_id=%d\n",
-                       config->wps_nfc_dev_pw_id);
-       write_global_bin(f, "wps_nfc_dh_pubkey", config->wps_nfc_dh_pubkey);
-       write_global_bin(f, "wps_nfc_dh_privkey", config->wps_nfc_dh_privkey);
-       write_global_bin(f, "wps_nfc_dev_pw", config->wps_nfc_dev_pw);
+       if (config->wps_nfc_pw_from_config) {
+               if (config->wps_nfc_dev_pw_id)
+                       fprintf(f, "wps_nfc_dev_pw_id=%d\n",
+                               config->wps_nfc_dev_pw_id);
+               write_global_bin(f, "wps_nfc_dh_pubkey",
+                                config->wps_nfc_dh_pubkey);
+               write_global_bin(f, "wps_nfc_dh_privkey",
+                                config->wps_nfc_dh_privkey);
+               write_global_bin(f, "wps_nfc_dev_pw", config->wps_nfc_dev_pw);
+       }
 
        if (config->ext_password_backend)
                fprintf(f, "ext_password_backend=%s\n",
@@ -921,6 +1006,58 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
        if (config->auto_interworking)
                fprintf(f, "auto_interworking=%d\n",
                        config->auto_interworking);
+       if (config->okc)
+               fprintf(f, "okc=%d\n", config->okc);
+       if (config->pmf)
+               fprintf(f, "pmf=%d\n", config->pmf);
+       if (config->dtim_period)
+               fprintf(f, "dtim_period=%d\n", config->dtim_period);
+       if (config->beacon_int)
+               fprintf(f, "beacon_int=%d\n", config->beacon_int);
+
+       if (config->sae_groups) {
+               int i;
+               fprintf(f, "sae_groups=");
+               for (i = 0; config->sae_groups[i] >= 0; i++) {
+                       fprintf(f, "%s%d", i > 0 ? " " : "",
+                               config->sae_groups[i]);
+               }
+               fprintf(f, "\n");
+       }
+
+       if (config->ap_vendor_elements) {
+               int i, len = wpabuf_len(config->ap_vendor_elements);
+               const u8 *p = wpabuf_head_u8(config->ap_vendor_elements);
+               if (len > 0) {
+                       fprintf(f, "ap_vendor_elements=");
+                       for (i = 0; i < len; i++)
+                               fprintf(f, "%02x", *p++);
+                       fprintf(f, "\n");
+               }
+       }
+
+       if (config->ignore_old_scan_res)
+               fprintf(f, "ignore_old_scan_res=%d\n",
+                       config->ignore_old_scan_res);
+
+       if (config->freq_list && config->freq_list[0]) {
+               int i;
+               fprintf(f, "freq_list=");
+               for (i = 0; config->freq_list[i]; i++) {
+                       fprintf(f, "%s%u", i > 0 ? " " : "",
+                               config->freq_list[i]);
+               }
+               fprintf(f, "\n");
+       }
+       if (config->scan_cur_freq != DEFAULT_SCAN_CUR_FREQ)
+               fprintf(f, "scan_cur_freq=%d\n", config->scan_cur_freq);
+
+       if (config->sched_scan_interval)
+               fprintf(f, "sched_scan_interval=%u\n",
+                       config->sched_scan_interval);
+
+       if (config->external_sim)
+               fprintf(f, "external_sim=%d\n", config->external_sim);
 }
 
 #endif /* CONFIG_NO_CONFIG_WRITE */