/** * eap_sim_db_get_reauth_entry - EAP-SIM DB: Get re-authentication entry * @priv: Private data pointer from eap_sim_db_init() * @identity: Identity of the user (may be permanent identity, pseudonym, or * reauth_id) * @identity_len: Length of identity * @len: Buffer for length of the returned permanent identity * Returns: Pointer to the re-auth entry, or %NULL if not found */ struct eap_sim_reauth * eap_sim_db_get_reauth_entry(void *priv, const u8 *identity, size_t identity_len) { struct eap_sim_db_data *data = priv; struct eap_sim_reauth *r; if (identity == NULL) return NULL; r = eap_sim_db_get_reauth(data, identity, identity_len); if (r == NULL) r = eap_sim_db_get_reauth_id(data, identity, identity_len); return r; }
/** * eap_sim_db_add_reauth - EAP-SIM DB: Add new re-authentication entry * @priv: Private data pointer from eap_sim_db_init() * @identity: Identity of the user (may be permanent identity or pseudonym) * @identity_len: Length of identity * @reauth_id: reauth_id for this user. This needs to be an allocated buffer, * e.g., return value from eap_sim_db_get_next_reauth_id(). Caller must not * free it. * @mk: 16-byte MK from the previous full authentication * Returns: 0 on success, -1 on failure * * This function adds a new re-authentication entry for an EAP-SIM user. * EAP-SIM DB is responsible of freeing reauth_id buffer once it is not needed * anymore. */ int eap_sim_db_add_reauth(void *priv, const u8 *identity, size_t identity_len, char *reauth_id, u16 counter, const u8 *mk) { struct eap_sim_db_data *data = priv; struct eap_sim_reauth *r; wpa_hexdump_ascii(MSG_DEBUG, "EAP-SIM DB: Add reauth_id for identity", identity, identity_len); wpa_printf(MSG_DEBUG, "EAP-SIM DB: reauth_id: %s", reauth_id); r = eap_sim_db_get_reauth(data, identity, identity_len); if (r == NULL) r = eap_sim_db_get_reauth_id(data, identity, identity_len); if (r) { wpa_printf(MSG_DEBUG, "EAP-SIM DB: Replacing previous " "reauth_id: %s", r->reauth_id); VM_FREE(r->reauth_id); r->reauth_id = reauth_id; } else { r = wpa_zalloc(sizeof(*r)); if (r == NULL) { VM_FREE(reauth_id); return -1; } r->next = data->reauths; r->identity = VM_MALLOC(identity_len); if (r->identity == NULL) { VM_FREE(r); VM_FREE(reauth_id); return -1; } memcpy(r->identity, identity, identity_len); r->identity_len = identity_len; r->reauth_id = reauth_id; data->reauths = r; wpa_printf(MSG_DEBUG, "EAP-SIM DB: Added new reauth entry"); } r->counter = counter; memcpy(r->mk, mk, EAP_SIM_MK_LEN); return 0; }
static struct eap_sim_reauth * eap_sim_db_add_reauth_data(struct eap_sim_db_data *data, const u8 *identity, size_t identity_len, char *reauth_id, u16 counter) { struct eap_sim_reauth *r; wpa_hexdump_ascii(MSG_DEBUG, "EAP-SIM DB: Add reauth_id for identity", identity, identity_len); wpa_printf(MSG_DEBUG, "EAP-SIM DB: reauth_id: %s", reauth_id); r = eap_sim_db_get_reauth(data, identity, identity_len); if (r == NULL) r = eap_sim_db_get_reauth_id(data, identity, identity_len); if (r) { wpa_printf(MSG_DEBUG, "EAP-SIM DB: Replacing previous " "reauth_id: %s", r->reauth_id); os_free(r->reauth_id); r->reauth_id = reauth_id; } else { r = os_zalloc(sizeof(*r)); if (r == NULL) { os_free(reauth_id); return NULL; } r->next = data->reauths; r->identity = os_malloc(identity_len); if (r->identity == NULL) { os_free(r); os_free(reauth_id); return NULL; } os_memcpy(r->identity, identity, identity_len); r->identity_len = identity_len; r->reauth_id = reauth_id; data->reauths = r; wpa_printf(MSG_DEBUG, "EAP-SIM DB: Added new reauth entry"); } r->counter = counter; return r; }