1 /*
2 * hostapd - IEEE 802.11r - Fast BSS Transition
3 * Copyright (c) 2004-2018, 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 #include "utils/includes.h"
10
11 #include "utils/common.h"
12 #include "utils/eloop.h"
13 #include "utils/list.h"
14 #include "common/ieee802_11_defs.h"
15 #include "common/ieee802_11_common.h"
16 #include "common/ocv.h"
17 #include "drivers/driver.h"
18 #include "crypto/aes.h"
19 #include "crypto/aes_siv.h"
20 #include "crypto/aes_wrap.h"
21 #include "crypto/sha384.h"
22 #include "crypto/random.h"
23 #include "ap_config.h"
24 #include "ieee802_11.h"
25 #include "wmm.h"
26 #include "wpa_auth.h"
27 #include "wpa_auth_i.h"
28
29
30 #ifdef CONFIG_IEEE80211R_AP
31
32 const unsigned int ftRRBseqTimeout = 10;
33 const unsigned int ftRRBmaxQueueLen = 100;
34
35
36 static int wpa_ft_send_rrb_auth_resp(struct wpa_state_machine *sm,
37 const u8 *current_ap, const u8 *sta_addr,
38 u16 status, const u8 *resp_ies,
39 size_t resp_ies_len);
40 static void ft_finish_pull(struct wpa_state_machine *sm);
41 static void wpa_ft_expire_pull(void *eloop_ctx, void *timeout_ctx);
42 static void wpa_ft_rrb_seq_timeout(void *eloop_ctx, void *timeout_ctx);
43
44 struct tlv_list {
45 u16 type;
46 size_t len;
47 const u8 *data;
48 };
49
50
51 /**
52 * wpa_ft_rrb_decrypt - Decrypt FT RRB message
53 * @key: AES-SIV key for AEAD
54 * @key_len: Length of key in octets
55 * @enc: Pointer to encrypted TLVs
56 * @enc_len: Length of encrypted TLVs in octets
57 * @auth: Pointer to authenticated TLVs
58 * @auth_len: Length of authenticated TLVs in octets
59 * @src_addr: MAC address of the frame sender
60 * @type: Vendor-specific subtype of the RRB frame (FT_PACKET_*)
61 * @plain: Pointer to return the pointer to the allocated plaintext buffer;
62 * needs to be freed by the caller if not NULL;
63 * will only be returned on success
64 * @plain_len: Pointer to return the length of the allocated plaintext buffer
65 * in octets
66 * Returns: 0 on success, -1 on error
67 */
wpa_ft_rrb_decrypt(const u8 * key,const size_t key_len,const u8 * enc,size_t enc_len,const u8 * auth,const size_t auth_len,const u8 * src_addr,u8 type,u8 ** plain,size_t * plain_size)68 static int wpa_ft_rrb_decrypt(const u8 *key, const size_t key_len,
69 const u8 *enc, size_t enc_len,
70 const u8 *auth, const size_t auth_len,
71 const u8 *src_addr, u8 type,
72 u8 **plain, size_t *plain_size)
73 {
74 const u8 *ad[3] = { src_addr, auth, &type };
75 size_t ad_len[3] = { ETH_ALEN, auth_len, sizeof(type) };
76
77 wpa_printf(MSG_DEBUG, "FT(RRB): src_addr=" MACSTR " type=%u",
78 MAC2STR(src_addr), type);
79 wpa_hexdump_key(MSG_DEBUG, "FT(RRB): decrypt using key", key, key_len);
80 wpa_hexdump(MSG_DEBUG, "FT(RRB): encrypted TLVs", enc, enc_len);
81 wpa_hexdump(MSG_DEBUG, "FT(RRB): authenticated TLVs", auth, auth_len);
82
83 if (!key) { /* skip decryption */
84 *plain = os_memdup(enc, enc_len);
85 if (enc_len > 0 && !*plain)
86 goto err;
87
88 *plain_size = enc_len;
89
90 return 0;
91 }
92
93 *plain = NULL;
94
95 /* SIV overhead */
96 if (enc_len < AES_BLOCK_SIZE)
97 goto err;
98
99 *plain = os_zalloc(enc_len - AES_BLOCK_SIZE);
100 if (!*plain)
101 goto err;
102
103 if (aes_siv_decrypt(key, key_len, enc, enc_len, 3, ad, ad_len,
104 *plain) < 0) {
105 if (enc_len < AES_BLOCK_SIZE + 2)
106 goto err;
107
108 /* Try to work around Ethernet devices that add extra
109 * two octet padding even if the frame is longer than
110 * the minimum Ethernet frame. */
111 enc_len -= 2;
112 if (aes_siv_decrypt(key, key_len, enc, enc_len, 3, ad, ad_len,
113 *plain) < 0)
114 goto err;
115 }
116
117 *plain_size = enc_len - AES_BLOCK_SIZE;
118 wpa_hexdump_key(MSG_DEBUG, "FT(RRB): decrypted TLVs",
119 *plain, *plain_size);
120 return 0;
121 err:
122 os_free(*plain);
123 *plain = NULL;
124 *plain_size = 0;
125
126 wpa_printf(MSG_ERROR, "FT(RRB): Failed to decrypt");
127
128 return -1;
129 }
130
131
132 /* get first tlv record in packet matching type
133 * @data (decrypted) packet
134 * @return 0 on success else -1
135 */
wpa_ft_rrb_get_tlv(const u8 * plain,size_t plain_len,u16 type,size_t * tlv_len,const u8 ** tlv_data)136 static int wpa_ft_rrb_get_tlv(const u8 *plain, size_t plain_len,
137 u16 type, size_t *tlv_len, const u8 **tlv_data)
138 {
139 const struct ft_rrb_tlv *f;
140 size_t left;
141 le16 type16;
142 size_t len;
143
144 left = plain_len;
145 type16 = host_to_le16(type);
146
147 while (left >= sizeof(*f)) {
148 f = (const struct ft_rrb_tlv *) plain;
149
150 left -= sizeof(*f);
151 plain += sizeof(*f);
152 len = le_to_host16(f->len);
153
154 if (left < len) {
155 wpa_printf(MSG_DEBUG, "FT: RRB message truncated");
156 break;
157 }
158
159 if (f->type == type16) {
160 *tlv_len = len;
161 *tlv_data = plain;
162 return 0;
163 }
164
165 left -= len;
166 plain += len;
167 }
168
169 return -1;
170 }
171
172
wpa_ft_rrb_dump(const u8 * plain,const size_t plain_len)173 static void wpa_ft_rrb_dump(const u8 *plain, const size_t plain_len)
174 {
175 const struct ft_rrb_tlv *f;
176 size_t left;
177 size_t len;
178
179 left = plain_len;
180
181 wpa_printf(MSG_DEBUG, "FT: RRB dump message");
182 while (left >= sizeof(*f)) {
183 f = (const struct ft_rrb_tlv *) plain;
184
185 left -= sizeof(*f);
186 plain += sizeof(*f);
187 len = le_to_host16(f->len);
188
189 wpa_printf(MSG_DEBUG, "FT: RRB TLV type = %d, len = %zu",
190 le_to_host16(f->type), len);
191
192 if (left < len) {
193 wpa_printf(MSG_DEBUG,
194 "FT: RRB message truncated: left %zu bytes, need %zu",
195 left, len);
196 break;
197 }
198
199 wpa_hexdump(MSG_DEBUG, "FT: RRB TLV data", plain, len);
200
201 left -= len;
202 plain += len;
203 }
204
205 if (left > 0)
206 wpa_hexdump(MSG_DEBUG, "FT: RRB TLV padding", plain, left);
207
208 wpa_printf(MSG_DEBUG, "FT: RRB dump message end");
209 }
210
211
cmp_int(const void * a,const void * b)212 static int cmp_int(const void *a, const void *b)
213 {
214 int x, y;
215
216 x = *((int *) a);
217 y = *((int *) b);
218 return x - y;
219 }
220
221
wpa_ft_rrb_get_tlv_vlan(const u8 * plain,const size_t plain_len,struct vlan_description * vlan)222 static int wpa_ft_rrb_get_tlv_vlan(const u8 *plain, const size_t plain_len,
223 struct vlan_description *vlan)
224 {
225 struct ft_rrb_tlv *f;
226 size_t left;
227 size_t len;
228 int taggedidx;
229 int vlan_id;
230 int type;
231
232 left = plain_len;
233 taggedidx = 0;
234 os_memset(vlan, 0, sizeof(*vlan));
235
236 while (left >= sizeof(*f)) {
237 f = (struct ft_rrb_tlv *) plain;
238
239 left -= sizeof(*f);
240 plain += sizeof(*f);
241
242 len = le_to_host16(f->len);
243 type = le_to_host16(f->type);
244
245 if (left < len) {
246 wpa_printf(MSG_DEBUG, "FT: RRB message truncated");
247 return -1;
248 }
249
250 if (type != FT_RRB_VLAN_UNTAGGED && type != FT_RRB_VLAN_TAGGED)
251 goto skip;
252
253 if (type == FT_RRB_VLAN_UNTAGGED && len != sizeof(le16)) {
254 wpa_printf(MSG_DEBUG,
255 "FT: RRB VLAN_UNTAGGED invalid length");
256 return -1;
257 }
258
259 if (type == FT_RRB_VLAN_TAGGED && len % sizeof(le16) != 0) {
260 wpa_printf(MSG_DEBUG,
261 "FT: RRB VLAN_TAGGED invalid length");
262 return -1;
263 }
264
265 while (len >= sizeof(le16)) {
266 vlan_id = WPA_GET_LE16(plain);
267 plain += sizeof(le16);
268 left -= sizeof(le16);
269 len -= sizeof(le16);
270
271 if (vlan_id <= 0 || vlan_id > MAX_VLAN_ID) {
272 wpa_printf(MSG_DEBUG,
273 "FT: RRB VLAN ID invalid %d",
274 vlan_id);
275 continue;
276 }
277
278 if (type == FT_RRB_VLAN_UNTAGGED)
279 vlan->untagged = vlan_id;
280
281 if (type == FT_RRB_VLAN_TAGGED &&
282 taggedidx < MAX_NUM_TAGGED_VLAN) {
283 vlan->tagged[taggedidx] = vlan_id;
284 taggedidx++;
285 } else if (type == FT_RRB_VLAN_TAGGED) {
286 wpa_printf(MSG_DEBUG, "FT: RRB too many VLANs");
287 }
288 }
289
290 skip:
291 left -= len;
292 plain += len;
293 }
294
295 if (taggedidx)
296 qsort(vlan->tagged, taggedidx, sizeof(int), cmp_int);
297
298 vlan->notempty = vlan->untagged || vlan->tagged[0];
299
300 return 0;
301 }
302
303
wpa_ft_tlv_len(const struct tlv_list * tlvs)304 static size_t wpa_ft_tlv_len(const struct tlv_list *tlvs)
305 {
306 size_t tlv_len = 0;
307 int i;
308
309 if (!tlvs)
310 return 0;
311
312 for (i = 0; tlvs[i].type != FT_RRB_LAST_EMPTY; i++) {
313 tlv_len += sizeof(struct ft_rrb_tlv);
314 tlv_len += tlvs[i].len;
315 }
316
317 return tlv_len;
318 }
319
320
wpa_ft_tlv_lin(const struct tlv_list * tlvs,u8 * start,u8 * endpos)321 static size_t wpa_ft_tlv_lin(const struct tlv_list *tlvs, u8 *start,
322 u8 *endpos)
323 {
324 int i;
325 size_t tlv_len;
326 struct ft_rrb_tlv *hdr;
327 u8 *pos;
328
329 if (!tlvs)
330 return 0;
331
332 tlv_len = 0;
333 pos = start;
334 for (i = 0; tlvs[i].type != FT_RRB_LAST_EMPTY; i++) {
335 if (tlv_len + sizeof(*hdr) > (size_t) (endpos - start))
336 return tlv_len;
337 tlv_len += sizeof(*hdr);
338 hdr = (struct ft_rrb_tlv *) pos;
339 hdr->type = host_to_le16(tlvs[i].type);
340 hdr->len = host_to_le16(tlvs[i].len);
341 pos = start + tlv_len;
342
343 if (tlv_len + tlvs[i].len > (size_t) (endpos - start))
344 return tlv_len;
345 if (tlvs[i].len == 0)
346 continue;
347 tlv_len += tlvs[i].len;
348 os_memcpy(pos, tlvs[i].data, tlvs[i].len);
349 pos = start + tlv_len;
350 }
351
352 return tlv_len;
353 }
354
355
wpa_ft_vlan_len(const struct vlan_description * vlan)356 static size_t wpa_ft_vlan_len(const struct vlan_description *vlan)
357 {
358 size_t tlv_len = 0;
359 int i;
360
361 if (!vlan || !vlan->notempty)
362 return 0;
363
364 if (vlan->untagged) {
365 tlv_len += sizeof(struct ft_rrb_tlv);
366 tlv_len += sizeof(le16);
367 }
368 if (vlan->tagged[0])
369 tlv_len += sizeof(struct ft_rrb_tlv);
370 for (i = 0; i < MAX_NUM_TAGGED_VLAN && vlan->tagged[i]; i++)
371 tlv_len += sizeof(le16);
372
373 return tlv_len;
374 }
375
376
wpa_ft_vlan_lin(const struct vlan_description * vlan,u8 * start,u8 * endpos)377 static size_t wpa_ft_vlan_lin(const struct vlan_description *vlan,
378 u8 *start, u8 *endpos)
379 {
380 size_t tlv_len;
381 int i, len;
382 struct ft_rrb_tlv *hdr;
383 u8 *pos = start;
384
385 if (!vlan || !vlan->notempty)
386 return 0;
387
388 tlv_len = 0;
389 if (vlan->untagged) {
390 tlv_len += sizeof(*hdr);
391 if (start + tlv_len > endpos)
392 return tlv_len;
393 hdr = (struct ft_rrb_tlv *) pos;
394 hdr->type = host_to_le16(FT_RRB_VLAN_UNTAGGED);
395 hdr->len = host_to_le16(sizeof(le16));
396 pos = start + tlv_len;
397
398 tlv_len += sizeof(le16);
399 if (start + tlv_len > endpos)
400 return tlv_len;
401 WPA_PUT_LE16(pos, vlan->untagged);
402 pos = start + tlv_len;
403 }
404
405 if (!vlan->tagged[0])
406 return tlv_len;
407
408 tlv_len += sizeof(*hdr);
409 if (start + tlv_len > endpos)
410 return tlv_len;
411 hdr = (struct ft_rrb_tlv *) pos;
412 hdr->type = host_to_le16(FT_RRB_VLAN_TAGGED);
413 len = 0; /* len is computed below */
414 pos = start + tlv_len;
415
416 for (i = 0; i < MAX_NUM_TAGGED_VLAN && vlan->tagged[i]; i++) {
417 tlv_len += sizeof(le16);
418 if (start + tlv_len > endpos)
419 break;
420 len += sizeof(le16);
421 WPA_PUT_LE16(pos, vlan->tagged[i]);
422 pos = start + tlv_len;
423 }
424
425 hdr->len = host_to_le16(len);
426
427 return tlv_len;
428 }
429
430
wpa_ft_rrb_lin(const struct tlv_list * tlvs1,const struct tlv_list * tlvs2,const struct vlan_description * vlan,u8 ** plain,size_t * plain_len)431 static int wpa_ft_rrb_lin(const struct tlv_list *tlvs1,
432 const struct tlv_list *tlvs2,
433 const struct vlan_description *vlan,
434 u8 **plain, size_t *plain_len)
435 {
436 u8 *pos, *endpos;
437 size_t tlv_len;
438
439 tlv_len = wpa_ft_tlv_len(tlvs1);
440 tlv_len += wpa_ft_tlv_len(tlvs2);
441 tlv_len += wpa_ft_vlan_len(vlan);
442
443 *plain_len = tlv_len;
444 *plain = os_zalloc(tlv_len);
445 if (!*plain) {
446 wpa_printf(MSG_ERROR, "FT: Failed to allocate plaintext");
447 goto err;
448 }
449
450 pos = *plain;
451 endpos = *plain + tlv_len;
452 pos += wpa_ft_tlv_lin(tlvs1, pos, endpos);
453 pos += wpa_ft_tlv_lin(tlvs2, pos, endpos);
454 pos += wpa_ft_vlan_lin(vlan, pos, endpos);
455
456 /* sanity check */
457 if (pos != endpos) {
458 wpa_printf(MSG_ERROR, "FT: Length error building RRB");
459 goto err;
460 }
461
462 return 0;
463
464 err:
465 os_free(*plain);
466 *plain = NULL;
467 *plain_len = 0;
468 return -1;
469 }
470
471
wpa_ft_rrb_encrypt(const u8 * key,const size_t key_len,const u8 * plain,const size_t plain_len,const u8 * auth,const size_t auth_len,const u8 * src_addr,u8 type,u8 * enc)472 static int wpa_ft_rrb_encrypt(const u8 *key, const size_t key_len,
473 const u8 *plain, const size_t plain_len,
474 const u8 *auth, const size_t auth_len,
475 const u8 *src_addr, u8 type, u8 *enc)
476 {
477 const u8 *ad[3] = { src_addr, auth, &type };
478 size_t ad_len[3] = { ETH_ALEN, auth_len, sizeof(type) };
479
480 wpa_printf(MSG_DEBUG, "FT(RRB): src_addr=" MACSTR " type=%u",
481 MAC2STR(src_addr), type);
482 wpa_hexdump_key(MSG_DEBUG, "FT(RRB): plaintext message",
483 plain, plain_len);
484 wpa_hexdump_key(MSG_DEBUG, "FT(RRB): encrypt using key", key, key_len);
485 wpa_hexdump(MSG_DEBUG, "FT(RRB): authenticated TLVs", auth, auth_len);
486
487 if (!key) {
488 /* encryption not needed, return plaintext as packet */
489 os_memcpy(enc, plain, plain_len);
490 } else if (aes_siv_encrypt(key, key_len, plain, plain_len,
491 3, ad, ad_len, enc) < 0) {
492 wpa_printf(MSG_ERROR, "FT: Failed to encrypt RRB-OUI message");
493 return -1;
494 }
495 wpa_hexdump(MSG_DEBUG, "FT(RRB): encrypted TLVs",
496 enc, plain_len + AES_BLOCK_SIZE);
497
498 return 0;
499 }
500
501
502 /**
503 * wpa_ft_rrb_build - Build and encrypt an FT RRB message
504 * @key: AES-SIV key for AEAD
505 * @key_len: Length of key in octets
506 * @tlvs_enc0: First set of to-be-encrypted TLVs
507 * @tlvs_enc1: Second set of to-be-encrypted TLVs
508 * @tlvs_auth: Set of to-be-authenticated TLVs
509 * @src_addr: MAC address of the frame sender
510 * @type: Vendor-specific subtype of the RRB frame (FT_PACKET_*)
511 * @packet Pointer to return the pointer to the allocated packet buffer;
512 * needs to be freed by the caller if not null;
513 * will only be returned on success
514 * @packet_len: Pointer to return the length of the allocated buffer in octets
515 * Returns: 0 on success, -1 on error
516 */
wpa_ft_rrb_build(const u8 * key,const size_t key_len,const struct tlv_list * tlvs_enc0,const struct tlv_list * tlvs_enc1,const struct tlv_list * tlvs_auth,const struct vlan_description * vlan,const u8 * src_addr,u8 type,u8 ** packet,size_t * packet_len)517 static int wpa_ft_rrb_build(const u8 *key, const size_t key_len,
518 const struct tlv_list *tlvs_enc0,
519 const struct tlv_list *tlvs_enc1,
520 const struct tlv_list *tlvs_auth,
521 const struct vlan_description *vlan,
522 const u8 *src_addr, u8 type,
523 u8 **packet, size_t *packet_len)
524 {
525 u8 *plain = NULL, *auth = NULL, *pos, *tmp;
526 size_t plain_len = 0, auth_len = 0;
527 int ret = -1;
528 size_t pad_len = 0;
529
530 *packet = NULL;
531 if (wpa_ft_rrb_lin(tlvs_enc0, tlvs_enc1, vlan, &plain, &plain_len) < 0)
532 goto out;
533
534 if (wpa_ft_rrb_lin(tlvs_auth, NULL, NULL, &auth, &auth_len) < 0)
535 goto out;
536
537 *packet_len = sizeof(u16) + auth_len + plain_len;
538 if (key)
539 *packet_len += AES_BLOCK_SIZE;
540 #define RRB_MIN_MSG_LEN 64
541 if (*packet_len < RRB_MIN_MSG_LEN) {
542 pad_len = RRB_MIN_MSG_LEN - *packet_len;
543 if (pad_len < sizeof(struct ft_rrb_tlv))
544 pad_len = sizeof(struct ft_rrb_tlv);
545 wpa_printf(MSG_DEBUG,
546 "FT: Pad message to minimum Ethernet frame length (%d --> %d)",
547 (int) *packet_len, (int) (*packet_len + pad_len));
548 *packet_len += pad_len;
549 tmp = os_realloc(auth, auth_len + pad_len);
550 if (!tmp)
551 goto out;
552 auth = tmp;
553 pos = auth + auth_len;
554 WPA_PUT_LE16(pos, FT_RRB_LAST_EMPTY);
555 pos += 2;
556 WPA_PUT_LE16(pos, pad_len - sizeof(struct ft_rrb_tlv));
557 pos += 2;
558 os_memset(pos, 0, pad_len - sizeof(struct ft_rrb_tlv));
559 auth_len += pad_len;
560
561 }
562 *packet = os_zalloc(*packet_len);
563 if (!*packet)
564 goto out;
565
566 pos = *packet;
567 WPA_PUT_LE16(pos, auth_len);
568 pos += 2;
569 os_memcpy(pos, auth, auth_len);
570 pos += auth_len;
571 if (wpa_ft_rrb_encrypt(key, key_len, plain, plain_len, auth,
572 auth_len, src_addr, type, pos) < 0)
573 goto out;
574 wpa_hexdump(MSG_MSGDUMP, "FT: RRB frame payload", *packet, *packet_len);
575
576 ret = 0;
577
578 out:
579 bin_clear_free(plain, plain_len);
580 os_free(auth);
581
582 if (ret) {
583 wpa_printf(MSG_ERROR, "FT: Failed to build RRB-OUI message");
584 os_free(*packet);
585 *packet = NULL;
586 *packet_len = 0;
587 }
588
589 return ret;
590 }
591
592
593 #define RRB_GET_SRC(srcfield, type, field, txt, checklength) do { \
594 if (wpa_ft_rrb_get_tlv(srcfield, srcfield##_len, type, \
595 &f_##field##_len, &f_##field) < 0 || \
596 (checklength > 0 && ((size_t) checklength) != f_##field##_len)) { \
597 wpa_printf(MSG_INFO, "FT: Missing required " #field \
598 " in %s from " MACSTR, txt, MAC2STR(src_addr)); \
599 wpa_ft_rrb_dump(srcfield, srcfield##_len); \
600 goto out; \
601 } \
602 } while (0)
603
604 #define RRB_GET(type, field, txt, checklength) \
605 RRB_GET_SRC(plain, type, field, txt, checklength)
606 #define RRB_GET_AUTH(type, field, txt, checklength) \
607 RRB_GET_SRC(auth, type, field, txt, checklength)
608
609 #define RRB_GET_OPTIONAL_SRC(srcfield, type, field, txt, checklength) do { \
610 if (wpa_ft_rrb_get_tlv(srcfield, srcfield##_len, type, \
611 &f_##field##_len, &f_##field) < 0 || \
612 (checklength > 0 && ((size_t) checklength) != f_##field##_len)) { \
613 wpa_printf(MSG_DEBUG, "FT: Missing optional " #field \
614 " in %s from " MACSTR, txt, MAC2STR(src_addr)); \
615 f_##field##_len = 0; \
616 f_##field = NULL; \
617 } \
618 } while (0)
619
620 #define RRB_GET_OPTIONAL(type, field, txt, checklength) \
621 RRB_GET_OPTIONAL_SRC(plain, type, field, txt, checklength)
622 #define RRB_GET_OPTIONAL_AUTH(type, field, txt, checklength) \
623 RRB_GET_OPTIONAL_SRC(auth, type, field, txt, checklength)
624
wpa_ft_rrb_send(struct wpa_authenticator * wpa_auth,const u8 * dst,const u8 * data,size_t data_len)625 static int wpa_ft_rrb_send(struct wpa_authenticator *wpa_auth, const u8 *dst,
626 const u8 *data, size_t data_len)
627 {
628 if (wpa_auth->cb->send_ether == NULL)
629 return -1;
630 wpa_printf(MSG_DEBUG, "FT: RRB send to " MACSTR, MAC2STR(dst));
631 return wpa_auth->cb->send_ether(wpa_auth->cb_ctx, dst, ETH_P_RRB,
632 data, data_len);
633 }
634
635
wpa_ft_rrb_oui_send(struct wpa_authenticator * wpa_auth,const u8 * dst,u8 oui_suffix,const u8 * data,size_t data_len)636 static int wpa_ft_rrb_oui_send(struct wpa_authenticator *wpa_auth,
637 const u8 *dst, u8 oui_suffix,
638 const u8 *data, size_t data_len)
639 {
640 if (!wpa_auth->cb->send_oui)
641 return -1;
642 wpa_printf(MSG_DEBUG, "FT: RRB-OUI type %u send to " MACSTR " (len=%u)",
643 oui_suffix, MAC2STR(dst), (unsigned int) data_len);
644 return wpa_auth->cb->send_oui(wpa_auth->cb_ctx, dst, oui_suffix, data,
645 data_len);
646 }
647
648
wpa_ft_action_send(struct wpa_authenticator * wpa_auth,const u8 * dst,const u8 * data,size_t data_len)649 static int wpa_ft_action_send(struct wpa_authenticator *wpa_auth,
650 const u8 *dst, const u8 *data, size_t data_len)
651 {
652 if (wpa_auth->cb->send_ft_action == NULL)
653 return -1;
654 return wpa_auth->cb->send_ft_action(wpa_auth->cb_ctx, dst,
655 data, data_len);
656 }
657
658
wpa_ft_get_psk(struct wpa_authenticator * wpa_auth,const u8 * addr,const u8 * p2p_dev_addr,const u8 * prev_psk)659 static const u8 * wpa_ft_get_psk(struct wpa_authenticator *wpa_auth,
660 const u8 *addr, const u8 *p2p_dev_addr,
661 const u8 *prev_psk)
662 {
663 if (wpa_auth->cb->get_psk == NULL)
664 return NULL;
665 return wpa_auth->cb->get_psk(wpa_auth->cb_ctx, addr, p2p_dev_addr,
666 prev_psk, NULL, NULL);
667 }
668
669
670 static struct wpa_state_machine *
wpa_ft_add_sta(struct wpa_authenticator * wpa_auth,const u8 * sta_addr)671 wpa_ft_add_sta(struct wpa_authenticator *wpa_auth, const u8 *sta_addr)
672 {
673 if (wpa_auth->cb->add_sta == NULL)
674 return NULL;
675 return wpa_auth->cb->add_sta(wpa_auth->cb_ctx, sta_addr);
676 }
677
678
wpa_ft_set_vlan(struct wpa_authenticator * wpa_auth,const u8 * sta_addr,struct vlan_description * vlan)679 static int wpa_ft_set_vlan(struct wpa_authenticator *wpa_auth,
680 const u8 *sta_addr, struct vlan_description *vlan)
681 {
682 if (!wpa_auth->cb->set_vlan)
683 return -1;
684 return wpa_auth->cb->set_vlan(wpa_auth->cb_ctx, sta_addr, vlan);
685 }
686
687
wpa_ft_get_vlan(struct wpa_authenticator * wpa_auth,const u8 * sta_addr,struct vlan_description * vlan)688 static int wpa_ft_get_vlan(struct wpa_authenticator *wpa_auth,
689 const u8 *sta_addr, struct vlan_description *vlan)
690 {
691 if (!wpa_auth->cb->get_vlan)
692 return -1;
693 return wpa_auth->cb->get_vlan(wpa_auth->cb_ctx, sta_addr, vlan);
694 }
695
696
697 static int
wpa_ft_set_identity(struct wpa_authenticator * wpa_auth,const u8 * sta_addr,const u8 * identity,size_t identity_len)698 wpa_ft_set_identity(struct wpa_authenticator *wpa_auth, const u8 *sta_addr,
699 const u8 *identity, size_t identity_len)
700 {
701 if (!wpa_auth->cb->set_identity)
702 return -1;
703 return wpa_auth->cb->set_identity(wpa_auth->cb_ctx, sta_addr, identity,
704 identity_len);
705 }
706
707
708 static size_t
wpa_ft_get_identity(struct wpa_authenticator * wpa_auth,const u8 * sta_addr,const u8 ** buf)709 wpa_ft_get_identity(struct wpa_authenticator *wpa_auth, const u8 *sta_addr,
710 const u8 **buf)
711 {
712 *buf = NULL;
713 if (!wpa_auth->cb->get_identity)
714 return 0;
715 return wpa_auth->cb->get_identity(wpa_auth->cb_ctx, sta_addr, buf);
716 }
717
718
719 static int
wpa_ft_set_radius_cui(struct wpa_authenticator * wpa_auth,const u8 * sta_addr,const u8 * radius_cui,size_t radius_cui_len)720 wpa_ft_set_radius_cui(struct wpa_authenticator *wpa_auth, const u8 *sta_addr,
721 const u8 *radius_cui, size_t radius_cui_len)
722 {
723 if (!wpa_auth->cb->set_radius_cui)
724 return -1;
725 return wpa_auth->cb->set_radius_cui(wpa_auth->cb_ctx, sta_addr,
726 radius_cui, radius_cui_len);
727 }
728
729
730 static size_t
wpa_ft_get_radius_cui(struct wpa_authenticator * wpa_auth,const u8 * sta_addr,const u8 ** buf)731 wpa_ft_get_radius_cui(struct wpa_authenticator *wpa_auth, const u8 *sta_addr,
732 const u8 **buf)
733 {
734 *buf = NULL;
735 if (!wpa_auth->cb->get_radius_cui)
736 return 0;
737 return wpa_auth->cb->get_radius_cui(wpa_auth->cb_ctx, sta_addr, buf);
738 }
739
740
741 static void
wpa_ft_set_session_timeout(struct wpa_authenticator * wpa_auth,const u8 * sta_addr,int session_timeout)742 wpa_ft_set_session_timeout(struct wpa_authenticator *wpa_auth,
743 const u8 *sta_addr, int session_timeout)
744 {
745 if (!wpa_auth->cb->set_session_timeout)
746 return;
747 wpa_auth->cb->set_session_timeout(wpa_auth->cb_ctx, sta_addr,
748 session_timeout);
749 }
750
751
752 static int
wpa_ft_get_session_timeout(struct wpa_authenticator * wpa_auth,const u8 * sta_addr)753 wpa_ft_get_session_timeout(struct wpa_authenticator *wpa_auth,
754 const u8 *sta_addr)
755 {
756 if (!wpa_auth->cb->get_session_timeout)
757 return 0;
758 return wpa_auth->cb->get_session_timeout(wpa_auth->cb_ctx, sta_addr);
759 }
760
761
wpa_ft_add_tspec(struct wpa_authenticator * wpa_auth,const u8 * sta_addr,u8 * tspec_ie,size_t tspec_ielen)762 static int wpa_ft_add_tspec(struct wpa_authenticator *wpa_auth,
763 const u8 *sta_addr,
764 u8 *tspec_ie, size_t tspec_ielen)
765 {
766 if (wpa_auth->cb->add_tspec == NULL) {
767 wpa_printf(MSG_DEBUG, "FT: add_tspec is not initialized");
768 return -1;
769 }
770 return wpa_auth->cb->add_tspec(wpa_auth->cb_ctx, sta_addr, tspec_ie,
771 tspec_ielen);
772 }
773
774
775 #ifdef CONFIG_OCV
wpa_channel_info(struct wpa_authenticator * wpa_auth,struct wpa_channel_info * ci)776 static int wpa_channel_info(struct wpa_authenticator *wpa_auth,
777 struct wpa_channel_info *ci)
778 {
779 if (!wpa_auth->cb->channel_info)
780 return -1;
781 return wpa_auth->cb->channel_info(wpa_auth->cb_ctx, ci);
782 }
783 #endif /* CONFIG_OCV */
784
785
wpa_write_mdie(struct wpa_auth_config * conf,u8 * buf,size_t len)786 int wpa_write_mdie(struct wpa_auth_config *conf, u8 *buf, size_t len)
787 {
788 u8 *pos = buf;
789 u8 capab;
790 if (len < 2 + sizeof(struct rsn_mdie))
791 return -1;
792
793 *pos++ = WLAN_EID_MOBILITY_DOMAIN;
794 *pos++ = MOBILITY_DOMAIN_ID_LEN + 1;
795 os_memcpy(pos, conf->mobility_domain, MOBILITY_DOMAIN_ID_LEN);
796 pos += MOBILITY_DOMAIN_ID_LEN;
797 capab = 0;
798 if (conf->ft_over_ds)
799 capab |= RSN_FT_CAPAB_FT_OVER_DS;
800 *pos++ = capab;
801
802 return pos - buf;
803 }
804
805
wpa_write_ftie(struct wpa_auth_config * conf,int use_sha384,const u8 * r0kh_id,size_t r0kh_id_len,const u8 * anonce,const u8 * snonce,u8 * buf,size_t len,const u8 * subelem,size_t subelem_len)806 int wpa_write_ftie(struct wpa_auth_config *conf, int use_sha384,
807 const u8 *r0kh_id, size_t r0kh_id_len,
808 const u8 *anonce, const u8 *snonce,
809 u8 *buf, size_t len, const u8 *subelem,
810 size_t subelem_len)
811 {
812 u8 *pos = buf, *ielen;
813 size_t hdrlen = use_sha384 ? sizeof(struct rsn_ftie_sha384) :
814 sizeof(struct rsn_ftie);
815
816 if (len < 2 + hdrlen + 2 + FT_R1KH_ID_LEN + 2 + r0kh_id_len +
817 subelem_len)
818 return -1;
819
820 *pos++ = WLAN_EID_FAST_BSS_TRANSITION;
821 ielen = pos++;
822
823 if (use_sha384) {
824 struct rsn_ftie_sha384 *hdr = (struct rsn_ftie_sha384 *) pos;
825
826 os_memset(hdr, 0, sizeof(*hdr));
827 pos += sizeof(*hdr);
828 WPA_PUT_LE16(hdr->mic_control, 0);
829 if (anonce)
830 os_memcpy(hdr->anonce, anonce, WPA_NONCE_LEN);
831 if (snonce)
832 os_memcpy(hdr->snonce, snonce, WPA_NONCE_LEN);
833 } else {
834 struct rsn_ftie *hdr = (struct rsn_ftie *) pos;
835
836 os_memset(hdr, 0, sizeof(*hdr));
837 pos += sizeof(*hdr);
838 WPA_PUT_LE16(hdr->mic_control, 0);
839 if (anonce)
840 os_memcpy(hdr->anonce, anonce, WPA_NONCE_LEN);
841 if (snonce)
842 os_memcpy(hdr->snonce, snonce, WPA_NONCE_LEN);
843 }
844
845 /* Optional Parameters */
846 *pos++ = FTIE_SUBELEM_R1KH_ID;
847 *pos++ = FT_R1KH_ID_LEN;
848 os_memcpy(pos, conf->r1_key_holder, FT_R1KH_ID_LEN);
849 pos += FT_R1KH_ID_LEN;
850
851 if (r0kh_id) {
852 *pos++ = FTIE_SUBELEM_R0KH_ID;
853 *pos++ = r0kh_id_len;
854 os_memcpy(pos, r0kh_id, r0kh_id_len);
855 pos += r0kh_id_len;
856 }
857
858 if (subelem) {
859 os_memcpy(pos, subelem, subelem_len);
860 pos += subelem_len;
861 }
862
863 *ielen = pos - buf - 2;
864
865 return pos - buf;
866 }
867
868
869 /* A packet to be handled after seq response */
870 struct ft_remote_item {
871 struct dl_list list;
872
873 u8 nonce[FT_RRB_NONCE_LEN];
874 struct os_reltime nonce_ts;
875
876 u8 src_addr[ETH_ALEN];
877 u8 *enc;
878 size_t enc_len;
879 u8 *auth;
880 size_t auth_len;
881 int (*cb)(struct wpa_authenticator *wpa_auth,
882 const u8 *src_addr,
883 const u8 *enc, size_t enc_len,
884 const u8 *auth, size_t auth_len,
885 int no_defer);
886 };
887
888
wpa_ft_rrb_seq_free(struct ft_remote_item * item)889 static void wpa_ft_rrb_seq_free(struct ft_remote_item *item)
890 {
891 eloop_cancel_timeout(wpa_ft_rrb_seq_timeout, ELOOP_ALL_CTX, item);
892 dl_list_del(&item->list);
893 bin_clear_free(item->enc, item->enc_len);
894 os_free(item->auth);
895 os_free(item);
896 }
897
898
wpa_ft_rrb_seq_flush(struct wpa_authenticator * wpa_auth,struct ft_remote_seq * rkh_seq,int cb)899 static void wpa_ft_rrb_seq_flush(struct wpa_authenticator *wpa_auth,
900 struct ft_remote_seq *rkh_seq, int cb)
901 {
902 struct ft_remote_item *item, *n;
903
904 dl_list_for_each_safe(item, n, &rkh_seq->rx.queue,
905 struct ft_remote_item, list) {
906 if (cb && item->cb)
907 item->cb(wpa_auth, item->src_addr, item->enc,
908 item->enc_len, item->auth, item->auth_len, 1);
909 wpa_ft_rrb_seq_free(item);
910 }
911 }
912
913
wpa_ft_rrb_seq_timeout(void * eloop_ctx,void * timeout_ctx)914 static void wpa_ft_rrb_seq_timeout(void *eloop_ctx, void *timeout_ctx)
915 {
916 struct ft_remote_item *item = timeout_ctx;
917
918 wpa_ft_rrb_seq_free(item);
919 }
920
921
922 static int
wpa_ft_rrb_seq_req(struct wpa_authenticator * wpa_auth,struct ft_remote_seq * rkh_seq,const u8 * src_addr,const u8 * f_r0kh_id,size_t f_r0kh_id_len,const u8 * f_r1kh_id,const u8 * key,size_t key_len,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,int (* cb)(struct wpa_authenticator * wpa_auth,const u8 * src_addr,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,int no_defer))923 wpa_ft_rrb_seq_req(struct wpa_authenticator *wpa_auth,
924 struct ft_remote_seq *rkh_seq, const u8 *src_addr,
925 const u8 *f_r0kh_id, size_t f_r0kh_id_len,
926 const u8 *f_r1kh_id, const u8 *key, size_t key_len,
927 const u8 *enc, size_t enc_len,
928 const u8 *auth, size_t auth_len,
929 int (*cb)(struct wpa_authenticator *wpa_auth,
930 const u8 *src_addr,
931 const u8 *enc, size_t enc_len,
932 const u8 *auth, size_t auth_len,
933 int no_defer))
934 {
935 struct ft_remote_item *item = NULL;
936 u8 *packet = NULL;
937 size_t packet_len;
938 struct tlv_list seq_req_auth[] = {
939 { .type = FT_RRB_NONCE, .len = FT_RRB_NONCE_LEN,
940 .data = NULL /* to be filled: item->nonce */ },
941 { .type = FT_RRB_R0KH_ID, .len = f_r0kh_id_len,
942 .data = f_r0kh_id },
943 { .type = FT_RRB_R1KH_ID, .len = FT_R1KH_ID_LEN,
944 .data = f_r1kh_id },
945 { .type = FT_RRB_LAST_EMPTY, .len = 0, .data = NULL },
946 };
947
948 if (dl_list_len(&rkh_seq->rx.queue) >= ftRRBmaxQueueLen) {
949 wpa_printf(MSG_DEBUG, "FT: Sequence number queue too long");
950 goto err;
951 }
952
953 wpa_printf(MSG_DEBUG, "FT: Send out sequence number request to " MACSTR,
954 MAC2STR(src_addr));
955 item = os_zalloc(sizeof(*item));
956 if (!item)
957 goto err;
958
959 os_memcpy(item->src_addr, src_addr, ETH_ALEN);
960 item->cb = cb;
961
962 if (random_get_bytes(item->nonce, FT_RRB_NONCE_LEN) < 0) {
963 wpa_printf(MSG_DEBUG, "FT: Seq num nonce: out of random bytes");
964 goto err;
965 }
966
967 if (os_get_reltime(&item->nonce_ts) < 0)
968 goto err;
969
970 if (enc && enc_len > 0) {
971 item->enc = os_memdup(enc, enc_len);
972 item->enc_len = enc_len;
973 if (!item->enc)
974 goto err;
975 }
976
977 if (auth && auth_len > 0) {
978 item->auth = os_memdup(auth, auth_len);
979 item->auth_len = auth_len;
980 if (!item->auth)
981 goto err;
982 }
983
984 eloop_register_timeout(ftRRBseqTimeout, 0, wpa_ft_rrb_seq_timeout,
985 wpa_auth, item);
986
987 seq_req_auth[0].data = item->nonce;
988
989 if (wpa_ft_rrb_build(key, key_len, NULL, NULL, seq_req_auth, NULL,
990 wpa_auth->addr, FT_PACKET_R0KH_R1KH_SEQ_REQ,
991 &packet, &packet_len) < 0) {
992 item = NULL; /* some other seq resp might still accept this */
993 goto err;
994 }
995
996 dl_list_add(&rkh_seq->rx.queue, &item->list);
997
998 wpa_ft_rrb_oui_send(wpa_auth, src_addr, FT_PACKET_R0KH_R1KH_SEQ_REQ,
999 packet, packet_len);
1000
1001 os_free(packet);
1002
1003 return 0;
1004 err:
1005 wpa_printf(MSG_DEBUG, "FT: Failed to send sequence number request");
1006 if (item) {
1007 os_free(item->auth);
1008 bin_clear_free(item->enc, item->enc_len);
1009 os_free(item);
1010 }
1011
1012 return -1;
1013 }
1014
1015
1016 #define FT_RRB_SEQ_OK 0
1017 #define FT_RRB_SEQ_DROP 1
1018 #define FT_RRB_SEQ_DEFER 2
1019
1020 static int
wpa_ft_rrb_seq_chk(struct ft_remote_seq * rkh_seq,const u8 * src_addr,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,const char * msgtype,int no_defer)1021 wpa_ft_rrb_seq_chk(struct ft_remote_seq *rkh_seq, const u8 *src_addr,
1022 const u8 *enc, size_t enc_len,
1023 const u8 *auth, size_t auth_len,
1024 const char *msgtype, int no_defer)
1025 {
1026 const u8 *f_seq;
1027 size_t f_seq_len;
1028 const struct ft_rrb_seq *msg_both;
1029 u32 msg_seq, msg_off, rkh_off;
1030 struct os_reltime now;
1031 unsigned int i;
1032
1033 RRB_GET_AUTH(FT_RRB_SEQ, seq, msgtype, sizeof(*msg_both));
1034 wpa_hexdump(MSG_DEBUG, "FT: sequence number", f_seq, f_seq_len);
1035 msg_both = (const struct ft_rrb_seq *) f_seq;
1036
1037 if (rkh_seq->rx.num_last == 0) {
1038 /* first packet from remote */
1039 goto defer;
1040 }
1041
1042 if (le_to_host32(msg_both->dom) != rkh_seq->rx.dom) {
1043 /* remote might have rebooted */
1044 goto defer;
1045 }
1046
1047 if (os_get_reltime(&now) == 0) {
1048 u32 msg_ts_now_remote, msg_ts_off;
1049 struct os_reltime now_remote;
1050
1051 os_reltime_sub(&now, &rkh_seq->rx.time_offset, &now_remote);
1052 msg_ts_now_remote = now_remote.sec;
1053 msg_ts_off = le_to_host32(msg_both->ts) -
1054 (msg_ts_now_remote - ftRRBseqTimeout);
1055 if (msg_ts_off > 2 * ftRRBseqTimeout)
1056 goto defer;
1057 }
1058
1059 msg_seq = le_to_host32(msg_both->seq);
1060 rkh_off = rkh_seq->rx.last[rkh_seq->rx.offsetidx];
1061 msg_off = msg_seq - rkh_off;
1062 if (msg_off > 0xC0000000)
1063 goto out; /* too old message, drop it */
1064
1065 if (msg_off <= 0x40000000) {
1066 for (i = 0; i < rkh_seq->rx.num_last; i++) {
1067 if (rkh_seq->rx.last[i] == msg_seq)
1068 goto out; /* duplicate message, drop it */
1069 }
1070
1071 return FT_RRB_SEQ_OK;
1072 }
1073
1074 defer:
1075 if (no_defer)
1076 goto out;
1077
1078 wpa_printf(MSG_DEBUG, "FT: Possibly invalid sequence number in %s from "
1079 MACSTR, msgtype, MAC2STR(src_addr));
1080
1081 return FT_RRB_SEQ_DEFER;
1082 out:
1083 wpa_printf(MSG_DEBUG, "FT: Invalid sequence number in %s from " MACSTR,
1084 msgtype, MAC2STR(src_addr));
1085
1086 return FT_RRB_SEQ_DROP;
1087 }
1088
1089
1090 static void
wpa_ft_rrb_seq_accept(struct wpa_authenticator * wpa_auth,struct ft_remote_seq * rkh_seq,const u8 * src_addr,const u8 * auth,size_t auth_len,const char * msgtype)1091 wpa_ft_rrb_seq_accept(struct wpa_authenticator *wpa_auth,
1092 struct ft_remote_seq *rkh_seq, const u8 *src_addr,
1093 const u8 *auth, size_t auth_len,
1094 const char *msgtype)
1095 {
1096 const u8 *f_seq;
1097 size_t f_seq_len;
1098 const struct ft_rrb_seq *msg_both;
1099 u32 msg_seq, msg_off, min_off, rkh_off;
1100 int minidx = 0;
1101 unsigned int i;
1102
1103 RRB_GET_AUTH(FT_RRB_SEQ, seq, msgtype, sizeof(*msg_both));
1104 msg_both = (const struct ft_rrb_seq *) f_seq;
1105
1106 msg_seq = le_to_host32(msg_both->seq);
1107
1108 if (rkh_seq->rx.num_last < FT_REMOTE_SEQ_BACKLOG) {
1109 rkh_seq->rx.last[rkh_seq->rx.num_last] = msg_seq;
1110 rkh_seq->rx.num_last++;
1111 return;
1112 }
1113
1114 rkh_off = rkh_seq->rx.last[rkh_seq->rx.offsetidx];
1115 for (i = 0; i < rkh_seq->rx.num_last; i++) {
1116 msg_off = rkh_seq->rx.last[i] - rkh_off;
1117 min_off = rkh_seq->rx.last[minidx] - rkh_off;
1118 if (msg_off < min_off && i != rkh_seq->rx.offsetidx)
1119 minidx = i;
1120 }
1121 rkh_seq->rx.last[rkh_seq->rx.offsetidx] = msg_seq;
1122 rkh_seq->rx.offsetidx = minidx;
1123
1124 return;
1125 out:
1126 /* RRB_GET_AUTH should never fail here as
1127 * wpa_ft_rrb_seq_chk() verified FT_RRB_SEQ presence. */
1128 wpa_printf(MSG_ERROR, "FT: %s() failed", __func__);
1129 }
1130
1131
wpa_ft_new_seq(struct ft_remote_seq * rkh_seq,struct ft_rrb_seq * f_seq)1132 static int wpa_ft_new_seq(struct ft_remote_seq *rkh_seq,
1133 struct ft_rrb_seq *f_seq)
1134 {
1135 struct os_reltime now;
1136
1137 if (os_get_reltime(&now) < 0)
1138 return -1;
1139
1140 if (!rkh_seq->tx.dom) {
1141 if (random_get_bytes((u8 *) &rkh_seq->tx.seq,
1142 sizeof(rkh_seq->tx.seq))) {
1143 wpa_printf(MSG_ERROR,
1144 "FT: Failed to get random data for sequence number initialization");
1145 rkh_seq->tx.seq = now.usec;
1146 }
1147 if (random_get_bytes((u8 *) &rkh_seq->tx.dom,
1148 sizeof(rkh_seq->tx.dom))) {
1149 wpa_printf(MSG_ERROR,
1150 "FT: Failed to get random data for sequence number initialization");
1151 rkh_seq->tx.dom = now.usec;
1152 }
1153 rkh_seq->tx.dom |= 1;
1154 }
1155
1156 f_seq->dom = host_to_le32(rkh_seq->tx.dom);
1157 f_seq->seq = host_to_le32(rkh_seq->tx.seq);
1158 f_seq->ts = host_to_le32(now.sec);
1159
1160 rkh_seq->tx.seq++;
1161
1162 return 0;
1163 }
1164
1165
1166 struct wpa_ft_pmk_r0_sa {
1167 struct dl_list list;
1168 u8 pmk_r0[PMK_LEN_MAX];
1169 size_t pmk_r0_len;
1170 u8 pmk_r0_name[WPA_PMK_NAME_LEN];
1171 u8 spa[ETH_ALEN];
1172 int pairwise; /* Pairwise cipher suite, WPA_CIPHER_* */
1173 struct vlan_description *vlan;
1174 os_time_t expiration; /* 0 for no expiration */
1175 u8 *identity;
1176 size_t identity_len;
1177 u8 *radius_cui;
1178 size_t radius_cui_len;
1179 os_time_t session_timeout; /* 0 for no expiration */
1180 /* TODO: radius_class, EAP type */
1181 int pmk_r1_pushed;
1182 };
1183
1184 struct wpa_ft_pmk_r1_sa {
1185 struct dl_list list;
1186 u8 pmk_r1[PMK_LEN_MAX];
1187 size_t pmk_r1_len;
1188 u8 pmk_r1_name[WPA_PMK_NAME_LEN];
1189 u8 spa[ETH_ALEN];
1190 int pairwise; /* Pairwise cipher suite, WPA_CIPHER_* */
1191 struct vlan_description *vlan;
1192 u8 *identity;
1193 size_t identity_len;
1194 u8 *radius_cui;
1195 size_t radius_cui_len;
1196 os_time_t session_timeout; /* 0 for no expiration */
1197 /* TODO: radius_class, EAP type */
1198 };
1199
1200 struct wpa_ft_pmk_cache {
1201 struct dl_list pmk_r0; /* struct wpa_ft_pmk_r0_sa */
1202 struct dl_list pmk_r1; /* struct wpa_ft_pmk_r1_sa */
1203 };
1204
1205
1206 static void wpa_ft_expire_pmk_r0(void *eloop_ctx, void *timeout_ctx);
1207 static void wpa_ft_expire_pmk_r1(void *eloop_ctx, void *timeout_ctx);
1208
1209
wpa_ft_free_pmk_r0(struct wpa_ft_pmk_r0_sa * r0)1210 static void wpa_ft_free_pmk_r0(struct wpa_ft_pmk_r0_sa *r0)
1211 {
1212 if (!r0)
1213 return;
1214
1215 dl_list_del(&r0->list);
1216 eloop_cancel_timeout(wpa_ft_expire_pmk_r0, r0, NULL);
1217
1218 os_memset(r0->pmk_r0, 0, PMK_LEN_MAX);
1219 os_free(r0->vlan);
1220 os_free(r0->identity);
1221 os_free(r0->radius_cui);
1222 os_free(r0);
1223 }
1224
1225
wpa_ft_expire_pmk_r0(void * eloop_ctx,void * timeout_ctx)1226 static void wpa_ft_expire_pmk_r0(void *eloop_ctx, void *timeout_ctx)
1227 {
1228 struct wpa_ft_pmk_r0_sa *r0 = eloop_ctx;
1229 struct os_reltime now;
1230 int expires_in;
1231 int session_timeout;
1232
1233 os_get_reltime(&now);
1234
1235 if (!r0)
1236 return;
1237
1238 expires_in = r0->expiration - now.sec;
1239 session_timeout = r0->session_timeout - now.sec;
1240 /* conditions to remove from cache:
1241 * a) r0->expiration is set and hit
1242 * -or-
1243 * b) r0->session_timeout is set and hit
1244 */
1245 if ((!r0->expiration || expires_in > 0) &&
1246 (!r0->session_timeout || session_timeout > 0)) {
1247 wpa_printf(MSG_ERROR,
1248 "FT: %s() called for non-expired entry %p",
1249 __func__, r0);
1250 eloop_cancel_timeout(wpa_ft_expire_pmk_r0, r0, NULL);
1251 if (r0->expiration && expires_in > 0)
1252 eloop_register_timeout(expires_in + 1, 0,
1253 wpa_ft_expire_pmk_r0, r0, NULL);
1254 if (r0->session_timeout && session_timeout > 0)
1255 eloop_register_timeout(session_timeout + 1, 0,
1256 wpa_ft_expire_pmk_r0, r0, NULL);
1257 return;
1258 }
1259
1260 wpa_ft_free_pmk_r0(r0);
1261 }
1262
1263
wpa_ft_free_pmk_r1(struct wpa_ft_pmk_r1_sa * r1)1264 static void wpa_ft_free_pmk_r1(struct wpa_ft_pmk_r1_sa *r1)
1265 {
1266 if (!r1)
1267 return;
1268
1269 dl_list_del(&r1->list);
1270 eloop_cancel_timeout(wpa_ft_expire_pmk_r1, r1, NULL);
1271
1272 os_memset(r1->pmk_r1, 0, PMK_LEN_MAX);
1273 os_free(r1->vlan);
1274 os_free(r1->identity);
1275 os_free(r1->radius_cui);
1276 os_free(r1);
1277 }
1278
1279
wpa_ft_expire_pmk_r1(void * eloop_ctx,void * timeout_ctx)1280 static void wpa_ft_expire_pmk_r1(void *eloop_ctx, void *timeout_ctx)
1281 {
1282 struct wpa_ft_pmk_r1_sa *r1 = eloop_ctx;
1283
1284 wpa_ft_free_pmk_r1(r1);
1285 }
1286
1287
wpa_ft_pmk_cache_init(void)1288 struct wpa_ft_pmk_cache * wpa_ft_pmk_cache_init(void)
1289 {
1290 struct wpa_ft_pmk_cache *cache;
1291
1292 cache = os_zalloc(sizeof(*cache));
1293 if (cache) {
1294 dl_list_init(&cache->pmk_r0);
1295 dl_list_init(&cache->pmk_r1);
1296 }
1297
1298 return cache;
1299 }
1300
1301
wpa_ft_pmk_cache_deinit(struct wpa_ft_pmk_cache * cache)1302 void wpa_ft_pmk_cache_deinit(struct wpa_ft_pmk_cache *cache)
1303 {
1304 struct wpa_ft_pmk_r0_sa *r0, *r0prev;
1305 struct wpa_ft_pmk_r1_sa *r1, *r1prev;
1306
1307 dl_list_for_each_safe(r0, r0prev, &cache->pmk_r0,
1308 struct wpa_ft_pmk_r0_sa, list)
1309 wpa_ft_free_pmk_r0(r0);
1310
1311 dl_list_for_each_safe(r1, r1prev, &cache->pmk_r1,
1312 struct wpa_ft_pmk_r1_sa, list)
1313 wpa_ft_free_pmk_r1(r1);
1314
1315 os_free(cache);
1316 }
1317
1318
wpa_ft_store_pmk_r0(struct wpa_authenticator * wpa_auth,const u8 * spa,const u8 * pmk_r0,size_t pmk_r0_len,const u8 * pmk_r0_name,int pairwise,const struct vlan_description * vlan,int expires_in,int session_timeout,const u8 * identity,size_t identity_len,const u8 * radius_cui,size_t radius_cui_len)1319 static int wpa_ft_store_pmk_r0(struct wpa_authenticator *wpa_auth,
1320 const u8 *spa, const u8 *pmk_r0,
1321 size_t pmk_r0_len,
1322 const u8 *pmk_r0_name, int pairwise,
1323 const struct vlan_description *vlan,
1324 int expires_in, int session_timeout,
1325 const u8 *identity, size_t identity_len,
1326 const u8 *radius_cui, size_t radius_cui_len)
1327 {
1328 struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache;
1329 struct wpa_ft_pmk_r0_sa *r0;
1330 struct os_reltime now;
1331
1332 /* TODO: add limit on number of entries in cache */
1333 os_get_reltime(&now);
1334
1335 r0 = os_zalloc(sizeof(*r0));
1336 if (r0 == NULL)
1337 return -1;
1338
1339 os_memcpy(r0->pmk_r0, pmk_r0, pmk_r0_len);
1340 r0->pmk_r0_len = pmk_r0_len;
1341 os_memcpy(r0->pmk_r0_name, pmk_r0_name, WPA_PMK_NAME_LEN);
1342 os_memcpy(r0->spa, spa, ETH_ALEN);
1343 r0->pairwise = pairwise;
1344 if (expires_in > 0)
1345 r0->expiration = now.sec + expires_in;
1346 if (vlan && vlan->notempty) {
1347 r0->vlan = os_zalloc(sizeof(*vlan));
1348 if (!r0->vlan) {
1349 bin_clear_free(r0, sizeof(*r0));
1350 return -1;
1351 }
1352 *r0->vlan = *vlan;
1353 }
1354 if (identity) {
1355 r0->identity = os_malloc(identity_len);
1356 if (r0->identity) {
1357 os_memcpy(r0->identity, identity, identity_len);
1358 r0->identity_len = identity_len;
1359 }
1360 }
1361 if (radius_cui) {
1362 r0->radius_cui = os_malloc(radius_cui_len);
1363 if (r0->radius_cui) {
1364 os_memcpy(r0->radius_cui, radius_cui, radius_cui_len);
1365 r0->radius_cui_len = radius_cui_len;
1366 }
1367 }
1368 if (session_timeout > 0)
1369 r0->session_timeout = now.sec + session_timeout;
1370
1371 dl_list_add(&cache->pmk_r0, &r0->list);
1372 if (expires_in > 0)
1373 eloop_register_timeout(expires_in + 1, 0, wpa_ft_expire_pmk_r0,
1374 r0, NULL);
1375 if (session_timeout > 0)
1376 eloop_register_timeout(session_timeout + 1, 0,
1377 wpa_ft_expire_pmk_r0, r0, NULL);
1378
1379 return 0;
1380 }
1381
1382
wpa_ft_fetch_pmk_r0(struct wpa_authenticator * wpa_auth,const u8 * spa,const u8 * pmk_r0_name,const struct wpa_ft_pmk_r0_sa ** r0_out)1383 static int wpa_ft_fetch_pmk_r0(struct wpa_authenticator *wpa_auth,
1384 const u8 *spa, const u8 *pmk_r0_name,
1385 const struct wpa_ft_pmk_r0_sa **r0_out)
1386 {
1387 struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache;
1388 struct wpa_ft_pmk_r0_sa *r0;
1389 struct os_reltime now;
1390
1391 os_get_reltime(&now);
1392 dl_list_for_each(r0, &cache->pmk_r0, struct wpa_ft_pmk_r0_sa, list) {
1393 if (os_memcmp(r0->spa, spa, ETH_ALEN) == 0 &&
1394 os_memcmp_const(r0->pmk_r0_name, pmk_r0_name,
1395 WPA_PMK_NAME_LEN) == 0) {
1396 *r0_out = r0;
1397 return 0;
1398 }
1399 }
1400
1401 *r0_out = NULL;
1402 return -1;
1403 }
1404
1405
wpa_ft_store_pmk_r1(struct wpa_authenticator * wpa_auth,const u8 * spa,const u8 * pmk_r1,size_t pmk_r1_len,const u8 * pmk_r1_name,int pairwise,const struct vlan_description * vlan,int expires_in,int session_timeout,const u8 * identity,size_t identity_len,const u8 * radius_cui,size_t radius_cui_len)1406 static int wpa_ft_store_pmk_r1(struct wpa_authenticator *wpa_auth,
1407 const u8 *spa, const u8 *pmk_r1,
1408 size_t pmk_r1_len,
1409 const u8 *pmk_r1_name, int pairwise,
1410 const struct vlan_description *vlan,
1411 int expires_in, int session_timeout,
1412 const u8 *identity, size_t identity_len,
1413 const u8 *radius_cui, size_t radius_cui_len)
1414 {
1415 struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache;
1416 int max_expires_in = wpa_auth->conf.r1_max_key_lifetime;
1417 struct wpa_ft_pmk_r1_sa *r1;
1418 struct os_reltime now;
1419
1420 /* TODO: limit on number of entries in cache */
1421 os_get_reltime(&now);
1422
1423 if (max_expires_in && (max_expires_in < expires_in || expires_in == 0))
1424 expires_in = max_expires_in;
1425
1426 r1 = os_zalloc(sizeof(*r1));
1427 if (r1 == NULL)
1428 return -1;
1429
1430 os_memcpy(r1->pmk_r1, pmk_r1, pmk_r1_len);
1431 r1->pmk_r1_len = pmk_r1_len;
1432 os_memcpy(r1->pmk_r1_name, pmk_r1_name, WPA_PMK_NAME_LEN);
1433 os_memcpy(r1->spa, spa, ETH_ALEN);
1434 r1->pairwise = pairwise;
1435 if (vlan && vlan->notempty) {
1436 r1->vlan = os_zalloc(sizeof(*vlan));
1437 if (!r1->vlan) {
1438 bin_clear_free(r1, sizeof(*r1));
1439 return -1;
1440 }
1441 *r1->vlan = *vlan;
1442 }
1443 if (identity) {
1444 r1->identity = os_malloc(identity_len);
1445 if (r1->identity) {
1446 os_memcpy(r1->identity, identity, identity_len);
1447 r1->identity_len = identity_len;
1448 }
1449 }
1450 if (radius_cui) {
1451 r1->radius_cui = os_malloc(radius_cui_len);
1452 if (r1->radius_cui) {
1453 os_memcpy(r1->radius_cui, radius_cui, radius_cui_len);
1454 r1->radius_cui_len = radius_cui_len;
1455 }
1456 }
1457 if (session_timeout > 0)
1458 r1->session_timeout = now.sec + session_timeout;
1459
1460 dl_list_add(&cache->pmk_r1, &r1->list);
1461
1462 if (expires_in > 0)
1463 eloop_register_timeout(expires_in + 1, 0, wpa_ft_expire_pmk_r1,
1464 r1, NULL);
1465 if (session_timeout > 0)
1466 eloop_register_timeout(session_timeout + 1, 0,
1467 wpa_ft_expire_pmk_r1, r1, NULL);
1468
1469 return 0;
1470 }
1471
1472
wpa_ft_fetch_pmk_r1(struct wpa_authenticator * wpa_auth,const u8 * spa,const u8 * pmk_r1_name,u8 * pmk_r1,size_t * pmk_r1_len,int * pairwise,struct vlan_description * vlan,const u8 ** identity,size_t * identity_len,const u8 ** radius_cui,size_t * radius_cui_len,int * session_timeout)1473 static int wpa_ft_fetch_pmk_r1(struct wpa_authenticator *wpa_auth,
1474 const u8 *spa, const u8 *pmk_r1_name,
1475 u8 *pmk_r1, size_t *pmk_r1_len, int *pairwise,
1476 struct vlan_description *vlan,
1477 const u8 **identity, size_t *identity_len,
1478 const u8 **radius_cui, size_t *radius_cui_len,
1479 int *session_timeout)
1480 {
1481 struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache;
1482 struct wpa_ft_pmk_r1_sa *r1;
1483 struct os_reltime now;
1484
1485 os_get_reltime(&now);
1486
1487 dl_list_for_each(r1, &cache->pmk_r1, struct wpa_ft_pmk_r1_sa, list) {
1488 if (os_memcmp(r1->spa, spa, ETH_ALEN) == 0 &&
1489 os_memcmp_const(r1->pmk_r1_name, pmk_r1_name,
1490 WPA_PMK_NAME_LEN) == 0) {
1491 os_memcpy(pmk_r1, r1->pmk_r1, r1->pmk_r1_len);
1492 *pmk_r1_len = r1->pmk_r1_len;
1493 if (pairwise)
1494 *pairwise = r1->pairwise;
1495 if (vlan && r1->vlan)
1496 *vlan = *r1->vlan;
1497 if (vlan && !r1->vlan)
1498 os_memset(vlan, 0, sizeof(*vlan));
1499 if (identity && identity_len) {
1500 *identity = r1->identity;
1501 *identity_len = r1->identity_len;
1502 }
1503 if (radius_cui && radius_cui_len) {
1504 *radius_cui = r1->radius_cui;
1505 *radius_cui_len = r1->radius_cui_len;
1506 }
1507 if (session_timeout && r1->session_timeout > now.sec)
1508 *session_timeout = r1->session_timeout -
1509 now.sec;
1510 else if (session_timeout && r1->session_timeout)
1511 *session_timeout = 1;
1512 else if (session_timeout)
1513 *session_timeout = 0;
1514 return 0;
1515 }
1516 }
1517
1518 return -1;
1519 }
1520
1521
wpa_ft_rrb_init_r0kh_seq(struct ft_remote_r0kh * r0kh)1522 static int wpa_ft_rrb_init_r0kh_seq(struct ft_remote_r0kh *r0kh)
1523 {
1524 if (r0kh->seq)
1525 return 0;
1526
1527 r0kh->seq = os_zalloc(sizeof(*r0kh->seq));
1528 if (!r0kh->seq) {
1529 wpa_printf(MSG_DEBUG, "FT: Failed to allocate r0kh->seq");
1530 return -1;
1531 }
1532
1533 dl_list_init(&r0kh->seq->rx.queue);
1534
1535 return 0;
1536 }
1537
1538
wpa_ft_rrb_lookup_r0kh(struct wpa_authenticator * wpa_auth,const u8 * f_r0kh_id,size_t f_r0kh_id_len,struct ft_remote_r0kh ** r0kh_out,struct ft_remote_r0kh ** r0kh_wildcard)1539 static void wpa_ft_rrb_lookup_r0kh(struct wpa_authenticator *wpa_auth,
1540 const u8 *f_r0kh_id, size_t f_r0kh_id_len,
1541 struct ft_remote_r0kh **r0kh_out,
1542 struct ft_remote_r0kh **r0kh_wildcard)
1543 {
1544 struct ft_remote_r0kh *r0kh;
1545
1546 *r0kh_wildcard = NULL;
1547 *r0kh_out = NULL;
1548
1549 if (wpa_auth->conf.r0kh_list)
1550 r0kh = *wpa_auth->conf.r0kh_list;
1551 else
1552 r0kh = NULL;
1553 for (; r0kh; r0kh = r0kh->next) {
1554 if (r0kh->id_len == 1 && r0kh->id[0] == '*')
1555 *r0kh_wildcard = r0kh;
1556 if (f_r0kh_id && r0kh->id_len == f_r0kh_id_len &&
1557 os_memcmp_const(f_r0kh_id, r0kh->id, f_r0kh_id_len) == 0)
1558 *r0kh_out = r0kh;
1559 }
1560
1561 if (!*r0kh_out && !*r0kh_wildcard)
1562 wpa_printf(MSG_DEBUG, "FT: No matching R0KH found");
1563
1564 if (*r0kh_out && wpa_ft_rrb_init_r0kh_seq(*r0kh_out) < 0)
1565 *r0kh_out = NULL;
1566 }
1567
1568
wpa_ft_rrb_init_r1kh_seq(struct ft_remote_r1kh * r1kh)1569 static int wpa_ft_rrb_init_r1kh_seq(struct ft_remote_r1kh *r1kh)
1570 {
1571 if (r1kh->seq)
1572 return 0;
1573
1574 r1kh->seq = os_zalloc(sizeof(*r1kh->seq));
1575 if (!r1kh->seq) {
1576 wpa_printf(MSG_DEBUG, "FT: Failed to allocate r1kh->seq");
1577 return -1;
1578 }
1579
1580 dl_list_init(&r1kh->seq->rx.queue);
1581
1582 return 0;
1583 }
1584
1585
wpa_ft_rrb_lookup_r1kh(struct wpa_authenticator * wpa_auth,const u8 * f_r1kh_id,struct ft_remote_r1kh ** r1kh_out,struct ft_remote_r1kh ** r1kh_wildcard)1586 static void wpa_ft_rrb_lookup_r1kh(struct wpa_authenticator *wpa_auth,
1587 const u8 *f_r1kh_id,
1588 struct ft_remote_r1kh **r1kh_out,
1589 struct ft_remote_r1kh **r1kh_wildcard)
1590 {
1591 struct ft_remote_r1kh *r1kh;
1592
1593 *r1kh_wildcard = NULL;
1594 *r1kh_out = NULL;
1595
1596 if (wpa_auth->conf.r1kh_list)
1597 r1kh = *wpa_auth->conf.r1kh_list;
1598 else
1599 r1kh = NULL;
1600 for (; r1kh; r1kh = r1kh->next) {
1601 if (is_zero_ether_addr(r1kh->addr) &&
1602 is_zero_ether_addr(r1kh->id))
1603 *r1kh_wildcard = r1kh;
1604 if (f_r1kh_id &&
1605 os_memcmp_const(r1kh->id, f_r1kh_id, FT_R1KH_ID_LEN) == 0)
1606 *r1kh_out = r1kh;
1607 }
1608
1609 if (!*r1kh_out && !*r1kh_wildcard)
1610 wpa_printf(MSG_DEBUG, "FT: No matching R1KH found");
1611
1612 if (*r1kh_out && wpa_ft_rrb_init_r1kh_seq(*r1kh_out) < 0)
1613 *r1kh_out = NULL;
1614 }
1615
1616
wpa_ft_rrb_check_r0kh(struct wpa_authenticator * wpa_auth,const u8 * f_r0kh_id,size_t f_r0kh_id_len)1617 static int wpa_ft_rrb_check_r0kh(struct wpa_authenticator *wpa_auth,
1618 const u8 *f_r0kh_id, size_t f_r0kh_id_len)
1619 {
1620 if (f_r0kh_id_len != wpa_auth->conf.r0_key_holder_len ||
1621 os_memcmp_const(f_r0kh_id, wpa_auth->conf.r0_key_holder,
1622 f_r0kh_id_len) != 0)
1623 return -1;
1624
1625 return 0;
1626 }
1627
1628
wpa_ft_rrb_check_r1kh(struct wpa_authenticator * wpa_auth,const u8 * f_r1kh_id)1629 static int wpa_ft_rrb_check_r1kh(struct wpa_authenticator *wpa_auth,
1630 const u8 *f_r1kh_id)
1631 {
1632 if (os_memcmp_const(f_r1kh_id, wpa_auth->conf.r1_key_holder,
1633 FT_R1KH_ID_LEN) != 0)
1634 return -1;
1635
1636 return 0;
1637 }
1638
1639
wpa_ft_rrb_del_r0kh(void * eloop_ctx,void * timeout_ctx)1640 static void wpa_ft_rrb_del_r0kh(void *eloop_ctx, void *timeout_ctx)
1641 {
1642 struct wpa_authenticator *wpa_auth = eloop_ctx;
1643 struct ft_remote_r0kh *r0kh, *prev = NULL;
1644
1645 if (!wpa_auth->conf.r0kh_list)
1646 return;
1647
1648 for (r0kh = *wpa_auth->conf.r0kh_list; r0kh; r0kh = r0kh->next) {
1649 if (r0kh == timeout_ctx)
1650 break;
1651 prev = r0kh;
1652 }
1653 if (!r0kh)
1654 return;
1655 if (prev)
1656 prev->next = r0kh->next;
1657 else
1658 *wpa_auth->conf.r0kh_list = r0kh->next;
1659 if (r0kh->seq)
1660 wpa_ft_rrb_seq_flush(wpa_auth, r0kh->seq, 0);
1661 os_free(r0kh->seq);
1662 os_free(r0kh);
1663 }
1664
1665
wpa_ft_rrb_r0kh_replenish(struct wpa_authenticator * wpa_auth,struct ft_remote_r0kh * r0kh,int timeout)1666 static void wpa_ft_rrb_r0kh_replenish(struct wpa_authenticator *wpa_auth,
1667 struct ft_remote_r0kh *r0kh, int timeout)
1668 {
1669 if (timeout > 0)
1670 eloop_replenish_timeout(timeout, 0, wpa_ft_rrb_del_r0kh,
1671 wpa_auth, r0kh);
1672 }
1673
1674
wpa_ft_rrb_r0kh_timeout(struct wpa_authenticator * wpa_auth,struct ft_remote_r0kh * r0kh,int timeout)1675 static void wpa_ft_rrb_r0kh_timeout(struct wpa_authenticator *wpa_auth,
1676 struct ft_remote_r0kh *r0kh, int timeout)
1677 {
1678 eloop_cancel_timeout(wpa_ft_rrb_del_r0kh, wpa_auth, r0kh);
1679
1680 if (timeout > 0)
1681 eloop_register_timeout(timeout, 0, wpa_ft_rrb_del_r0kh,
1682 wpa_auth, r0kh);
1683 }
1684
1685
1686 static struct ft_remote_r0kh *
wpa_ft_rrb_add_r0kh(struct wpa_authenticator * wpa_auth,struct ft_remote_r0kh * r0kh_wildcard,const u8 * src_addr,const u8 * r0kh_id,size_t id_len,int timeout)1687 wpa_ft_rrb_add_r0kh(struct wpa_authenticator *wpa_auth,
1688 struct ft_remote_r0kh *r0kh_wildcard,
1689 const u8 *src_addr, const u8 *r0kh_id, size_t id_len,
1690 int timeout)
1691 {
1692 struct ft_remote_r0kh *r0kh;
1693
1694 if (!wpa_auth->conf.r0kh_list)
1695 return NULL;
1696
1697 r0kh = os_zalloc(sizeof(*r0kh));
1698 if (!r0kh)
1699 return NULL;
1700
1701 if (src_addr)
1702 os_memcpy(r0kh->addr, src_addr, sizeof(r0kh->addr));
1703
1704 if (id_len > FT_R0KH_ID_MAX_LEN)
1705 id_len = FT_R0KH_ID_MAX_LEN;
1706 os_memcpy(r0kh->id, r0kh_id, id_len);
1707 r0kh->id_len = id_len;
1708
1709 os_memcpy(r0kh->key, r0kh_wildcard->key, sizeof(r0kh->key));
1710
1711 r0kh->next = *wpa_auth->conf.r0kh_list;
1712 *wpa_auth->conf.r0kh_list = r0kh;
1713
1714 if (timeout > 0)
1715 eloop_register_timeout(timeout, 0, wpa_ft_rrb_del_r0kh,
1716 wpa_auth, r0kh);
1717
1718 if (wpa_ft_rrb_init_r0kh_seq(r0kh) < 0)
1719 return NULL;
1720
1721 return r0kh;
1722 }
1723
1724
wpa_ft_rrb_del_r1kh(void * eloop_ctx,void * timeout_ctx)1725 static void wpa_ft_rrb_del_r1kh(void *eloop_ctx, void *timeout_ctx)
1726 {
1727 struct wpa_authenticator *wpa_auth = eloop_ctx;
1728 struct ft_remote_r1kh *r1kh, *prev = NULL;
1729
1730 if (!wpa_auth->conf.r1kh_list)
1731 return;
1732
1733 for (r1kh = *wpa_auth->conf.r1kh_list; r1kh; r1kh = r1kh->next) {
1734 if (r1kh == timeout_ctx)
1735 break;
1736 prev = r1kh;
1737 }
1738 if (!r1kh)
1739 return;
1740 if (prev)
1741 prev->next = r1kh->next;
1742 else
1743 *wpa_auth->conf.r1kh_list = r1kh->next;
1744 if (r1kh->seq)
1745 wpa_ft_rrb_seq_flush(wpa_auth, r1kh->seq, 0);
1746 os_free(r1kh->seq);
1747 os_free(r1kh);
1748 }
1749
1750
wpa_ft_rrb_r1kh_replenish(struct wpa_authenticator * wpa_auth,struct ft_remote_r1kh * r1kh,int timeout)1751 static void wpa_ft_rrb_r1kh_replenish(struct wpa_authenticator *wpa_auth,
1752 struct ft_remote_r1kh *r1kh, int timeout)
1753 {
1754 if (timeout > 0)
1755 eloop_replenish_timeout(timeout, 0, wpa_ft_rrb_del_r1kh,
1756 wpa_auth, r1kh);
1757 }
1758
1759
1760 static struct ft_remote_r1kh *
wpa_ft_rrb_add_r1kh(struct wpa_authenticator * wpa_auth,struct ft_remote_r1kh * r1kh_wildcard,const u8 * src_addr,const u8 * r1kh_id,int timeout)1761 wpa_ft_rrb_add_r1kh(struct wpa_authenticator *wpa_auth,
1762 struct ft_remote_r1kh *r1kh_wildcard,
1763 const u8 *src_addr, const u8 *r1kh_id, int timeout)
1764 {
1765 struct ft_remote_r1kh *r1kh;
1766
1767 if (!wpa_auth->conf.r1kh_list)
1768 return NULL;
1769
1770 r1kh = os_zalloc(sizeof(*r1kh));
1771 if (!r1kh)
1772 return NULL;
1773
1774 os_memcpy(r1kh->addr, src_addr, sizeof(r1kh->addr));
1775 os_memcpy(r1kh->id, r1kh_id, sizeof(r1kh->id));
1776 os_memcpy(r1kh->key, r1kh_wildcard->key, sizeof(r1kh->key));
1777 r1kh->next = *wpa_auth->conf.r1kh_list;
1778 *wpa_auth->conf.r1kh_list = r1kh;
1779
1780 if (timeout > 0)
1781 eloop_register_timeout(timeout, 0, wpa_ft_rrb_del_r1kh,
1782 wpa_auth, r1kh);
1783
1784 if (wpa_ft_rrb_init_r1kh_seq(r1kh) < 0)
1785 return NULL;
1786
1787 return r1kh;
1788 }
1789
1790
wpa_ft_sta_deinit(struct wpa_state_machine * sm)1791 void wpa_ft_sta_deinit(struct wpa_state_machine *sm)
1792 {
1793 eloop_cancel_timeout(wpa_ft_expire_pull, sm, NULL);
1794 }
1795
1796
wpa_ft_deinit_seq(struct wpa_authenticator * wpa_auth)1797 static void wpa_ft_deinit_seq(struct wpa_authenticator *wpa_auth)
1798 {
1799 struct ft_remote_r0kh *r0kh;
1800 struct ft_remote_r1kh *r1kh;
1801
1802 eloop_cancel_timeout(wpa_ft_rrb_seq_timeout, wpa_auth, ELOOP_ALL_CTX);
1803
1804 if (wpa_auth->conf.r0kh_list)
1805 r0kh = *wpa_auth->conf.r0kh_list;
1806 else
1807 r0kh = NULL;
1808 for (; r0kh; r0kh = r0kh->next) {
1809 if (!r0kh->seq)
1810 continue;
1811 wpa_ft_rrb_seq_flush(wpa_auth, r0kh->seq, 0);
1812 os_free(r0kh->seq);
1813 r0kh->seq = NULL;
1814 }
1815
1816 if (wpa_auth->conf.r1kh_list)
1817 r1kh = *wpa_auth->conf.r1kh_list;
1818 else
1819 r1kh = NULL;
1820 for (; r1kh; r1kh = r1kh->next) {
1821 if (!r1kh->seq)
1822 continue;
1823 wpa_ft_rrb_seq_flush(wpa_auth, r1kh->seq, 0);
1824 os_free(r1kh->seq);
1825 r1kh->seq = NULL;
1826 }
1827 }
1828
1829
wpa_ft_deinit_rkh_tmp(struct wpa_authenticator * wpa_auth)1830 static void wpa_ft_deinit_rkh_tmp(struct wpa_authenticator *wpa_auth)
1831 {
1832 struct ft_remote_r0kh *r0kh, *r0kh_next, *r0kh_prev = NULL;
1833 struct ft_remote_r1kh *r1kh, *r1kh_next, *r1kh_prev = NULL;
1834
1835 if (wpa_auth->conf.r0kh_list)
1836 r0kh = *wpa_auth->conf.r0kh_list;
1837 else
1838 r0kh = NULL;
1839 while (r0kh) {
1840 r0kh_next = r0kh->next;
1841 if (eloop_cancel_timeout(wpa_ft_rrb_del_r0kh, wpa_auth,
1842 r0kh) > 0) {
1843 if (r0kh_prev)
1844 r0kh_prev->next = r0kh_next;
1845 else
1846 *wpa_auth->conf.r0kh_list = r0kh_next;
1847 os_free(r0kh);
1848 } else {
1849 r0kh_prev = r0kh;
1850 }
1851 r0kh = r0kh_next;
1852 }
1853
1854 if (wpa_auth->conf.r1kh_list)
1855 r1kh = *wpa_auth->conf.r1kh_list;
1856 else
1857 r1kh = NULL;
1858 while (r1kh) {
1859 r1kh_next = r1kh->next;
1860 if (eloop_cancel_timeout(wpa_ft_rrb_del_r1kh, wpa_auth,
1861 r1kh) > 0) {
1862 if (r1kh_prev)
1863 r1kh_prev->next = r1kh_next;
1864 else
1865 *wpa_auth->conf.r1kh_list = r1kh_next;
1866 os_free(r1kh);
1867 } else {
1868 r1kh_prev = r1kh;
1869 }
1870 r1kh = r1kh_next;
1871 }
1872 }
1873
1874
wpa_ft_deinit(struct wpa_authenticator * wpa_auth)1875 void wpa_ft_deinit(struct wpa_authenticator *wpa_auth)
1876 {
1877 wpa_ft_deinit_seq(wpa_auth);
1878 wpa_ft_deinit_rkh_tmp(wpa_auth);
1879 }
1880
1881
wpa_ft_block_r0kh(struct wpa_authenticator * wpa_auth,const u8 * f_r0kh_id,size_t f_r0kh_id_len)1882 static void wpa_ft_block_r0kh(struct wpa_authenticator *wpa_auth,
1883 const u8 *f_r0kh_id, size_t f_r0kh_id_len)
1884 {
1885 struct ft_remote_r0kh *r0kh, *r0kh_wildcard;
1886
1887 if (!wpa_auth->conf.rkh_neg_timeout)
1888 return;
1889
1890 wpa_ft_rrb_lookup_r0kh(wpa_auth, f_r0kh_id, f_r0kh_id_len,
1891 &r0kh, &r0kh_wildcard);
1892
1893 if (!r0kh_wildcard) {
1894 /* r0kh removed after neg_timeout and might need re-adding */
1895 return;
1896 }
1897
1898 wpa_hexdump(MSG_DEBUG, "FT: Blacklist R0KH-ID",
1899 f_r0kh_id, f_r0kh_id_len);
1900
1901 if (r0kh) {
1902 wpa_ft_rrb_r0kh_timeout(wpa_auth, r0kh,
1903 wpa_auth->conf.rkh_neg_timeout);
1904 os_memset(r0kh->addr, 0, ETH_ALEN);
1905 } else
1906 wpa_ft_rrb_add_r0kh(wpa_auth, r0kh_wildcard, NULL, f_r0kh_id,
1907 f_r0kh_id_len,
1908 wpa_auth->conf.rkh_neg_timeout);
1909 }
1910
1911
wpa_ft_expire_pull(void * eloop_ctx,void * timeout_ctx)1912 static void wpa_ft_expire_pull(void *eloop_ctx, void *timeout_ctx)
1913 {
1914 struct wpa_state_machine *sm = eloop_ctx;
1915
1916 wpa_printf(MSG_DEBUG, "FT: Timeout pending pull request for " MACSTR,
1917 MAC2STR(sm->addr));
1918 if (sm->ft_pending_pull_left_retries <= 0)
1919 wpa_ft_block_r0kh(sm->wpa_auth, sm->r0kh_id, sm->r0kh_id_len);
1920
1921 /* cancel multiple timeouts */
1922 eloop_cancel_timeout(wpa_ft_expire_pull, sm, NULL);
1923 ft_finish_pull(sm);
1924 }
1925
1926
wpa_ft_pull_pmk_r1(struct wpa_state_machine * sm,const u8 * ies,size_t ies_len,const u8 * pmk_r0_name)1927 static int wpa_ft_pull_pmk_r1(struct wpa_state_machine *sm,
1928 const u8 *ies, size_t ies_len,
1929 const u8 *pmk_r0_name)
1930 {
1931 struct ft_remote_r0kh *r0kh, *r0kh_wildcard;
1932 u8 *packet = NULL;
1933 const u8 *key, *f_r1kh_id = sm->wpa_auth->conf.r1_key_holder;
1934 size_t packet_len, key_len;
1935 struct ft_rrb_seq f_seq;
1936 int tsecs, tusecs, first;
1937 struct wpabuf *ft_pending_req_ies;
1938 int r0kh_timeout;
1939 struct tlv_list req_enc[] = {
1940 { .type = FT_RRB_PMK_R0_NAME, .len = WPA_PMK_NAME_LEN,
1941 .data = pmk_r0_name },
1942 { .type = FT_RRB_S1KH_ID, .len = ETH_ALEN,
1943 .data = sm->addr },
1944 { .type = FT_RRB_LAST_EMPTY, .len = 0, .data = NULL },
1945 };
1946 struct tlv_list req_auth[] = {
1947 { .type = FT_RRB_NONCE, .len = FT_RRB_NONCE_LEN,
1948 .data = sm->ft_pending_pull_nonce },
1949 { .type = FT_RRB_SEQ, .len = sizeof(f_seq),
1950 .data = (u8 *) &f_seq },
1951 { .type = FT_RRB_R0KH_ID, .len = sm->r0kh_id_len,
1952 .data = sm->r0kh_id },
1953 { .type = FT_RRB_R1KH_ID, .len = FT_R1KH_ID_LEN,
1954 .data = f_r1kh_id },
1955 { .type = FT_RRB_LAST_EMPTY, .len = 0, .data = NULL },
1956 };
1957
1958 if (sm->ft_pending_pull_left_retries <= 0)
1959 return -1;
1960 first = sm->ft_pending_pull_left_retries ==
1961 sm->wpa_auth->conf.rkh_pull_retries;
1962 sm->ft_pending_pull_left_retries--;
1963
1964 wpa_ft_rrb_lookup_r0kh(sm->wpa_auth, sm->r0kh_id, sm->r0kh_id_len,
1965 &r0kh, &r0kh_wildcard);
1966
1967 /* Keep r0kh sufficiently long in the list for seq num check */
1968 r0kh_timeout = sm->wpa_auth->conf.rkh_pull_timeout / 1000 +
1969 1 + ftRRBseqTimeout;
1970 if (r0kh) {
1971 wpa_ft_rrb_r0kh_replenish(sm->wpa_auth, r0kh, r0kh_timeout);
1972 } else if (r0kh_wildcard) {
1973 wpa_printf(MSG_DEBUG, "FT: Using wildcard R0KH-ID");
1974 /* r0kh->addr: updated by SEQ_RESP and wpa_ft_expire_pull */
1975 r0kh = wpa_ft_rrb_add_r0kh(sm->wpa_auth, r0kh_wildcard,
1976 r0kh_wildcard->addr,
1977 sm->r0kh_id, sm->r0kh_id_len,
1978 r0kh_timeout);
1979 }
1980 if (r0kh == NULL) {
1981 wpa_hexdump(MSG_DEBUG, "FT: Did not find R0KH-ID",
1982 sm->r0kh_id, sm->r0kh_id_len);
1983 return -1;
1984 }
1985 if (is_zero_ether_addr(r0kh->addr)) {
1986 wpa_hexdump(MSG_DEBUG, "FT: R0KH-ID is blacklisted",
1987 sm->r0kh_id, sm->r0kh_id_len);
1988 return -1;
1989 }
1990 if (os_memcmp(r0kh->addr, sm->wpa_auth->addr, ETH_ALEN) == 0) {
1991 wpa_printf(MSG_DEBUG,
1992 "FT: R0KH-ID points to self - no matching key available");
1993 return -1;
1994 }
1995
1996 key = r0kh->key;
1997 key_len = sizeof(r0kh->key);
1998
1999 wpa_printf(MSG_DEBUG, "FT: Send PMK-R1 pull request to remote R0KH "
2000 "address " MACSTR, MAC2STR(r0kh->addr));
2001
2002 if (r0kh->seq->rx.num_last == 0) {
2003 /* A sequence request will be sent out anyway when pull
2004 * response is received. Send it out now to avoid one RTT. */
2005 wpa_ft_rrb_seq_req(sm->wpa_auth, r0kh->seq, r0kh->addr,
2006 r0kh->id, r0kh->id_len, f_r1kh_id, key,
2007 key_len, NULL, 0, NULL, 0, NULL);
2008 }
2009
2010 if (first &&
2011 random_get_bytes(sm->ft_pending_pull_nonce, FT_RRB_NONCE_LEN) < 0) {
2012 wpa_printf(MSG_DEBUG, "FT: Failed to get random data for "
2013 "nonce");
2014 return -1;
2015 }
2016
2017 if (wpa_ft_new_seq(r0kh->seq, &f_seq) < 0) {
2018 wpa_printf(MSG_DEBUG, "FT: Failed to get seq num");
2019 return -1;
2020 }
2021
2022 if (wpa_ft_rrb_build(key, key_len, req_enc, NULL, req_auth, NULL,
2023 sm->wpa_auth->addr, FT_PACKET_R0KH_R1KH_PULL,
2024 &packet, &packet_len) < 0)
2025 return -1;
2026
2027 ft_pending_req_ies = wpabuf_alloc_copy(ies, ies_len);
2028 wpabuf_free(sm->ft_pending_req_ies);
2029 sm->ft_pending_req_ies = ft_pending_req_ies;
2030 if (!sm->ft_pending_req_ies) {
2031 os_free(packet);
2032 return -1;
2033 }
2034
2035 tsecs = sm->wpa_auth->conf.rkh_pull_timeout / 1000;
2036 tusecs = (sm->wpa_auth->conf.rkh_pull_timeout % 1000) * 1000;
2037 eloop_register_timeout(tsecs, tusecs, wpa_ft_expire_pull, sm, NULL);
2038
2039 wpa_ft_rrb_oui_send(sm->wpa_auth, r0kh->addr, FT_PACKET_R0KH_R1KH_PULL,
2040 packet, packet_len);
2041
2042 os_free(packet);
2043
2044 return 0;
2045 }
2046
2047
wpa_ft_store_pmk_fils(struct wpa_state_machine * sm,const u8 * pmk_r0,const u8 * pmk_r0_name)2048 int wpa_ft_store_pmk_fils(struct wpa_state_machine *sm,
2049 const u8 *pmk_r0, const u8 *pmk_r0_name)
2050 {
2051 int expires_in = sm->wpa_auth->conf.r0_key_lifetime;
2052 struct vlan_description vlan;
2053 const u8 *identity, *radius_cui;
2054 size_t identity_len, radius_cui_len;
2055 int session_timeout;
2056 size_t pmk_r0_len = wpa_key_mgmt_sha384(sm->wpa_key_mgmt) ?
2057 SHA384_MAC_LEN : PMK_LEN;
2058
2059 if (wpa_ft_get_vlan(sm->wpa_auth, sm->addr, &vlan) < 0) {
2060 wpa_printf(MSG_DEBUG, "FT: vlan not available for STA " MACSTR,
2061 MAC2STR(sm->addr));
2062 return -1;
2063 }
2064
2065 identity_len = wpa_ft_get_identity(sm->wpa_auth, sm->addr, &identity);
2066 radius_cui_len = wpa_ft_get_radius_cui(sm->wpa_auth, sm->addr,
2067 &radius_cui);
2068 session_timeout = wpa_ft_get_session_timeout(sm->wpa_auth, sm->addr);
2069
2070 return wpa_ft_store_pmk_r0(sm->wpa_auth, sm->addr, pmk_r0, pmk_r0_len,
2071 pmk_r0_name, sm->pairwise, &vlan, expires_in,
2072 session_timeout, identity, identity_len,
2073 radius_cui, radius_cui_len);
2074 }
2075
2076
wpa_auth_derive_ptk_ft(struct wpa_state_machine * sm,const u8 * pmk,struct wpa_ptk * ptk)2077 int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, const u8 *pmk,
2078 struct wpa_ptk *ptk)
2079 {
2080 u8 pmk_r0[PMK_LEN_MAX], pmk_r0_name[WPA_PMK_NAME_LEN];
2081 size_t pmk_r0_len = wpa_key_mgmt_sha384(sm->wpa_key_mgmt) ?
2082 SHA384_MAC_LEN : PMK_LEN;
2083 size_t pmk_r1_len = pmk_r0_len;
2084 u8 pmk_r1[PMK_LEN_MAX];
2085 u8 ptk_name[WPA_PMK_NAME_LEN];
2086 const u8 *mdid = sm->wpa_auth->conf.mobility_domain;
2087 const u8 *r0kh = sm->wpa_auth->conf.r0_key_holder;
2088 size_t r0kh_len = sm->wpa_auth->conf.r0_key_holder_len;
2089 const u8 *r1kh = sm->wpa_auth->conf.r1_key_holder;
2090 const u8 *ssid = sm->wpa_auth->conf.ssid;
2091 size_t ssid_len = sm->wpa_auth->conf.ssid_len;
2092 int psk_local = sm->wpa_auth->conf.ft_psk_generate_local;
2093 int expires_in = sm->wpa_auth->conf.r0_key_lifetime;
2094 struct vlan_description vlan;
2095 const u8 *identity, *radius_cui;
2096 size_t identity_len, radius_cui_len;
2097 int session_timeout;
2098
2099 if (sm->xxkey_len == 0) {
2100 wpa_printf(MSG_DEBUG, "FT: XXKey not available for key "
2101 "derivation");
2102 return -1;
2103 }
2104
2105 if (wpa_ft_get_vlan(sm->wpa_auth, sm->addr, &vlan) < 0) {
2106 wpa_printf(MSG_DEBUG, "FT: vlan not available for STA " MACSTR,
2107 MAC2STR(sm->addr));
2108 return -1;
2109 }
2110
2111 identity_len = wpa_ft_get_identity(sm->wpa_auth, sm->addr, &identity);
2112 radius_cui_len = wpa_ft_get_radius_cui(sm->wpa_auth, sm->addr,
2113 &radius_cui);
2114 session_timeout = wpa_ft_get_session_timeout(sm->wpa_auth, sm->addr);
2115
2116 if (wpa_derive_pmk_r0(sm->xxkey, sm->xxkey_len, ssid, ssid_len, mdid,
2117 r0kh, r0kh_len, sm->addr,
2118 pmk_r0, pmk_r0_name,
2119 wpa_key_mgmt_sha384(sm->wpa_key_mgmt)) < 0)
2120 return -1;
2121 wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R0", pmk_r0, pmk_r0_len);
2122 wpa_hexdump(MSG_DEBUG, "FT: PMKR0Name", pmk_r0_name, WPA_PMK_NAME_LEN);
2123 if (!psk_local || !wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
2124 wpa_ft_store_pmk_r0(sm->wpa_auth, sm->addr, pmk_r0, pmk_r0_len,
2125 pmk_r0_name,
2126 sm->pairwise, &vlan, expires_in,
2127 session_timeout, identity, identity_len,
2128 radius_cui, radius_cui_len);
2129
2130 if (wpa_derive_pmk_r1(pmk_r0, pmk_r0_len, pmk_r0_name, r1kh, sm->addr,
2131 pmk_r1, sm->pmk_r1_name) < 0)
2132 return -1;
2133 wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1", pmk_r1, pmk_r1_len);
2134 wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name", sm->pmk_r1_name,
2135 WPA_PMK_NAME_LEN);
2136 if (!psk_local || !wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
2137 wpa_ft_store_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1, pmk_r1_len,
2138 sm->pmk_r1_name, sm->pairwise, &vlan,
2139 expires_in, session_timeout, identity,
2140 identity_len, radius_cui, radius_cui_len);
2141
2142 return wpa_pmk_r1_to_ptk(pmk_r1, pmk_r1_len, sm->SNonce, sm->ANonce,
2143 sm->addr, sm->wpa_auth->addr, sm->pmk_r1_name,
2144 ptk, ptk_name, sm->wpa_key_mgmt, sm->pairwise);
2145 }
2146
2147
wpa_auth_get_seqnum(struct wpa_authenticator * wpa_auth,const u8 * addr,int idx,u8 * seq)2148 static inline int wpa_auth_get_seqnum(struct wpa_authenticator *wpa_auth,
2149 const u8 *addr, int idx, u8 *seq)
2150 {
2151 if (wpa_auth->cb->get_seqnum == NULL)
2152 return -1;
2153 return wpa_auth->cb->get_seqnum(wpa_auth->cb_ctx, addr, idx, seq);
2154 }
2155
2156
wpa_ft_gtk_subelem(struct wpa_state_machine * sm,size_t * len)2157 static u8 * wpa_ft_gtk_subelem(struct wpa_state_machine *sm, size_t *len)
2158 {
2159 u8 *subelem;
2160 struct wpa_group *gsm = sm->group;
2161 size_t subelem_len, pad_len;
2162 const u8 *key;
2163 size_t key_len;
2164 u8 keybuf[32];
2165 const u8 *kek;
2166 size_t kek_len;
2167
2168 if (wpa_key_mgmt_fils(sm->wpa_key_mgmt)) {
2169 kek = sm->PTK.kek2;
2170 kek_len = sm->PTK.kek2_len;
2171 } else {
2172 kek = sm->PTK.kek;
2173 kek_len = sm->PTK.kek_len;
2174 }
2175
2176 key_len = gsm->GTK_len;
2177 if (key_len > sizeof(keybuf))
2178 return NULL;
2179
2180 /*
2181 * Pad key for AES Key Wrap if it is not multiple of 8 bytes or is less
2182 * than 16 bytes.
2183 */
2184 pad_len = key_len % 8;
2185 if (pad_len)
2186 pad_len = 8 - pad_len;
2187 if (key_len + pad_len < 16)
2188 pad_len += 8;
2189 if (pad_len && key_len < sizeof(keybuf)) {
2190 os_memcpy(keybuf, gsm->GTK[gsm->GN - 1], key_len);
2191 os_memset(keybuf + key_len, 0, pad_len);
2192 keybuf[key_len] = 0xdd;
2193 key_len += pad_len;
2194 key = keybuf;
2195 } else
2196 key = gsm->GTK[gsm->GN - 1];
2197
2198 /*
2199 * Sub-elem ID[1] | Length[1] | Key Info[2] | Key Length[1] | RSC[8] |
2200 * Key[5..32].
2201 */
2202 subelem_len = 13 + key_len + 8;
2203 subelem = os_zalloc(subelem_len);
2204 if (subelem == NULL)
2205 return NULL;
2206
2207 subelem[0] = FTIE_SUBELEM_GTK;
2208 subelem[1] = 11 + key_len + 8;
2209 /* Key ID in B0-B1 of Key Info */
2210 WPA_PUT_LE16(&subelem[2], gsm->GN & 0x03);
2211 subelem[4] = gsm->GTK_len;
2212 wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, subelem + 5);
2213 if (aes_wrap(kek, kek_len, key_len / 8, key, subelem + 13)) {
2214 wpa_printf(MSG_DEBUG,
2215 "FT: GTK subelem encryption failed: kek_len=%d",
2216 (int) kek_len);
2217 os_free(subelem);
2218 return NULL;
2219 }
2220
2221 *len = subelem_len;
2222 return subelem;
2223 }
2224
2225
2226 #ifdef CONFIG_IEEE80211W
wpa_ft_igtk_subelem(struct wpa_state_machine * sm,size_t * len)2227 static u8 * wpa_ft_igtk_subelem(struct wpa_state_machine *sm, size_t *len)
2228 {
2229 u8 *subelem, *pos;
2230 struct wpa_group *gsm = sm->group;
2231 size_t subelem_len;
2232 const u8 *kek;
2233 size_t kek_len;
2234 size_t igtk_len;
2235
2236 if (wpa_key_mgmt_fils(sm->wpa_key_mgmt)) {
2237 kek = sm->PTK.kek2;
2238 kek_len = sm->PTK.kek2_len;
2239 } else {
2240 kek = sm->PTK.kek;
2241 kek_len = sm->PTK.kek_len;
2242 }
2243
2244 igtk_len = wpa_cipher_key_len(sm->wpa_auth->conf.group_mgmt_cipher);
2245
2246 /* Sub-elem ID[1] | Length[1] | KeyID[2] | IPN[6] | Key Length[1] |
2247 * Key[16+8] */
2248 subelem_len = 1 + 1 + 2 + 6 + 1 + igtk_len + 8;
2249 subelem = os_zalloc(subelem_len);
2250 if (subelem == NULL)
2251 return NULL;
2252
2253 pos = subelem;
2254 *pos++ = FTIE_SUBELEM_IGTK;
2255 *pos++ = subelem_len - 2;
2256 WPA_PUT_LE16(pos, gsm->GN_igtk);
2257 pos += 2;
2258 wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN_igtk, pos);
2259 pos += 6;
2260 *pos++ = igtk_len;
2261 if (aes_wrap(kek, kek_len, igtk_len / 8,
2262 gsm->IGTK[gsm->GN_igtk - 4], pos)) {
2263 wpa_printf(MSG_DEBUG,
2264 "FT: IGTK subelem encryption failed: kek_len=%d",
2265 (int) kek_len);
2266 os_free(subelem);
2267 return NULL;
2268 }
2269
2270 *len = subelem_len;
2271 return subelem;
2272 }
2273 #endif /* CONFIG_IEEE80211W */
2274
2275
wpa_ft_process_rdie(struct wpa_state_machine * sm,u8 * pos,u8 * end,u8 id,u8 descr_count,const u8 * ies,size_t ies_len)2276 static u8 * wpa_ft_process_rdie(struct wpa_state_machine *sm,
2277 u8 *pos, u8 *end, u8 id, u8 descr_count,
2278 const u8 *ies, size_t ies_len)
2279 {
2280 struct ieee802_11_elems parse;
2281 struct rsn_rdie *rdie;
2282
2283 wpa_printf(MSG_DEBUG, "FT: Resource Request: id=%d descr_count=%d",
2284 id, descr_count);
2285 wpa_hexdump(MSG_MSGDUMP, "FT: Resource descriptor IE(s)",
2286 ies, ies_len);
2287
2288 if (end - pos < (int) sizeof(*rdie)) {
2289 wpa_printf(MSG_ERROR, "FT: Not enough room for response RDIE");
2290 return pos;
2291 }
2292
2293 *pos++ = WLAN_EID_RIC_DATA;
2294 *pos++ = sizeof(*rdie);
2295 rdie = (struct rsn_rdie *) pos;
2296 rdie->id = id;
2297 rdie->descr_count = 0;
2298 rdie->status_code = host_to_le16(WLAN_STATUS_SUCCESS);
2299 pos += sizeof(*rdie);
2300
2301 if (ieee802_11_parse_elems((u8 *) ies, ies_len, &parse, 1) ==
2302 ParseFailed) {
2303 wpa_printf(MSG_DEBUG, "FT: Failed to parse request IEs");
2304 rdie->status_code =
2305 host_to_le16(WLAN_STATUS_UNSPECIFIED_FAILURE);
2306 return pos;
2307 }
2308
2309 if (parse.wmm_tspec) {
2310 struct wmm_tspec_element *tspec;
2311
2312 if (parse.wmm_tspec_len + 2 < (int) sizeof(*tspec)) {
2313 wpa_printf(MSG_DEBUG, "FT: Too short WMM TSPEC IE "
2314 "(%d)", (int) parse.wmm_tspec_len);
2315 rdie->status_code =
2316 host_to_le16(WLAN_STATUS_UNSPECIFIED_FAILURE);
2317 return pos;
2318 }
2319 if (end - pos < (int) sizeof(*tspec)) {
2320 wpa_printf(MSG_ERROR, "FT: Not enough room for "
2321 "response TSPEC");
2322 rdie->status_code =
2323 host_to_le16(WLAN_STATUS_UNSPECIFIED_FAILURE);
2324 return pos;
2325 }
2326 tspec = (struct wmm_tspec_element *) pos;
2327 os_memcpy(tspec, parse.wmm_tspec - 2, sizeof(*tspec));
2328 }
2329
2330 #ifdef NEED_AP_MLME
2331 if (parse.wmm_tspec && sm->wpa_auth->conf.ap_mlme) {
2332 int res;
2333
2334 res = wmm_process_tspec((struct wmm_tspec_element *) pos);
2335 wpa_printf(MSG_DEBUG, "FT: ADDTS processing result: %d", res);
2336 if (res == WMM_ADDTS_STATUS_INVALID_PARAMETERS)
2337 rdie->status_code =
2338 host_to_le16(WLAN_STATUS_INVALID_PARAMETERS);
2339 else if (res == WMM_ADDTS_STATUS_REFUSED)
2340 rdie->status_code =
2341 host_to_le16(WLAN_STATUS_REQUEST_DECLINED);
2342 else {
2343 /* TSPEC accepted; include updated TSPEC in response */
2344 rdie->descr_count = 1;
2345 pos += sizeof(struct wmm_tspec_element);
2346 }
2347 return pos;
2348 }
2349 #endif /* NEED_AP_MLME */
2350
2351 if (parse.wmm_tspec && !sm->wpa_auth->conf.ap_mlme) {
2352 int res;
2353
2354 res = wpa_ft_add_tspec(sm->wpa_auth, sm->addr, pos,
2355 sizeof(struct wmm_tspec_element));
2356 if (res >= 0) {
2357 if (res)
2358 rdie->status_code = host_to_le16(res);
2359 else {
2360 /* TSPEC accepted; include updated TSPEC in
2361 * response */
2362 rdie->descr_count = 1;
2363 pos += sizeof(struct wmm_tspec_element);
2364 }
2365 return pos;
2366 }
2367 }
2368
2369 wpa_printf(MSG_DEBUG, "FT: No supported resource requested");
2370 rdie->status_code = host_to_le16(WLAN_STATUS_UNSPECIFIED_FAILURE);
2371 return pos;
2372 }
2373
2374
wpa_ft_process_ric(struct wpa_state_machine * sm,u8 * pos,u8 * end,const u8 * ric,size_t ric_len)2375 static u8 * wpa_ft_process_ric(struct wpa_state_machine *sm, u8 *pos, u8 *end,
2376 const u8 *ric, size_t ric_len)
2377 {
2378 const u8 *rpos, *start;
2379 const struct rsn_rdie *rdie;
2380
2381 wpa_hexdump(MSG_MSGDUMP, "FT: RIC Request", ric, ric_len);
2382
2383 rpos = ric;
2384 while (rpos + sizeof(*rdie) < ric + ric_len) {
2385 if (rpos[0] != WLAN_EID_RIC_DATA || rpos[1] < sizeof(*rdie) ||
2386 rpos + 2 + rpos[1] > ric + ric_len)
2387 break;
2388 rdie = (const struct rsn_rdie *) (rpos + 2);
2389 rpos += 2 + rpos[1];
2390 start = rpos;
2391
2392 while (rpos + 2 <= ric + ric_len &&
2393 rpos + 2 + rpos[1] <= ric + ric_len) {
2394 if (rpos[0] == WLAN_EID_RIC_DATA)
2395 break;
2396 rpos += 2 + rpos[1];
2397 }
2398 pos = wpa_ft_process_rdie(sm, pos, end, rdie->id,
2399 rdie->descr_count,
2400 start, rpos - start);
2401 }
2402
2403 return pos;
2404 }
2405
2406
wpa_sm_write_assoc_resp_ies(struct wpa_state_machine * sm,u8 * pos,size_t max_len,int auth_alg,const u8 * req_ies,size_t req_ies_len)2407 u8 * wpa_sm_write_assoc_resp_ies(struct wpa_state_machine *sm, u8 *pos,
2408 size_t max_len, int auth_alg,
2409 const u8 *req_ies, size_t req_ies_len)
2410 {
2411 u8 *end, *mdie, *ftie, *rsnie = NULL, *r0kh_id, *subelem = NULL;
2412 u8 *fte_mic, *elem_count;
2413 size_t mdie_len, ftie_len, rsnie_len = 0, r0kh_id_len, subelem_len = 0;
2414 int res;
2415 struct wpa_auth_config *conf;
2416 struct wpa_ft_ies parse;
2417 u8 *ric_start;
2418 u8 *anonce, *snonce;
2419 const u8 *kck;
2420 size_t kck_len;
2421 int use_sha384;
2422
2423 if (sm == NULL)
2424 return pos;
2425
2426 use_sha384 = wpa_key_mgmt_sha384(sm->wpa_key_mgmt);
2427 conf = &sm->wpa_auth->conf;
2428
2429 if (!wpa_key_mgmt_ft(sm->wpa_key_mgmt))
2430 return pos;
2431
2432 end = pos + max_len;
2433
2434 if (auth_alg == WLAN_AUTH_FT ||
2435 ((auth_alg == WLAN_AUTH_FILS_SK ||
2436 auth_alg == WLAN_AUTH_FILS_SK_PFS ||
2437 auth_alg == WLAN_AUTH_FILS_PK) &&
2438 (sm->wpa_key_mgmt & (WPA_KEY_MGMT_FT_FILS_SHA256 |
2439 WPA_KEY_MGMT_FT_FILS_SHA384)))) {
2440 if (!sm->pmk_r1_name_valid) {
2441 wpa_printf(MSG_ERROR,
2442 "FT: PMKR1Name is not valid for Assoc Resp RSNE");
2443 return NULL;
2444 }
2445 wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name for Assoc Resp RSNE",
2446 sm->pmk_r1_name, WPA_PMK_NAME_LEN);
2447 /*
2448 * RSN (only present if this is a Reassociation Response and
2449 * part of a fast BSS transition; or if this is a
2450 * (Re)Association Response frame during an FT initial mobility
2451 * domain association using FILS)
2452 */
2453 res = wpa_write_rsn_ie(conf, pos, end - pos, sm->pmk_r1_name);
2454 if (res < 0)
2455 return NULL;
2456 rsnie = pos;
2457 rsnie_len = res;
2458 pos += res;
2459 }
2460
2461 /* Mobility Domain Information */
2462 res = wpa_write_mdie(conf, pos, end - pos);
2463 if (res < 0)
2464 return NULL;
2465 mdie = pos;
2466 mdie_len = res;
2467 pos += res;
2468
2469 /* Fast BSS Transition Information */
2470 if (auth_alg == WLAN_AUTH_FT) {
2471 subelem = wpa_ft_gtk_subelem(sm, &subelem_len);
2472 if (!subelem) {
2473 wpa_printf(MSG_DEBUG,
2474 "FT: Failed to add GTK subelement");
2475 return NULL;
2476 }
2477 r0kh_id = sm->r0kh_id;
2478 r0kh_id_len = sm->r0kh_id_len;
2479 anonce = sm->ANonce;
2480 snonce = sm->SNonce;
2481 #ifdef CONFIG_IEEE80211W
2482 if (sm->mgmt_frame_prot) {
2483 u8 *igtk;
2484 size_t igtk_len;
2485 u8 *nbuf;
2486 igtk = wpa_ft_igtk_subelem(sm, &igtk_len);
2487 if (igtk == NULL) {
2488 wpa_printf(MSG_DEBUG,
2489 "FT: Failed to add IGTK subelement");
2490 os_free(subelem);
2491 return NULL;
2492 }
2493 nbuf = os_realloc(subelem, subelem_len + igtk_len);
2494 if (nbuf == NULL) {
2495 os_free(subelem);
2496 os_free(igtk);
2497 return NULL;
2498 }
2499 subelem = nbuf;
2500 os_memcpy(subelem + subelem_len, igtk, igtk_len);
2501 subelem_len += igtk_len;
2502 os_free(igtk);
2503 }
2504 #endif /* CONFIG_IEEE80211W */
2505 #ifdef CONFIG_OCV
2506 if (wpa_auth_uses_ocv(sm)) {
2507 struct wpa_channel_info ci;
2508 u8 *nbuf, *ocipos;
2509
2510 if (wpa_channel_info(sm->wpa_auth, &ci) != 0) {
2511 wpa_printf(MSG_WARNING,
2512 "Failed to get channel info for OCI element");
2513 os_free(subelem);
2514 return NULL;
2515 }
2516
2517 subelem_len += 2 + OCV_OCI_LEN;
2518 nbuf = os_realloc(subelem, subelem_len);
2519 if (!nbuf) {
2520 os_free(subelem);
2521 return NULL;
2522 }
2523 subelem = nbuf;
2524
2525 ocipos = subelem + subelem_len - 2 - OCV_OCI_LEN;
2526 *ocipos++ = FTIE_SUBELEM_OCI;
2527 *ocipos++ = OCV_OCI_LEN;
2528 if (ocv_insert_oci(&ci, &ocipos) < 0) {
2529 os_free(subelem);
2530 return NULL;
2531 }
2532 }
2533 #endif /* CONFIG_OCV */
2534 } else {
2535 r0kh_id = conf->r0_key_holder;
2536 r0kh_id_len = conf->r0_key_holder_len;
2537 anonce = NULL;
2538 snonce = NULL;
2539 }
2540 res = wpa_write_ftie(conf, use_sha384, r0kh_id, r0kh_id_len,
2541 anonce, snonce, pos, end - pos,
2542 subelem, subelem_len);
2543 os_free(subelem);
2544 if (res < 0)
2545 return NULL;
2546 ftie = pos;
2547 ftie_len = res;
2548 pos += res;
2549
2550 if (use_sha384) {
2551 struct rsn_ftie_sha384 *_ftie =
2552 (struct rsn_ftie_sha384 *) (ftie + 2);
2553
2554 fte_mic = _ftie->mic;
2555 elem_count = &_ftie->mic_control[1];
2556 } else {
2557 struct rsn_ftie *_ftie = (struct rsn_ftie *) (ftie + 2);
2558
2559 fte_mic = _ftie->mic;
2560 elem_count = &_ftie->mic_control[1];
2561 }
2562 if (auth_alg == WLAN_AUTH_FT)
2563 *elem_count = 3; /* Information element count */
2564
2565 ric_start = pos;
2566 if (wpa_ft_parse_ies(req_ies, req_ies_len, &parse, use_sha384) == 0
2567 && parse.ric) {
2568 pos = wpa_ft_process_ric(sm, pos, end, parse.ric,
2569 parse.ric_len);
2570 if (auth_alg == WLAN_AUTH_FT)
2571 *elem_count +=
2572 ieee802_11_ie_count(ric_start,
2573 pos - ric_start);
2574 }
2575 if (ric_start == pos)
2576 ric_start = NULL;
2577
2578 if (wpa_key_mgmt_fils(sm->wpa_key_mgmt)) {
2579 kck = sm->PTK.kck2;
2580 kck_len = sm->PTK.kck2_len;
2581 } else {
2582 kck = sm->PTK.kck;
2583 kck_len = sm->PTK.kck_len;
2584 }
2585 if (auth_alg == WLAN_AUTH_FT &&
2586 wpa_ft_mic(kck, kck_len, sm->addr, sm->wpa_auth->addr, 6,
2587 mdie, mdie_len, ftie, ftie_len,
2588 rsnie, rsnie_len,
2589 ric_start, ric_start ? pos - ric_start : 0,
2590 fte_mic) < 0) {
2591 wpa_printf(MSG_DEBUG, "FT: Failed to calculate MIC");
2592 return NULL;
2593 }
2594
2595 os_free(sm->assoc_resp_ftie);
2596 sm->assoc_resp_ftie = os_malloc(ftie_len);
2597 if (!sm->assoc_resp_ftie)
2598 return NULL;
2599 os_memcpy(sm->assoc_resp_ftie, ftie, ftie_len);
2600
2601 return pos;
2602 }
2603
2604
wpa_auth_set_key(struct wpa_authenticator * wpa_auth,int vlan_id,enum wpa_alg alg,const u8 * addr,int idx,u8 * key,size_t key_len)2605 static inline int wpa_auth_set_key(struct wpa_authenticator *wpa_auth,
2606 int vlan_id,
2607 enum wpa_alg alg, const u8 *addr, int idx,
2608 u8 *key, size_t key_len)
2609 {
2610 if (wpa_auth->cb->set_key == NULL)
2611 return -1;
2612 return wpa_auth->cb->set_key(wpa_auth->cb_ctx, vlan_id, alg, addr, idx,
2613 key, key_len);
2614 }
2615
2616
wpa_ft_install_ptk(struct wpa_state_machine * sm)2617 void wpa_ft_install_ptk(struct wpa_state_machine *sm)
2618 {
2619 enum wpa_alg alg;
2620 int klen;
2621
2622 /* MLME-SETKEYS.request(PTK) */
2623 alg = wpa_cipher_to_alg(sm->pairwise);
2624 klen = wpa_cipher_key_len(sm->pairwise);
2625 if (!wpa_cipher_valid_pairwise(sm->pairwise)) {
2626 wpa_printf(MSG_DEBUG, "FT: Unknown pairwise alg 0x%x - skip "
2627 "PTK configuration", sm->pairwise);
2628 return;
2629 }
2630
2631 if (sm->tk_already_set) {
2632 /* Must avoid TK reconfiguration to prevent clearing of TX/RX
2633 * PN in the driver */
2634 wpa_printf(MSG_DEBUG,
2635 "FT: Do not re-install same PTK to the driver");
2636 return;
2637 }
2638
2639 /* FIX: add STA entry to kernel/driver here? The set_key will fail
2640 * most likely without this.. At the moment, STA entry is added only
2641 * after association has been completed. This function will be called
2642 * again after association to get the PTK configured, but that could be
2643 * optimized by adding the STA entry earlier.
2644 */
2645 if (wpa_auth_set_key(sm->wpa_auth, 0, alg, sm->addr, 0,
2646 sm->PTK.tk, klen))
2647 return;
2648
2649 /* FIX: MLME-SetProtection.Request(TA, Tx_Rx) */
2650 sm->pairwise_set = TRUE;
2651 sm->tk_already_set = TRUE;
2652 }
2653
2654
2655 /* Derive PMK-R1 from PSK, check all available PSK */
wpa_ft_psk_pmk_r1(struct wpa_state_machine * sm,const u8 * req_pmk_r1_name,u8 * out_pmk_r1,int * out_pairwise,struct vlan_description * out_vlan,const u8 ** out_identity,size_t * out_identity_len,const u8 ** out_radius_cui,size_t * out_radius_cui_len,int * out_session_timeout)2656 static int wpa_ft_psk_pmk_r1(struct wpa_state_machine *sm,
2657 const u8 *req_pmk_r1_name,
2658 u8 *out_pmk_r1, int *out_pairwise,
2659 struct vlan_description *out_vlan,
2660 const u8 **out_identity, size_t *out_identity_len,
2661 const u8 **out_radius_cui,
2662 size_t *out_radius_cui_len,
2663 int *out_session_timeout)
2664 {
2665 const u8 *pmk = NULL;
2666 u8 pmk_r0[PMK_LEN], pmk_r0_name[WPA_PMK_NAME_LEN];
2667 u8 pmk_r1[PMK_LEN], pmk_r1_name[WPA_PMK_NAME_LEN];
2668 struct wpa_authenticator *wpa_auth = sm->wpa_auth;
2669 const u8 *mdid = wpa_auth->conf.mobility_domain;
2670 const u8 *r0kh = sm->r0kh_id;
2671 size_t r0kh_len = sm->r0kh_id_len;
2672 const u8 *r1kh = wpa_auth->conf.r1_key_holder;
2673 const u8 *ssid = wpa_auth->conf.ssid;
2674 size_t ssid_len = wpa_auth->conf.ssid_len;
2675 int pairwise;
2676
2677 pairwise = sm->pairwise;
2678
2679 for (;;) {
2680 pmk = wpa_ft_get_psk(wpa_auth, sm->addr, sm->p2p_dev_addr,
2681 pmk);
2682 if (pmk == NULL)
2683 break;
2684
2685 if (wpa_derive_pmk_r0(pmk, PMK_LEN, ssid, ssid_len, mdid, r0kh,
2686 r0kh_len, sm->addr,
2687 pmk_r0, pmk_r0_name, 0) < 0 ||
2688 wpa_derive_pmk_r1(pmk_r0, PMK_LEN, pmk_r0_name, r1kh,
2689 sm->addr, pmk_r1, pmk_r1_name) < 0 ||
2690 os_memcmp_const(pmk_r1_name, req_pmk_r1_name,
2691 WPA_PMK_NAME_LEN) != 0)
2692 continue;
2693
2694 /* We found a PSK that matches the requested pmk_r1_name */
2695 wpa_printf(MSG_DEBUG,
2696 "FT: Found PSK to generate PMK-R1 locally");
2697 os_memcpy(out_pmk_r1, pmk_r1, PMK_LEN);
2698 if (out_pairwise)
2699 *out_pairwise = pairwise;
2700 os_memcpy(sm->PMK, pmk, PMK_LEN);
2701 sm->pmk_len = PMK_LEN;
2702 if (out_vlan &&
2703 wpa_ft_get_vlan(sm->wpa_auth, sm->addr, out_vlan) < 0) {
2704 wpa_printf(MSG_DEBUG, "FT: vlan not available for STA "
2705 MACSTR, MAC2STR(sm->addr));
2706 return -1;
2707 }
2708
2709 if (out_identity && out_identity_len) {
2710 *out_identity_len = wpa_ft_get_identity(
2711 sm->wpa_auth, sm->addr, out_identity);
2712 }
2713
2714 if (out_radius_cui && out_radius_cui_len) {
2715 *out_radius_cui_len = wpa_ft_get_radius_cui(
2716 sm->wpa_auth, sm->addr, out_radius_cui);
2717 }
2718
2719 if (out_session_timeout) {
2720 *out_session_timeout = wpa_ft_get_session_timeout(
2721 sm->wpa_auth, sm->addr);
2722 }
2723
2724 return 0;
2725 }
2726
2727 wpa_printf(MSG_DEBUG,
2728 "FT: Did not find PSK to generate PMK-R1 locally");
2729 return -1;
2730 }
2731
2732
2733 /* Detect the configuration the station asked for.
2734 * Required to detect FT-PSK and pairwise cipher.
2735 */
wpa_ft_set_key_mgmt(struct wpa_state_machine * sm,struct wpa_ft_ies * parse)2736 static int wpa_ft_set_key_mgmt(struct wpa_state_machine *sm,
2737 struct wpa_ft_ies *parse)
2738 {
2739 int key_mgmt, ciphers;
2740
2741 if (sm->wpa_key_mgmt)
2742 return 0;
2743
2744 key_mgmt = parse->key_mgmt & sm->wpa_auth->conf.wpa_key_mgmt;
2745 if (!key_mgmt) {
2746 wpa_printf(MSG_DEBUG, "FT: Invalid key mgmt (0x%x) from "
2747 MACSTR, parse->key_mgmt, MAC2STR(sm->addr));
2748 return -1;
2749 }
2750 if (key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
2751 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
2752 #ifdef CONFIG_SHA384
2753 else if (key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X_SHA384)
2754 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X_SHA384;
2755 #endif /* CONFIG_SHA384 */
2756 else if (key_mgmt & WPA_KEY_MGMT_FT_PSK)
2757 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_PSK;
2758 #ifdef CONFIG_FILS
2759 else if (key_mgmt & WPA_KEY_MGMT_FT_FILS_SHA256)
2760 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_FILS_SHA256;
2761 else if (key_mgmt & WPA_KEY_MGMT_FT_FILS_SHA384)
2762 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_FILS_SHA384;
2763 #endif /* CONFIG_FILS */
2764 ciphers = parse->pairwise_cipher & sm->wpa_auth->conf.rsn_pairwise;
2765 if (!ciphers) {
2766 wpa_printf(MSG_DEBUG, "FT: Invalid pairwise cipher (0x%x) from "
2767 MACSTR,
2768 parse->pairwise_cipher, MAC2STR(sm->addr));
2769 return -1;
2770 }
2771 sm->pairwise = wpa_pick_pairwise_cipher(ciphers, 0);
2772
2773 return 0;
2774 }
2775
2776
wpa_ft_local_derive_pmk_r1(struct wpa_authenticator * wpa_auth,struct wpa_state_machine * sm,const u8 * r0kh_id,size_t r0kh_id_len,const u8 * req_pmk_r0_name,const u8 * req_pmk_r1_name,u8 * out_pmk_r1,int * out_pairwise,struct vlan_description * vlan,const u8 ** identity,size_t * identity_len,const u8 ** radius_cui,size_t * radius_cui_len,int * out_session_timeout)2777 static int wpa_ft_local_derive_pmk_r1(struct wpa_authenticator *wpa_auth,
2778 struct wpa_state_machine *sm,
2779 const u8 *r0kh_id, size_t r0kh_id_len,
2780 const u8 *req_pmk_r0_name,
2781 const u8 *req_pmk_r1_name,
2782 u8 *out_pmk_r1, int *out_pairwise,
2783 struct vlan_description *vlan,
2784 const u8 **identity, size_t *identity_len,
2785 const u8 **radius_cui,
2786 size_t *radius_cui_len,
2787 int *out_session_timeout)
2788 {
2789 struct wpa_auth_config *conf = &wpa_auth->conf;
2790 const struct wpa_ft_pmk_r0_sa *r0;
2791 u8 pmk_r1_name[WPA_PMK_NAME_LEN];
2792 int expires_in = 0;
2793 int session_timeout = 0;
2794 struct os_reltime now;
2795
2796 if (conf->r0_key_holder_len != r0kh_id_len ||
2797 os_memcmp(conf->r0_key_holder, r0kh_id, conf->r0_key_holder_len) !=
2798 0)
2799 return -1; /* not our R0KH-ID */
2800
2801 wpa_printf(MSG_DEBUG, "FT: STA R0KH-ID matching local configuration");
2802 if (wpa_ft_fetch_pmk_r0(sm->wpa_auth, sm->addr, req_pmk_r0_name, &r0) <
2803 0)
2804 return -1; /* no matching PMKR0Name in local cache */
2805
2806 wpa_printf(MSG_DEBUG, "FT: Requested PMKR0Name found in local cache");
2807
2808 if (wpa_derive_pmk_r1(r0->pmk_r0, r0->pmk_r0_len, r0->pmk_r0_name,
2809 conf->r1_key_holder,
2810 sm->addr, out_pmk_r1, pmk_r1_name) < 0)
2811 return -1;
2812 wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1", out_pmk_r1, r0->pmk_r0_len);
2813 wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name", pmk_r1_name, WPA_PMK_NAME_LEN);
2814
2815 os_get_reltime(&now);
2816 if (r0->expiration)
2817 expires_in = r0->expiration - now.sec;
2818
2819 if (r0->session_timeout)
2820 session_timeout = r0->session_timeout - now.sec;
2821
2822 wpa_ft_store_pmk_r1(wpa_auth, sm->addr, out_pmk_r1, r0->pmk_r0_len,
2823 pmk_r1_name,
2824 sm->pairwise, r0->vlan, expires_in, session_timeout,
2825 r0->identity, r0->identity_len,
2826 r0->radius_cui, r0->radius_cui_len);
2827
2828 *out_pairwise = sm->pairwise;
2829 if (vlan) {
2830 if (r0->vlan)
2831 *vlan = *r0->vlan;
2832 else
2833 os_memset(vlan, 0, sizeof(*vlan));
2834 }
2835
2836 if (identity && identity_len) {
2837 *identity = r0->identity;
2838 *identity_len = r0->identity_len;
2839 }
2840
2841 if (radius_cui && radius_cui_len) {
2842 *radius_cui = r0->radius_cui;
2843 *radius_cui_len = r0->radius_cui_len;
2844 }
2845
2846 *out_session_timeout = session_timeout;
2847
2848 return 0;
2849 }
2850
2851
wpa_ft_process_auth_req(struct wpa_state_machine * sm,const u8 * ies,size_t ies_len,u8 ** resp_ies,size_t * resp_ies_len)2852 static int wpa_ft_process_auth_req(struct wpa_state_machine *sm,
2853 const u8 *ies, size_t ies_len,
2854 u8 **resp_ies, size_t *resp_ies_len)
2855 {
2856 struct rsn_mdie *mdie;
2857 u8 pmk_r1[PMK_LEN_MAX], pmk_r1_name[WPA_PMK_NAME_LEN];
2858 u8 ptk_name[WPA_PMK_NAME_LEN];
2859 struct wpa_auth_config *conf;
2860 struct wpa_ft_ies parse;
2861 size_t buflen;
2862 int ret;
2863 u8 *pos, *end;
2864 int pairwise, session_timeout = 0;
2865 struct vlan_description vlan;
2866 const u8 *identity, *radius_cui;
2867 size_t identity_len = 0, radius_cui_len = 0;
2868 int use_sha384;
2869 size_t pmk_r1_len;
2870
2871 *resp_ies = NULL;
2872 *resp_ies_len = 0;
2873
2874 sm->pmk_r1_name_valid = 0;
2875 conf = &sm->wpa_auth->conf;
2876
2877 wpa_hexdump(MSG_DEBUG, "FT: Received authentication frame IEs",
2878 ies, ies_len);
2879
2880 if (wpa_ft_parse_ies(ies, ies_len, &parse, -1)) {
2881 wpa_printf(MSG_DEBUG, "FT: Failed to parse FT IEs");
2882 return WLAN_STATUS_UNSPECIFIED_FAILURE;
2883 }
2884 use_sha384 = wpa_key_mgmt_sha384(parse.key_mgmt);
2885 pmk_r1_len = use_sha384 ? SHA384_MAC_LEN : PMK_LEN;
2886
2887 mdie = (struct rsn_mdie *) parse.mdie;
2888 if (mdie == NULL || parse.mdie_len < sizeof(*mdie) ||
2889 os_memcmp(mdie->mobility_domain,
2890 sm->wpa_auth->conf.mobility_domain,
2891 MOBILITY_DOMAIN_ID_LEN) != 0) {
2892 wpa_printf(MSG_DEBUG, "FT: Invalid MDIE");
2893 return WLAN_STATUS_INVALID_MDIE;
2894 }
2895
2896 if (use_sha384) {
2897 struct rsn_ftie_sha384 *ftie;
2898
2899 ftie = (struct rsn_ftie_sha384 *) parse.ftie;
2900 if (!ftie || parse.ftie_len < sizeof(*ftie)) {
2901 wpa_printf(MSG_DEBUG, "FT: Invalid FTIE");
2902 return WLAN_STATUS_INVALID_FTIE;
2903 }
2904
2905 os_memcpy(sm->SNonce, ftie->snonce, WPA_NONCE_LEN);
2906 } else {
2907 struct rsn_ftie *ftie;
2908
2909 ftie = (struct rsn_ftie *) parse.ftie;
2910 if (!ftie || parse.ftie_len < sizeof(*ftie)) {
2911 wpa_printf(MSG_DEBUG, "FT: Invalid FTIE");
2912 return WLAN_STATUS_INVALID_FTIE;
2913 }
2914
2915 os_memcpy(sm->SNonce, ftie->snonce, WPA_NONCE_LEN);
2916 }
2917
2918 if (parse.r0kh_id == NULL) {
2919 wpa_printf(MSG_DEBUG, "FT: Invalid FTIE - no R0KH-ID");
2920 return WLAN_STATUS_INVALID_FTIE;
2921 }
2922
2923 wpa_hexdump(MSG_DEBUG, "FT: STA R0KH-ID",
2924 parse.r0kh_id, parse.r0kh_id_len);
2925 os_memcpy(sm->r0kh_id, parse.r0kh_id, parse.r0kh_id_len);
2926 sm->r0kh_id_len = parse.r0kh_id_len;
2927
2928 if (parse.rsn_pmkid == NULL) {
2929 wpa_printf(MSG_DEBUG, "FT: No PMKID in RSNIE");
2930 return WLAN_STATUS_INVALID_PMKID;
2931 }
2932
2933 if (wpa_ft_set_key_mgmt(sm, &parse) < 0)
2934 return WLAN_STATUS_UNSPECIFIED_FAILURE;
2935
2936 wpa_hexdump(MSG_DEBUG, "FT: Requested PMKR0Name",
2937 parse.rsn_pmkid, WPA_PMK_NAME_LEN);
2938 if (wpa_derive_pmk_r1_name(parse.rsn_pmkid,
2939 sm->wpa_auth->conf.r1_key_holder, sm->addr,
2940 pmk_r1_name, use_sha384) < 0)
2941 return WLAN_STATUS_UNSPECIFIED_FAILURE;
2942 wpa_hexdump(MSG_DEBUG, "FT: Derived requested PMKR1Name",
2943 pmk_r1_name, WPA_PMK_NAME_LEN);
2944
2945 if (conf->ft_psk_generate_local &&
2946 wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt)) {
2947 if (wpa_ft_psk_pmk_r1(sm, pmk_r1_name, pmk_r1, &pairwise,
2948 &vlan, &identity, &identity_len,
2949 &radius_cui, &radius_cui_len,
2950 &session_timeout) < 0)
2951 return WLAN_STATUS_INVALID_PMKID;
2952 wpa_printf(MSG_DEBUG,
2953 "FT: Generated PMK-R1 for FT-PSK locally");
2954 } else if (wpa_ft_fetch_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1_name,
2955 pmk_r1, &pmk_r1_len, &pairwise, &vlan,
2956 &identity, &identity_len, &radius_cui,
2957 &radius_cui_len, &session_timeout) < 0) {
2958 wpa_printf(MSG_DEBUG,
2959 "FT: No PMK-R1 available in local cache for the requested PMKR1Name");
2960 if (wpa_ft_local_derive_pmk_r1(sm->wpa_auth, sm,
2961 parse.r0kh_id, parse.r0kh_id_len,
2962 parse.rsn_pmkid,
2963 pmk_r1_name, pmk_r1, &pairwise,
2964 &vlan, &identity, &identity_len,
2965 &radius_cui, &radius_cui_len,
2966 &session_timeout) == 0) {
2967 wpa_printf(MSG_DEBUG,
2968 "FT: Generated PMK-R1 based on local PMK-R0");
2969 goto pmk_r1_derived;
2970 }
2971
2972 if (wpa_ft_pull_pmk_r1(sm, ies, ies_len, parse.rsn_pmkid) < 0) {
2973 wpa_printf(MSG_DEBUG,
2974 "FT: Did not have matching PMK-R1 and either unknown or blocked R0KH-ID or NAK from R0KH");
2975 return WLAN_STATUS_INVALID_PMKID;
2976 }
2977
2978 return -1; /* Status pending */
2979 } else {
2980 wpa_printf(MSG_DEBUG, "FT: Found PMKR1Name from local cache");
2981 }
2982
2983 pmk_r1_derived:
2984 wpa_hexdump_key(MSG_DEBUG, "FT: Selected PMK-R1", pmk_r1, pmk_r1_len);
2985 sm->pmk_r1_name_valid = 1;
2986 os_memcpy(sm->pmk_r1_name, pmk_r1_name, WPA_PMK_NAME_LEN);
2987
2988 if (random_get_bytes(sm->ANonce, WPA_NONCE_LEN)) {
2989 wpa_printf(MSG_DEBUG, "FT: Failed to get random data for "
2990 "ANonce");
2991 return WLAN_STATUS_UNSPECIFIED_FAILURE;
2992 }
2993
2994 wpa_hexdump(MSG_DEBUG, "FT: Received SNonce",
2995 sm->SNonce, WPA_NONCE_LEN);
2996 wpa_hexdump(MSG_DEBUG, "FT: Generated ANonce",
2997 sm->ANonce, WPA_NONCE_LEN);
2998
2999 if (wpa_pmk_r1_to_ptk(pmk_r1, pmk_r1_len, sm->SNonce, sm->ANonce,
3000 sm->addr, sm->wpa_auth->addr, pmk_r1_name,
3001 &sm->PTK, ptk_name, sm->wpa_key_mgmt,
3002 pairwise) < 0)
3003 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3004
3005 sm->pairwise = pairwise;
3006 sm->PTK_valid = TRUE;
3007 sm->tk_already_set = FALSE;
3008 wpa_ft_install_ptk(sm);
3009
3010 if (wpa_ft_set_vlan(sm->wpa_auth, sm->addr, &vlan) < 0) {
3011 wpa_printf(MSG_DEBUG, "FT: Failed to configure VLAN");
3012 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3013 }
3014 if (wpa_ft_set_identity(sm->wpa_auth, sm->addr,
3015 identity, identity_len) < 0 ||
3016 wpa_ft_set_radius_cui(sm->wpa_auth, sm->addr,
3017 radius_cui, radius_cui_len) < 0) {
3018 wpa_printf(MSG_DEBUG, "FT: Failed to configure identity/CUI");
3019 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3020 }
3021 wpa_ft_set_session_timeout(sm->wpa_auth, sm->addr, session_timeout);
3022
3023 buflen = 2 + sizeof(struct rsn_mdie) + 2 + sizeof(struct rsn_ftie) +
3024 2 + FT_R1KH_ID_LEN + 200;
3025 *resp_ies = os_zalloc(buflen);
3026 if (*resp_ies == NULL)
3027 goto fail;
3028
3029 pos = *resp_ies;
3030 end = *resp_ies + buflen;
3031
3032 ret = wpa_write_rsn_ie(conf, pos, end - pos, parse.rsn_pmkid);
3033 if (ret < 0)
3034 goto fail;
3035 pos += ret;
3036
3037 ret = wpa_write_mdie(conf, pos, end - pos);
3038 if (ret < 0)
3039 goto fail;
3040 pos += ret;
3041
3042 ret = wpa_write_ftie(conf, use_sha384, parse.r0kh_id, parse.r0kh_id_len,
3043 sm->ANonce, sm->SNonce, pos, end - pos, NULL, 0);
3044 if (ret < 0)
3045 goto fail;
3046 pos += ret;
3047
3048 *resp_ies_len = pos - *resp_ies;
3049
3050 return WLAN_STATUS_SUCCESS;
3051 fail:
3052 os_free(*resp_ies);
3053 *resp_ies = NULL;
3054 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3055 }
3056
3057
wpa_ft_process_auth(struct wpa_state_machine * sm,const u8 * bssid,u16 auth_transaction,const u8 * ies,size_t ies_len,void (* cb)(void * ctx,const u8 * dst,const u8 * bssid,u16 auth_transaction,u16 status,const u8 * ies,size_t ies_len),void * ctx)3058 void wpa_ft_process_auth(struct wpa_state_machine *sm, const u8 *bssid,
3059 u16 auth_transaction, const u8 *ies, size_t ies_len,
3060 void (*cb)(void *ctx, const u8 *dst, const u8 *bssid,
3061 u16 auth_transaction, u16 status,
3062 const u8 *ies, size_t ies_len),
3063 void *ctx)
3064 {
3065 u16 status;
3066 u8 *resp_ies;
3067 size_t resp_ies_len;
3068 int res;
3069
3070 if (sm == NULL) {
3071 wpa_printf(MSG_DEBUG, "FT: Received authentication frame, but "
3072 "WPA SM not available");
3073 return;
3074 }
3075
3076 wpa_printf(MSG_DEBUG, "FT: Received authentication frame: STA=" MACSTR
3077 " BSSID=" MACSTR " transaction=%d",
3078 MAC2STR(sm->addr), MAC2STR(bssid), auth_transaction);
3079 sm->ft_pending_cb = cb;
3080 sm->ft_pending_cb_ctx = ctx;
3081 sm->ft_pending_auth_transaction = auth_transaction;
3082 sm->ft_pending_pull_left_retries = sm->wpa_auth->conf.rkh_pull_retries;
3083 res = wpa_ft_process_auth_req(sm, ies, ies_len, &resp_ies,
3084 &resp_ies_len);
3085 if (res < 0) {
3086 wpa_printf(MSG_DEBUG, "FT: Callback postponed until response is available");
3087 return;
3088 }
3089 status = res;
3090
3091 wpa_printf(MSG_DEBUG, "FT: FT authentication response: dst=" MACSTR
3092 " auth_transaction=%d status=%d",
3093 MAC2STR(sm->addr), auth_transaction + 1, status);
3094 wpa_hexdump(MSG_DEBUG, "FT: Response IEs", resp_ies, resp_ies_len);
3095 cb(ctx, sm->addr, bssid, auth_transaction + 1, status,
3096 resp_ies, resp_ies_len);
3097 os_free(resp_ies);
3098 }
3099
3100
wpa_ft_validate_reassoc(struct wpa_state_machine * sm,const u8 * ies,size_t ies_len)3101 u16 wpa_ft_validate_reassoc(struct wpa_state_machine *sm, const u8 *ies,
3102 size_t ies_len)
3103 {
3104 struct wpa_ft_ies parse;
3105 struct rsn_mdie *mdie;
3106 u8 mic[WPA_EAPOL_KEY_MIC_MAX_LEN];
3107 size_t mic_len = 16;
3108 unsigned int count;
3109 const u8 *kck;
3110 size_t kck_len;
3111 int use_sha384;
3112 const u8 *anonce, *snonce, *fte_mic;
3113 u8 fte_elem_count;
3114
3115 if (sm == NULL)
3116 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3117
3118 use_sha384 = wpa_key_mgmt_sha384(sm->wpa_key_mgmt);
3119
3120 wpa_hexdump(MSG_DEBUG, "FT: Reassoc Req IEs", ies, ies_len);
3121
3122 if (wpa_ft_parse_ies(ies, ies_len, &parse, use_sha384) < 0) {
3123 wpa_printf(MSG_DEBUG, "FT: Failed to parse FT IEs");
3124 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3125 }
3126
3127 if (parse.rsn == NULL) {
3128 wpa_printf(MSG_DEBUG, "FT: No RSNIE in Reassoc Req");
3129 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3130 }
3131
3132 if (parse.rsn_pmkid == NULL) {
3133 wpa_printf(MSG_DEBUG, "FT: No PMKID in RSNIE");
3134 return WLAN_STATUS_INVALID_PMKID;
3135 }
3136
3137 if (os_memcmp_const(parse.rsn_pmkid, sm->pmk_r1_name, WPA_PMK_NAME_LEN)
3138 != 0) {
3139 wpa_printf(MSG_DEBUG, "FT: PMKID in Reassoc Req did not match "
3140 "with the PMKR1Name derived from auth request");
3141 return WLAN_STATUS_INVALID_PMKID;
3142 }
3143
3144 mdie = (struct rsn_mdie *) parse.mdie;
3145 if (mdie == NULL || parse.mdie_len < sizeof(*mdie) ||
3146 os_memcmp(mdie->mobility_domain,
3147 sm->wpa_auth->conf.mobility_domain,
3148 MOBILITY_DOMAIN_ID_LEN) != 0) {
3149 wpa_printf(MSG_DEBUG, "FT: Invalid MDIE");
3150 return WLAN_STATUS_INVALID_MDIE;
3151 }
3152
3153 if (use_sha384) {
3154 struct rsn_ftie_sha384 *ftie;
3155
3156 ftie = (struct rsn_ftie_sha384 *) parse.ftie;
3157 if (ftie == NULL || parse.ftie_len < sizeof(*ftie)) {
3158 wpa_printf(MSG_DEBUG, "FT: Invalid FTIE");
3159 return WLAN_STATUS_INVALID_FTIE;
3160 }
3161
3162 anonce = ftie->anonce;
3163 snonce = ftie->snonce;
3164 fte_elem_count = ftie->mic_control[1];
3165 fte_mic = ftie->mic;
3166 } else {
3167 struct rsn_ftie *ftie;
3168
3169 ftie = (struct rsn_ftie *) parse.ftie;
3170 if (ftie == NULL || parse.ftie_len < sizeof(*ftie)) {
3171 wpa_printf(MSG_DEBUG, "FT: Invalid FTIE");
3172 return WLAN_STATUS_INVALID_FTIE;
3173 }
3174
3175 anonce = ftie->anonce;
3176 snonce = ftie->snonce;
3177 fte_elem_count = ftie->mic_control[1];
3178 fte_mic = ftie->mic;
3179 }
3180
3181 if (os_memcmp(snonce, sm->SNonce, WPA_NONCE_LEN) != 0) {
3182 wpa_printf(MSG_DEBUG, "FT: SNonce mismatch in FTIE");
3183 wpa_hexdump(MSG_DEBUG, "FT: Received SNonce",
3184 snonce, WPA_NONCE_LEN);
3185 wpa_hexdump(MSG_DEBUG, "FT: Expected SNonce",
3186 sm->SNonce, WPA_NONCE_LEN);
3187 return WLAN_STATUS_INVALID_FTIE;
3188 }
3189
3190 if (os_memcmp(anonce, sm->ANonce, WPA_NONCE_LEN) != 0) {
3191 wpa_printf(MSG_DEBUG, "FT: ANonce mismatch in FTIE");
3192 wpa_hexdump(MSG_DEBUG, "FT: Received ANonce",
3193 anonce, WPA_NONCE_LEN);
3194 wpa_hexdump(MSG_DEBUG, "FT: Expected ANonce",
3195 sm->ANonce, WPA_NONCE_LEN);
3196 return WLAN_STATUS_INVALID_FTIE;
3197 }
3198
3199
3200 if (parse.r0kh_id == NULL) {
3201 wpa_printf(MSG_DEBUG, "FT: No R0KH-ID subelem in FTIE");
3202 return WLAN_STATUS_INVALID_FTIE;
3203 }
3204
3205 if (parse.r0kh_id_len != sm->r0kh_id_len ||
3206 os_memcmp_const(parse.r0kh_id, sm->r0kh_id, parse.r0kh_id_len) != 0)
3207 {
3208 wpa_printf(MSG_DEBUG, "FT: R0KH-ID in FTIE did not match with "
3209 "the current R0KH-ID");
3210 wpa_hexdump(MSG_DEBUG, "FT: R0KH-ID in FTIE",
3211 parse.r0kh_id, parse.r0kh_id_len);
3212 wpa_hexdump(MSG_DEBUG, "FT: The current R0KH-ID",
3213 sm->r0kh_id, sm->r0kh_id_len);
3214 return WLAN_STATUS_INVALID_FTIE;
3215 }
3216
3217 if (parse.r1kh_id == NULL) {
3218 wpa_printf(MSG_DEBUG, "FT: No R1KH-ID subelem in FTIE");
3219 return WLAN_STATUS_INVALID_FTIE;
3220 }
3221
3222 if (os_memcmp_const(parse.r1kh_id, sm->wpa_auth->conf.r1_key_holder,
3223 FT_R1KH_ID_LEN) != 0) {
3224 wpa_printf(MSG_DEBUG, "FT: Unknown R1KH-ID used in "
3225 "ReassocReq");
3226 wpa_hexdump(MSG_DEBUG, "FT: R1KH-ID in FTIE",
3227 parse.r1kh_id, FT_R1KH_ID_LEN);
3228 wpa_hexdump(MSG_DEBUG, "FT: Expected R1KH-ID",
3229 sm->wpa_auth->conf.r1_key_holder, FT_R1KH_ID_LEN);
3230 return WLAN_STATUS_INVALID_FTIE;
3231 }
3232
3233 if (parse.rsn_pmkid == NULL ||
3234 os_memcmp_const(parse.rsn_pmkid, sm->pmk_r1_name, WPA_PMK_NAME_LEN))
3235 {
3236 wpa_printf(MSG_DEBUG, "FT: No matching PMKR1Name (PMKID) in "
3237 "RSNIE (pmkid=%d)", !!parse.rsn_pmkid);
3238 return WLAN_STATUS_INVALID_PMKID;
3239 }
3240
3241 count = 3;
3242 if (parse.ric)
3243 count += ieee802_11_ie_count(parse.ric, parse.ric_len);
3244 if (fte_elem_count != count) {
3245 wpa_printf(MSG_DEBUG, "FT: Unexpected IE count in MIC "
3246 "Control: received %u expected %u",
3247 fte_elem_count, count);
3248 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3249 }
3250
3251 if (wpa_key_mgmt_fils(sm->wpa_key_mgmt)) {
3252 kck = sm->PTK.kck2;
3253 kck_len = sm->PTK.kck2_len;
3254 } else {
3255 kck = sm->PTK.kck;
3256 kck_len = sm->PTK.kck_len;
3257 }
3258 if (wpa_ft_mic(kck, kck_len, sm->addr, sm->wpa_auth->addr, 5,
3259 parse.mdie - 2, parse.mdie_len + 2,
3260 parse.ftie - 2, parse.ftie_len + 2,
3261 parse.rsn - 2, parse.rsn_len + 2,
3262 parse.ric, parse.ric_len,
3263 mic) < 0) {
3264 wpa_printf(MSG_DEBUG, "FT: Failed to calculate MIC");
3265 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3266 }
3267
3268 if (os_memcmp_const(mic, fte_mic, mic_len) != 0) {
3269 wpa_printf(MSG_DEBUG, "FT: Invalid MIC in FTIE");
3270 wpa_printf(MSG_DEBUG, "FT: addr=" MACSTR " auth_addr=" MACSTR,
3271 MAC2STR(sm->addr), MAC2STR(sm->wpa_auth->addr));
3272 wpa_hexdump(MSG_MSGDUMP, "FT: Received MIC",
3273 fte_mic, mic_len);
3274 wpa_hexdump(MSG_MSGDUMP, "FT: Calculated MIC", mic, mic_len);
3275 wpa_hexdump(MSG_MSGDUMP, "FT: MDIE",
3276 parse.mdie - 2, parse.mdie_len + 2);
3277 wpa_hexdump(MSG_MSGDUMP, "FT: FTIE",
3278 parse.ftie - 2, parse.ftie_len + 2);
3279 wpa_hexdump(MSG_MSGDUMP, "FT: RSN",
3280 parse.rsn - 2, parse.rsn_len + 2);
3281 return WLAN_STATUS_INVALID_FTIE;
3282 }
3283
3284 #ifdef CONFIG_OCV
3285 if (wpa_auth_uses_ocv(sm)) {
3286 struct wpa_channel_info ci;
3287 int tx_chanwidth;
3288 int tx_seg1_idx;
3289
3290 if (wpa_channel_info(sm->wpa_auth, &ci) != 0) {
3291 wpa_printf(MSG_WARNING,
3292 "Failed to get channel info to validate received OCI in (Re)Assoc Request");
3293 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3294 }
3295
3296 if (get_sta_tx_parameters(sm,
3297 channel_width_to_int(ci.chanwidth),
3298 ci.seg1_idx, &tx_chanwidth,
3299 &tx_seg1_idx) < 0)
3300 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3301
3302 if (ocv_verify_tx_params(parse.oci, parse.oci_len, &ci,
3303 tx_chanwidth, tx_seg1_idx) != 0) {
3304 wpa_printf(MSG_WARNING, "%s", ocv_errorstr);
3305 return WLAN_STATUS_UNSPECIFIED_FAILURE;
3306 }
3307 }
3308 #endif /* CONFIG_OCV */
3309
3310 return WLAN_STATUS_SUCCESS;
3311 }
3312
3313
wpa_ft_action_rx(struct wpa_state_machine * sm,const u8 * data,size_t len)3314 int wpa_ft_action_rx(struct wpa_state_machine *sm, const u8 *data, size_t len)
3315 {
3316 const u8 *sta_addr, *target_ap;
3317 const u8 *ies;
3318 size_t ies_len;
3319 u8 action;
3320 struct ft_rrb_frame *frame;
3321
3322 if (sm == NULL)
3323 return -1;
3324
3325 /*
3326 * data: Category[1] Action[1] STA_Address[6] Target_AP_Address[6]
3327 * FT Request action frame body[variable]
3328 */
3329
3330 if (len < 14) {
3331 wpa_printf(MSG_DEBUG, "FT: Too short FT Action frame "
3332 "(len=%lu)", (unsigned long) len);
3333 return -1;
3334 }
3335
3336 action = data[1];
3337 sta_addr = data + 2;
3338 target_ap = data + 8;
3339 ies = data + 14;
3340 ies_len = len - 14;
3341
3342 wpa_printf(MSG_DEBUG, "FT: Received FT Action frame (STA=" MACSTR
3343 " Target AP=" MACSTR " Action=%d)",
3344 MAC2STR(sta_addr), MAC2STR(target_ap), action);
3345
3346 if (os_memcmp(sta_addr, sm->addr, ETH_ALEN) != 0) {
3347 wpa_printf(MSG_DEBUG, "FT: Mismatch in FT Action STA address: "
3348 "STA=" MACSTR " STA-Address=" MACSTR,
3349 MAC2STR(sm->addr), MAC2STR(sta_addr));
3350 return -1;
3351 }
3352
3353 /*
3354 * Do some sanity checking on the target AP address (not own and not
3355 * broadcast. This could be extended to filter based on a list of known
3356 * APs in the MD (if such a list were configured).
3357 */
3358 if ((target_ap[0] & 0x01) ||
3359 os_memcmp(target_ap, sm->wpa_auth->addr, ETH_ALEN) == 0) {
3360 wpa_printf(MSG_DEBUG, "FT: Invalid Target AP in FT Action "
3361 "frame");
3362 return -1;
3363 }
3364
3365 wpa_hexdump(MSG_MSGDUMP, "FT: Action frame body", ies, ies_len);
3366
3367 if (!sm->wpa_auth->conf.ft_over_ds) {
3368 wpa_printf(MSG_DEBUG, "FT: Over-DS option disabled - reject");
3369 return -1;
3370 }
3371
3372 /* RRB - Forward action frame to the target AP */
3373 frame = os_malloc(sizeof(*frame) + len);
3374 if (frame == NULL)
3375 return -1;
3376 frame->frame_type = RSN_REMOTE_FRAME_TYPE_FT_RRB;
3377 frame->packet_type = FT_PACKET_REQUEST;
3378 frame->action_length = host_to_le16(len);
3379 os_memcpy(frame->ap_address, sm->wpa_auth->addr, ETH_ALEN);
3380 os_memcpy(frame + 1, data, len);
3381
3382 wpa_ft_rrb_send(sm->wpa_auth, target_ap, (u8 *) frame,
3383 sizeof(*frame) + len);
3384 os_free(frame);
3385
3386 return 0;
3387 }
3388
3389
wpa_ft_rrb_rx_request_cb(void * ctx,const u8 * dst,const u8 * bssid,u16 auth_transaction,u16 resp,const u8 * ies,size_t ies_len)3390 static void wpa_ft_rrb_rx_request_cb(void *ctx, const u8 *dst, const u8 *bssid,
3391 u16 auth_transaction, u16 resp,
3392 const u8 *ies, size_t ies_len)
3393 {
3394 struct wpa_state_machine *sm = ctx;
3395 wpa_printf(MSG_DEBUG, "FT: Over-the-DS RX request cb for " MACSTR,
3396 MAC2STR(sm->addr));
3397 wpa_ft_send_rrb_auth_resp(sm, sm->ft_pending_current_ap, sm->addr,
3398 WLAN_STATUS_SUCCESS, ies, ies_len);
3399 }
3400
3401
wpa_ft_rrb_rx_request(struct wpa_authenticator * wpa_auth,const u8 * current_ap,const u8 * sta_addr,const u8 * body,size_t len)3402 static int wpa_ft_rrb_rx_request(struct wpa_authenticator *wpa_auth,
3403 const u8 *current_ap, const u8 *sta_addr,
3404 const u8 *body, size_t len)
3405 {
3406 struct wpa_state_machine *sm;
3407 u16 status;
3408 u8 *resp_ies;
3409 size_t resp_ies_len;
3410 int res;
3411
3412 sm = wpa_ft_add_sta(wpa_auth, sta_addr);
3413 if (sm == NULL) {
3414 wpa_printf(MSG_DEBUG, "FT: Failed to add new STA based on "
3415 "RRB Request");
3416 return -1;
3417 }
3418
3419 wpa_hexdump(MSG_MSGDUMP, "FT: RRB Request Frame body", body, len);
3420
3421 sm->ft_pending_cb = wpa_ft_rrb_rx_request_cb;
3422 sm->ft_pending_cb_ctx = sm;
3423 os_memcpy(sm->ft_pending_current_ap, current_ap, ETH_ALEN);
3424 sm->ft_pending_pull_left_retries = sm->wpa_auth->conf.rkh_pull_retries;
3425 res = wpa_ft_process_auth_req(sm, body, len, &resp_ies,
3426 &resp_ies_len);
3427 if (res < 0) {
3428 wpa_printf(MSG_DEBUG, "FT: No immediate response available - wait for pull response");
3429 return 0;
3430 }
3431 status = res;
3432
3433 res = wpa_ft_send_rrb_auth_resp(sm, current_ap, sta_addr, status,
3434 resp_ies, resp_ies_len);
3435 os_free(resp_ies);
3436 return res;
3437 }
3438
3439
wpa_ft_send_rrb_auth_resp(struct wpa_state_machine * sm,const u8 * current_ap,const u8 * sta_addr,u16 status,const u8 * resp_ies,size_t resp_ies_len)3440 static int wpa_ft_send_rrb_auth_resp(struct wpa_state_machine *sm,
3441 const u8 *current_ap, const u8 *sta_addr,
3442 u16 status, const u8 *resp_ies,
3443 size_t resp_ies_len)
3444 {
3445 struct wpa_authenticator *wpa_auth = sm->wpa_auth;
3446 size_t rlen;
3447 struct ft_rrb_frame *frame;
3448 u8 *pos;
3449
3450 wpa_printf(MSG_DEBUG, "FT: RRB authentication response: STA=" MACSTR
3451 " CurrentAP=" MACSTR " status=%d",
3452 MAC2STR(sm->addr), MAC2STR(current_ap), status);
3453 wpa_hexdump(MSG_DEBUG, "FT: Response IEs", resp_ies, resp_ies_len);
3454
3455 /* RRB - Forward action frame response to the Current AP */
3456
3457 /*
3458 * data: Category[1] Action[1] STA_Address[6] Target_AP_Address[6]
3459 * Status_Code[2] FT Request action frame body[variable]
3460 */
3461 rlen = 2 + 2 * ETH_ALEN + 2 + resp_ies_len;
3462
3463 frame = os_malloc(sizeof(*frame) + rlen);
3464 if (frame == NULL)
3465 return -1;
3466 frame->frame_type = RSN_REMOTE_FRAME_TYPE_FT_RRB;
3467 frame->packet_type = FT_PACKET_RESPONSE;
3468 frame->action_length = host_to_le16(rlen);
3469 os_memcpy(frame->ap_address, wpa_auth->addr, ETH_ALEN);
3470 pos = (u8 *) (frame + 1);
3471 *pos++ = WLAN_ACTION_FT;
3472 *pos++ = 2; /* Action: Response */
3473 os_memcpy(pos, sta_addr, ETH_ALEN);
3474 pos += ETH_ALEN;
3475 os_memcpy(pos, wpa_auth->addr, ETH_ALEN);
3476 pos += ETH_ALEN;
3477 WPA_PUT_LE16(pos, status);
3478 pos += 2;
3479 if (resp_ies)
3480 os_memcpy(pos, resp_ies, resp_ies_len);
3481
3482 wpa_ft_rrb_send(wpa_auth, current_ap, (u8 *) frame,
3483 sizeof(*frame) + rlen);
3484 os_free(frame);
3485
3486 return 0;
3487 }
3488
3489
wpa_ft_rrb_build_r0(const u8 * key,const size_t key_len,const struct tlv_list * tlvs,const struct wpa_ft_pmk_r0_sa * pmk_r0,const u8 * r1kh_id,const u8 * s1kh_id,const struct tlv_list * tlv_auth,const u8 * src_addr,u8 type,u8 ** packet,size_t * packet_len)3490 static int wpa_ft_rrb_build_r0(const u8 *key, const size_t key_len,
3491 const struct tlv_list *tlvs,
3492 const struct wpa_ft_pmk_r0_sa *pmk_r0,
3493 const u8 *r1kh_id, const u8 *s1kh_id,
3494 const struct tlv_list *tlv_auth,
3495 const u8 *src_addr, u8 type,
3496 u8 **packet, size_t *packet_len)
3497 {
3498 u8 pmk_r1[PMK_LEN_MAX];
3499 size_t pmk_r1_len = pmk_r0->pmk_r0_len;
3500 u8 pmk_r1_name[WPA_PMK_NAME_LEN];
3501 u8 f_pairwise[sizeof(le16)];
3502 u8 f_expires_in[sizeof(le16)];
3503 u8 f_session_timeout[sizeof(le32)];
3504 int expires_in;
3505 int session_timeout;
3506 struct os_reltime now;
3507 int ret;
3508 struct tlv_list sess_tlv[] = {
3509 { .type = FT_RRB_PMK_R1, .len = pmk_r1_len,
3510 .data = pmk_r1 },
3511 { .type = FT_RRB_PMK_R1_NAME, .len = sizeof(pmk_r1_name),
3512 .data = pmk_r1_name },
3513 { .type = FT_RRB_PAIRWISE, .len = sizeof(f_pairwise),
3514 .data = f_pairwise },
3515 { .type = FT_RRB_EXPIRES_IN, .len = sizeof(f_expires_in),
3516 .data = f_expires_in },
3517 { .type = FT_RRB_IDENTITY, .len = pmk_r0->identity_len,
3518 .data = pmk_r0->identity },
3519 { .type = FT_RRB_RADIUS_CUI, .len = pmk_r0->radius_cui_len,
3520 .data = pmk_r0->radius_cui },
3521 { .type = FT_RRB_SESSION_TIMEOUT,
3522 .len = sizeof(f_session_timeout),
3523 .data = f_session_timeout },
3524 { .type = FT_RRB_LAST_EMPTY, .len = 0, .data = NULL },
3525 };
3526
3527 if (wpa_derive_pmk_r1(pmk_r0->pmk_r0, pmk_r0->pmk_r0_len,
3528 pmk_r0->pmk_r0_name, r1kh_id,
3529 s1kh_id, pmk_r1, pmk_r1_name) < 0)
3530 return -1;
3531 wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1 (for peer AP)",
3532 pmk_r1, pmk_r1_len);
3533 wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name (for peer AP)",
3534 pmk_r1_name, WPA_PMK_NAME_LEN);
3535 WPA_PUT_LE16(f_pairwise, pmk_r0->pairwise);
3536
3537 os_get_reltime(&now);
3538 if (pmk_r0->expiration > now.sec)
3539 expires_in = pmk_r0->expiration - now.sec;
3540 else if (pmk_r0->expiration)
3541 expires_in = 1;
3542 else
3543 expires_in = 0;
3544 WPA_PUT_LE16(f_expires_in, expires_in);
3545
3546 if (pmk_r0->session_timeout > now.sec)
3547 session_timeout = pmk_r0->session_timeout - now.sec;
3548 else if (pmk_r0->session_timeout)
3549 session_timeout = 1;
3550 else
3551 session_timeout = 0;
3552 WPA_PUT_LE32(f_session_timeout, session_timeout);
3553
3554 ret = wpa_ft_rrb_build(key, key_len, tlvs, sess_tlv, tlv_auth,
3555 pmk_r0->vlan, src_addr, type,
3556 packet, packet_len);
3557
3558 os_memset(pmk_r1, 0, sizeof(pmk_r1));
3559
3560 return ret;
3561 }
3562
3563
wpa_ft_rrb_rx_pull(struct wpa_authenticator * wpa_auth,const u8 * src_addr,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,int no_defer)3564 static int wpa_ft_rrb_rx_pull(struct wpa_authenticator *wpa_auth,
3565 const u8 *src_addr,
3566 const u8 *enc, size_t enc_len,
3567 const u8 *auth, size_t auth_len,
3568 int no_defer)
3569 {
3570 const char *msgtype = "pull request";
3571 u8 *plain = NULL, *packet = NULL;
3572 size_t plain_len = 0, packet_len = 0;
3573 struct ft_remote_r1kh *r1kh, *r1kh_wildcard;
3574 const u8 *key;
3575 size_t key_len;
3576 int seq_ret;
3577 const u8 *f_nonce, *f_r0kh_id, *f_r1kh_id, *f_s1kh_id, *f_pmk_r0_name;
3578 size_t f_nonce_len, f_r0kh_id_len, f_r1kh_id_len, f_s1kh_id_len;
3579 size_t f_pmk_r0_name_len;
3580 const struct wpa_ft_pmk_r0_sa *r0;
3581 int ret;
3582 struct tlv_list resp[2];
3583 struct tlv_list resp_auth[5];
3584 struct ft_rrb_seq f_seq;
3585
3586 wpa_printf(MSG_DEBUG, "FT: Received PMK-R1 pull");
3587
3588 RRB_GET_AUTH(FT_RRB_R0KH_ID, r0kh_id, msgtype, -1);
3589 wpa_hexdump(MSG_DEBUG, "FT: R0KH-ID", f_r0kh_id, f_r0kh_id_len);
3590
3591 if (wpa_ft_rrb_check_r0kh(wpa_auth, f_r0kh_id, f_r0kh_id_len)) {
3592 wpa_printf(MSG_DEBUG, "FT: R0KH-ID mismatch");
3593 goto out;
3594 }
3595
3596 RRB_GET_AUTH(FT_RRB_R1KH_ID, r1kh_id, msgtype, FT_R1KH_ID_LEN);
3597 wpa_printf(MSG_DEBUG, "FT: R1KH-ID=" MACSTR, MAC2STR(f_r1kh_id));
3598
3599 wpa_ft_rrb_lookup_r1kh(wpa_auth, f_r1kh_id, &r1kh, &r1kh_wildcard);
3600 if (r1kh) {
3601 key = r1kh->key;
3602 key_len = sizeof(r1kh->key);
3603 } else if (r1kh_wildcard) {
3604 wpa_printf(MSG_DEBUG, "FT: Using wildcard R1KH-ID");
3605 key = r1kh_wildcard->key;
3606 key_len = sizeof(r1kh_wildcard->key);
3607 } else {
3608 goto out;
3609 }
3610
3611 RRB_GET_AUTH(FT_RRB_NONCE, nonce, "pull request", FT_RRB_NONCE_LEN);
3612 wpa_hexdump(MSG_DEBUG, "FT: nonce", f_nonce, f_nonce_len);
3613
3614 seq_ret = FT_RRB_SEQ_DROP;
3615 if (r1kh)
3616 seq_ret = wpa_ft_rrb_seq_chk(r1kh->seq, src_addr, enc, enc_len,
3617 auth, auth_len, msgtype, no_defer);
3618 if (!no_defer && r1kh_wildcard &&
3619 (!r1kh || os_memcmp(r1kh->addr, src_addr, ETH_ALEN) != 0)) {
3620 /* wildcard: r1kh-id unknown or changed addr -> do a seq req */
3621 seq_ret = FT_RRB_SEQ_DEFER;
3622 }
3623
3624 if (seq_ret == FT_RRB_SEQ_DROP)
3625 goto out;
3626
3627 if (wpa_ft_rrb_decrypt(key, key_len, enc, enc_len, auth, auth_len,
3628 src_addr, FT_PACKET_R0KH_R1KH_PULL,
3629 &plain, &plain_len) < 0)
3630 goto out;
3631
3632 if (!r1kh)
3633 r1kh = wpa_ft_rrb_add_r1kh(wpa_auth, r1kh_wildcard, src_addr,
3634 f_r1kh_id,
3635 wpa_auth->conf.rkh_pos_timeout);
3636 if (!r1kh)
3637 goto out;
3638
3639 if (seq_ret == FT_RRB_SEQ_DEFER) {
3640 wpa_ft_rrb_seq_req(wpa_auth, r1kh->seq, src_addr, f_r0kh_id,
3641 f_r0kh_id_len, f_r1kh_id, key, key_len,
3642 enc, enc_len, auth, auth_len,
3643 &wpa_ft_rrb_rx_pull);
3644 goto out;
3645 }
3646
3647 wpa_ft_rrb_seq_accept(wpa_auth, r1kh->seq, src_addr, auth, auth_len,
3648 msgtype);
3649 wpa_ft_rrb_r1kh_replenish(wpa_auth, r1kh,
3650 wpa_auth->conf.rkh_pos_timeout);
3651
3652 RRB_GET(FT_RRB_PMK_R0_NAME, pmk_r0_name, msgtype, WPA_PMK_NAME_LEN);
3653 wpa_hexdump(MSG_DEBUG, "FT: PMKR0Name", f_pmk_r0_name,
3654 f_pmk_r0_name_len);
3655
3656 RRB_GET(FT_RRB_S1KH_ID, s1kh_id, msgtype, ETH_ALEN);
3657 wpa_printf(MSG_DEBUG, "FT: S1KH-ID=" MACSTR, MAC2STR(f_s1kh_id));
3658
3659 if (wpa_ft_new_seq(r1kh->seq, &f_seq) < 0) {
3660 wpa_printf(MSG_DEBUG, "FT: Failed to get seq num");
3661 goto out;
3662 }
3663
3664 resp[0].type = FT_RRB_S1KH_ID;
3665 resp[0].len = f_s1kh_id_len;
3666 resp[0].data = f_s1kh_id;
3667 resp[1].type = FT_RRB_LAST_EMPTY;
3668 resp[1].len = 0;
3669 resp[1].data = NULL;
3670
3671 resp_auth[0].type = FT_RRB_NONCE;
3672 resp_auth[0].len = f_nonce_len;
3673 resp_auth[0].data = f_nonce;
3674 resp_auth[1].type = FT_RRB_SEQ;
3675 resp_auth[1].len = sizeof(f_seq);
3676 resp_auth[1].data = (u8 *) &f_seq;
3677 resp_auth[2].type = FT_RRB_R0KH_ID;
3678 resp_auth[2].len = f_r0kh_id_len;
3679 resp_auth[2].data = f_r0kh_id;
3680 resp_auth[3].type = FT_RRB_R1KH_ID;
3681 resp_auth[3].len = f_r1kh_id_len;
3682 resp_auth[3].data = f_r1kh_id;
3683 resp_auth[4].type = FT_RRB_LAST_EMPTY;
3684 resp_auth[4].len = 0;
3685 resp_auth[4].data = NULL;
3686
3687 if (wpa_ft_fetch_pmk_r0(wpa_auth, f_s1kh_id, f_pmk_r0_name, &r0) < 0) {
3688 wpa_printf(MSG_DEBUG, "FT: No matching PMK-R0-Name found");
3689 ret = wpa_ft_rrb_build(key, key_len, resp, NULL, resp_auth,
3690 NULL, wpa_auth->addr,
3691 FT_PACKET_R0KH_R1KH_RESP,
3692 &packet, &packet_len);
3693 } else {
3694 ret = wpa_ft_rrb_build_r0(key, key_len, resp, r0, f_r1kh_id,
3695 f_s1kh_id, resp_auth, wpa_auth->addr,
3696 FT_PACKET_R0KH_R1KH_RESP,
3697 &packet, &packet_len);
3698 }
3699
3700 if (!ret)
3701 wpa_ft_rrb_oui_send(wpa_auth, src_addr,
3702 FT_PACKET_R0KH_R1KH_RESP, packet,
3703 packet_len);
3704
3705 out:
3706 os_free(plain);
3707 os_free(packet);
3708
3709 return 0;
3710 }
3711
3712
3713 /* @returns 0 on success
3714 * -1 on error
3715 * -2 if FR_RRB_PAIRWISE is missing
3716 */
wpa_ft_rrb_rx_r1(struct wpa_authenticator * wpa_auth,const u8 * src_addr,u8 type,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,const char * msgtype,u8 * s1kh_id_out,int (* cb)(struct wpa_authenticator * wpa_auth,const u8 * src_addr,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,int no_defer))3717 static int wpa_ft_rrb_rx_r1(struct wpa_authenticator *wpa_auth,
3718 const u8 *src_addr, u8 type,
3719 const u8 *enc, size_t enc_len,
3720 const u8 *auth, size_t auth_len,
3721 const char *msgtype, u8 *s1kh_id_out,
3722 int (*cb)(struct wpa_authenticator *wpa_auth,
3723 const u8 *src_addr,
3724 const u8 *enc, size_t enc_len,
3725 const u8 *auth, size_t auth_len,
3726 int no_defer))
3727 {
3728 u8 *plain = NULL;
3729 size_t plain_len = 0;
3730 struct ft_remote_r0kh *r0kh, *r0kh_wildcard;
3731 const u8 *key;
3732 size_t key_len;
3733 int seq_ret;
3734 const u8 *f_r1kh_id, *f_s1kh_id, *f_r0kh_id;
3735 const u8 *f_pmk_r1_name, *f_pairwise, *f_pmk_r1;
3736 const u8 *f_expires_in;
3737 size_t f_r1kh_id_len, f_s1kh_id_len, f_r0kh_id_len;
3738 const u8 *f_identity, *f_radius_cui;
3739 const u8 *f_session_timeout;
3740 size_t f_pmk_r1_name_len, f_pairwise_len, f_pmk_r1_len;
3741 size_t f_expires_in_len;
3742 size_t f_identity_len, f_radius_cui_len;
3743 size_t f_session_timeout_len;
3744 int pairwise;
3745 int ret = -1;
3746 int expires_in;
3747 int session_timeout;
3748 struct vlan_description vlan;
3749 size_t pmk_r1_len;
3750
3751 RRB_GET_AUTH(FT_RRB_R0KH_ID, r0kh_id, msgtype, -1);
3752 wpa_hexdump(MSG_DEBUG, "FT: R0KH-ID", f_r0kh_id, f_r0kh_id_len);
3753
3754 RRB_GET_AUTH(FT_RRB_R1KH_ID, r1kh_id, msgtype, FT_R1KH_ID_LEN);
3755 wpa_printf(MSG_DEBUG, "FT: R1KH-ID=" MACSTR, MAC2STR(f_r1kh_id));
3756
3757 if (wpa_ft_rrb_check_r1kh(wpa_auth, f_r1kh_id)) {
3758 wpa_printf(MSG_DEBUG, "FT: R1KH-ID mismatch");
3759 goto out;
3760 }
3761
3762 wpa_ft_rrb_lookup_r0kh(wpa_auth, f_r0kh_id, f_r0kh_id_len, &r0kh,
3763 &r0kh_wildcard);
3764 if (r0kh) {
3765 key = r0kh->key;
3766 key_len = sizeof(r0kh->key);
3767 } else if (r0kh_wildcard) {
3768 wpa_printf(MSG_DEBUG, "FT: Using wildcard R0KH-ID");
3769 key = r0kh_wildcard->key;
3770 key_len = sizeof(r0kh_wildcard->key);
3771 } else {
3772 goto out;
3773 }
3774
3775 seq_ret = FT_RRB_SEQ_DROP;
3776 if (r0kh) {
3777 seq_ret = wpa_ft_rrb_seq_chk(r0kh->seq, src_addr, enc, enc_len,
3778 auth, auth_len, msgtype,
3779 cb ? 0 : 1);
3780 }
3781 if (cb && r0kh_wildcard &&
3782 (!r0kh || os_memcmp(r0kh->addr, src_addr, ETH_ALEN) != 0)) {
3783 /* wildcard: r0kh-id unknown or changed addr -> do a seq req */
3784 seq_ret = FT_RRB_SEQ_DEFER;
3785 }
3786
3787 if (seq_ret == FT_RRB_SEQ_DROP)
3788 goto out;
3789
3790 if (wpa_ft_rrb_decrypt(key, key_len, enc, enc_len, auth, auth_len,
3791 src_addr, type, &plain, &plain_len) < 0)
3792 goto out;
3793
3794 if (!r0kh)
3795 r0kh = wpa_ft_rrb_add_r0kh(wpa_auth, r0kh_wildcard, src_addr,
3796 f_r0kh_id, f_r0kh_id_len,
3797 wpa_auth->conf.rkh_pos_timeout);
3798 if (!r0kh)
3799 goto out;
3800
3801 if (seq_ret == FT_RRB_SEQ_DEFER) {
3802 wpa_ft_rrb_seq_req(wpa_auth, r0kh->seq, src_addr, f_r0kh_id,
3803 f_r0kh_id_len, f_r1kh_id, key, key_len,
3804 enc, enc_len, auth, auth_len, cb);
3805 goto out;
3806 }
3807
3808 wpa_ft_rrb_seq_accept(wpa_auth, r0kh->seq, src_addr, auth, auth_len,
3809 msgtype);
3810 wpa_ft_rrb_r0kh_replenish(wpa_auth, r0kh,
3811 wpa_auth->conf.rkh_pos_timeout);
3812
3813 RRB_GET(FT_RRB_S1KH_ID, s1kh_id, msgtype, ETH_ALEN);
3814 wpa_printf(MSG_DEBUG, "FT: S1KH-ID=" MACSTR, MAC2STR(f_s1kh_id));
3815
3816 if (s1kh_id_out)
3817 os_memcpy(s1kh_id_out, f_s1kh_id, ETH_ALEN);
3818
3819 ret = -2;
3820 RRB_GET(FT_RRB_PAIRWISE, pairwise, msgtype, sizeof(le16));
3821 wpa_hexdump(MSG_DEBUG, "FT: pairwise", f_pairwise, f_pairwise_len);
3822
3823 ret = -1;
3824 RRB_GET(FT_RRB_PMK_R1_NAME, pmk_r1_name, msgtype, WPA_PMK_NAME_LEN);
3825 wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name",
3826 f_pmk_r1_name, WPA_PMK_NAME_LEN);
3827
3828 pmk_r1_len = PMK_LEN;
3829 if (wpa_ft_rrb_get_tlv(plain, plain_len, FT_RRB_PMK_R1, &f_pmk_r1_len,
3830 &f_pmk_r1) == 0 &&
3831 (f_pmk_r1_len == PMK_LEN || f_pmk_r1_len == SHA384_MAC_LEN))
3832 pmk_r1_len = f_pmk_r1_len;
3833 RRB_GET(FT_RRB_PMK_R1, pmk_r1, msgtype, pmk_r1_len);
3834 wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1", f_pmk_r1, pmk_r1_len);
3835
3836 pairwise = WPA_GET_LE16(f_pairwise);
3837
3838 RRB_GET_OPTIONAL(FT_RRB_EXPIRES_IN, expires_in, msgtype,
3839 sizeof(le16));
3840 if (f_expires_in)
3841 expires_in = WPA_GET_LE16(f_expires_in);
3842 else
3843 expires_in = 0;
3844
3845 wpa_printf(MSG_DEBUG, "FT: PMK-R1 %s - expires_in=%d", msgtype,
3846 expires_in);
3847
3848 if (wpa_ft_rrb_get_tlv_vlan(plain, plain_len, &vlan) < 0) {
3849 wpa_printf(MSG_DEBUG, "FT: Cannot parse vlan");
3850 wpa_ft_rrb_dump(plain, plain_len);
3851 goto out;
3852 }
3853
3854 wpa_printf(MSG_DEBUG, "FT: vlan %d%s",
3855 le_to_host16(vlan.untagged), vlan.tagged[0] ? "+" : "");
3856
3857 RRB_GET_OPTIONAL(FT_RRB_IDENTITY, identity, msgtype, -1);
3858 if (f_identity)
3859 wpa_hexdump_ascii(MSG_DEBUG, "FT: Identity", f_identity,
3860 f_identity_len);
3861
3862 RRB_GET_OPTIONAL(FT_RRB_RADIUS_CUI, radius_cui, msgtype, -1);
3863 if (f_radius_cui)
3864 wpa_hexdump_ascii(MSG_DEBUG, "FT: CUI", f_radius_cui,
3865 f_radius_cui_len);
3866
3867 RRB_GET_OPTIONAL(FT_RRB_SESSION_TIMEOUT, session_timeout, msgtype,
3868 sizeof(le32));
3869 if (f_session_timeout)
3870 session_timeout = WPA_GET_LE32(f_session_timeout);
3871 else
3872 session_timeout = 0;
3873 wpa_printf(MSG_DEBUG, "FT: session_timeout %d", session_timeout);
3874
3875 if (wpa_ft_store_pmk_r1(wpa_auth, f_s1kh_id, f_pmk_r1, pmk_r1_len,
3876 f_pmk_r1_name,
3877 pairwise, &vlan, expires_in, session_timeout,
3878 f_identity, f_identity_len, f_radius_cui,
3879 f_radius_cui_len) < 0)
3880 goto out;
3881
3882 ret = 0;
3883 out:
3884 if (plain) {
3885 os_memset(plain, 0, plain_len);
3886 os_free(plain);
3887 }
3888
3889 return ret;
3890
3891 }
3892
3893
ft_finish_pull(struct wpa_state_machine * sm)3894 static void ft_finish_pull(struct wpa_state_machine *sm)
3895 {
3896 int res;
3897 u8 *resp_ies;
3898 size_t resp_ies_len;
3899 u16 status;
3900
3901 if (!sm->ft_pending_cb || !sm->ft_pending_req_ies)
3902 return;
3903
3904 res = wpa_ft_process_auth_req(sm, wpabuf_head(sm->ft_pending_req_ies),
3905 wpabuf_len(sm->ft_pending_req_ies),
3906 &resp_ies, &resp_ies_len);
3907 if (res < 0) {
3908 /* this loop is broken by ft_pending_pull_left_retries */
3909 wpa_printf(MSG_DEBUG,
3910 "FT: Callback postponed until response is available");
3911 return;
3912 }
3913 wpabuf_free(sm->ft_pending_req_ies);
3914 sm->ft_pending_req_ies = NULL;
3915 status = res;
3916 wpa_printf(MSG_DEBUG, "FT: Postponed auth callback result for " MACSTR
3917 " - status %u", MAC2STR(sm->addr), status);
3918
3919 sm->ft_pending_cb(sm->ft_pending_cb_ctx, sm->addr, sm->wpa_auth->addr,
3920 sm->ft_pending_auth_transaction + 1, status,
3921 resp_ies, resp_ies_len);
3922 os_free(resp_ies);
3923 }
3924
3925
3926 struct ft_get_sta_ctx {
3927 const u8 *nonce;
3928 const u8 *s1kh_id;
3929 struct wpa_state_machine *sm;
3930 };
3931
3932
ft_get_sta_cb(struct wpa_state_machine * sm,void * ctx)3933 static int ft_get_sta_cb(struct wpa_state_machine *sm, void *ctx)
3934 {
3935 struct ft_get_sta_ctx *info = ctx;
3936
3937 if ((info->s1kh_id &&
3938 os_memcmp(info->s1kh_id, sm->addr, ETH_ALEN) != 0) ||
3939 os_memcmp(info->nonce, sm->ft_pending_pull_nonce,
3940 FT_RRB_NONCE_LEN) != 0 ||
3941 sm->ft_pending_cb == NULL || sm->ft_pending_req_ies == NULL)
3942 return 0;
3943
3944 info->sm = sm;
3945
3946 return 1;
3947 }
3948
3949
wpa_ft_rrb_rx_resp(struct wpa_authenticator * wpa_auth,const u8 * src_addr,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,int no_defer)3950 static int wpa_ft_rrb_rx_resp(struct wpa_authenticator *wpa_auth,
3951 const u8 *src_addr,
3952 const u8 *enc, size_t enc_len,
3953 const u8 *auth, size_t auth_len,
3954 int no_defer)
3955 {
3956 const char *msgtype = "pull response";
3957 int nak, ret = -1;
3958 struct ft_get_sta_ctx ctx;
3959 u8 s1kh_id[ETH_ALEN];
3960 const u8 *f_nonce;
3961 size_t f_nonce_len;
3962
3963 wpa_printf(MSG_DEBUG, "FT: Received PMK-R1 pull response");
3964
3965 RRB_GET_AUTH(FT_RRB_NONCE, nonce, msgtype, FT_RRB_NONCE_LEN);
3966 wpa_hexdump(MSG_DEBUG, "FT: nonce", f_nonce, f_nonce_len);
3967
3968 os_memset(&ctx, 0, sizeof(ctx));
3969 ctx.nonce = f_nonce;
3970 if (!wpa_auth_for_each_sta(wpa_auth, ft_get_sta_cb, &ctx)) {
3971 /* nonce not found */
3972 wpa_printf(MSG_DEBUG, "FT: Invalid nonce");
3973 return -1;
3974 }
3975
3976 ret = wpa_ft_rrb_rx_r1(wpa_auth, src_addr, FT_PACKET_R0KH_R1KH_RESP,
3977 enc, enc_len, auth, auth_len, msgtype, s1kh_id,
3978 no_defer ? NULL : &wpa_ft_rrb_rx_resp);
3979 if (ret == -2) {
3980 ret = 0;
3981 nak = 1;
3982 } else {
3983 nak = 0;
3984 }
3985 if (ret < 0)
3986 return -1;
3987
3988 ctx.s1kh_id = s1kh_id;
3989 if (wpa_auth_for_each_sta(wpa_auth, ft_get_sta_cb, &ctx)) {
3990 wpa_printf(MSG_DEBUG,
3991 "FT: Response to a pending pull request for " MACSTR,
3992 MAC2STR(ctx.sm->addr));
3993 eloop_cancel_timeout(wpa_ft_expire_pull, ctx.sm, NULL);
3994 if (nak)
3995 ctx.sm->ft_pending_pull_left_retries = 0;
3996 ft_finish_pull(ctx.sm);
3997 }
3998
3999 out:
4000 return ret;
4001 }
4002
4003
wpa_ft_rrb_rx_push(struct wpa_authenticator * wpa_auth,const u8 * src_addr,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,int no_defer)4004 static int wpa_ft_rrb_rx_push(struct wpa_authenticator *wpa_auth,
4005 const u8 *src_addr,
4006 const u8 *enc, size_t enc_len,
4007 const u8 *auth, size_t auth_len, int no_defer)
4008 {
4009 const char *msgtype = "push";
4010
4011 wpa_printf(MSG_DEBUG, "FT: Received PMK-R1 push");
4012
4013 if (wpa_ft_rrb_rx_r1(wpa_auth, src_addr, FT_PACKET_R0KH_R1KH_PUSH,
4014 enc, enc_len, auth, auth_len, msgtype, NULL,
4015 no_defer ? NULL : wpa_ft_rrb_rx_push) < 0)
4016 return -1;
4017
4018 return 0;
4019 }
4020
4021
wpa_ft_rrb_rx_seq(struct wpa_authenticator * wpa_auth,const u8 * src_addr,int type,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,struct ft_remote_seq ** rkh_seq,u8 ** key,size_t * key_len,struct ft_remote_r0kh ** r0kh_out,struct ft_remote_r1kh ** r1kh_out,struct ft_remote_r0kh ** r0kh_wildcard_out,struct ft_remote_r1kh ** r1kh_wildcard_out)4022 static int wpa_ft_rrb_rx_seq(struct wpa_authenticator *wpa_auth,
4023 const u8 *src_addr, int type,
4024 const u8 *enc, size_t enc_len,
4025 const u8 *auth, size_t auth_len,
4026 struct ft_remote_seq **rkh_seq,
4027 u8 **key, size_t *key_len,
4028 struct ft_remote_r0kh **r0kh_out,
4029 struct ft_remote_r1kh **r1kh_out,
4030 struct ft_remote_r0kh **r0kh_wildcard_out,
4031 struct ft_remote_r1kh **r1kh_wildcard_out)
4032 {
4033 struct ft_remote_r0kh *r0kh = NULL;
4034 struct ft_remote_r1kh *r1kh = NULL;
4035 const u8 *f_r0kh_id, *f_r1kh_id;
4036 size_t f_r0kh_id_len, f_r1kh_id_len;
4037 int to_r0kh, to_r1kh;
4038 u8 *plain = NULL;
4039 size_t plain_len = 0;
4040 struct ft_remote_r0kh *r0kh_wildcard;
4041 struct ft_remote_r1kh *r1kh_wildcard;
4042
4043 RRB_GET_AUTH(FT_RRB_R0KH_ID, r0kh_id, "seq", -1);
4044 RRB_GET_AUTH(FT_RRB_R1KH_ID, r1kh_id, "seq", FT_R1KH_ID_LEN);
4045
4046 to_r0kh = !wpa_ft_rrb_check_r0kh(wpa_auth, f_r0kh_id, f_r0kh_id_len);
4047 to_r1kh = !wpa_ft_rrb_check_r1kh(wpa_auth, f_r1kh_id);
4048
4049 if (to_r0kh && to_r1kh) {
4050 wpa_printf(MSG_DEBUG, "FT: seq - local R0KH-ID and R1KH-ID");
4051 goto out;
4052 }
4053
4054 if (!to_r0kh && !to_r1kh) {
4055 wpa_printf(MSG_DEBUG, "FT: seq - remote R0KH-ID and R1KH-ID");
4056 goto out;
4057 }
4058
4059 if (!to_r0kh) {
4060 wpa_ft_rrb_lookup_r0kh(wpa_auth, f_r0kh_id, f_r0kh_id_len,
4061 &r0kh, &r0kh_wildcard);
4062 if (!r0kh_wildcard &&
4063 (!r0kh || os_memcmp(r0kh->addr, src_addr, ETH_ALEN) != 0)) {
4064 wpa_hexdump(MSG_DEBUG, "FT: Did not find R0KH-ID",
4065 f_r0kh_id, f_r0kh_id_len);
4066 goto out;
4067 }
4068 if (r0kh) {
4069 *key = r0kh->key;
4070 *key_len = sizeof(r0kh->key);
4071 } else {
4072 *key = r0kh_wildcard->key;
4073 *key_len = sizeof(r0kh_wildcard->key);
4074 }
4075 }
4076
4077 if (!to_r1kh) {
4078 wpa_ft_rrb_lookup_r1kh(wpa_auth, f_r1kh_id, &r1kh,
4079 &r1kh_wildcard);
4080 if (!r1kh_wildcard &&
4081 (!r1kh || os_memcmp(r1kh->addr, src_addr, ETH_ALEN) != 0)) {
4082 wpa_hexdump(MSG_DEBUG, "FT: Did not find R1KH-ID",
4083 f_r1kh_id, FT_R1KH_ID_LEN);
4084 goto out;
4085 }
4086 if (r1kh) {
4087 *key = r1kh->key;
4088 *key_len = sizeof(r1kh->key);
4089 } else {
4090 *key = r1kh_wildcard->key;
4091 *key_len = sizeof(r1kh_wildcard->key);
4092 }
4093 }
4094
4095 if (wpa_ft_rrb_decrypt(*key, *key_len, enc, enc_len, auth, auth_len,
4096 src_addr, type, &plain, &plain_len) < 0)
4097 goto out;
4098
4099 os_free(plain);
4100
4101 if (!to_r0kh) {
4102 if (!r0kh)
4103 r0kh = wpa_ft_rrb_add_r0kh(wpa_auth, r0kh_wildcard,
4104 src_addr, f_r0kh_id,
4105 f_r0kh_id_len,
4106 ftRRBseqTimeout);
4107 if (!r0kh)
4108 goto out;
4109
4110 wpa_ft_rrb_r0kh_replenish(wpa_auth, r0kh, ftRRBseqTimeout);
4111 *rkh_seq = r0kh->seq;
4112 if (r0kh_out)
4113 *r0kh_out = r0kh;
4114 if (r0kh_wildcard_out)
4115 *r0kh_wildcard_out = r0kh_wildcard;
4116 }
4117
4118 if (!to_r1kh) {
4119 if (!r1kh)
4120 r1kh = wpa_ft_rrb_add_r1kh(wpa_auth, r1kh_wildcard,
4121 src_addr, f_r1kh_id,
4122 ftRRBseqTimeout);
4123 if (!r1kh)
4124 goto out;
4125
4126 wpa_ft_rrb_r1kh_replenish(wpa_auth, r1kh, ftRRBseqTimeout);
4127 *rkh_seq = r1kh->seq;
4128 if (r1kh_out)
4129 *r1kh_out = r1kh;
4130 if (r1kh_wildcard_out)
4131 *r1kh_wildcard_out = r1kh_wildcard;
4132 }
4133
4134 return 0;
4135 out:
4136 return -1;
4137 }
4138
4139
wpa_ft_rrb_rx_seq_req(struct wpa_authenticator * wpa_auth,const u8 * src_addr,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,int no_defer)4140 static int wpa_ft_rrb_rx_seq_req(struct wpa_authenticator *wpa_auth,
4141 const u8 *src_addr,
4142 const u8 *enc, size_t enc_len,
4143 const u8 *auth, size_t auth_len,
4144 int no_defer)
4145 {
4146 int ret = -1;
4147 struct ft_rrb_seq f_seq;
4148 const u8 *f_nonce, *f_r0kh_id, *f_r1kh_id;
4149 size_t f_nonce_len, f_r0kh_id_len, f_r1kh_id_len;
4150 struct ft_remote_seq *rkh_seq = NULL;
4151 u8 *packet = NULL, *key = NULL;
4152 size_t packet_len = 0, key_len = 0;
4153 struct tlv_list seq_resp_auth[5];
4154
4155 wpa_printf(MSG_DEBUG, "FT: Received sequence number request");
4156
4157 if (wpa_ft_rrb_rx_seq(wpa_auth, src_addr, FT_PACKET_R0KH_R1KH_SEQ_REQ,
4158 enc, enc_len, auth, auth_len, &rkh_seq, &key,
4159 &key_len, NULL, NULL, NULL, NULL) < 0)
4160 goto out;
4161
4162 RRB_GET_AUTH(FT_RRB_NONCE, nonce, "seq request", FT_RRB_NONCE_LEN);
4163 wpa_hexdump(MSG_DEBUG, "FT: seq request - nonce", f_nonce, f_nonce_len);
4164
4165 RRB_GET_AUTH(FT_RRB_R0KH_ID, r0kh_id, "seq", -1);
4166 RRB_GET_AUTH(FT_RRB_R1KH_ID, r1kh_id, "seq", FT_R1KH_ID_LEN);
4167
4168 if (wpa_ft_new_seq(rkh_seq, &f_seq) < 0) {
4169 wpa_printf(MSG_DEBUG, "FT: Failed to get seq num");
4170 goto out;
4171 }
4172
4173 seq_resp_auth[0].type = FT_RRB_NONCE;
4174 seq_resp_auth[0].len = f_nonce_len;
4175 seq_resp_auth[0].data = f_nonce;
4176 seq_resp_auth[1].type = FT_RRB_SEQ;
4177 seq_resp_auth[1].len = sizeof(f_seq);
4178 seq_resp_auth[1].data = (u8 *) &f_seq;
4179 seq_resp_auth[2].type = FT_RRB_R0KH_ID;
4180 seq_resp_auth[2].len = f_r0kh_id_len;
4181 seq_resp_auth[2].data = f_r0kh_id;
4182 seq_resp_auth[3].type = FT_RRB_R1KH_ID;
4183 seq_resp_auth[3].len = FT_R1KH_ID_LEN;
4184 seq_resp_auth[3].data = f_r1kh_id;
4185 seq_resp_auth[4].type = FT_RRB_LAST_EMPTY;
4186 seq_resp_auth[4].len = 0;
4187 seq_resp_auth[4].data = NULL;
4188
4189 if (wpa_ft_rrb_build(key, key_len, NULL, NULL, seq_resp_auth, NULL,
4190 wpa_auth->addr, FT_PACKET_R0KH_R1KH_SEQ_RESP,
4191 &packet, &packet_len) < 0)
4192 goto out;
4193
4194 wpa_ft_rrb_oui_send(wpa_auth, src_addr,
4195 FT_PACKET_R0KH_R1KH_SEQ_RESP, packet,
4196 packet_len);
4197
4198 out:
4199 os_free(packet);
4200
4201 return ret;
4202 }
4203
4204
wpa_ft_rrb_rx_seq_resp(struct wpa_authenticator * wpa_auth,const u8 * src_addr,const u8 * enc,size_t enc_len,const u8 * auth,size_t auth_len,int no_defer)4205 static int wpa_ft_rrb_rx_seq_resp(struct wpa_authenticator *wpa_auth,
4206 const u8 *src_addr,
4207 const u8 *enc, size_t enc_len,
4208 const u8 *auth, size_t auth_len,
4209 int no_defer)
4210 {
4211 u8 *key = NULL;
4212 size_t key_len = 0;
4213 struct ft_remote_r0kh *r0kh = NULL, *r0kh_wildcard = NULL;
4214 struct ft_remote_r1kh *r1kh = NULL, *r1kh_wildcard = NULL;
4215 const u8 *f_nonce, *f_seq;
4216 size_t f_nonce_len, f_seq_len;
4217 struct ft_remote_seq *rkh_seq = NULL;
4218 struct ft_remote_item *item;
4219 struct os_reltime now, now_remote;
4220 int seq_ret, found;
4221 const struct ft_rrb_seq *msg_both;
4222 u32 msg_dom, msg_seq;
4223
4224 wpa_printf(MSG_DEBUG, "FT: Received sequence number response");
4225
4226 if (wpa_ft_rrb_rx_seq(wpa_auth, src_addr, FT_PACKET_R0KH_R1KH_SEQ_RESP,
4227 enc, enc_len, auth, auth_len, &rkh_seq, &key,
4228 &key_len, &r0kh, &r1kh, &r0kh_wildcard,
4229 &r1kh_wildcard) < 0)
4230 goto out;
4231
4232 RRB_GET_AUTH(FT_RRB_NONCE, nonce, "seq response", FT_RRB_NONCE_LEN);
4233 wpa_hexdump(MSG_DEBUG, "FT: seq response - nonce", f_nonce,
4234 f_nonce_len);
4235
4236 found = 0;
4237 dl_list_for_each(item, &rkh_seq->rx.queue, struct ft_remote_item,
4238 list) {
4239 if (os_memcmp_const(f_nonce, item->nonce,
4240 FT_RRB_NONCE_LEN) != 0 ||
4241 os_get_reltime(&now) < 0 ||
4242 os_reltime_expired(&now, &item->nonce_ts, ftRRBseqTimeout))
4243 continue;
4244
4245 found = 1;
4246 break;
4247 }
4248 if (!found) {
4249 wpa_printf(MSG_DEBUG, "FT: seq response - bad nonce");
4250 goto out;
4251 }
4252
4253 if (r0kh) {
4254 wpa_ft_rrb_r0kh_replenish(wpa_auth, r0kh,
4255 wpa_auth->conf.rkh_pos_timeout);
4256 if (r0kh_wildcard)
4257 os_memcpy(r0kh->addr, src_addr, ETH_ALEN);
4258 }
4259
4260 if (r1kh) {
4261 wpa_ft_rrb_r1kh_replenish(wpa_auth, r1kh,
4262 wpa_auth->conf.rkh_pos_timeout);
4263 if (r1kh_wildcard)
4264 os_memcpy(r1kh->addr, src_addr, ETH_ALEN);
4265 }
4266
4267 seq_ret = wpa_ft_rrb_seq_chk(rkh_seq, src_addr, enc, enc_len, auth,
4268 auth_len, "seq response", 1);
4269 if (seq_ret == FT_RRB_SEQ_OK) {
4270 wpa_printf(MSG_DEBUG, "FT: seq response - valid seq number");
4271 wpa_ft_rrb_seq_accept(wpa_auth, rkh_seq, src_addr, auth,
4272 auth_len, "seq response");
4273 } else {
4274 wpa_printf(MSG_DEBUG, "FT: seq response - reset seq number");
4275
4276 RRB_GET_AUTH(FT_RRB_SEQ, seq, "seq response",
4277 sizeof(*msg_both));
4278 msg_both = (const struct ft_rrb_seq *) f_seq;
4279
4280 msg_dom = le_to_host32(msg_both->dom);
4281 msg_seq = le_to_host32(msg_both->seq);
4282 now_remote.sec = le_to_host32(msg_both->ts);
4283 now_remote.usec = 0;
4284
4285 rkh_seq->rx.num_last = 2;
4286 rkh_seq->rx.dom = msg_dom;
4287 rkh_seq->rx.offsetidx = 0;
4288 /* Accept some older, possibly cached packets as well */
4289 rkh_seq->rx.last[0] = msg_seq - FT_REMOTE_SEQ_BACKLOG -
4290 dl_list_len(&rkh_seq->rx.queue);
4291 rkh_seq->rx.last[1] = msg_seq;
4292
4293 /* local time - offset = remote time
4294 * <=> local time - remote time = offset */
4295 os_reltime_sub(&now, &now_remote, &rkh_seq->rx.time_offset);
4296 }
4297
4298 wpa_ft_rrb_seq_flush(wpa_auth, rkh_seq, 1);
4299
4300 return 0;
4301 out:
4302 return -1;
4303 }
4304
4305
wpa_ft_rrb_rx(struct wpa_authenticator * wpa_auth,const u8 * src_addr,const u8 * data,size_t data_len)4306 int wpa_ft_rrb_rx(struct wpa_authenticator *wpa_auth, const u8 *src_addr,
4307 const u8 *data, size_t data_len)
4308 {
4309 struct ft_rrb_frame *frame;
4310 u16 alen;
4311 const u8 *pos, *end, *start;
4312 u8 action;
4313 const u8 *sta_addr, *target_ap_addr;
4314
4315 wpa_printf(MSG_DEBUG, "FT: RRB received frame from remote AP " MACSTR,
4316 MAC2STR(src_addr));
4317
4318 if (data_len < sizeof(*frame)) {
4319 wpa_printf(MSG_DEBUG, "FT: Too short RRB frame (data_len=%lu)",
4320 (unsigned long) data_len);
4321 return -1;
4322 }
4323
4324 pos = data;
4325 frame = (struct ft_rrb_frame *) pos;
4326 pos += sizeof(*frame);
4327
4328 alen = le_to_host16(frame->action_length);
4329 wpa_printf(MSG_DEBUG, "FT: RRB frame - frame_type=%d packet_type=%d "
4330 "action_length=%d ap_address=" MACSTR,
4331 frame->frame_type, frame->packet_type, alen,
4332 MAC2STR(frame->ap_address));
4333
4334 if (frame->frame_type != RSN_REMOTE_FRAME_TYPE_FT_RRB) {
4335 /* Discard frame per IEEE Std 802.11r-2008, 11A.10.3 */
4336 wpa_printf(MSG_DEBUG, "FT: RRB discarded frame with "
4337 "unrecognized type %d", frame->frame_type);
4338 return -1;
4339 }
4340
4341 if (alen > data_len - sizeof(*frame)) {
4342 wpa_printf(MSG_DEBUG, "FT: RRB frame too short for action "
4343 "frame");
4344 return -1;
4345 }
4346
4347 wpa_hexdump(MSG_MSGDUMP, "FT: RRB - FT Action frame", pos, alen);
4348
4349 if (alen < 1 + 1 + 2 * ETH_ALEN) {
4350 wpa_printf(MSG_DEBUG, "FT: Too short RRB frame (not enough "
4351 "room for Action Frame body); alen=%lu",
4352 (unsigned long) alen);
4353 return -1;
4354 }
4355 start = pos;
4356 end = pos + alen;
4357
4358 if (*pos != WLAN_ACTION_FT) {
4359 wpa_printf(MSG_DEBUG, "FT: Unexpected Action frame category "
4360 "%d", *pos);
4361 return -1;
4362 }
4363
4364 pos++;
4365 action = *pos++;
4366 sta_addr = pos;
4367 pos += ETH_ALEN;
4368 target_ap_addr = pos;
4369 pos += ETH_ALEN;
4370 wpa_printf(MSG_DEBUG, "FT: RRB Action Frame: action=%d sta_addr="
4371 MACSTR " target_ap_addr=" MACSTR,
4372 action, MAC2STR(sta_addr), MAC2STR(target_ap_addr));
4373
4374 if (frame->packet_type == FT_PACKET_REQUEST) {
4375 wpa_printf(MSG_DEBUG, "FT: FT Packet Type - Request");
4376
4377 if (action != 1) {
4378 wpa_printf(MSG_DEBUG, "FT: Unexpected Action %d in "
4379 "RRB Request", action);
4380 return -1;
4381 }
4382
4383 if (os_memcmp(target_ap_addr, wpa_auth->addr, ETH_ALEN) != 0) {
4384 wpa_printf(MSG_DEBUG, "FT: Target AP address in the "
4385 "RRB Request does not match with own "
4386 "address");
4387 return -1;
4388 }
4389
4390 if (wpa_ft_rrb_rx_request(wpa_auth, frame->ap_address,
4391 sta_addr, pos, end - pos) < 0)
4392 return -1;
4393 } else if (frame->packet_type == FT_PACKET_RESPONSE) {
4394 u16 status_code;
4395
4396 if (end - pos < 2) {
4397 wpa_printf(MSG_DEBUG, "FT: Not enough room for status "
4398 "code in RRB Response");
4399 return -1;
4400 }
4401 status_code = WPA_GET_LE16(pos);
4402 pos += 2;
4403
4404 wpa_printf(MSG_DEBUG, "FT: FT Packet Type - Response "
4405 "(status_code=%d)", status_code);
4406
4407 if (wpa_ft_action_send(wpa_auth, sta_addr, start, alen) < 0)
4408 return -1;
4409 } else {
4410 wpa_printf(MSG_DEBUG, "FT: RRB discarded frame with unknown "
4411 "packet_type %d", frame->packet_type);
4412 return -1;
4413 }
4414
4415 if (end > pos) {
4416 wpa_hexdump(MSG_DEBUG, "FT: Ignore extra data in end",
4417 pos, end - pos);
4418 }
4419
4420 return 0;
4421 }
4422
4423
wpa_ft_rrb_oui_rx(struct wpa_authenticator * wpa_auth,const u8 * src_addr,const u8 * dst_addr,u8 oui_suffix,const u8 * data,size_t data_len)4424 void wpa_ft_rrb_oui_rx(struct wpa_authenticator *wpa_auth, const u8 *src_addr,
4425 const u8 *dst_addr, u8 oui_suffix, const u8 *data,
4426 size_t data_len)
4427 {
4428 const u8 *auth, *enc;
4429 size_t alen, elen;
4430 int no_defer = 0;
4431
4432 wpa_printf(MSG_DEBUG, "FT: RRB-OUI received frame from remote AP "
4433 MACSTR, MAC2STR(src_addr));
4434 wpa_printf(MSG_DEBUG, "FT: RRB-OUI frame - oui_suffix=%d", oui_suffix);
4435 wpa_hexdump(MSG_MSGDUMP, "FT: RRB frame payload", data, data_len);
4436
4437 if (is_multicast_ether_addr(src_addr)) {
4438 wpa_printf(MSG_DEBUG,
4439 "FT: RRB-OUI received frame from multicast address "
4440 MACSTR, MAC2STR(src_addr));
4441 return;
4442 }
4443
4444 if (is_multicast_ether_addr(dst_addr)) {
4445 wpa_printf(MSG_DEBUG,
4446 "FT: RRB-OUI received frame from remote AP " MACSTR
4447 " to multicast address " MACSTR,
4448 MAC2STR(src_addr), MAC2STR(dst_addr));
4449 no_defer = 1;
4450 }
4451
4452 if (data_len < sizeof(u16)) {
4453 wpa_printf(MSG_DEBUG, "FT: RRB-OUI frame too short");
4454 return;
4455 }
4456
4457 alen = WPA_GET_LE16(data);
4458 if (data_len < sizeof(u16) + alen) {
4459 wpa_printf(MSG_DEBUG, "FT: RRB-OUI frame too short");
4460 return;
4461 }
4462
4463 auth = data + sizeof(u16);
4464 wpa_hexdump(MSG_MSGDUMP, "FT: Authenticated payload", auth, alen);
4465 enc = data + sizeof(u16) + alen;
4466 elen = data_len - sizeof(u16) - alen;
4467 wpa_hexdump(MSG_MSGDUMP, "FT: Encrypted payload", enc, elen);
4468
4469 switch (oui_suffix) {
4470 case FT_PACKET_R0KH_R1KH_PULL:
4471 wpa_ft_rrb_rx_pull(wpa_auth, src_addr, enc, elen, auth, alen,
4472 no_defer);
4473 break;
4474 case FT_PACKET_R0KH_R1KH_RESP:
4475 wpa_ft_rrb_rx_resp(wpa_auth, src_addr, enc, elen, auth, alen,
4476 no_defer);
4477 break;
4478 case FT_PACKET_R0KH_R1KH_PUSH:
4479 wpa_ft_rrb_rx_push(wpa_auth, src_addr, enc, elen, auth, alen,
4480 no_defer);
4481 break;
4482 case FT_PACKET_R0KH_R1KH_SEQ_REQ:
4483 wpa_ft_rrb_rx_seq_req(wpa_auth, src_addr, enc, elen, auth, alen,
4484 no_defer);
4485 break;
4486 case FT_PACKET_R0KH_R1KH_SEQ_RESP:
4487 wpa_ft_rrb_rx_seq_resp(wpa_auth, src_addr, enc, elen, auth,
4488 alen, no_defer);
4489 break;
4490 }
4491 }
4492
4493
wpa_ft_generate_pmk_r1(struct wpa_authenticator * wpa_auth,struct wpa_ft_pmk_r0_sa * pmk_r0,struct ft_remote_r1kh * r1kh,const u8 * s1kh_id)4494 static int wpa_ft_generate_pmk_r1(struct wpa_authenticator *wpa_auth,
4495 struct wpa_ft_pmk_r0_sa *pmk_r0,
4496 struct ft_remote_r1kh *r1kh,
4497 const u8 *s1kh_id)
4498 {
4499 u8 *packet;
4500 size_t packet_len;
4501 struct ft_rrb_seq f_seq;
4502 struct tlv_list push[] = {
4503 { .type = FT_RRB_S1KH_ID, .len = ETH_ALEN,
4504 .data = s1kh_id },
4505 { .type = FT_RRB_PMK_R0_NAME, .len = WPA_PMK_NAME_LEN,
4506 .data = pmk_r0->pmk_r0_name },
4507 { .type = FT_RRB_LAST_EMPTY, .len = 0, .data = NULL },
4508 };
4509 struct tlv_list push_auth[] = {
4510 { .type = FT_RRB_SEQ, .len = sizeof(f_seq),
4511 .data = (u8 *) &f_seq },
4512 { .type = FT_RRB_R0KH_ID,
4513 .len = wpa_auth->conf.r0_key_holder_len,
4514 .data = wpa_auth->conf.r0_key_holder },
4515 { .type = FT_RRB_R1KH_ID, .len = FT_R1KH_ID_LEN,
4516 .data = r1kh->id },
4517 { .type = FT_RRB_LAST_EMPTY, .len = 0, .data = NULL },
4518 };
4519
4520 if (wpa_ft_new_seq(r1kh->seq, &f_seq) < 0) {
4521 wpa_printf(MSG_DEBUG, "FT: Failed to get seq num");
4522 return -1;
4523 }
4524
4525 if (wpa_ft_rrb_build_r0(r1kh->key, sizeof(r1kh->key), push, pmk_r0,
4526 r1kh->id, s1kh_id, push_auth, wpa_auth->addr,
4527 FT_PACKET_R0KH_R1KH_PUSH,
4528 &packet, &packet_len) < 0)
4529 return -1;
4530
4531 wpa_ft_rrb_oui_send(wpa_auth, r1kh->addr, FT_PACKET_R0KH_R1KH_PUSH,
4532 packet, packet_len);
4533
4534 os_free(packet);
4535 return 0;
4536 }
4537
4538
wpa_ft_push_pmk_r1(struct wpa_authenticator * wpa_auth,const u8 * addr)4539 void wpa_ft_push_pmk_r1(struct wpa_authenticator *wpa_auth, const u8 *addr)
4540 {
4541 struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache;
4542 struct wpa_ft_pmk_r0_sa *r0, *r0found = NULL;
4543 struct ft_remote_r1kh *r1kh;
4544
4545 if (!wpa_auth->conf.pmk_r1_push)
4546 return;
4547 if (!wpa_auth->conf.r1kh_list)
4548 return;
4549
4550 dl_list_for_each(r0, &cache->pmk_r0, struct wpa_ft_pmk_r0_sa, list) {
4551 if (os_memcmp(r0->spa, addr, ETH_ALEN) == 0) {
4552 r0found = r0;
4553 break;
4554 }
4555 }
4556
4557 r0 = r0found;
4558 if (r0 == NULL || r0->pmk_r1_pushed)
4559 return;
4560 r0->pmk_r1_pushed = 1;
4561
4562 wpa_printf(MSG_DEBUG, "FT: Deriving and pushing PMK-R1 keys to R1KHs "
4563 "for STA " MACSTR, MAC2STR(addr));
4564
4565 for (r1kh = *wpa_auth->conf.r1kh_list; r1kh; r1kh = r1kh->next) {
4566 if (is_zero_ether_addr(r1kh->addr) ||
4567 is_zero_ether_addr(r1kh->id))
4568 continue;
4569 if (wpa_ft_rrb_init_r1kh_seq(r1kh) < 0)
4570 continue;
4571 wpa_ft_generate_pmk_r1(wpa_auth, r0, r1kh, addr);
4572 }
4573 }
4574
4575 #endif /* CONFIG_IEEE80211R_AP */
4576