blob: 6a85cc19ef0778ff6b44bb77e2e7b00570abaee6 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2 * wlantest - IEEE 802.11 protocol monitoring and testing tool
3 * Copyright (c) 2010-2020, 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 WLANTEST_H
10#define WLANTEST_H
11
12#include "utils/list.h"
13#include "common/wpa_common.h"
14#include "wlantest_ctrl.h"
15
16struct ieee802_11_elems;
17struct radius_msg;
18struct ieee80211_hdr;
19struct wlantest_bss;
20
21#define MAX_RADIUS_SECRET_LEN 128
22
23struct wlantest_radius_secret {
24 struct dl_list list;
25 char secret[MAX_RADIUS_SECRET_LEN];
26};
27
28struct wlantest_passphrase {
29 struct dl_list list;
30 char passphrase[64];
31 u8 ssid[32];
32 size_t ssid_len;
33 u8 bssid[ETH_ALEN];
34};
35
36struct wlantest_pmk {
37 struct dl_list list;
38 u8 pmk[PMK_LEN_MAX];
39 size_t pmk_len;
40};
41
42struct wlantest_ptk {
43 struct dl_list list;
44 struct wpa_ptk ptk;
45 size_t ptk_len;
46};
47
48struct wlantest_wep {
49 struct dl_list list;
50 size_t key_len;
51 u8 key[13];
52};
53
54struct wlantest_sta {
55 struct dl_list list;
56 struct wlantest_bss *bss;
57 u8 addr[ETH_ALEN];
58 u8 mld_mac_addr[ETH_ALEN];
59 u8 link_addr[MAX_NUM_MLO_LINKS][ETH_ALEN];
60 enum {
61 STATE1 /* not authenticated */,
62 STATE2 /* authenticated */,
63 STATE3 /* associated */
64 } state;
65 u16 auth_alg;
66 bool ft_over_ds;
67 u16 aid;
68 u8 rsnie[257]; /* WPA/RSN IE */
69 u8 rsnxe[254]; /* RSNXE data */
70 size_t rsnxe_len;
71 u8 osenie[257]; /* OSEN IE */
72 int proto;
73 int pairwise_cipher;
74 int group_cipher;
75 int key_mgmt;
76 int rsn_capab;
77 /* ANonce from the previous EAPOL-Key msg 1/4 or 3/4 */
78 u8 anonce[WPA_NONCE_LEN];
79 /* SNonce from the previous EAPOL-Key msg 2/4 */
80 u8 snonce[WPA_NONCE_LEN];
81 u8 pmk_r0[PMK_LEN_MAX];
82 size_t pmk_r0_len;
83 u8 pmk_r0_name[WPA_PMK_NAME_LEN];
84 u8 pmk_r1[PMK_LEN_MAX];
85 size_t pmk_r1_len;
86 u8 pmk_r1_name[WPA_PMK_NAME_LEN];
87 struct wpa_ptk ptk; /* Derived PTK */
88 int ptk_set;
89 struct wpa_ptk tptk; /* Derived PTK during rekeying */
90 int tptk_set;
91 u8 rsc_tods[16 + 1][6];
92 u8 rsc_fromds[16 + 1][6];
93 u8 ap_sa_query_tr[2];
94 u8 sta_sa_query_tr[2];
95 u32 counters[NUM_WLANTEST_STA_COUNTER];
96 int assocreq_seen;
97 u16 assocreq_capab_info;
98 u16 assocreq_listen_int;
99 u8 *assocreq_ies;
100 size_t assocreq_ies_len;
101
102 /* Last ICMP Echo request information */
103 u32 icmp_echo_req_src;
104 u32 icmp_echo_req_dst;
105 u16 icmp_echo_req_id;
106 u16 icmp_echo_req_seq;
107
108 le16 seq_ctrl_to_sta[17];
109 le16 seq_ctrl_to_ap[17];
110 int allow_duplicate;
111
112 int pwrmgt;
113 int pspoll;
114
115 u8 gtk[32];
116 size_t gtk_len;
117 int gtk_idx;
118
119 u32 tx_tid[16 + 1];
120 u32 rx_tid[16 + 1];
121
122 u16 sae_group;
123};
124
125struct wlantest_tdls {
126 struct dl_list list;
127 struct wlantest_sta *init;
128 struct wlantest_sta *resp;
129 struct tpk {
130 u8 kck[16];
131 u8 tk[16];
132 } tpk;
133 int link_up;
134 u8 dialog_token;
135 u8 rsc_init[16 + 1][6];
136 u8 rsc_resp[16 + 1][6];
137 u32 counters[NUM_WLANTEST_TDLS_COUNTER];
138 u8 inonce[32];
139 u8 rnonce[32];
140};
141
142struct wlantest_bss {
143 struct dl_list list;
144 u8 bssid[ETH_ALEN];
145 u8 mld_mac_addr[ETH_ALEN];
146 u16 capab_info;
147 u16 prev_capab_info;
148 u8 ssid[32];
149 size_t ssid_len;
150 int beacon_seen;
151 int proberesp_seen;
152 int ies_set;
153 int parse_error_reported;
154 u8 wpaie[257];
155 u8 rsnie[257];
156 u8 rsnxe[254]; /* RSNXE data */
157 size_t rsnxe_len;
158 u8 osenie[257];
159 int proto;
160 int pairwise_cipher;
161 int group_cipher;
162 int mgmt_group_cipher;
163 int key_mgmt;
164 int rsn_capab;
165 struct dl_list sta; /* struct wlantest_sta */
166 struct dl_list pmk; /* struct wlantest_pmk */
167 u8 gtk[4][32];
168 size_t gtk_len[4];
169 int gtk_idx;
170 u8 rsc[4][6];
171 u8 igtk[8][32];
172 size_t igtk_len[8];
173 int igtk_idx;
174 u8 ipn[8][6];
175 int bigtk_idx;
176 u32 counters[NUM_WLANTEST_BSS_COUNTER];
177 struct dl_list tdls; /* struct wlantest_tdls */
178 u8 mdid[MOBILITY_DOMAIN_ID_LEN];
179 u8 r0kh_id[FT_R0KH_ID_MAX_LEN];
180 size_t r0kh_id_len;
181 u8 r1kh_id[FT_R1KH_ID_LEN];
182 bool mesh;
183};
184
185struct wlantest_radius {
186 struct dl_list list;
187 u32 srv;
188 u32 cli;
189 struct radius_msg *last_req;
190};
191
192
193#define MAX_CTRL_CONNECTIONS 10
194#define MAX_NOTES 10
195
196struct tkip_frag {
197 struct wpabuf *buf;
198 u8 ra[ETH_ALEN];
199 u8 ta[ETH_ALEN];
200 u16 sn;
201 u8 fn;
202};
203
204struct wlantest {
205 int monitor_sock;
206 int monitor_wired;
207
208 int ctrl_sock;
209 int ctrl_socks[MAX_CTRL_CONNECTIONS];
210
211 struct dl_list passphrase; /* struct wlantest_passphrase */
212 struct dl_list bss; /* struct wlantest_bss */
213 struct dl_list secret; /* struct wlantest_radius_secret */
214 struct dl_list radius; /* struct wlantest_radius */
215 struct dl_list pmk; /* struct wlantest_pmk */
216 struct dl_list ptk; /* struct wlantest_ptk */
217 struct dl_list wep; /* struct wlantest_wep */
218
219 unsigned int rx_mgmt;
220 unsigned int rx_ctrl;
221 unsigned int rx_data;
222 unsigned int fcs_error;
223 unsigned int frame_num;
224
225 void *write_pcap; /* pcap_t* */
226 void *write_pcap_dumper; /* pcpa_dumper_t */
227 struct timeval write_pcap_time;
228 u8 *decrypted;
229 size_t decrypted_len;
230 FILE *pcapng;
231 u32 write_pcapng_time_high;
232 u32 write_pcapng_time_low;
233
234 u8 last_hdr[30];
235 size_t last_len;
236 int last_mgmt_valid;
237
238 unsigned int assume_fcs:1;
239 unsigned int pcap_no_buffer:1;
240 unsigned int ethernet:1;
241
242 char *notes[MAX_NOTES];
243 size_t num_notes;
244
245 const char *write_file;
246 const char *pcapng_file;
247
248 struct tkip_frag tkip_frag;
249};
250
251void add_note(struct wlantest *wt, int level, const char *fmt, ...)
252PRINTF_FORMAT(3, 4);
253void clear_notes(struct wlantest *wt);
254size_t notes_len(struct wlantest *wt, size_t hdrlen);
255void write_decrypted_note(struct wlantest *wt, const u8 *decrypted,
256 const u8 *tk, size_t tk_len, int keyid);
257
258int add_wep(struct wlantest *wt, const char *key);
259int read_cap_file(struct wlantest *wt, const char *fname);
260int read_wired_cap_file(struct wlantest *wt, const char *fname);
261
262int write_pcap_init(struct wlantest *wt, const char *fname);
263void write_pcap_deinit(struct wlantest *wt);
264void write_pcap_captured(struct wlantest *wt, const u8 *buf, size_t len);
265void write_pcap_decrypted(struct wlantest *wt, const u8 *buf1, size_t len1,
266 const u8 *buf2, size_t len2);
267
268int write_pcapng_init(struct wlantest *wt, const char *fname);
269void write_pcapng_deinit(struct wlantest *wt);
270struct pcap_pkthdr;
271void write_pcapng_write_read(struct wlantest *wt, int dlt,
272 struct pcap_pkthdr *hdr, const u8 *data);
273void write_pcapng_captured(struct wlantest *wt, const u8 *buf, size_t len);
274
275void wlantest_process(struct wlantest *wt, const u8 *data, size_t len);
276void wlantest_process_prism(struct wlantest *wt, const u8 *data, size_t len);
277void wlantest_process_80211(struct wlantest *wt, const u8 *data, size_t len);
278void wlantest_process_wired(struct wlantest *wt, const u8 *data, size_t len);
279int monitor_init(struct wlantest *wt, const char *ifname);
280int monitor_init_wired(struct wlantest *wt, const char *ifname);
281void monitor_deinit(struct wlantest *wt);
282void rx_mgmt(struct wlantest *wt, const u8 *data, size_t len);
283void rx_mgmt_ack(struct wlantest *wt, const struct ieee80211_hdr *hdr);
284void rx_data(struct wlantest *wt, const u8 *data, size_t len);
285void rx_data_eapol(struct wlantest *wt, const u8 *bssid, const u8 *sta_addr,
286 const u8 *dst, const u8 *src,
287 const u8 *data, size_t len, int prot);
288void rx_data_ip(struct wlantest *wt, const u8 *bssid, const u8 *sta_addr,
289 const u8 *dst, const u8 *src, const u8 *data, size_t len,
290 const u8 *peer_addr);
291void rx_data_80211_encap(struct wlantest *wt, const u8 *bssid,
292 const u8 *sta_addr, const u8 *dst, const u8 *src,
293 const u8 *data, size_t len);
294
295struct wlantest_bss * bss_find(struct wlantest *wt, const u8 *bssid);
296struct wlantest_bss * bss_get(struct wlantest *wt, const u8 *bssid);
297void bss_deinit(struct wlantest_bss *bss);
298void bss_update(struct wlantest *wt, struct wlantest_bss *bss,
299 struct ieee802_11_elems *elems, int beacon);
300void bss_flush(struct wlantest *wt);
301int bss_add_pmk_from_passphrase(struct wlantest_bss *bss,
302 const char *passphrase);
303void pmk_deinit(struct wlantest_pmk *pmk);
304void tdls_deinit(struct wlantest_tdls *tdls);
305
306struct wlantest_sta * sta_find(struct wlantest_bss *bss, const u8 *addr);
307struct wlantest_sta * sta_find_mlo(struct wlantest *wt,
308 struct wlantest_bss *bss, const u8 *addr);
309struct wlantest_sta * sta_get(struct wlantest_bss *bss, const u8 *addr);
310void sta_deinit(struct wlantest_sta *sta);
311void sta_update_assoc(struct wlantest_sta *sta,
312 struct ieee802_11_elems *elems);
313void sta_new_ptk(struct wlantest *wt, struct wlantest_sta *sta,
314 struct wpa_ptk *ptk);
315
316u8 * ccmp_decrypt(const u8 *tk, const struct ieee80211_hdr *hdr,
317 const u8 *a1, const u8 *a2, const u8 *a3,
318 const u8 *data, size_t data_len, size_t *decrypted_len);
319u8 * ccmp_encrypt(const u8 *tk, u8 *frame, size_t len, size_t hdrlen,
320 const u8 *qos, const u8 *a1, const u8 *a2, const u8 *a3,
321 const u8 *pn, int keyid, size_t *encrypted_len);
322u8 * ccmp_encrypt_pv1(const u8 *tk, const u8 *a1, const u8 *a2, const u8 *a3,
323 const u8 *frame, size_t len,
324 size_t hdrlen, const u8 *pn, int keyid,
325 size_t *encrypted_len);
326void ccmp_get_pn(u8 *pn, const u8 *data);
327u8 * ccmp_256_decrypt(const u8 *tk, const struct ieee80211_hdr *hdr,
328 const u8 *a1, const u8 *a2, const u8 *a3,
329 const u8 *data, size_t data_len, size_t *decrypted_len);
330u8 * ccmp_256_encrypt(const u8 *tk, u8 *frame, size_t len, size_t hdrlen,
331 const u8 *qos, const u8 *a1, const u8 *a2, const u8 *a3,
332 const u8 *pn, int keyid, size_t *encrypted_len);
333
334enum michael_mic_result {
335 MICHAEL_MIC_OK,
336 MICHAEL_MIC_INCORRECT,
337 MICHAEL_MIC_NOT_VERIFIED
338};
339u8 * tkip_decrypt(const u8 *tk, const struct ieee80211_hdr *hdr,
340 const u8 *data, size_t data_len, size_t *decrypted_len,
341 enum michael_mic_result *mic_res, struct tkip_frag *frag);
342u8 * tkip_encrypt(const u8 *tk, u8 *frame, size_t len, size_t hdrlen, u8 *qos,
343 u8 *pn, int keyid, size_t *encrypted_len);
344void tkip_get_pn(u8 *pn, const u8 *data);
345
346u8 * wep_decrypt(struct wlantest *wt, const struct ieee80211_hdr *hdr,
347 const u8 *data, size_t data_len, size_t *decrypted_len);
348
349u8 * bip_protect(const u8 *igtk, size_t igtk_len, u8 *frame, size_t len,
350 u8 *ipn, int keyid, size_t *prot_len);
351u8 * bip_gmac_protect(const u8 *igtk, size_t igtk_len, u8 *frame, size_t len,
352 u8 *ipn, int keyid, size_t *prot_len);
353
354u8 * gcmp_decrypt(const u8 *tk, size_t tk_len, const struct ieee80211_hdr *hdr,
355 const u8 *a1, const u8 *a2, const u8 *a3,
356 const u8 *data, size_t data_len, size_t *decrypted_len);
357u8 * gcmp_encrypt(const u8 *tk, size_t tk_len, const u8 *frame, size_t len,
358 size_t hdrlen, const u8 *qos, const u8 *a1, const u8 *a2,
359 const u8 *a3, const u8 *pn, int keyid, size_t *encrypted_len);
360
361int ctrl_init(struct wlantest *wt);
362void ctrl_deinit(struct wlantest *wt);
363
364int wlantest_inject(struct wlantest *wt, struct wlantest_bss *bss,
365 struct wlantest_sta *sta, u8 *frame, size_t len,
366 enum wlantest_inject_protection prot);
367
368int wlantest_relog(struct wlantest *wt);
369
370#endif /* WLANTEST_H */