[PATCH 4/4] EAP-SIM/EAP-AKA peer: Support realms according to 3GPP TS 23.003

Simon Baatz gmbnomis
Sun Jan 15 12:32:48 PST 2012


If the identity is derived from the SIM, use a realm according
to 3GPP TS 23.003.

Signed-hostap: Simon Baatz <gmbnomis at gmail.com>
---
 src/eap_peer/eap.c |   47 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 46 insertions(+), 1 deletions(-)

diff --git a/src/eap_peer/eap.c b/src/eap_peer/eap.c
index 91fa4a9..02070d7 100644
--- a/src/eap_peer/eap.c
+++ b/src/eap_peer/eap.c
@@ -878,6 +878,51 @@ static void eap_sm_processIdentity(struct eap_sm *sm, const struct wpabuf *req)
 
 
 #ifdef PCSC_FUNCS
+static int eap_sm_append_3gpp_realm(struct eap_sm *sm,
+				    struct eap_peer_config *conf)
+{
+	char *realm_3gpp = "@wlan.mnc000.mcc000.3gppnetwork.org";
+	u8 *full_id = NULL;
+	size_t full_id_len = 0;
+	int mnc_len;
+
+	full_id = os_malloc(conf->identity_len + strlen(realm_3gpp));
+	if (full_id == NULL) {
+		wpa_printf(MSG_WARNING, "Failed to allocate buffer for "
+			   "3GPP realm");
+		return -1;
+	}
+	os_memcpy(full_id, conf->identity, conf->identity_len);
+	os_memcpy(full_id + conf->identity_len, 
+		  realm_3gpp, strlen(realm_3gpp));
+	full_id_len = conf->identity_len + strlen(realm_3gpp);
+
+	full_id[conf->identity_len + 16] = full_id[1];
+	full_id[conf->identity_len + 17] = full_id[2];
+	full_id[conf->identity_len + 18] = full_id[3];
+
+	mnc_len = scard_get_mnc_len(sm->scard_ctx);
+	if (mnc_len < 0) {
+		wpa_printf(MSG_WARNING, "Failed to get MNC length from (U)SIM"
+			   " assuming 3");
+		mnc_len = 3;
+	}
+	if (mnc_len == 2) {
+	        full_id[conf->identity_len + 10] = full_id[4];
+        	full_id[conf->identity_len + 11] = full_id[5];
+	} else if (mnc_len == 3) {
+	        full_id[conf->identity_len +  9] = full_id[4];
+	        full_id[conf->identity_len + 10] = full_id[5];
+	        full_id[conf->identity_len + 11] = full_id[6];
+	} 
+
+	os_free(conf->identity);
+	conf->identity = full_id;
+	conf->identity_len = full_id_len;
+
+	return 0;
+}
+
 static int eap_sm_imsi_identity(struct eap_sm *sm,
 				struct eap_peer_config *conf)
 {
@@ -916,7 +961,7 @@ static int eap_sm_imsi_identity(struct eap_sm *sm,
 	os_memcpy(conf->identity + 1, imsi, imsi_len);
 	conf->identity_len = 1 + imsi_len;
 
-	return 0;
+        return eap_sm_append_3gpp_realm(sm, conf);
 }
 #endif /* PCSC_FUNCS */
 
-- 
1.7.5.4




More information about the Hostap mailing list