139beb93cSSam Leffler /* 239beb93cSSam Leffler * wpa_supplicant - WPA2/RSN PMKSA cache functions 3f05cddf9SRui Paulo * Copyright (c) 2003-2009, 2011-2012, Jouni Malinen <j@w1.fi> 439beb93cSSam Leffler * 5f05cddf9SRui Paulo * This software may be distributed under the terms of the BSD license. 6f05cddf9SRui Paulo * See README for more details. 739beb93cSSam Leffler */ 839beb93cSSam Leffler 939beb93cSSam Leffler #ifndef PMKSA_CACHE_H 1039beb93cSSam Leffler #define PMKSA_CACHE_H 1139beb93cSSam Leffler 1239beb93cSSam Leffler /** 1339beb93cSSam Leffler * struct rsn_pmksa_cache_entry - PMKSA cache entry 1439beb93cSSam Leffler */ 1539beb93cSSam Leffler struct rsn_pmksa_cache_entry { 1639beb93cSSam Leffler struct rsn_pmksa_cache_entry *next; 1739beb93cSSam Leffler u8 pmkid[PMKID_LEN]; 18780fb4a2SCy Schubert u8 pmk[PMK_LEN_MAX]; 1939beb93cSSam Leffler size_t pmk_len; 2039beb93cSSam Leffler os_time_t expiration; 2139beb93cSSam Leffler int akmp; /* WPA_KEY_MGMT_* */ 2239beb93cSSam Leffler u8 aa[ETH_ALEN]; 2339beb93cSSam Leffler 24*85732ac8SCy Schubert /* 25*85732ac8SCy Schubert * If FILS Cache Identifier is included (fils_cache_id_set), this PMKSA 26*85732ac8SCy Schubert * cache entry is applicable to all BSSs (any BSSID/aa[]) that 27*85732ac8SCy Schubert * advertise the same FILS Cache Identifier within the same ESS. 28*85732ac8SCy Schubert */ 29*85732ac8SCy Schubert u8 fils_cache_id[2]; 30*85732ac8SCy Schubert unsigned int fils_cache_id_set:1; 31*85732ac8SCy Schubert 3239beb93cSSam Leffler os_time_t reauth_time; 3339beb93cSSam Leffler 3439beb93cSSam Leffler /** 3539beb93cSSam Leffler * network_ctx - Network configuration context 3639beb93cSSam Leffler * 3739beb93cSSam Leffler * This field is only used to match PMKSA cache entries to a specific 3839beb93cSSam Leffler * network configuration (e.g., a specific SSID and security policy). 3939beb93cSSam Leffler * This can be a pointer to the configuration entry, but PMKSA caching 4039beb93cSSam Leffler * code does not dereference the value and this could be any kind of 4139beb93cSSam Leffler * identifier. 4239beb93cSSam Leffler */ 4339beb93cSSam Leffler void *network_ctx; 4439beb93cSSam Leffler int opportunistic; 4539beb93cSSam Leffler }; 4639beb93cSSam Leffler 4739beb93cSSam Leffler struct rsn_pmksa_cache; 4839beb93cSSam Leffler 49f05cddf9SRui Paulo enum pmksa_free_reason { 50f05cddf9SRui Paulo PMKSA_FREE, 51f05cddf9SRui Paulo PMKSA_REPLACE, 52f05cddf9SRui Paulo PMKSA_EXPIRE, 53f05cddf9SRui Paulo }; 54f05cddf9SRui Paulo 55780fb4a2SCy Schubert #if defined(IEEE8021X_EAPOL) && !defined(CONFIG_NO_WPA) 5639beb93cSSam Leffler 5739beb93cSSam Leffler struct rsn_pmksa_cache * 5839beb93cSSam Leffler pmksa_cache_init(void (*free_cb)(struct rsn_pmksa_cache_entry *entry, 59f05cddf9SRui Paulo void *ctx, enum pmksa_free_reason reason), 6039beb93cSSam Leffler void *ctx, struct wpa_sm *sm); 6139beb93cSSam Leffler void pmksa_cache_deinit(struct rsn_pmksa_cache *pmksa); 6239beb93cSSam Leffler struct rsn_pmksa_cache_entry * pmksa_cache_get(struct rsn_pmksa_cache *pmksa, 63f05cddf9SRui Paulo const u8 *aa, const u8 *pmkid, 64*85732ac8SCy Schubert const void *network_ctx, 65*85732ac8SCy Schubert int akmp); 66e28a4053SRui Paulo int pmksa_cache_list(struct rsn_pmksa_cache *pmksa, char *buf, size_t len); 67*85732ac8SCy Schubert struct rsn_pmksa_cache_entry * pmksa_cache_head(struct rsn_pmksa_cache *pmksa); 6839beb93cSSam Leffler struct rsn_pmksa_cache_entry * 6939beb93cSSam Leffler pmksa_cache_add(struct rsn_pmksa_cache *pmksa, const u8 *pmk, size_t pmk_len, 70780fb4a2SCy Schubert const u8 *pmkid, const u8 *kck, size_t kck_len, 71*85732ac8SCy Schubert const u8 *aa, const u8 *spa, void *network_ctx, int akmp, 72*85732ac8SCy Schubert const u8 *cache_id); 73*85732ac8SCy Schubert struct rsn_pmksa_cache_entry * 74*85732ac8SCy Schubert pmksa_cache_add_entry(struct rsn_pmksa_cache *pmksa, 75*85732ac8SCy Schubert struct rsn_pmksa_cache_entry *entry); 7639beb93cSSam Leffler struct rsn_pmksa_cache_entry * pmksa_cache_get_current(struct wpa_sm *sm); 7739beb93cSSam Leffler void pmksa_cache_clear_current(struct wpa_sm *sm); 7839beb93cSSam Leffler int pmksa_cache_set_current(struct wpa_sm *sm, const u8 *pmkid, 7939beb93cSSam Leffler const u8 *bssid, void *network_ctx, 80*85732ac8SCy Schubert int try_opportunistic, const u8 *fils_cache_id, 81*85732ac8SCy Schubert int akmp); 8239beb93cSSam Leffler struct rsn_pmksa_cache_entry * 8339beb93cSSam Leffler pmksa_cache_get_opportunistic(struct rsn_pmksa_cache *pmksa, 84*85732ac8SCy Schubert void *network_ctx, const u8 *aa, int akmp); 855b9c547cSRui Paulo void pmksa_cache_flush(struct rsn_pmksa_cache *pmksa, void *network_ctx, 865b9c547cSRui Paulo const u8 *pmk, size_t pmk_len); 8739beb93cSSam Leffler 885b9c547cSRui Paulo #else /* IEEE8021X_EAPOL */ 8939beb93cSSam Leffler 9039beb93cSSam Leffler static inline struct rsn_pmksa_cache * 9139beb93cSSam Leffler pmksa_cache_init(void (*free_cb)(struct rsn_pmksa_cache_entry *entry, 925b9c547cSRui Paulo void *ctx, enum pmksa_free_reason reason), 9339beb93cSSam Leffler void *ctx, struct wpa_sm *sm) 9439beb93cSSam Leffler { 9539beb93cSSam Leffler return (void *) -1; 9639beb93cSSam Leffler } 9739beb93cSSam Leffler 9839beb93cSSam Leffler static inline void pmksa_cache_deinit(struct rsn_pmksa_cache *pmksa) 9939beb93cSSam Leffler { 10039beb93cSSam Leffler } 10139beb93cSSam Leffler 10239beb93cSSam Leffler static inline struct rsn_pmksa_cache_entry * 103f05cddf9SRui Paulo pmksa_cache_get(struct rsn_pmksa_cache *pmksa, const u8 *aa, const u8 *pmkid, 104*85732ac8SCy Schubert const void *network_ctx, int akmp) 10539beb93cSSam Leffler { 10639beb93cSSam Leffler return NULL; 10739beb93cSSam Leffler } 10839beb93cSSam Leffler 10939beb93cSSam Leffler static inline struct rsn_pmksa_cache_entry * 11039beb93cSSam Leffler pmksa_cache_get_current(struct wpa_sm *sm) 11139beb93cSSam Leffler { 11239beb93cSSam Leffler return NULL; 11339beb93cSSam Leffler } 11439beb93cSSam Leffler 115e28a4053SRui Paulo static inline int pmksa_cache_list(struct rsn_pmksa_cache *pmksa, char *buf, 116e28a4053SRui Paulo size_t len) 11739beb93cSSam Leffler { 11839beb93cSSam Leffler return -1; 11939beb93cSSam Leffler } 12039beb93cSSam Leffler 12139beb93cSSam Leffler static inline struct rsn_pmksa_cache_entry * 122*85732ac8SCy Schubert pmksa_cache_head(struct rsn_pmksa_cache *pmksa) 123*85732ac8SCy Schubert { 124*85732ac8SCy Schubert return NULL; 125*85732ac8SCy Schubert } 126*85732ac8SCy Schubert 127*85732ac8SCy Schubert static inline struct rsn_pmksa_cache_entry * 128*85732ac8SCy Schubert pmksa_cache_add_entry(struct rsn_pmksa_cache *pmksa, 129*85732ac8SCy Schubert struct rsn_pmksa_cache_entry *entry) 130*85732ac8SCy Schubert { 131*85732ac8SCy Schubert return NULL; 132*85732ac8SCy Schubert } 133*85732ac8SCy Schubert 134*85732ac8SCy Schubert static inline struct rsn_pmksa_cache_entry * 13539beb93cSSam Leffler pmksa_cache_add(struct rsn_pmksa_cache *pmksa, const u8 *pmk, size_t pmk_len, 136780fb4a2SCy Schubert const u8 *pmkid, const u8 *kck, size_t kck_len, 137*85732ac8SCy Schubert const u8 *aa, const u8 *spa, void *network_ctx, int akmp, 138*85732ac8SCy Schubert const u8 *cache_id) 13939beb93cSSam Leffler { 14039beb93cSSam Leffler return NULL; 14139beb93cSSam Leffler } 14239beb93cSSam Leffler 14339beb93cSSam Leffler static inline void pmksa_cache_clear_current(struct wpa_sm *sm) 14439beb93cSSam Leffler { 14539beb93cSSam Leffler } 14639beb93cSSam Leffler 14739beb93cSSam Leffler static inline int pmksa_cache_set_current(struct wpa_sm *sm, const u8 *pmkid, 14839beb93cSSam Leffler const u8 *bssid, 14939beb93cSSam Leffler void *network_ctx, 150*85732ac8SCy Schubert int try_opportunistic, 151*85732ac8SCy Schubert const u8 *fils_cache_id, 152*85732ac8SCy Schubert int akmp) 15339beb93cSSam Leffler { 15439beb93cSSam Leffler return -1; 15539beb93cSSam Leffler } 15639beb93cSSam Leffler 157f05cddf9SRui Paulo static inline void pmksa_cache_flush(struct rsn_pmksa_cache *pmksa, 1585b9c547cSRui Paulo void *network_ctx, 1595b9c547cSRui Paulo const u8 *pmk, size_t pmk_len) 160f05cddf9SRui Paulo { 161f05cddf9SRui Paulo } 162f05cddf9SRui Paulo 1635b9c547cSRui Paulo #endif /* IEEE8021X_EAPOL */ 16439beb93cSSam Leffler 16539beb93cSSam Leffler #endif /* PMKSA_CACHE_H */ 166