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,
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const u8 *aa, const u8 *spa, void *network_ctx, int akmp);
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry * pmksa_cache_get_current(struct wpa_sm *sm);
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid pmksa_cache_clear_current(struct wpa_sm *sm);
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint pmksa_cache_set_current(struct wpa_sm *sm, const u8 *pmkid,
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    const u8 *bssid, void *network_ctx,
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    int try_opportunistic);
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct rsn_pmksa_cache_entry *
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_get_opportunistic(struct rsn_pmksa_cache *pmksa,
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      void *network_ctx, const u8 *aa);
69f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtvoid pmksa_cache_flush(struct rsn_pmksa_cache *pmksa, void *network_ctx,
70f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		       const u8 *pmk, size_t pmk_len);
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt#else /* IEEE8021X_EAPOL */
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct rsn_pmksa_cache *
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_init(void (*free_cb)(struct rsn_pmksa_cache_entry *entry,
764b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt				 void *ctx, enum pmksa_free_reason reason),
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 void *ctx, struct wpa_sm *sm)
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return (void *) -1;
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void pmksa_cache_deinit(struct rsn_pmksa_cache *pmksa)
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct rsn_pmksa_cache_entry *
87c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtpmksa_cache_get(struct rsn_pmksa_cache *pmksa, const u8 *aa, const u8 *pmkid,
88c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		const void *network_ctx)
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct rsn_pmksa_cache_entry *
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_get_current(struct wpa_sm *sm)
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int pmksa_cache_list(struct rsn_pmksa_cache *pmksa, char *buf,
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   size_t len)
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct rsn_pmksa_cache_entry *
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpmksa_cache_add(struct rsn_pmksa_cache *pmksa, const u8 *pmk, size_t pmk_len,
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const u8 *aa, const u8 *spa, void *network_ctx, int akmp)
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void pmksa_cache_clear_current(struct wpa_sm *sm)
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int pmksa_cache_set_current(struct wpa_sm *sm, const u8 *pmkid,
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const u8 *bssid,
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  void *network_ctx,
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  int try_opportunistic)
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic inline void pmksa_cache_flush(struct rsn_pmksa_cache *pmksa,
12534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt				     void *network_ctx,
12634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt				     const u8 *pmk, size_t pmk_len)
1271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
13034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt#endif /* IEEE8021X_EAPOL */
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* PMKSA_CACHE_H */
133