Introduces two new configuration keywords:
- PACFile: PAC (Protected Access Credentials) file for EAP-FAST
- FASTProv: Configure different EAP-FAST provisioning modes, possible values
  are:
0 = provisioning disabled
1 = anonymous provisioning only
2 = authenticated provisioning only
3 = both provisioning modes allowed
---
 doc/config-format.txt     |   24 +++++++++++++++++---
 gsupplicant/gsupplicant.h |    2 +
 gsupplicant/supplicant.c  |   52 +++++++++++++++++++++++++++++++++++++++++++++
 plugins/wifi.c            |    2 +
 src/config.c              |   29 +++++++++++++++++++++++++
 src/network.c             |   14 ++++++++++++
 src/service.c             |   18 +++++++++++++++
 7 files changed, 137 insertions(+), 4 deletions(-)

diff --git a/doc/config-format.txt b/doc/config-format.txt
index f3c8f01..c1d4131 100644
--- a/doc/config-format.txt
+++ b/doc/config-format.txt
@@ -29,7 +29,7 @@ to store the different services into an hash table.
 Allowed fields:
 - Type: Service type. We currently only support wifi.
 - SSID: An hexadecimal or a string representation of a 802.11 SSID.
-- EAP: EAP type. We currently only support tls, ttls or peap.
+- EAP: EAP type. We currently only support tls, ttls, peap or fast.
 - CACertFile: File path to CA certificate file (PEM/DER).
 - ClientCertFile: File path to client certificate file (PEM/DER).
 - PrivateKeyFile: File path to client private key file (PEM/DER/PFX).
@@ -43,13 +43,20 @@ to fsid.
 Prefix the value with "EAP-" to indicate the usage of an EAP-based inner
 authentication method (should only be used with EAP = TTLS).
 - Passphrase: RSN/WPA/WPA2 Passphrase
+- PACFile: PAC (Protected Access Credentials) file for EAP-FAST
+- FASTProv: Configure different EAP-FAST provisioning modes, possible values
+are:
+0 = provisioning disabled
+1 = anonymous provisioning only
+2 = authenticated provisioning only
+3 = both provisioning modes allowed
 
 
 Example
 =======
 
