hostapd
wpa.h
1 /*
2  * wpa_supplicant - WPA definitions
3  * Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8 
9 #ifndef WPA_H
10 #define WPA_H
11 
12 #include "common/defs.h"
13 #include "common/eapol_common.h"
14 #include "common/wpa_common.h"
15 #include "common/ieee802_11_defs.h"
16 
17 struct wpa_sm;
18 struct eapol_sm;
19 struct wpa_config_blob;
20 struct hostapd_freq_params;
21 
22 struct wpa_sm_ctx {
23  void *ctx; /* pointer to arbitrary upper level context */
24  void *msg_ctx; /* upper level context for wpa_msg() calls */
25 
26  void (*set_state)(void *ctx, enum wpa_states state);
27  enum wpa_states (*get_state)(void *ctx);
28  void (*deauthenticate)(void * ctx, int reason_code);
29  int (*set_key)(void *ctx, enum wpa_alg alg,
30  const u8 *addr, int key_idx, int set_tx,
31  const u8 *seq, size_t seq_len,
32  const u8 *key, size_t key_len);
33  void * (*get_network_ctx)(void *ctx);
34  int (*get_bssid)(void *ctx, u8 *bssid);
35  int (*ether_send)(void *ctx, const u8 *dest, u16 proto, const u8 *buf,
36  size_t len);
37  int (*get_beacon_ie)(void *ctx);
38  void (*cancel_auth_timeout)(void *ctx);
39  u8 * (*alloc_eapol)(void *ctx, u8 type, const void *data, u16 data_len,
40  size_t *msg_len, void **data_pos);
41  int (*add_pmkid)(void *ctx, void *network_ctx, const u8 *bssid,
42  const u8 *pmkid);
43  int (*remove_pmkid)(void *ctx, void *network_ctx, const u8 *bssid,
44  const u8 *pmkid);
45  void (*set_config_blob)(void *ctx, struct wpa_config_blob *blob);
46  const struct wpa_config_blob * (*get_config_blob)(void *ctx,
47  const char *name);
48  int (*mlme_setprotection)(void *ctx, const u8 *addr,
49  int protection_type, int key_type);
50  int (*update_ft_ies)(void *ctx, const u8 *md, const u8 *ies,
51  size_t ies_len);
52  int (*send_ft_action)(void *ctx, u8 action, const u8 *target_ap,
53  const u8 *ies, size_t ies_len);
54  int (*mark_authenticated)(void *ctx, const u8 *target_ap);
55 #ifdef CONFIG_TDLS
56  int (*tdls_get_capa)(void *ctx, int *tdls_supported,
57  int *tdls_ext_setup, int *tdls_chan_switch);
58  int (*send_tdls_mgmt)(void *ctx, const u8 *dst,
59  u8 action_code, u8 dialog_token,
60  u16 status_code, u32 peer_capab,
61  int initiator, const u8 *buf, size_t len);
62  int (*tdls_oper)(void *ctx, int oper, const u8 *peer);
63  int (*tdls_peer_addset)(void *ctx, const u8 *addr, int add, u16 aid,
64  u16 capability, const u8 *supp_rates,
65  size_t supp_rates_len,
66  const struct ieee80211_ht_capabilities *ht_capab,
67  const struct ieee80211_vht_capabilities *vht_capab,
68  u8 qosinfo, int wmm, const u8 *ext_capab,
69  size_t ext_capab_len, const u8 *supp_channels,
70  size_t supp_channels_len,
71  const u8 *supp_oper_classes,
72  size_t supp_oper_classes_len);
73  int (*tdls_enable_channel_switch)(
74  void *ctx, const u8 *addr, u8 oper_class,
75  const struct hostapd_freq_params *params);
76  int (*tdls_disable_channel_switch)(void *ctx, const u8 *addr);
77 #endif /* CONFIG_TDLS */
78  void (*set_rekey_offload)(void *ctx, const u8 *kek, size_t kek_len,
79  const u8 *kck, size_t kck_len,
80  const u8 *replay_ctr);
81  int (*key_mgmt_set_pmk)(void *ctx, const u8 *pmk, size_t pmk_len);
82 };
83 
84 
85 enum wpa_sm_conf_params {
86  RSNA_PMK_LIFETIME /* dot11RSNAConfigPMKLifetime */,
87  RSNA_PMK_REAUTH_THRESHOLD /* dot11RSNAConfigPMKReauthThreshold */,
88  RSNA_SA_TIMEOUT /* dot11RSNAConfigSATimeout */,
89  WPA_PARAM_PROTO,
90  WPA_PARAM_PAIRWISE,
91  WPA_PARAM_GROUP,
92  WPA_PARAM_KEY_MGMT,
93  WPA_PARAM_MGMT_GROUP,
94  WPA_PARAM_RSN_ENABLED,
95  WPA_PARAM_MFP
96 };
97 
99  void *network_ctx;
100  int peerkey_enabled;
101  int allowed_pairwise_cipher; /* bitfield of WPA_CIPHER_* */
102  int proactive_key_caching;
103  int eap_workaround;
104  void *eap_conf_ctx;
105  const u8 *ssid;
106  size_t ssid_len;
107  int wpa_ptk_rekey;
108  int p2p;
109  int wpa_rsc_relaxation;
110 };
111 
112 #ifndef CONFIG_NO_WPA
113 
114 struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx);
115 void wpa_sm_deinit(struct wpa_sm *sm);
116 void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid);
117 void wpa_sm_notify_disassoc(struct wpa_sm *sm);
118 void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk, size_t pmk_len,
119  const u8 *pmkid, const u8 *bssid);
120 void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm);
121 void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth);
122 void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx);
123 void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config);
124 void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr);
125 void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
126  const char *bridge_ifname);
127 void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol);
128 int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
129 int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm, u8 *wpa_ie,
130  size_t *wpa_ie_len);
131 int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
132 int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
133 int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen);
134 
135 int wpa_sm_set_param(struct wpa_sm *sm, enum wpa_sm_conf_params param,
136  unsigned int value);
137 
138 int wpa_sm_get_status(struct wpa_sm *sm, char *buf, size_t buflen,
139  int verbose);
140 int wpa_sm_pmf_enabled(struct wpa_sm *sm);
141 
142 void wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise);
143 
144 int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len,
145  struct wpa_ie_data *data);
146 
147 void wpa_sm_aborted_cached(struct wpa_sm *sm);
148 int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
149  const u8 *buf, size_t len);
150 int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm, struct wpa_ie_data *data);
151 int wpa_sm_pmksa_cache_list(struct wpa_sm *sm, char *buf, size_t len);
152 struct rsn_pmksa_cache_entry * wpa_sm_pmksa_cache_head(struct wpa_sm *sm);
153 struct rsn_pmksa_cache_entry *
154 wpa_sm_pmksa_cache_add_entry(struct wpa_sm *sm,
155  struct rsn_pmksa_cache_entry * entry);
156 void wpa_sm_drop_sa(struct wpa_sm *sm);
157 int wpa_sm_has_ptk(struct wpa_sm *sm);
158 
159 void wpa_sm_update_replay_ctr(struct wpa_sm *sm, const u8 *replay_ctr);
160 
161 void wpa_sm_pmksa_cache_flush(struct wpa_sm *sm, void *network_ctx);
162 
163 int wpa_sm_get_p2p_ip_addr(struct wpa_sm *sm, u8 *buf);
164 
165 void wpa_sm_set_rx_replay_ctr(struct wpa_sm *sm, const u8 *rx_replay_counter);
166 void wpa_sm_set_ptk_kck_kek(struct wpa_sm *sm,
167  const u8 *ptk_kck, size_t ptk_kck_len,
168  const u8 *ptk_kek, size_t ptk_kek_len);
169 
170 #else /* CONFIG_NO_WPA */
171 
172 static inline struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx)
173 {
174  return (struct wpa_sm *) 1;
175 }
176 
177 static inline void wpa_sm_deinit(struct wpa_sm *sm)
178 {
179 }
180 
181 static inline void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid)
182 {
183 }
184 
185 static inline void wpa_sm_notify_disassoc(struct wpa_sm *sm)
186 {
187 }
188 
189 static inline void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk,
190  size_t pmk_len, const u8 *pmkid,
191  const u8 *bssid)
192 {
193 }
194 
195 static inline void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm)
196 {
197 }
198 
199 static inline void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth)
200 {
201 }
202 
203 static inline void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx)
204 {
205 }
206 
207 static inline void wpa_sm_set_config(struct wpa_sm *sm,
208  struct rsn_supp_config *config)
209 {
210 }
211 
212 static inline void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr)
213 {
214 }
215 
216 static inline void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
217  const char *bridge_ifname)
218 {
219 }
220 
221 static inline void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol)
222 {
223 }
224 
225 static inline int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie,
226  size_t len)
227 {
228  return -1;
229 }
230 
231 static inline int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm,
232  u8 *wpa_ie,
233  size_t *wpa_ie_len)
234 {
235  return -1;
236 }
237 
238 static inline int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie,
239  size_t len)
240 {
241  return -1;
242 }
243 
244 static inline int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie,
245  size_t len)
246 {
247  return -1;
248 }
249 
250 static inline int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen)
251 {
252  return 0;
253 }
254 
255 static inline int wpa_sm_set_param(struct wpa_sm *sm,
256  enum wpa_sm_conf_params param,
257  unsigned int value)
258 {
259  return -1;
260 }
261 
262 static inline int wpa_sm_get_status(struct wpa_sm *sm, char *buf,
263  size_t buflen, int verbose)
264 {
265  return 0;
266 }
267 
268 static inline int wpa_sm_pmf_enabled(struct wpa_sm *sm)
269 {
270  return 0;
271 }
272 
273 static inline void wpa_sm_key_request(struct wpa_sm *sm, int error,
274  int pairwise)
275 {
276 }
277 
278 static inline int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len,
279  struct wpa_ie_data *data)
280 {
281  return -1;
282 }
283 
284 static inline void wpa_sm_aborted_cached(struct wpa_sm *sm)
285 {
286 }
287 
288 static inline int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
289  const u8 *buf, size_t len)
290 {
291  return -1;
292 }
293 
294 static inline int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm,
295  struct wpa_ie_data *data)
296 {
297  return -1;
298 }
299 
300 static inline int wpa_sm_pmksa_cache_list(struct wpa_sm *sm, char *buf,
301  size_t len)
302 {
303  return -1;
304 }
305 
306 static inline void wpa_sm_drop_sa(struct wpa_sm *sm)
307 {
308 }
309 
310 static inline int wpa_sm_has_ptk(struct wpa_sm *sm)
311 {
312  return 0;
313 }
314 
315 static inline void wpa_sm_update_replay_ctr(struct wpa_sm *sm,
316  const u8 *replay_ctr)
317 {
318 }
319 
320 static inline void wpa_sm_pmksa_cache_flush(struct wpa_sm *sm,
321  void *network_ctx)
322 {
323 }
324 
325 static inline void wpa_sm_set_rx_replay_ctr(struct wpa_sm *sm,
326  const u8 *rx_replay_counter)
327 {
328 }
329 
330 static inline void wpa_sm_set_ptk_kck_kek(struct wpa_sm *sm, const u8 *ptk_kck,
331  size_t ptk_kck_len,
332  const u8 *ptk_kek, size_t ptk_kek_len)
333 {
334 }
335 
336 #endif /* CONFIG_NO_WPA */
337 
338 #ifdef CONFIG_PEERKEY
339 int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer);
340 int wpa_sm_rx_eapol_peerkey(struct wpa_sm *sm, const u8 *src_addr,
341  const u8 *buf, size_t len);
342 #else /* CONFIG_PEERKEY */
343 static inline int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer)
344 {
345  return -1;
346 }
347 
348 static inline int wpa_sm_rx_eapol_peerkey(struct wpa_sm *sm, const u8 *src_addr,
349  const u8 *buf, size_t len)
350 {
351  return 0;
352 }
353 #endif /* CONFIG_PEERKEY */
354 
355 #ifdef CONFIG_IEEE80211R
356 
357 int wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *ies, size_t ies_len);
358 int wpa_ft_prepare_auth_request(struct wpa_sm *sm, const u8 *mdie);
359 int wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
360  int ft_action, const u8 *target_ap,
361  const u8 *ric_ies, size_t ric_ies_len);
362 int wpa_ft_is_completed(struct wpa_sm *sm);
363 void wpa_reset_ft_completed(struct wpa_sm *sm);
364 int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
365  size_t ies_len, const u8 *src_addr);
366 int wpa_ft_start_over_ds(struct wpa_sm *sm, const u8 *target_ap,
367  const u8 *mdie);
368 
369 #else /* CONFIG_IEEE80211R */
370 
371 static inline int
372 wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *ies, size_t ies_len)
373 {
374  return 0;
375 }
376 
377 static inline int wpa_ft_prepare_auth_request(struct wpa_sm *sm,
378  const u8 *mdie)
379 {
380  return 0;
381 }
382 
383 static inline int
384 wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
385  int ft_action, const u8 *target_ap)
386 {
387  return 0;
388 }
389 
390 static inline int wpa_ft_is_completed(struct wpa_sm *sm)
391 {
392  return 0;
393 }
394 
395 static inline void wpa_reset_ft_completed(struct wpa_sm *sm)
396 {
397 }
398 
399 static inline int
400 wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
401  const u8 *src_addr)
402 {
403  return -1;
404 }
405 
406 #endif /* CONFIG_IEEE80211R */
407 
408 
409 /* tdls.c */
410 void wpa_tdls_ap_ies(struct wpa_sm *sm, const u8 *ies, size_t len);
411 void wpa_tdls_assoc_resp_ies(struct wpa_sm *sm, const u8 *ies, size_t len);
412 int wpa_tdls_start(struct wpa_sm *sm, const u8 *addr);
413 void wpa_tdls_remove(struct wpa_sm *sm, const u8 *addr);
414 int wpa_tdls_teardown_link(struct wpa_sm *sm, const u8 *addr, u16 reason_code);
415 int wpa_tdls_send_discovery_request(struct wpa_sm *sm, const u8 *addr);
416 int wpa_tdls_init(struct wpa_sm *sm);
417 void wpa_tdls_teardown_peers(struct wpa_sm *sm);
418 void wpa_tdls_deinit(struct wpa_sm *sm);
419 void wpa_tdls_enable(struct wpa_sm *sm, int enabled);
420 void wpa_tdls_disable_unreachable_link(struct wpa_sm *sm, const u8 *addr);
421 const char * wpa_tdls_get_link_status(struct wpa_sm *sm, const u8 *addr);
422 int wpa_tdls_is_external_setup(struct wpa_sm *sm);
423 int wpa_tdls_enable_chan_switch(struct wpa_sm *sm, const u8 *addr,
424  u8 oper_class,
425  struct hostapd_freq_params *freq_params);
426 int wpa_tdls_disable_chan_switch(struct wpa_sm *sm, const u8 *addr);
427 #ifdef CONFIG_TDLS_TESTING
428 extern unsigned int tdls_testing;
429 #endif /* CONFIG_TDLS_TESTING */
430 
431 
432 int wpa_wnmsleep_install_key(struct wpa_sm *sm, u8 subelem_id, u8 *buf);
433 void wpa_sm_set_test_assoc_ie(struct wpa_sm *sm, struct wpabuf *buf);
434 
435 struct wpabuf * fils_build_auth(struct wpa_sm *sm);
436 int fils_process_auth(struct wpa_sm *sm, const u8 *data, size_t len);
437 struct wpabuf * fils_build_assoc_req(struct wpa_sm *sm, const u8 **kek,
438  size_t *kek_len, const u8 **snonce,
439  const u8 **anonce);
440 int fils_process_assoc_resp(struct wpa_sm *sm, const u8 *resp, size_t len);
441 int wpa_fils_is_completed(struct wpa_sm *sm);
442 
443 #endif /* WPA_H */
Definition: config.py:1
Definition: wpabuf.h:20
Definition: ieee802_11_defs.h:944
Definition: wpa.h:22
Definition: ieee802_11_defs.h:978
struct wpa_config_blob - Named configuration blob
Definition: eap_config.h:766
void * network_ctx
network_ctx - Network configuration context
Definition: pmksa_cache.h:35
Definition: wpa.h:98
size_t len
len - Length of binary data
Definition: eap_config.h:780
struct rsn_pmksa_cache_entry - PMKSA cache entry
Definition: pmksa_cache_auth.h:17
struct eapol_sm - Internal data for EAPOL state machines
Definition: eapol_supp_sm.c:31
struct hostapd_freq_params - Channel parameters
Definition: driver.h:565
struct wpa_sm - Internal WPA state machine data
Definition: wpa_i.h:21
char * name
name - Blob name
Definition: eap_config.h:770
Definition: wpa_common.h:365