Browse Source

WPS: Moved UUID configuration from phase1 into global config area

Jouni Malinen 16 years ago
parent
commit
f855f923a7

+ 2 - 0
src/eap_peer/eap.c

@@ -1180,6 +1180,8 @@ struct eap_sm * eap_peer_sm_init(void *eapol_ctx,
 	sm->ClientTimeout = 60;
 	sm->ClientTimeout = 60;
 	if (conf->mac_addr)
 	if (conf->mac_addr)
 		os_memcpy(sm->mac_addr, conf->mac_addr, ETH_ALEN);
 		os_memcpy(sm->mac_addr, conf->mac_addr, ETH_ALEN);
+	if (conf->uuid)
+		os_memcpy(sm->uuid, conf->uuid, 16);
 
 
 	os_memset(&tlsconf, 0, sizeof(tlsconf));
 	os_memset(&tlsconf, 0, sizeof(tlsconf));
 	tlsconf.opensc_engine_path = conf->opensc_engine_path;
 	tlsconf.opensc_engine_path = conf->opensc_engine_path;

+ 6 - 0
src/eap_peer/eap.h

@@ -263,6 +263,12 @@ struct eap_config {
 	 * This is only used by EAP-WSC and can be left %NULL if not available.
 	 * This is only used by EAP-WSC and can be left %NULL if not available.
 	 */
 	 */
 	const u8 *mac_addr;
 	const u8 *mac_addr;
+	/**
+	 * uuid - Device UUID
+	 *
+	 * This is only used by EAP-WSC and can be left %NULL if not available.
+	 */
+	const u8 *uuid;
 };
 };
 
 
 struct eap_sm * eap_peer_sm_init(void *eapol_ctx,
 struct eap_sm * eap_peer_sm_init(void *eapol_ctx,

+ 1 - 0
src/eap_peer/eap_i.h

@@ -334,6 +334,7 @@ struct eap_sm {
 	int force_disabled;
 	int force_disabled;
 
 
 	u8 mac_addr[ETH_ALEN];
 	u8 mac_addr[ETH_ALEN];
+	u8 uuid[16];
 };
 };
 
 
 const u8 * eap_get_config_identity(struct eap_sm *sm, size_t *len);
 const u8 * eap_get_config_identity(struct eap_sm *sm, size_t *len);

+ 2 - 16
src/eap_peer/eap_wsc.c

@@ -107,7 +107,6 @@ static void * eap_wsc_init(struct eap_sm *sm)
 	size_t identity_len;
 	size_t identity_len;
 	int registrar;
 	int registrar;
 	struct wps_config cfg;
 	struct wps_config cfg;
-	u8 uuid[UUID_LEN];
 	const char *pos;
 	const char *pos;
 	const char *phase1;
 	const char *phase1;
 	struct wps_context *wps = NULL;
 	struct wps_context *wps = NULL;
@@ -201,23 +200,10 @@ static void * eap_wsc_init(struct eap_sm *sm)
 		return NULL;
 		return NULL;
 	}
 	}
 
 
-	pos = os_strstr(phase1, "uuid=");
-	if (pos == NULL) {
-		wpa_printf(MSG_INFO, "EAP-WSC: UUID not set in phase1 "
-			   "configuration data");
-		os_free(data);
-		return NULL;
-	}
-	if (uuid_str2bin(pos + 5, uuid)) {
-		wpa_printf(MSG_INFO, "EAP-WSC: Invalid UUID in phase1 "
-			   "configuration data");
-		os_free(data);
-		return NULL;
-	}
 	if (registrar && wps)
 	if (registrar && wps)
-		os_memcpy(wps->uuid, uuid, UUID_LEN);
+		os_memcpy(wps->uuid, sm->uuid, UUID_LEN);
 	else
 	else