-This is a configuration file for a network providing EAP-TLS, EAP-TTLS and
-EAP-PEAP services.
+This is a configuration file for a network providing EAP-TLS, EAP-TTLS, 
EAP-PEAP
+and EAP-FAST services.
 The respective SSIDs are tls_ssid, ttls_ssid and peap_ssid and the file name
 is example.config.
 Please note that the SSID entry is for hexadecimal encoded SSID (e.g. "SSID =
@@ -76,7 +83,7 @@ Identity = user
 Type = wifi
 Name = ttls_ssid
 EAP = ttls
-CACertFile = /home/user/.cert/ca.pem
+    CACertFile = /home/user/.cert/ca.pem
 Phase2 = MSCHAPV2
 Identity = user
 
@@ -87,3 +94,12 @@ EAP = peap
 CACertFile = /home/user/.cert/ca.pem
 Phase2 = MSCHAPV2
 Identity = user
+
+[service_fast]
+Type = wifi
+Name = fast_ssid
+EAP = fast
+PACFile = /etc/wpa_supplicant.eap-fast-pac
+Identity = user
+Passphrase = password
+Phase2 = MSCHAPV2
diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h
index 1da9661..ccf8151 100644
--- a/gsupplicant/gsupplicant.h
+++ b/gsupplicant/gsupplicant.h
@@ -110,6 +110,8 @@ struct _GSupplicantSSID {
        const char *private_key_path;
        const char *private_key_passphrase;
        const char *phase2_auth;
+       const char *pac_file;
+       const char *fast_prov;
 };
 
 typedef struct _GSupplicantSSID GSupplicantSSID;
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index 827664b..2b66bcb 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -2361,6 +2361,56 @@ static void add_network_security_peap(DBusMessageIter 
*dict,
        g_free(phase2_auth);
 }
 
+static void add_network_security_fast(DBusMessageIter *dict,
+                                       GSupplicantSSID *ssid)
+{
+       char *phase2_auth, *fast_prov = NULL;
+
+       /*
+        * For FAST, we need:
+        *              The PAC file
+        *              The 2nd phase authentication method
+        *              The 2nd phase passphrase
+        *
+        * Provisioning mode for the 1st phase is optional.
+        */
+
+       if (ssid->passphrase == NULL)
+               return;
+
+       if (ssid->phase2_auth == NULL)
+               return;
+
+       if (ssid->pac_file == NULL)
+               return;
+
+       phase2_auth = g_strdup_printf("auth=%s", ssid->phase2_auth);
+
+       if (ssid->fast_prov != NULL)
+               fast_prov = g_strdup_printf("fast_provisioning=%s",
+                                       ssid->fast_prov);
+
+       supplicant_dbus_dict_append_basic(dict, "password",
+                                               DBUS_TYPE_STRING,
+                                               &ssid->passphrase);
+
+       supplicant_dbus_dict_append_basic(dict, "phase2",
+                                               DBUS_TYPE_STRING,
+                                               &phase2_auth);
+
+       supplicant_dbus_dict_append_basic(dict, "pac_file",
+                                               DBUS_TYPE_STRING,
+                                               &ssid->pac_file);
+
+       if (fast_prov != NULL)
+               supplicant_dbus_dict_append_basic(dict, "phase1",
+                                                       DBUS_TYPE_STRING,
+                                                       &fast_prov);
+
+       g_free(phase2_auth);
+       g_free(fast_prov);
+}
+
 static void add_network_security_eap(DBusMessageIter *dict,
                                        GSupplicantSSID *ssid)
 {
@@ -2374,6 +2424,8 @@ static void add_network_security_eap(DBusMessageIter 
*dict,
        } else if (g_strcmp0(ssid->eap, "peap") == 0 ||
                                g_strcmp0(ssid->eap, "ttls") == 0) {
                add_network_security_peap(dict, ssid);
+       } else if (g_strcmp0(ssid->eap, "fast") == 0) {
+               add_network_security_fast(dict, ssid);
        } else
                return;
 
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 62d9216..ad7bee6 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -637,6 +637,8 @@ static void ssid_init(GSupplicantSSID *ssid, struct 
connman_network *network)
        ssid->private_key_passphrase = connman_network_get_string(network,
                                                "WiFi.PrivateKeyPassphrase");
        ssid->phase2_auth = connman_network_get_string(network, "WiFi.Phase2");
+       ssid->pac_file = connman_network_get_string(network, "WiFi.PACFile");
+       ssid->fast_prov = connman_network_get_string(network, "WiFi.FASTProv");
 
 }
 
diff --git a/src/config.c b/src/config.c
index 9dd0911..9b985d1 100644
--- a/src/config.c
+++ b/src/config.c
@@ -47,6 +47,8 @@ struct connman_config_service {
        char *private_key_passphrase_type;
        char *phase2;
        char *passphrase;
+       char *pac_file;
+       char *fast_prov;
 };
 
 struct connman_config {
@@ -79,6 +81,8 @@ static uint inotify_watch = 0;
 #define SERVICE_KEY_IDENTITY           "Identity"
 #define SERVICE_KEY_PHASE2             "Phase2"
 #define SERVICE_KEY_PASSPHRASE         "Passphrase"
+#define SERVICE_KEY_PAC                "PACFile"
+#define SERVICE_KEY_FAST_PROV          "FASTProv"
 
 static const char *config_possible_keys[] = {
        CONFIG_KEY_NAME,
@@ -99,6 +103,8 @@ static const char *service_possible_keys[] = {
        SERVICE_KEY_IDENTITY,
        SERVICE_KEY_PHASE2,
        SERVICE_KEY_PASSPHRASE,
+       SERVICE_KEY_PAC,
+       SERVICE_KEY_FAST_PROV,
        NULL,
 };
 
@@ -135,6 +141,8 @@ static void unregister_service(gpointer data)
        g_free(service->private_key_passphrase_type);
        g_free(service->phase2);
        g_free(service->passphrase);
+       g_free(service->pac_file);
+       g_free(service->fast_prov);
        g_free(service);
 }
 
@@ -297,6 +305,19 @@ static int load_service(GKeyFile *keyfile, const char 
*group,
                service->passphrase = str;
        }
 
+       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_PAC, NULL);
+       if (str != NULL) {
+               g_free(service->pac_file);
+               service->pac_file = str;
+       }
+
+       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_FAST_PROV,
+                                       NULL);
+       if (str != NULL) {
+               g_free(service->fast_prov);
+               service->fast_prov = str;
+       }
+
        g_hash_table_replace(config->service_table, service->ident, service);
 
        connman_info("Adding service configuration %s", service->ident);
