authsrv.c revision 1f69aa52ea2e0a73ac502565df8c666ee49cab6a
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Authentication server setup
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This program is free software; you can redistribute it and/or modify
68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it under the terms of the GNU General Public License version 2 as
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * published by the Free Software Foundation.
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * license.
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See README and COPYING for more details.
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/includes.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "crypto/tls.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_server/eap.h"
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_server/eap_sim_db.h"
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eapol_auth/eapol_auth_sm.h"
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "radius/radius_server.h"
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "hostapd.h"
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap_config.h"
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "sta_info.h"
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "authsrv.h"
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(EAP_SERVER_SIM) || defined(EAP_SERVER_AKA)
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SIM_DB
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SERVER_SIM || EAP_SERVER_AKA */
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SIM_DB
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_sim_db_cb_sta(struct hostapd_data *hapd,
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 struct sta_info *sta, void *ctx)
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (eapol_auth_eap_pending_cb(sta->eapol_sm, ctx) == 0)
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 1;
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void hostapd_sim_db_cb(void *ctx, void *session_ctx)
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct hostapd_data *hapd = ctx;
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ap_for_each_sta(hapd, hostapd_sim_db_cb_sta, session_ctx) == 0) {
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef RADIUS_SERVER
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		radius_server_eap_pending_cb(hapd->radius_srv, session_ctx);
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* RADIUS_SERVER */
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SIM_DB */
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef RADIUS_SERVER
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_radius_get_eap_user(void *ctx, const u8 *identity,
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       size_t identity_len, int phase2,
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct eap_user *user)
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct hostapd_eap_user *eap_user;
631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int i;
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eap_user = hostapd_get_eap_user(ctx, identity, identity_len, phase2);
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (eap_user == NULL)
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (user == NULL)
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(user, 0, sizeof(*user));
731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	for (i = 0; i < EAP_MAX_METHODS; i++) {
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		user->methods[i].vendor = eap_user->methods[i].vendor;
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		user->methods[i].method = eap_user->methods[i].method;
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (eap_user->password) {
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		user->password = os_malloc(eap_user->password_len);
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (user->password == NULL)
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memcpy(user->password, eap_user->password,
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  eap_user->password_len);
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		user->password_len = eap_user->password_len;
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		user->password_hash = eap_user->password_hash;
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	user->force_version = eap_user->force_version;
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	user->ttls_auth = eap_user->ttls_auth;
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int hostapd_setup_radius_srv(struct hostapd_data *hapd)
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct radius_server_conf srv;
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct hostapd_bss_config *conf = hapd->conf;
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&srv, 0, sizeof(srv));
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.client_file = conf->radius_server_clients;
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.auth_port = conf->radius_server_auth_port;
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.conf_ctx = conf;
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.eap_sim_db_priv = hapd->eap_sim_db_priv;
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.ssl_ctx = hapd->ssl_ctx;
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.msg_ctx = hapd->msg_ctx;
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.pac_opaque_encr_key = conf->pac_opaque_encr_key;
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.eap_fast_a_id = conf->eap_fast_a_id;
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.eap_fast_a_id_len = conf->eap_fast_a_id_len;
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.eap_fast_a_id_info = conf->eap_fast_a_id_info;
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.eap_fast_prov = conf->eap_fast_prov;
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.pac_key_lifetime = conf->pac_key_lifetime;
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.pac_key_refresh_time = conf->pac_key_refresh_time;
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.eap_sim_aka_result_ind = conf->eap_sim_aka_result_ind;
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.tnc = conf->tnc;
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.wps = hapd->wps;
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.ipv6 = conf->radius_server_ipv6;
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.get_eap_user = hostapd_radius_get_eap_user;
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.eap_req_id_text = conf->eap_req_id_text;
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.eap_req_id_text_len = conf->eap_req_id_text_len;
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	srv.pwd_group = conf->pwd_group;
1201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_RADIUS_TEST
1211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	srv.dump_msk_file = conf->dump_msk_file;
1221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_RADIUS_TEST */
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	hapd->radius_srv = radius_server_init(&srv);
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hapd->radius_srv == NULL) {
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "RADIUS server initialization failed.");
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* RADIUS_SERVER */
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint authsrv_init(struct hostapd_data *hapd)
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_TLS_FUNCS
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hapd->conf->eap_server &&
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    (hapd->conf->ca_cert || hapd->conf->server_cert ||
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	     hapd->conf->dh_file)) {
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct tls_connection_params params;
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hapd->ssl_ctx = tls_init(NULL);
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (hapd->ssl_ctx == NULL) {
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_ERROR, "Failed to initialize TLS");
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			authsrv_deinit(hapd);
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memset(&params, 0, sizeof(params));
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		params.ca_cert = hapd->conf->ca_cert;
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		params.client_cert = hapd->conf->server_cert;
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		params.private_key = hapd->conf->private_key;
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		params.private_key_passwd = hapd->conf->private_key_passwd;
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		params.dh_file = hapd->conf->dh_file;
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (tls_global_set_params(hapd->ssl_ctx, &params)) {
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_ERROR, "Failed to set TLS parameters");
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			authsrv_deinit(hapd);
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (tls_global_set_verify(hapd->ssl_ctx,
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  hapd->conf->check_crl)) {
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_ERROR, "Failed to enable check_crl");
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			authsrv_deinit(hapd);
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_TLS_FUNCS */
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SIM_DB
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hapd->conf->eap_sim_db) {
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hapd->eap_sim_db_priv =
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			eap_sim_db_init(hapd->conf->eap_sim_db,
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					hostapd_sim_db_cb, hapd);
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (hapd->eap_sim_db_priv == NULL) {
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_ERROR, "Failed to initialize EAP-SIM "
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "database interface");
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			authsrv_deinit(hapd);
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SIM_DB */
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef RADIUS_SERVER
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hapd->conf->radius_server_clients &&
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    hostapd_setup_radius_srv(hapd))
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* RADIUS_SERVER */
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid authsrv_deinit(struct hostapd_data *hapd)
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef RADIUS_SERVER
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	radius_server_deinit(hapd->radius_srv);
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	hapd->radius_srv = NULL;
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* RADIUS_SERVER */
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_TLS_FUNCS
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hapd->ssl_ctx) {
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tls_deinit(hapd->ssl_ctx);
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hapd->ssl_ctx = NULL;
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_TLS_FUNCS */
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAP_SIM_DB
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hapd->eap_sim_db_priv) {
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eap_sim_db_deinit(hapd->eap_sim_db_priv);
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hapd->eap_sim_db_priv = NULL;
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SIM_DB */
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
218