-		cfg.uuid = uuid;
+		cfg.uuid = sm->uuid;
 	cfg.wps_cred_cb = sm->eapol_cb->wps_cred;
 	cfg.wps_cred_cb = sm->eapol_cb->wps_cred;
 	cfg.cb_ctx = sm->eapol_ctx;
 	cfg.cb_ctx = sm->eapol_ctx;
 	data->wps = wps_init(&cfg);
 	data->wps = wps_init(&cfg);

+ 1 - 0
src/eapol_supp/eapol_supp_sm.c

@@ -1820,6 +1820,7 @@ struct eapol_sm *eapol_sm_init(struct eapol_ctx *ctx)
 	conf.pkcs11_module_path = ctx->pkcs11_module_path;
 	conf.pkcs11_module_path = ctx->pkcs11_module_path;
 #endif /* EAP_TLS_OPENSSL */
 #endif /* EAP_TLS_OPENSSL */
 	conf.mac_addr = ctx->mac_addr;
 	conf.mac_addr = ctx->mac_addr;
+	conf.uuid = ctx->uuid;
 
 
 	sm->eap = eap_peer_sm_init(sm, &eapol_cb, sm->ctx->msg_ctx, &conf);
 	sm->eap = eap_peer_sm_init(sm, &eapol_cb, sm->ctx->msg_ctx, &conf);
 	if (sm->eap == NULL) {
 	if (sm->eap == NULL) {

+ 7 - 0
src/eapol_supp/eapol_supp_sm.h

@@ -207,6 +207,13 @@ struct eapol_ctx {
 	 */
 	 */
 	const u8 *mac_addr;
 	const u8 *mac_addr;
 
 
+	/**
+	 * uuid - Device UUID
+	 *
+	 * This is only used by EAP-WSC and can be left %NULL if not available.
+	 */
+	const u8 *uuid;
+
 	/**
 	/**
 	 * wps_cred - Notify that new credential was received from WPS
 	 * wps_cred - Notify that new credential was received from WPS
 	 * @ctx: Callback context (ctx)
 	 * @ctx: Callback context (ctx)

+ 10 - 0
src/utils/uuid.c

@@ -65,3 +65,13 @@ int uuid_bin2str(const u8 *bin, char *str, size_t max_len)
 		return -1;
 		return -1;
 	return 0;
 	return 0;
 }
 }
+
+
+int is_nil_uuid(const u8 *uuid)
+{
+	int i;
+	for (i = 0; i < UUID_LEN; i++)
+		if (uuid[i])
+			return 0;
+	return 1;
+}

+ 1 - 0
src/utils/uuid.h

@@ -19,5 +19,6 @@
 
 
 int uuid_str2bin(const char *str, u8 *bin);
 int uuid_str2bin(const char *str, u8 *bin);
 int uuid_bin2str(const u8 *bin, char *str, size_t max_len);
 int uuid_bin2str(const u8 *bin, char *str, size_t max_len);
+int is_nil_uuid(const u8 *uuid);
 
 
 #endif /* UUID_H */
 #endif /* UUID_H */

+ 5 - 0
wpa_supplicant/config.h

@@ -247,6 +247,11 @@ struct wpa_config {
 	 * blobs - Configuration blobs
 	 * blobs - Configuration blobs
 	 */
 	 */
 	struct wpa_config_blob *blobs;
 	struct wpa_config_blob *blobs;
+
+	/**
+	 * uuid - Universally Unique IDentifier (UUID; see RFC 4122) for WPS
+	 */
+	u8 uuid[16];
 };
 };
 
 
 
 

+ 29 - 0
wpa_supplicant/config_file.c

@@ -21,6 +21,7 @@
 #include "common.h"
 #include "common.h"
 #include "config.h"
 #include "config.h"
 #include "base64.h"
 #include "base64.h"
+#include "uuid.h"
 #include "eap_peer/eap_methods.h"
 #include "eap_peer/eap_methods.h"
 
 
 
 
@@ -427,6 +428,22 @@ static int wpa_config_process_load_dynamic_eap(int line, char *so)
 }
 }
 
 
 
 
