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