@@ -680,6 +701,14 @@ static void provision_service(gpointer key, gpointer 
value, gpointer user_data)
 
        if (config->passphrase != NULL)
                __connman_service_set_string(service, "Passphrase", 
config->passphrase);
+
+       if (config->pac_file != NULL)
+               __connman_service_set_string(service, "PACFile",
+                                               config->pac_file);
+
+       if (config->fast_prov != NULL)
+               __connman_service_set_string(service, "FASTProv",
+                                               config->fast_prov);
 }
 
 int __connman_config_provision_service(struct connman_service *service)
diff --git a/src/network.c b/src/network.c
index 3130f7c..4317d12 100644
--- a/src/network.c
+++ b/src/network.c
@@ -67,6 +67,8 @@ struct connman_network {
                char *private_key_path;
                char *private_key_passphrase;
                char *phase2_auth;
+               char *pac_file;
+               char *fast_prov;
        } wifi;
 };
 
@@ -168,6 +170,8 @@ static void network_destruct(struct connman_element 
*element)
        g_free(network->wifi.private_key_path);
        g_free(network->wifi.private_key_passphrase);
        g_free(network->wifi.phase2_auth);
+       g_free(network->wifi.pac_file);
+       g_free(network->wifi.fast_prov);
 
        g_free(network->group);
        g_free(network->node);
@@ -1236,6 +1240,12 @@ int connman_network_set_string(struct connman_network 
*network,
        } else if (g_str_equal(key, "WiFi.Phase2") == TRUE) {
                g_free(network->wifi.phase2_auth);
                network->wifi.phase2_auth = g_strdup(value);
+       } else if (g_str_equal(key, "WiFi.PACFile") == TRUE) {
+               g_free(network->wifi.pac_file);
+               network->wifi.pac_file = g_strdup(value);
+       } else if (g_str_equal(key, "WiFi.FASTProv") == TRUE) {
+               g_free(network->wifi.fast_prov);
+               network->wifi.fast_prov = g_strdup(value);
        }
 
        err = connman_element_set_string(&network->element, key, value);
@@ -1289,6 +1299,10 @@ const char *connman_network_get_string(struct 
connman_network *network,
                return network->wifi.private_key_passphrase;
        else if (g_str_equal(key, "WiFi.Phase2") == TRUE)
                return network->wifi.phase2_auth;
+       else if (g_str_equal(key, "WiFi.PACFile") == TRUE)
+               return network->wifi.pac_file;
+       else if (g_str_equal(key, "WiFi.FASTProv") == TRUE)
+               return network->wifi.fast_prov;
 
        return connman_element_get_string(&network->element, key);
 }
diff --git a/src/service.c b/src/service.c
index 0002609..bf41365 100644
--- a/src/service.c
+++ b/src/service.c
@@ -95,6 +95,8 @@ struct connman_service {
        char *private_key_file;
        char *private_key_passphrase;
        char *phase2;
+       char *pac_file;
+       char *fast_prov;
        DBusMessage *pending;
        guint timeout;
        struct connman_location *location;
@@ -2641,6 +2643,8 @@ static void service_free(gpointer user_data)
        g_free(service->private_key_file);
        g_free(service->private_key_passphrase);
        g_free(service->phase2);
+       g_free(service->pac_file);
+       g_free(service->fast_prov);
 
        if (service->stats.timer != NULL)
                g_timer_destroy(service->stats.timer);
@@ -2999,6 +3003,12 @@ void __connman_service_set_string(struct connman_service 
*service,
        } else if (g_str_equal(key, "Passphrase") == TRUE) {
                g_free(service->passphrase);
                service->passphrase = g_strdup(value);
+       } else if (g_str_equal(key, "PACFile") == TRUE) {
+               g_free(service->pac_file);
+               service->pac_file = g_strdup(value);
+       } else if (g_str_equal(key, "FASTProv") == TRUE) {
+               g_free(service->fast_prov);
+               service->fast_prov = g_strdup(value);
        }
 }
 
@@ -3268,6 +3278,14 @@ static void prepare_8021x(struct connman_service 
*service)
        if (service->phase2 != NULL)
                connman_network_set_string(service->network, "WiFi.Phase2",
                                                        service->phase2);
+
+       if (service->pac_file != NULL)
+               connman_network_set_string(service->network, "WiFi.PACFile",
+                                                       service->pac_file);
+
+       if (service->fast_prov != NULL)
+               connman_network_set_string(service->network, "WiFi.FASTProv",
+                                                       service->fast_prov);
 }
 
 int __connman_service_connect(struct connman_service *service)
-- 
1.7.0.4


_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to