1214501Srpaulo/*
2214501Srpaulo * hostapd - PMKSA cache for IEEE 802.11i RSN
3252726Srpaulo * Copyright (c) 2004-2008, 2012, Jouni Malinen <j@w1.fi>
4214501Srpaulo *
5252726Srpaulo * This software may be distributed under the terms of the BSD license.
6252726Srpaulo * See README for more details.
7214501Srpaulo */
8214501Srpaulo
9214501Srpaulo#ifndef PMKSA_CACHE_H
10214501Srpaulo#define PMKSA_CACHE_H
11214501Srpaulo
12214501Srpaulo#include "radius/radius.h"
13214501Srpaulo
14214501Srpaulo/**
15214501Srpaulo * struct rsn_pmksa_cache_entry - PMKSA cache entry
16214501Srpaulo */
17214501Srpaulostruct rsn_pmksa_cache_entry {
18214501Srpaulo	struct rsn_pmksa_cache_entry *next, *hnext;
19214501Srpaulo	u8 pmkid[PMKID_LEN];
20337817Scy	u8 pmk[PMK_LEN_MAX];
21214501Srpaulo	size_t pmk_len;
22214501Srpaulo	os_time_t expiration;
23214501Srpaulo	int akmp; /* WPA_KEY_MGMT_* */
24214501Srpaulo	u8 spa[ETH_ALEN];
25214501Srpaulo
26214501Srpaulo	u8 *identity;
27214501Srpaulo	size_t identity_len;
28252726Srpaulo	struct wpabuf *cui;
29214501Srpaulo	struct radius_class_data radius_class;
30214501Srpaulo	u8 eap_type_authsrv;
31337817Scy	struct vlan_description *vlan_desc;
32214501Srpaulo	int opportunistic;
33281806Srpaulo
34337817Scy	u64 acct_multi_session_id;
35214501Srpaulo};
36214501Srpaulo
37214501Srpaulostruct rsn_pmksa_cache;
38346981Scystruct radius_das_attrs;
39214501Srpaulo
40214501Srpaulostruct rsn_pmksa_cache *
41214501Srpaulopmksa_cache_auth_init(void (*free_cb)(struct rsn_pmksa_cache_entry *entry,
42214501Srpaulo				      void *ctx), void *ctx);
43214501Srpaulovoid pmksa_cache_auth_deinit(struct rsn_pmksa_cache *pmksa);
44214501Srpaulostruct rsn_pmksa_cache_entry *
45214501Srpaulopmksa_cache_auth_get(struct rsn_pmksa_cache *pmksa,
46214501Srpaulo		     const u8 *spa, const u8 *pmkid);
47214501Srpaulostruct rsn_pmksa_cache_entry * pmksa_cache_get_okc(
48214501Srpaulo	struct rsn_pmksa_cache *pmksa, const u8 *spa, const u8 *aa,
49214501Srpaulo	const u8 *pmkid);
50214501Srpaulostruct rsn_pmksa_cache_entry *
51214501Srpaulopmksa_cache_auth_add(struct rsn_pmksa_cache *pmksa,
52337817Scy		     const u8 *pmk, size_t pmk_len, const u8 *pmkid,
53281806Srpaulo		     const u8 *kck, size_t kck_len,
54214501Srpaulo		     const u8 *aa, const u8 *spa, int session_timeout,
55214501Srpaulo		     struct eapol_state_machine *eapol, int akmp);
56214501Srpaulostruct rsn_pmksa_cache_entry *
57346981Scypmksa_cache_auth_create_entry(const u8 *pmk, size_t pmk_len, const u8 *pmkid,
58346981Scy			      const u8 *kck, size_t kck_len, const u8 *aa,
59346981Scy			      const u8 *spa, int session_timeout,
60346981Scy			      struct eapol_state_machine *eapol, int akmp);
61346981Scyint pmksa_cache_auth_add_entry(struct rsn_pmksa_cache *pmksa,
62346981Scy			       struct rsn_pmksa_cache_entry *entry);
63346981Scystruct rsn_pmksa_cache_entry *
64214501Srpaulopmksa_cache_add_okc(struct rsn_pmksa_cache *pmksa,
65214501Srpaulo		    const struct rsn_pmksa_cache_entry *old_entry,
66214501Srpaulo		    const u8 *aa, const u8 *pmkid);
67337817Scyvoid pmksa_cache_to_eapol_data(struct hostapd_data *hapd,
68337817Scy			       struct rsn_pmksa_cache_entry *entry,
69214501Srpaulo			       struct eapol_state_machine *eapol);
70281806Srpaulovoid pmksa_cache_free_entry(struct rsn_pmksa_cache *pmksa,
71281806Srpaulo			    struct rsn_pmksa_cache_entry *entry);
72281806Srpauloint pmksa_cache_auth_radius_das_disconnect(struct rsn_pmksa_cache *pmksa,
73281806Srpaulo					   struct radius_das_attrs *attr);
74337817Scyint pmksa_cache_auth_list(struct rsn_pmksa_cache *pmksa, char *buf, size_t len);
75337817Scyvoid pmksa_cache_auth_flush(struct rsn_pmksa_cache *pmksa);
76346981Scyint pmksa_cache_auth_list_mesh(struct rsn_pmksa_cache *pmksa, const u8 *addr,
77346981Scy			       char *buf, size_t len);
78214501Srpaulo
79214501Srpaulo#endif /* PMKSA_CACHE_H */
80