18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd - PMKSA cache for IEEE 802.11i RSN
304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Copyright (c) 2004-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 PMKSA_CACHE_H
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define PMKSA_CACHE_H
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "radius/radius.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * struct rsn_pmksa_cache_entry - PMKSA cache entry
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry {
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct rsn_pmksa_cache_entry *next, *hnext;
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 pmkid[PMKID_LEN];
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 pmk[PMK_LEN];
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t pmk_len;
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_time_t expiration;
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int akmp; /* WPA_KEY_MGMT_* */
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 spa[ETH_ALEN];
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *identity;
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t identity_len;
2804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpabuf *cui;
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct radius_class_data radius_class;
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 eap_type_authsrv;
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int vlan_id;
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int opportunistic;
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache;
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache *
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_auth_init(void (*free_cb)(struct rsn_pmksa_cache_entry *entry,
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      void *ctx), void *ctx);
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid pmksa_cache_auth_deinit(struct rsn_pmksa_cache *pmksa);
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry *
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_auth_get(struct rsn_pmksa_cache *pmksa,
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     const u8 *spa, const u8 *pmkid);
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry * pmksa_cache_get_okc(
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct rsn_pmksa_cache *pmksa, const u8 *spa, const u8 *aa,
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *pmkid);
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry *
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_auth_add(struct rsn_pmksa_cache *pmksa,
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     const u8 *pmk, size_t pmk_len,
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     const u8 *aa, const u8 *spa, int session_timeout,
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     struct eapol_state_machine *eapol, int akmp);
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry *
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_add_okc(struct rsn_pmksa_cache *pmksa,
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    const struct rsn_pmksa_cache_entry *old_entry,
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    const u8 *aa, const u8 *pmkid);
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid pmksa_cache_to_eapol_data(struct rsn_pmksa_cache_entry *entry,
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       struct eapol_state_machine *eapol);
58f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtvoid pmksa_cache_free_entry(struct rsn_pmksa_cache *pmksa,
59f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			    struct rsn_pmksa_cache_entry *entry);
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* PMKSA_CACHE_H */
62