1189251Ssam/*
2189251Ssam * wpa_supplicant - WPA definitions
3281806Srpaulo * Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi>
4189251Ssam *
5252726Srpaulo * This software may be distributed under the terms of the BSD license.
6252726Srpaulo * See README for more details.
7189251Ssam */
8189251Ssam
9189251Ssam#ifndef WPA_H
10189251Ssam#define WPA_H
11189251Ssam
12214734Srpaulo#include "common/defs.h"
13214734Srpaulo#include "common/eapol_common.h"
14214734Srpaulo#include "common/wpa_common.h"
15281806Srpaulo#include "common/ieee802_11_defs.h"
16189251Ssam
17189251Ssamstruct wpa_sm;
18189251Ssamstruct eapol_sm;
19189251Ssamstruct wpa_config_blob;
20281806Srpaulostruct hostapd_freq_params;
21189251Ssam
22189251Ssamstruct wpa_sm_ctx {
23189251Ssam	void *ctx; /* pointer to arbitrary upper level context */
24214734Srpaulo	void *msg_ctx; /* upper level context for wpa_msg() calls */
25189251Ssam
26214734Srpaulo	void (*set_state)(void *ctx, enum wpa_states state);
27214734Srpaulo	enum wpa_states (*get_state)(void *ctx);
28189251Ssam	void (*deauthenticate)(void * ctx, int reason_code);
29214734Srpaulo	int (*set_key)(void *ctx, enum wpa_alg alg,
30189251Ssam		       const u8 *addr, int key_idx, int set_tx,
31189251Ssam		       const u8 *seq, size_t seq_len,
32189251Ssam		       const u8 *key, size_t key_len);
33189251Ssam	void * (*get_network_ctx)(void *ctx);
34189251Ssam	int (*get_bssid)(void *ctx, u8 *bssid);
35189251Ssam	int (*ether_send)(void *ctx, const u8 *dest, u16 proto, const u8 *buf,
36189251Ssam			  size_t len);
37189251Ssam	int (*get_beacon_ie)(void *ctx);
38189251Ssam	void (*cancel_auth_timeout)(void *ctx);
39189251Ssam	u8 * (*alloc_eapol)(void *ctx, u8 type, const void *data, u16 data_len,
40189251Ssam			    size_t *msg_len, void **data_pos);
41189251Ssam	int (*add_pmkid)(void *ctx, const u8 *bssid, const u8 *pmkid);
42189251Ssam	int (*remove_pmkid)(void *ctx, const u8 *bssid, const u8 *pmkid);
43189251Ssam	void (*set_config_blob)(void *ctx, struct wpa_config_blob *blob);
44189251Ssam	const struct wpa_config_blob * (*get_config_blob)(void *ctx,
45189251Ssam							  const char *name);
46189251Ssam	int (*mlme_setprotection)(void *ctx, const u8 *addr,
47189251Ssam				  int protection_type, int key_type);
48189251Ssam	int (*update_ft_ies)(void *ctx, const u8 *md, const u8 *ies,
49189251Ssam			     size_t ies_len);
50189251Ssam	int (*send_ft_action)(void *ctx, u8 action, const u8 *target_ap,
51189251Ssam			      const u8 *ies, size_t ies_len);
52214734Srpaulo	int (*mark_authenticated)(void *ctx, const u8 *target_ap);
53252726Srpaulo#ifdef CONFIG_TDLS
54252726Srpaulo	int (*tdls_get_capa)(void *ctx, int *tdls_supported,
55281806Srpaulo			     int *tdls_ext_setup, int *tdls_chan_switch);
56252726Srpaulo	int (*send_tdls_mgmt)(void *ctx, const u8 *dst,
57252726Srpaulo			      u8 action_code, u8 dialog_token,
58281806Srpaulo			      u16 status_code, u32 peer_capab,
59281806Srpaulo			      int initiator, const u8 *buf, size_t len);
60252726Srpaulo	int (*tdls_oper)(void *ctx, int oper, const u8 *peer);
61281806Srpaulo	int (*tdls_peer_addset)(void *ctx, const u8 *addr, int add, u16 aid,
62252726Srpaulo				u16 capability, const u8 *supp_rates,
63281806Srpaulo				size_t supp_rates_len,
64281806Srpaulo				const struct ieee80211_ht_capabilities *ht_capab,
65281806Srpaulo				const struct ieee80211_vht_capabilities *vht_capab,
66281806Srpaulo				u8 qosinfo, int wmm, const u8 *ext_capab,
67281806Srpaulo				size_t ext_capab_len, const u8 *supp_channels,
68281806Srpaulo				size_t supp_channels_len,
69281806Srpaulo				const u8 *supp_oper_classes,
70281806Srpaulo				size_t supp_oper_classes_len);
71281806Srpaulo	int (*tdls_enable_channel_switch)(
72281806Srpaulo		void *ctx, const u8 *addr, u8 oper_class,
73281806Srpaulo		const struct hostapd_freq_params *params);
74281806Srpaulo	int (*tdls_disable_channel_switch)(void *ctx, const u8 *addr);
75252726Srpaulo#endif /* CONFIG_TDLS */
76281806Srpaulo	void (*set_rekey_offload)(void *ctx, const u8 *kek, size_t kek_len,
77281806Srpaulo				  const u8 *kck, size_t kck_len,
78252726Srpaulo				  const u8 *replay_ctr);
79281806Srpaulo	int (*key_mgmt_set_pmk)(void *ctx, const u8 *pmk, size_t pmk_len);
80189251Ssam};
81189251Ssam
82189251Ssam
83189251Ssamenum wpa_sm_conf_params {
84189251Ssam	RSNA_PMK_LIFETIME /* dot11RSNAConfigPMKLifetime */,
85189251Ssam	RSNA_PMK_REAUTH_THRESHOLD /* dot11RSNAConfigPMKReauthThreshold */,
86189251Ssam	RSNA_SA_TIMEOUT /* dot11RSNAConfigSATimeout */,
87189251Ssam	WPA_PARAM_PROTO,
88189251Ssam	WPA_PARAM_PAIRWISE,
89189251Ssam	WPA_PARAM_GROUP,
90189251Ssam	WPA_PARAM_KEY_MGMT,
91189251Ssam	WPA_PARAM_MGMT_GROUP,
92214734Srpaulo	WPA_PARAM_RSN_ENABLED,
93214734Srpaulo	WPA_PARAM_MFP
94189251Ssam};
95189251Ssam
96189251Ssamstruct rsn_supp_config {
97189251Ssam	void *network_ctx;
98189251Ssam	int peerkey_enabled;
99189251Ssam	int allowed_pairwise_cipher; /* bitfield of WPA_CIPHER_* */
100189251Ssam	int proactive_key_caching;
101189251Ssam	int eap_workaround;
102189251Ssam	void *eap_conf_ctx;
103189251Ssam	const u8 *ssid;
104189251Ssam	size_t ssid_len;
105189251Ssam	int wpa_ptk_rekey;
106281806Srpaulo	int p2p;
107189251Ssam};
108189251Ssam
109189251Ssam#ifndef CONFIG_NO_WPA
110189251Ssam
111189251Ssamstruct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx);
112189251Ssamvoid wpa_sm_deinit(struct wpa_sm *sm);
113189251Ssamvoid wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid);
114189251Ssamvoid wpa_sm_notify_disassoc(struct wpa_sm *sm);
115281806Srpaulovoid wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk, size_t pmk_len,
116281806Srpaulo		    const u8 *bssid);
117189251Ssamvoid wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm);
118189251Ssamvoid wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth);
119189251Ssamvoid wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx);
120189251Ssamvoid wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config);
121189251Ssamvoid wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr);
122189251Ssamvoid wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
123189251Ssam		       const char *bridge_ifname);
124189251Ssamvoid wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol);
125189251Ssamint wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
126189251Ssamint wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm, u8 *wpa_ie,
127189251Ssam				    size_t *wpa_ie_len);
128189251Ssamint wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
129189251Ssamint wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
130189251Ssamint wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen);
131189251Ssam
132189251Ssamint wpa_sm_set_param(struct wpa_sm *sm, enum wpa_sm_conf_params param,
133189251Ssam		     unsigned int value);
134189251Ssam
135189251Ssamint wpa_sm_get_status(struct wpa_sm *sm, char *buf, size_t buflen,
136189251Ssam		      int verbose);
137281806Srpauloint wpa_sm_pmf_enabled(struct wpa_sm *sm);
138189251Ssam
139189251Ssamvoid wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise);
140189251Ssam
141189251Ssamint wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len,
142189251Ssam		     struct wpa_ie_data *data);
143189251Ssam
144189251Ssamvoid wpa_sm_aborted_cached(struct wpa_sm *sm);
145189251Ssamint wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
146189251Ssam		    const u8 *buf, size_t len);
147189251Ssamint wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm, struct wpa_ie_data *data);
148214734Srpauloint wpa_sm_pmksa_cache_list(struct wpa_sm *sm, char *buf, size_t len);
149214734Srpaulovoid wpa_sm_drop_sa(struct wpa_sm *sm);
150214734Srpauloint wpa_sm_has_ptk(struct wpa_sm *sm);
151189251Ssam
152252726Srpaulovoid wpa_sm_update_replay_ctr(struct wpa_sm *sm, const u8 *replay_ctr);
153252726Srpaulo
154252726Srpaulovoid wpa_sm_pmksa_cache_flush(struct wpa_sm *sm, void *network_ctx);
155252726Srpaulo
156281806Srpauloint wpa_sm_get_p2p_ip_addr(struct wpa_sm *sm, u8 *buf);
157281806Srpaulo
158281806Srpaulovoid wpa_sm_set_rx_replay_ctr(struct wpa_sm *sm, const u8 *rx_replay_counter);
159281806Srpaulovoid wpa_sm_set_ptk_kck_kek(struct wpa_sm *sm,
160281806Srpaulo			    const u8 *ptk_kck, size_t ptk_kck_len,
161281806Srpaulo			    const u8 *ptk_kek, size_t ptk_kek_len);
162281806Srpaulo
163189251Ssam#else /* CONFIG_NO_WPA */
164189251Ssam
165189251Ssamstatic inline struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx)
166189251Ssam{
167189251Ssam	return (struct wpa_sm *) 1;
168189251Ssam}
169189251Ssam
170189251Ssamstatic inline void wpa_sm_deinit(struct wpa_sm *sm)
171189251Ssam{
172189251Ssam}
173189251Ssam
174189251Ssamstatic inline void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid)
175189251Ssam{
176189251Ssam}
177189251Ssam
178189251Ssamstatic inline void wpa_sm_notify_disassoc(struct wpa_sm *sm)
179189251Ssam{
180189251Ssam}
181189251Ssam
182189251Ssamstatic inline void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk,
183189251Ssam				  size_t pmk_len)
184189251Ssam{
185189251Ssam}
186189251Ssam
187189251Ssamstatic inline void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm)
188189251Ssam{
189189251Ssam}
190189251Ssam
191189251Ssamstatic inline void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth)
192189251Ssam{
193189251Ssam}
194189251Ssam
195189251Ssamstatic inline void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx)
196189251Ssam{
197189251Ssam}
198189251Ssam
199189251Ssamstatic inline void wpa_sm_set_config(struct wpa_sm *sm,
200189251Ssam				     struct rsn_supp_config *config)
201189251Ssam{
202189251Ssam}
203189251Ssam
204189251Ssamstatic inline void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr)
205189251Ssam{
206189251Ssam}
207189251Ssam
208189251Ssamstatic inline void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
209189251Ssam				     const char *bridge_ifname)
210189251Ssam{
211189251Ssam}
212189251Ssam
213189251Ssamstatic inline void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol)
214189251Ssam{
215189251Ssam}
216189251Ssam
217189251Ssamstatic inline int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie,
218189251Ssam					  size_t len)
219189251Ssam{
220189251Ssam	return -1;
221189251Ssam}
222189251Ssam
223189251Ssamstatic inline int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm,
224189251Ssam						  u8 *wpa_ie,
225189251Ssam						  size_t *wpa_ie_len)
226189251Ssam{
227189251Ssam	return -1;
228189251Ssam}
229189251Ssam
230189251Ssamstatic inline int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie,
231189251Ssam				       size_t len)
232189251Ssam{
233189251Ssam	return -1;
234189251Ssam}
235189251Ssam
236189251Ssamstatic inline int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie,
237189251Ssam				       size_t len)
238189251Ssam{
239189251Ssam	return -1;
240189251Ssam}
241189251Ssam
242189251Ssamstatic inline int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen)
243189251Ssam{
244189251Ssam	return 0;
245189251Ssam}
246189251Ssam
247189251Ssamstatic inline int wpa_sm_set_param(struct wpa_sm *sm,
248189251Ssam				   enum wpa_sm_conf_params param,
249189251Ssam				   unsigned int value)
250189251Ssam{
251189251Ssam	return -1;
252189251Ssam}
253189251Ssam
254281806Srpaulostatic inline int wpa_sm_get_status(struct wpa_sm *sm, char *buf,
255281806Srpaulo				    size_t buflen, int verbose)
256189251Ssam{
257189251Ssam	return 0;
258189251Ssam}
259189251Ssam
260281806Srpaulostatic inline int wpa_sm_pmf_enabled(struct wpa_sm *sm)
261189251Ssam{
262189251Ssam	return 0;
263189251Ssam}
264189251Ssam
265189251Ssamstatic inline void wpa_sm_key_request(struct wpa_sm *sm, int error,
266189251Ssam				      int pairwise)
267189251Ssam{
268189251Ssam}
269189251Ssam
270189251Ssamstatic inline int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len,
271189251Ssam				   struct wpa_ie_data *data)
272189251Ssam{
273189251Ssam	return -1;
274189251Ssam}
275189251Ssam
276189251Ssamstatic inline void wpa_sm_aborted_cached(struct wpa_sm *sm)
277189251Ssam{
278189251Ssam}
279189251Ssam
280189251Ssamstatic inline int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
281189251Ssam				  const u8 *buf, size_t len)
282189251Ssam{
283189251Ssam	return -1;
284189251Ssam}
285189251Ssam
286189251Ssamstatic inline int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm,
287189251Ssam					  struct wpa_ie_data *data)
288189251Ssam{
289189251Ssam	return -1;
290189251Ssam}
291189251Ssam
292214734Srpaulostatic inline int wpa_sm_pmksa_cache_list(struct wpa_sm *sm, char *buf,
293214734Srpaulo					  size_t len)
294214734Srpaulo{
295214734Srpaulo	return -1;
296214734Srpaulo}
297214734Srpaulo
298214734Srpaulostatic inline void wpa_sm_drop_sa(struct wpa_sm *sm)
299214734Srpaulo{
300214734Srpaulo}
301214734Srpaulo
302214734Srpaulostatic inline int wpa_sm_has_ptk(struct wpa_sm *sm)
303214734Srpaulo{
304214734Srpaulo	return 0;
305214734Srpaulo}
306214734Srpaulo
307252726Srpaulostatic inline void wpa_sm_update_replay_ctr(struct wpa_sm *sm,
308252726Srpaulo					    const u8 *replay_ctr)
309252726Srpaulo{
310252726Srpaulo}
311252726Srpaulo
312252726Srpaulostatic inline void wpa_sm_pmksa_cache_flush(struct wpa_sm *sm,
313252726Srpaulo					    void *network_ctx)
314252726Srpaulo{
315252726Srpaulo}
316252726Srpaulo
317281806Srpaulostatic inline void wpa_sm_set_rx_replay_ctr(struct wpa_sm *sm,
318281806Srpaulo					    const u8 *rx_replay_counter)
319281806Srpaulo{
320281806Srpaulo}
321281806Srpaulo
322281806Srpaulostatic inline void wpa_sm_set_ptk_kck_kek(struct wpa_sm *sm, const u8 *ptk_kck,
323281806Srpaulo					  const u8 *ptk_kek)
324281806Srpaulo{
325281806Srpaulo}
326281806Srpaulo
327189251Ssam#endif /* CONFIG_NO_WPA */
328189251Ssam
329189251Ssam#ifdef CONFIG_PEERKEY
330189251Ssamint wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer);
331281806Srpauloint wpa_sm_rx_eapol_peerkey(struct wpa_sm *sm, const u8 *src_addr,
332281806Srpaulo			    const u8 *buf, size_t len);
333189251Ssam#else /* CONFIG_PEERKEY */
334189251Ssamstatic inline int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer)
335189251Ssam{
336189251Ssam	return -1;
337189251Ssam}
338281806Srpaulo
339281806Srpaulostatic inline int wpa_sm_rx_eapol_peerkey(struct wpa_sm *sm, const u8 *src_addr,
340281806Srpaulo					  const u8 *buf, size_t len)
341281806Srpaulo{
342281806Srpaulo	return 0;
343281806Srpaulo}
344189251Ssam#endif /* CONFIG_PEERKEY */
345189251Ssam
346189251Ssam#ifdef CONFIG_IEEE80211R
347189251Ssam
348214734Srpauloint wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *ies, size_t ies_len);
349214734Srpauloint wpa_ft_prepare_auth_request(struct wpa_sm *sm, const u8 *mdie);
350189251Ssamint wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
351214734Srpaulo			    int ft_action, const u8 *target_ap,
352214734Srpaulo			    const u8 *ric_ies, size_t ric_ies_len);
353189251Ssamint wpa_ft_is_completed(struct wpa_sm *sm);
354281806Srpaulovoid wpa_reset_ft_completed(struct wpa_sm *sm);
355189251Ssamint wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
356189251Ssam				 size_t ies_len, const u8 *src_addr);
357214734Srpauloint wpa_ft_start_over_ds(struct wpa_sm *sm, const u8 *target_ap,
358214734Srpaulo			 const u8 *mdie);
359189251Ssam
360189251Ssam#else /* CONFIG_IEEE80211R */
361189251Ssam
362189251Ssamstatic inline int
363214734Srpaulowpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *ies, size_t ies_len)
364189251Ssam{
365189251Ssam	return 0;
366189251Ssam}
367189251Ssam
368214734Srpaulostatic inline int wpa_ft_prepare_auth_request(struct wpa_sm *sm,
369214734Srpaulo					      const u8 *mdie)
370189251Ssam{
371189251Ssam	return 0;
372189251Ssam}
373189251Ssam
374189251Ssamstatic inline int
375189251Ssamwpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
376189251Ssam			int ft_action, const u8 *target_ap)
377189251Ssam{
378189251Ssam	return 0;
379189251Ssam}
380189251Ssam
381189251Ssamstatic inline int wpa_ft_is_completed(struct wpa_sm *sm)
382189251Ssam{
383189251Ssam	return 0;
384189251Ssam}
385189251Ssam
386281806Srpaulostatic inline void wpa_reset_ft_completed(struct wpa_sm *sm)
387281806Srpaulo{
388281806Srpaulo}
389281806Srpaulo
390189251Ssamstatic inline int
391189251Ssamwpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
392189251Ssam			     const u8 *src_addr)
393189251Ssam{
394189251Ssam	return -1;
395189251Ssam}
396189251Ssam
397189251Ssam#endif /* CONFIG_IEEE80211R */
398189251Ssam
399252726Srpaulo
400252726Srpaulo/* tdls.c */
401252726Srpaulovoid wpa_tdls_ap_ies(struct wpa_sm *sm, const u8 *ies, size_t len);
402252726Srpaulovoid wpa_tdls_assoc_resp_ies(struct wpa_sm *sm, const u8 *ies, size_t len);
403252726Srpauloint wpa_tdls_start(struct wpa_sm *sm, const u8 *addr);
404281806Srpaulovoid wpa_tdls_remove(struct wpa_sm *sm, const u8 *addr);
405252726Srpauloint wpa_tdls_teardown_link(struct wpa_sm *sm, const u8 *addr, u16 reason_code);
406252726Srpauloint wpa_tdls_send_discovery_request(struct wpa_sm *sm, const u8 *addr);
407252726Srpauloint wpa_tdls_init(struct wpa_sm *sm);
408281806Srpaulovoid wpa_tdls_teardown_peers(struct wpa_sm *sm);
409252726Srpaulovoid wpa_tdls_deinit(struct wpa_sm *sm);
410252726Srpaulovoid wpa_tdls_enable(struct wpa_sm *sm, int enabled);
411281806Srpaulovoid wpa_tdls_disable_unreachable_link(struct wpa_sm *sm, const u8 *addr);
412281806Srpauloconst char * wpa_tdls_get_link_status(struct wpa_sm *sm, const u8 *addr);
413252726Srpauloint wpa_tdls_is_external_setup(struct wpa_sm *sm);
414281806Srpauloint wpa_tdls_enable_chan_switch(struct wpa_sm *sm, const u8 *addr,
415281806Srpaulo				u8 oper_class,
416281806Srpaulo				struct hostapd_freq_params *freq_params);
417281806Srpauloint wpa_tdls_disable_chan_switch(struct wpa_sm *sm, const u8 *addr);
418252726Srpaulo
419252726Srpauloint wpa_wnmsleep_install_key(struct wpa_sm *sm, u8 subelem_id, u8 *buf);
420252726Srpaulo
421189251Ssam#endif /* WPA_H */
422