+#ifdef CONFIG_WPS
+static int wpa_config_process_uuid(struct wpa_config *config, int line,
+				   char *pos)
+{
+	char buf[40];
+	if (uuid_str2bin(pos, config->uuid)) {
+		wpa_printf(MSG_ERROR, "Line %d: invalid UUID", line);
+		return -1;
+	}
+	uuid_bin2str(config->uuid, buf, sizeof(buf));
+	wpa_printf(MSG_DEBUG, "uuid=%s", buf);
+	return 0;
+}
+#endif /* CONFIG_WPS */
+
+
 static int wpa_config_process_global(struct wpa_config *config, char *pos,
 static int wpa_config_process_global(struct wpa_config *config, char *pos,
 				     int line)
 				     int line)
 {
 {
@@ -481,6 +498,11 @@ static int wpa_config_process_global(struct wpa_config *config, char *pos,
 	if (os_strncmp(pos, "load_dynamic_eap=", 17) == 0)
 	if (os_strncmp(pos, "load_dynamic_eap=", 17) == 0)
 		return wpa_config_process_load_dynamic_eap(line, pos + 17);
 		return wpa_config_process_load_dynamic_eap(line, pos + 17);
 
 
+#ifdef CONFIG_WPS
+	if (os_strncmp(pos, "uuid=", 5) == 0)
+		return wpa_config_process_uuid(config, line, pos + 5);
+#endif /* CONFIG_WPS */
+
 	return -1;
 	return -1;
 }
 }
 
 
@@ -845,6 +867,13 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
 			config->dot11RSNAConfigSATimeout);
 			config->dot11RSNAConfigSATimeout);
 	if (config->update_config)
 	if (config->update_config)
 		fprintf(f, "update_config=%d\n", config->update_config);
 		fprintf(f, "update_config=%d\n", config->update_config);
+#ifdef CONFIG_WPS
+	if (is_nil_uuid(config->uuid)) {
+		char buf[40];
+		uuid_bin2str(config->uuid, buf, sizeof(buf));
+		fprintf(f, "uuid=%s\n", buf);
+	}
+#endif /* CONFIG_WPS */
 }
 }
 
 
 #endif /* CONFIG_NO_CONFIG_WRITE */
 #endif /* CONFIG_NO_CONFIG_WRITE */

+ 33 - 0
wpa_supplicant/config_winreg.c

@@ -32,6 +32,7 @@
 #include "includes.h"
 #include "includes.h"
 
 
 #include "common.h"
 #include "common.h"
+#include "uuid.h"
 #include "config.h"
 #include "config.h"
 
 
 #ifndef WPA_KEY_ROOT
 #ifndef WPA_KEY_ROOT
@@ -161,6 +162,26 @@ static char * wpa_config_read_reg_string(HKEY hk, const TCHAR *name)
 }
 }
 
 
 
 
+#ifdef CONFIG_WPS
+static int wpa_config_read_global_uuid(struct wpa_config *config, HKEY hk)
+{
+	char *str;
+	int ret = 0;
+
+	str = wpa_config_read_reg_string(hk, TEXT("uuid"));
+	if (str == NULL)
+		return 0;
+
+	if (uuid_str2bin(str, config->uuid))
+		ret = -1;
+
+	os_free(str);
+
+	return ret;
+}
+#endif /* CONFIG_WPS */
+
+
 static int wpa_config_read_global(struct wpa_config *config, HKEY hk)
 static int wpa_config_read_global(struct wpa_config *config, HKEY hk)
 {
 {
 	int errors = 0;
 	int errors = 0;
@@ -191,6 +212,11 @@ static int wpa_config_read_global(struct wpa_config *config, HKEY hk)
 	config->ctrl_interface = wpa_config_read_reg_string(
 	config->ctrl_interface = wpa_config_read_reg_string(
 		hk, TEXT("ctrl_interface"));
 		hk, TEXT("ctrl_interface"));
 
 
+#ifdef CONFIG_WPS
+	if (wpa_config_read_global_uuid(config, hk))
+		errors++;
+#endif /* CONFIG_WPS */
+
 	return errors ? -1 : 0;
 	return errors ? -1 : 0;
 }
 }
 
 
