18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_supplicant - WPA2/RSN PMKSA cache functions
3c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Copyright (c) 2003-2009, 2011-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/**
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * struct rsn_pmksa_cache_entry - PMKSA cache entry
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry {
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct rsn_pmksa_cache_entry *next;
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 pmkid[PMKID_LEN];
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 pmk[PMK_LEN];
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t pmk_len;
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_time_t expiration;
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int akmp; /* WPA_KEY_MGMT_* */
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 aa[ETH_ALEN];
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_time_t reauth_time;
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/**
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * network_ctx - Network configuration context
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 *
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * This field is only used to match PMKSA cache entries to a specific
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * network configuration (e.g., a specific SSID and security policy).
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * This can be a pointer to the configuration entry, but PMKSA caching
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * code does not dereference the value and this could be any kind of
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * identifier.
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	void *network_ctx;
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int opportunistic;
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache;
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtenum pmksa_free_reason {
42d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	PMKSA_FREE,
43d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	PMKSA_REPLACE,
44d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	PMKSA_EXPIRE,
45d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt};
46d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt#ifdef IEEE8021X_EAPOL
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache *
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_init(void (*free_cb)(struct rsn_pmksa_cache_entry *entry,
51d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt				 void *ctx, enum pmksa_free_reason reason),
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 void *ctx, struct wpa_sm *sm);
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid pmksa_cache_deinit(struct rsn_pmksa_cache *pmksa);
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry * pmksa_cache_get(struct rsn_pmksa_cache *pmksa,
55c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					       const u8 *aa, const u8 *pmkid,
56c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					       const void *network_ctx);
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint pmksa_cache_list(struct rsn_pmksa_cache *pmksa, char *buf, size_t len);
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry *
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_add(struct rsn_pmksa_cache *pmksa, const u8 *pmk, size_t pmk_len,
60fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		const u8 *kck, size_t kck_len,
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const u8 *aa, const u8 *spa, void *network_ctx, int akmp);
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry * pmksa_cache_get_current(struct wpa_sm *sm);
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid pmksa_cache_clear_current(struct wpa_sm *sm);
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint pmksa_cache_set_current(struct wpa_sm *sm, const u8 *pmkid,
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    const u8 *bssid, void *network_ctx,
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    int try_opportunistic);
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry *
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_get_opportunistic(struct rsn_pmksa_cache *pmksa,
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      void *network_ctx, const u8 *aa);
70f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtvoid pmksa_cache_flush(struct rsn_pmksa_cache *pmksa, void *network_ctx,
71f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		       const u8 *pmk, size_t pmk_len);
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt#else /* IEEE8021X_EAPOL */
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct rsn_pmksa_cache *
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_init(void (*free_cb)(struct rsn_pmksa_cache_entry *entry,
774b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt				 void *ctx, enum pmksa_free_reason reason),
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 void *ctx, struct wpa_sm *sm)
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return (void *) -1;
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void pmksa_cache_deinit(struct rsn_pmksa_cache *pmksa)
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct rsn_pmksa_cache_entry *
88c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtpmksa_cache_get(struct rsn_pmksa_cache *pmksa, const u8 *aa, const u8 *pmkid,
89c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		const void *network_ctx)
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct rsn_pmksa_cache_entry *
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_get_current(struct wpa_sm *sm)
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int pmksa_cache_list(struct rsn_pmksa_cache *pmksa, char *buf,
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   size_t len)
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct rsn_pmksa_cache_entry *
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_add(struct rsn_pmksa_cache *pmksa, const u8 *pmk, size_t pmk_len,
108fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		const u8 *kck, size_t kck_len,
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const u8 *aa, const u8 *spa, void *network_ctx, int akmp)
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void pmksa_cache_clear_current(struct wpa_sm *sm)
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int pmksa_cache_set_current(struct wpa_sm *sm, const u8 *pmkid,
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const u8 *bssid,
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  void *network_ctx,
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  int try_opportunistic)
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic inline void pmksa_cache_flush(struct rsn_pmksa_cache *pmksa,
12734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt				     void *network_ctx,
12834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt				     const u8 *pmk, size_t pmk_len)
1291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
13234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt#endif /* IEEE8021X_EAPOL */
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* PMKSA_CACHE_H */
135