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