aboutsummaryrefslogtreecommitdiffstats
path: root/src/eap_peer
diff options
context:
space:
mode:
authorSimon Baatz <gmbnomis@gmail.com>2012-01-22 21:11:24 +0200
committerJouni Malinen <j@w1.fi>2012-01-22 21:54:24 +0200
commit2d7d0ab307443e196d1517cccbc058229815419c (patch)
treed633b06b1731e38a31b3efe4a76d30bf7499d252 /src/eap_peer
parent4646ee67c0658cb0025be3f4fab2e9d92b059b50 (diff)
downloadexternal_wpa_supplicant_8_ti-2d7d0ab307443e196d1517cccbc058229815419c.zip
external_wpa_supplicant_8_ti-2d7d0ab307443e196d1517cccbc058229815419c.tar.gz
external_wpa_supplicant_8_ti-2d7d0ab307443e196d1517cccbc058229815419c.tar.bz2
EAP-SIM/EAP-AKA peer: Support realms according to 3GPP TS 23.003
If the identity is derived from the SIM, use a realm according to 3GPP TS 23.003. Signed-hostap: Simon Baatz <gmbnomis@gmail.com>
Diffstat (limited to 'src/eap_peer')
-rw-r--r--src/eap_peer/eap.c54
1 files changed, 53 insertions, 1 deletions
diff --git a/src/eap_peer/eap.c b/src/eap_peer/eap.c
index cac85db..5312c30 100644
--- a/src/eap_peer/eap.c
+++ b/src/eap_peer/eap.c
@@ -878,6 +878,57 @@ 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)
+{
+ const 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 + os_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, os_strlen(realm_3gpp));
+ full_id_len = conf->identity_len + os_strlen(realm_3gpp);
+
+ /* MCC */
+ 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 (2 or 3 digits) */
+ mnc_len = scard_get_mnc_len(sm->scard_ctx);
+ if (mnc_len < 0) {
+ wpa_printf(MSG_INFO, "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)
{
@@ -921,8 +972,9 @@ 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 */