[PATCH v2] DBus: publish provisioned keys in network properties

Johannes Berg johannes at sipsolutions.net
Tue Dec 28 06:14:37 EST 2010


From: Johannes Berg <johannes.berg at intel.com>

When the network was provisioned, we need to
get the keys to be able to reconnect without
new provisioning. To be able to publish those
keys but not normally configured ones, add a
new attribute to struct wpa_ssid indicating
whether or not keys may be exported.

Signed-off-by: Johannes Berg <johannes.berg at intel.com>
---
How about this then?

 wpa_supplicant/config.c                 |    3 +++
 wpa_supplicant/config_ssid.h            |    8 ++++++++
 wpa_supplicant/dbus/dbus_new_handlers.c |    2 +-
 wpa_supplicant/p2p_supplicant.c         |    2 ++
 wpa_supplicant/wps_supplicant.c         |    2 ++
 5 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c
index 1ea37d4..d732f54 100644
--- a/wpa_supplicant/config.c
+++ b/wpa_supplicant/config.c
@@ -1892,6 +1892,7 @@ int wpa_config_set(struct wpa_ssid *ssid, const char *var, const char *value,
  * wpa_config_get_all - Get all options from network configuration
  * @ssid: Pointer to network configuration data
  * @get_keys: Determines if keys/passwords will be included in returned list
+ *	(if they may be exported)
  * Returns: %NULL terminated list of all set keys and their values in the form
  * of [key1, val1, key2, val2, ... , NULL]
  *
@@ -1907,6 +1908,8 @@ char ** wpa_config_get_all(struct wpa_ssid *ssid, int get_keys)
 	char **props;
 	int fields_num;
 
+	get_keys = get_keys && ssid->export_keys;
+
 	props = os_zalloc(sizeof(char *) * ((2 * NUM_SSID_FIELDS) + 1));
 	if (!props)
 		return NULL;
diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h
index 38da3fc..8419f43 100644
--- a/wpa_supplicant/config_ssid.h
+++ b/wpa_supplicant/config_ssid.h
@@ -400,6 +400,14 @@ struct wpa_ssid {
 	 * temporary - Whether this network is temporary and not to be saved
 	 */
 	int temporary;
+
+	/**
+	 * export_keys - Whether keys may be exported
+	 *
+	 * This attribute will be set when keys are determined through
+	 * WPS or similar so that they may be exported.
+	 */
+	int export_keys;
 };
 
 #endif /* CONFIG_SSID_H */
diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c
index 08cdd72..5402bff 100644
--- a/wpa_supplicant/dbus/dbus_new_handlers.c
+++ b/wpa_supplicant/dbus/dbus_new_handlers.c
@@ -2882,7 +2882,7 @@ DBusMessage * wpas_dbus_getter_network_properties(
 	DBusMessage *reply = NULL;
 	DBusMessageIter	iter, variant_iter, dict_iter;
 	char **iterator;
-	char **props = wpa_config_get_all(net->ssid, 0);
+	char **props = wpa_config_get_all(net->ssid, 1);
 	if (!props)
 		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
 					      NULL);
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 862ae98..d0b020e 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -403,6 +403,7 @@ static void wpas_p2p_store_persistent_group(struct wpa_supplicant *wpa_s,
 	s->key_mgmt = WPA_KEY_MGMT_PSK;
 	s->proto = WPA_PROTO_RSN;
 	s->pairwise_cipher = WPA_CIPHER_CCMP;
+	s->export_keys = 1;
 	if (ssid->passphrase) {
 		os_free(s->passphrase);
 		s->passphrase = os_strdup(ssid->passphrase);
@@ -3179,6 +3180,7 @@ static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s,
 	os_memcpy(ssid->ssid, params->ssid, params->ssid_len);
 	ssid->ssid_len = params->ssid_len;
 	ssid->p2p_group = 1;
+	ssid->export_keys = 1;
 	if (params->psk_set) {
 		os_memcpy(ssid->psk, params->psk, 32);
 		ssid->psk_set = 1;
diff --git a/wpa_supplicant/wps_supplicant.c b/wpa_supplicant/wps_supplicant.c
index 7b5c9be..b9ed5a5 100644
--- a/wpa_supplicant/wps_supplicant.c
+++ b/wpa_supplicant/wps_supplicant.c
@@ -348,6 +348,7 @@ static int wpa_supplicant_wps_cred(void *ctx,
 				return -1;
 			}
 			ssid->psk_set = 1;
+			ssid->export_keys = 1;
 		} else if (cred->key_len >= 8 && cred->key_len < 2 * PMK_LEN) {
 			os_free(ssid->passphrase);
 			ssid->passphrase = os_malloc(cred->key_len + 1);
@@ -356,6 +357,7 @@ static int wpa_supplicant_wps_cred(void *ctx,
 			os_memcpy(ssid->passphrase, cred->key, cred->key_len);
 			ssid->passphrase[cred->key_len] = '\0';
 			wpa_config_update_psk(ssid);
+			ssid->export_keys = 1;
 		} else {
 			wpa_printf(MSG_ERROR, "WPS: Invalid Network Key "
 				   "length %lu",
-- 
1.7.2.3





More information about the HostAP mailing list