wpa_supplicant(HIDL): EAP Imsi Encryption support
The unncrypted identity is saved to eap.imsi_identity.
The encrypted identity is saved to eap.identity.
Bug: 30988281
Signed-off-by: Ecco Park <eccopark@google.com>
Change-Id: I0bbc8390e39e65d7701df217da9010892a5fa94c
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 498967b..ee5710f 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -6367,12 +6367,31 @@
{
#ifdef IEEE8021X_EAPOL
struct eap_peer_config *eap = &ssid->eap;
+ char *identity, *imsi_identity;
switch (rtype) {
case WPA_CTRL_REQ_EAP_IDENTITY:
os_free(eap->identity);
- eap->identity = (u8 *) dup_binstr(value, value_len);
- eap->identity_len = value_len;
+ os_free(eap->imsi_identity);
+ if (value == NULL)
+ return -1;
+ identity = os_strchr(value, ':');
+ if (identity == NULL) {
+ /* plain identity */
+ eap->identity = (u8 *)os_strdup(value);
+ eap->identity_len = os_strlen(value);
+ } else {
+ /* have both plain identity and encrypted identity */
+ imsi_identity = value;
+ *identity++ = '\0';
+ /* plain identity */
+ eap->imsi_identity = (u8 *)dup_binstr(imsi_identity, strlen(imsi_identity));
+ eap->imsi_identity_len = strlen(imsi_identity);
+ /* encrypted identity */
+ eap->identity = (u8 *)dup_binstr(identity,
+ value_len - strlen(imsi_identity) - 1);
+ eap->identity_len = value_len - strlen(imsi_identity) - 1;
+ }
eap->pending_req_identity = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;