Home | History | Annotate | Download | only in ap
      1 /*
      2  * hostapd - IEEE 802.11r - Fast BSS Transition
      3  * Copyright (c) 2004-2018, Jouni Malinen <j (at) 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  */
     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  */
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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  */
    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 
    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 
    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 
    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 
    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 *
    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 
    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 
    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
    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
    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
    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
    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
    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
    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 
    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
    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 
    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 
    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 
    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 
    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 
    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
    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
   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
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 *
   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 
   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 
   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 *
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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
   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 
   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 
   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 
   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 
   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 
   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 */
   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  */
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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  */
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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