@@ -492,6 +518,13 @@ static int wpa_config_write_global(struct wpa_config *config, HKEY hk)
 	wpa_config_write_reg_dword(hk, TEXT("update_config"),
 	wpa_config_write_reg_dword(hk, TEXT("update_config"),
 				   config->update_config,
 				   config->update_config,
 				   0);
 				   0);
+#ifdef CONFIG_WPS
+	if (is_nil_uuid(config->uuid)) {
+		char buf[40];
+		uuid_bin2str(config->uuid, buf, sizeof(buf));
+		wpa_config_write_reg_string(hk, "uuid", buf);
+	}
+#endif /* CONFIG_WPS */
 
 
 	return 0;
 	return 0;
 }
 }

+ 4 - 12
wpa_supplicant/scan.c

@@ -19,7 +19,6 @@
 #include "config.h"
 #include "config.h"
 #include "wpa_supplicant_i.h"
 #include "wpa_supplicant_i.h"
 #include "mlme.h"
 #include "mlme.h"
-#include "uuid.h"
 #include "wps/wps.h"
 #include "wps/wps.h"
 
 
 
 
@@ -43,11 +42,10 @@ static void wpa_supplicant_gen_assoc_event(struct wpa_supplicant *wpa_s)
 
 
 
 
 #ifdef CONFIG_WPS
 #ifdef CONFIG_WPS
-static int wpas_wps_in_use(struct wpa_config *conf, u8 *uuid)
+static int wpas_wps_in_use(struct wpa_config *conf)
 {
 {
 	struct wpa_ssid *ssid;
 	struct wpa_ssid *ssid;
 	int wps = 0;
 	int wps = 0;
-	const char *pos;
 
 
 	for (ssid = conf->ssid; ssid; ssid = ssid->next) {
 	for (ssid = conf->ssid; ssid; ssid = ssid->next) {
 		if (!(ssid->key_mgmt & WPA_KEY_MGMT_WPS))
 		if (!(ssid->key_mgmt & WPA_KEY_MGMT_WPS))
@@ -57,10 +55,6 @@ static int wpas_wps_in_use(struct wpa_config *conf, u8 *uuid)
 		if (!ssid->eap.phase1)
 		if (!ssid->eap.phase1)
 			continue;
 			continue;
 
 
-		pos = os_strstr(ssid->eap.phase1, "uuid=");
-		if (pos)
-			uuid_str2bin(pos + 5, uuid);
-
 		if (os_strstr(ssid->eap.phase1, "pbc=1"))
 		if (os_strstr(ssid->eap.phase1, "pbc=1"))
 			return 2;
 			return 2;
 	}
 	}
@@ -78,9 +72,6 @@ static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx)
 	const u8 *extra_ie = NULL;
 	const u8 *extra_ie = NULL;
 	size_t extra_ie_len = 0;
 	size_t extra_ie_len = 0;
 	int wps = 0;
 	int wps = 0;
-#ifdef CONFIG_WPS
-	u8 uuid[UUID_LEN];
-#endif /* CONFIG_WPS */
 
 
 	if (wpa_s->disconnected && !wpa_s->scan_req)
 	if (wpa_s->disconnected && !wpa_s->scan_req)
 		return;
 		return;
@@ -168,7 +159,7 @@ static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx)
 		wpa_s->prev_scan_ssid = BROADCAST_SSID_SCAN;
 		wpa_s->prev_scan_ssid = BROADCAST_SSID_SCAN;
 
 
 #ifdef CONFIG_WPS
 #ifdef CONFIG_WPS
