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(¶ms, 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, ¶ms)) { 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