18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd / EAP-SIM database/authenticator gateway
304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Copyright (c) 2005-2008, 2012, 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#ifndef EAP_SIM_DB_H
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SIM_DB_H
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_common/eap_sim_common.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Identity prefixes */
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SIM_PERMANENT_PREFIX '1'
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SIM_PSEUDONYM_PREFIX '3'
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SIM_REAUTH_ID_PREFIX '5'
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_AKA_PERMANENT_PREFIX '0'
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_AKA_PSEUDONYM_PREFIX '2'
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_AKA_REAUTH_ID_PREFIX '4'
2104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#define EAP_AKA_PRIME_PERMANENT_PREFIX '6'
2204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#define EAP_AKA_PRIME_PSEUDONYM_PREFIX '7'
2304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#define EAP_AKA_PRIME_REAUTH_ID_PREFIX '8'
2404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtenum eap_sim_db_method {
2604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	EAP_SIM_DB_SIM,
2704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	EAP_SIM_DB_AKA,
2804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	EAP_SIM_DB_AKA_PRIME
2904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt};
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
314530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtstruct eap_sim_db_data;
324530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt
334530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtstruct eap_sim_db_data *
34d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidteap_sim_db_init(const char *config, unsigned int db_timeout,
354530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt		void (*get_complete_cb)(void *ctx, void *session_ctx),
364530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt		void *ctx);
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eap_sim_db_deinit(void *priv);
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
404530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtint eap_sim_db_get_gsm_triplets(struct eap_sim_db_data *data,
414530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt				const char *username, int max_chal,
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				u8 *_rand, u8 *kc, u8 *sres,
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				void *cb_session_ctx);
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SIM_DB_FAILURE -1
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SIM_DB_PENDING -2
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
484530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtchar * eap_sim_db_get_next_pseudonym(struct eap_sim_db_data *data,
4904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     enum eap_sim_db_method method);
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
514530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtchar * eap_sim_db_get_next_reauth_id(struct eap_sim_db_data *data,
5204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     enum eap_sim_db_method method);
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
544530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtint eap_sim_db_add_pseudonym(struct eap_sim_db_data *data,
554530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt			     const char *permanent, char *pseudonym);
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
574530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtint eap_sim_db_add_reauth(struct eap_sim_db_data *data, const char *permanent,
584530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt			  char *reauth_id, u16 counter, const u8 *mk);
594530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtint eap_sim_db_add_reauth_prime(struct eap_sim_db_data *data,
604530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt				const char *permanent,
614530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt				char *reauth_id, u16 counter, const u8 *k_encr,
624530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt				const u8 *k_aut, const u8 *k_re);
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
644530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtconst char * eap_sim_db_get_permanent(struct eap_sim_db_data *data,
654530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt				      const char *pseudonym);
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_sim_reauth {
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct eap_sim_reauth *next;
694530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt	char *permanent; /* Permanent username */
704530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt	char *reauth_id; /* Fast re-authentication username */
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u16 counter;
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 mk[EAP_SIM_MK_LEN];
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 k_encr[EAP_SIM_K_ENCR_LEN];
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 k_aut[EAP_AKA_PRIME_K_AUT_LEN];
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 k_re[EAP_AKA_PRIME_K_RE_LEN];
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_sim_reauth *
794530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidteap_sim_db_get_reauth_entry(struct eap_sim_db_data *data,
804530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt			    const char *reauth_id);
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
824530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtvoid eap_sim_db_remove_reauth(struct eap_sim_db_data *data,
834530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt			      struct eap_sim_reauth *reauth);
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
854530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtint eap_sim_db_get_aka_auth(struct eap_sim_db_data *data, const char *username,
864530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt			    u8 *_rand, u8 *autn, u8 *ik, u8 *ck,
874530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt			    u8 *res, size_t *res_len, void *cb_session_ctx);
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
894530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtint eap_sim_db_resynchronize(struct eap_sim_db_data *data,
904530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt			     const char *username, const u8 *auts,
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     const u8 *_rand);
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
934530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidtchar * sim_get_username(const u8 *identity, size_t identity_len);
944530cfd4d14a77c58e35393b91e40f8dd9d62697Dmitry Shmidt
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SIM_DB_H */
96