-	wps = wpas_wps_in_use(wpa_s->conf, uuid);
+	wps = wpas_wps_in_use(wpa_s->conf);
 #endif /* CONFIG_WPS */
 #endif /* CONFIG_WPS */
 
 
 	if (wpa_s->scan_res_tried == 0 && wpa_s->conf->ap_scan == 1 &&
 	if (wpa_s->scan_res_tried == 0 && wpa_s->conf->ap_scan == 1 &&
@@ -184,7 +175,8 @@ static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx)
 
 
 #ifdef CONFIG_WPS
 #ifdef CONFIG_WPS
 	if (wps) {
 	if (wps) {
-		wps_ie = wps_enrollee_build_probe_req_ie(wps == 2, uuid);
+		wps_ie = wps_enrollee_build_probe_req_ie(wps == 2,
+							 wpa_s->conf->uuid);
 		if (wps_ie) {
 		if (wps_ie) {
 			extra_ie = wpabuf_head(wps_ie);
 			extra_ie = wpabuf_head(wps_ie);
 			extra_ie_len = wpabuf_len(wps_ie);
 			extra_ie_len = wpabuf_len(wps_ie);

+ 8 - 2
wpa_supplicant/wpa_supplicant.conf

@@ -142,6 +142,12 @@ fast_reauth=1
 # Timeout for security association negotiation in seconds; default 60
 # Timeout for security association negotiation in seconds; default 60
 #dot11RSNAConfigSATimeout=60
 #dot11RSNAConfigSATimeout=60
 
 
+# Wi-Fi Protected Setup (WPS) parameters
+
+# Universally Unique IDentifier (UUID; see RFC 4122) of the device
+#uuid=12345678-9abc-def0-1234-56789abcdef0
+
+
 # network block
 # network block
 #
 #
 # Each network (usually AP's sharing the same SSID) is configured as a separate
 # Each network (usually AP's sharing the same SSID) is configured as a separate
@@ -397,8 +403,8 @@ fast_reauth=1
 #	 * 0 = do not use cryptobinding (default)
 #	 * 0 = do not use cryptobinding (default)
 #	 * 1 = use cryptobinding if server supports it
 #	 * 1 = use cryptobinding if server supports it
 #	 * 2 = require cryptobinding
 #	 * 2 = require cryptobinding
-#	EAP-WSC (WPS) uses following options: pin=<Device Password> and
-#	uuid=<Device UUID>.
+#	EAP-WSC (WPS) uses following options: pin=<Device Password> or
+#	pbc=1.
 # phase2: Phase2 (inner authentication with TLS tunnel) parameters
 # phase2: Phase2 (inner authentication with TLS tunnel) parameters
 #	(string with field-value pairs, e.g., "auth=MSCHAPV2" for EAP-PEAP or
 #	(string with field-value pairs, e.g., "auth=MSCHAPV2" for EAP-PEAP or
 #	"autheap=MSCHAPV2 autheap=MD5" for EAP-TTLS)
 #	"autheap=MSCHAPV2 autheap=MD5" for EAP-TTLS)

+ 1 - 0
wpa_supplicant/wpas_glue.c

@@ -703,6 +703,7 @@ int wpa_supplicant_init_eapol(struct wpa_supplicant *wpa_s)
 	ctx->pkcs11_module_path = wpa_s->conf->pkcs11_module_path;
 	ctx->pkcs11_module_path = wpa_s->conf->pkcs11_module_path;
 #endif /* EAP_TLS_OPENSSL */
 #endif /* EAP_TLS_OPENSSL */
 	ctx->mac_addr = wpa_s->own_addr;
 	ctx->mac_addr = wpa_s->own_addr;
+	ctx->uuid = wpa_s->conf->uuid;
 	ctx->wps_cred = wpa_supplicant_wps_cred;
 	ctx->wps_cred = wpa_supplicant_wps_cred;
 	ctx->eap_param_needed = wpa_supplicant_eap_param_needed;
 	ctx->eap_param_needed = wpa_supplicant_eap_param_needed;
 	ctx->cb = wpa_supplicant_eapol_cb;
 	ctx->cb = wpa_supplicant_eapol_cb;