key.c 35.0 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-only
2 3 4 5
/*
 * Copyright 2002-2005, Instant802 Networks, Inc.
 * Copyright 2005-2006, Devicescape Software, Inc.
 * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz>
6
 * Copyright 2007-2008	Johannes Berg <johannes@sipsolutions.net>
7
 * Copyright 2013-2014  Intel Mobile Communications GmbH
8
 * Copyright 2015-2017	Intel Deutschland GmbH
9
 * Copyright 2018-2019  Intel Corporation
10 11
 */

J
Johannes Berg 已提交
12 13 14
#include <linux/if_ether.h>
#include <linux/etherdevice.h>
#include <linux/list.h>
15
#include <linux/rcupdate.h>
16
#include <linux/rtnetlink.h>
17
#include <linux/slab.h>
18
#include <linux/export.h>
19
#include <net/mac80211.h>
20
#include <crypto/algapi.h>
21
#include <asm/unaligned.h>
22
#include "ieee80211_i.h"
23
#include "driver-ops.h"
24 25
#include "debugfs_key.h"
#include "aes_ccm.h"
26
#include "aes_cmac.h"
27
#include "aes_gmac.h"
28
#include "aes_gcm.h"
29

J
Johannes Berg 已提交
30

J
Johannes Berg 已提交
31 32
/**
 * DOC: Key handling basics
J
Johannes Berg 已提交
33 34 35 36 37
 *
 * Key handling in mac80211 is done based on per-interface (sub_if_data)
 * keys and per-station keys. Since each station belongs to an interface,
 * each station key also belongs to that interface.
 *
38 39 40 41 42 43 44
 * Hardware acceleration is done on a best-effort basis for algorithms
 * that are implemented in software,  for each key the hardware is asked
 * to enable that key for offloading but if it cannot do that the key is
 * simply kept for software encryption (unless it is for an algorithm
 * that isn't implemented in software).
 * There is currently no way of knowing whether a key is handled in SW
 * or HW except by looking into debugfs.
J
Johannes Berg 已提交
45
 *
46 47 48 49 50 51
 * All key management is internally protected by a mutex. Within all
 * other parts of mac80211, key references are, just as STA structure
 * references, protected by RCU. Note, however, that some things are
 * unprotected, namely the key->sta dereferences within the hardware
 * acceleration functions. This means that sta_info_destroy() must
 * remove the key which waits for an RCU grace period.
J
Johannes Berg 已提交
52 53 54 55
 */

static const u8 bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

J
Johannes Berg 已提交
56
static void assert_key_lock(struct ieee80211_local *local)
57
{
58
	lockdep_assert_held(&local->key_mtx);
59 60
}

61 62 63 64 65 66 67 68
static void
update_vlan_tailroom_need_count(struct ieee80211_sub_if_data *sdata, int delta)
{
	struct ieee80211_sub_if_data *vlan;

	if (sdata->vif.type != NL80211_IFTYPE_AP)
		return;

69 70
	/* crypto_tx_tailroom_needed_cnt is protected by this */
	assert_key_lock(sdata->local);
71

72 73 74
	rcu_read_lock();

	list_for_each_entry_rcu(vlan, &sdata->u.ap.vlans, u.vlan.list)
75 76
		vlan->crypto_tx_tailroom_needed_cnt += delta;

77
	rcu_read_unlock();
78 79
}

80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata)
{
	/*
	 * When this count is zero, SKB resizing for allocating tailroom
	 * for IV or MMIC is skipped. But, this check has created two race
	 * cases in xmit path while transiting from zero count to one:
	 *
	 * 1. SKB resize was skipped because no key was added but just before
	 * the xmit key is added and SW encryption kicks off.
	 *
	 * 2. SKB resize was skipped because all the keys were hw planted but
	 * just before xmit one of the key is deleted and SW encryption kicks
	 * off.
	 *
	 * In both the above case SW encryption will find not enough space for
	 * tailroom and exits with WARN_ON. (See WARN_ONs at wpa.c)
	 *
	 * Solution has been explained at
	 * http://mid.gmane.org/1308590980.4322.19.camel@jlt3.sipsolutions.net
	 */

101 102
	assert_key_lock(sdata->local);

103 104
	update_vlan_tailroom_need_count(sdata, 1);

105 106 107 108 109 110 111 112 113
	if (!sdata->crypto_tx_tailroom_needed_cnt++) {
		/*
		 * Flush all XMIT packets currently using HW encryption or no
		 * encryption at all if the count transition is from 0 -> 1.
		 */
		synchronize_net();
	}
}

114 115 116
static void decrease_tailroom_need_count(struct ieee80211_sub_if_data *sdata,
					 int delta)
{
117 118
	assert_key_lock(sdata->local);

119 120 121 122 123 124
	WARN_ON_ONCE(sdata->crypto_tx_tailroom_needed_cnt < delta);

	update_vlan_tailroom_need_count(sdata, -delta);
	sdata->crypto_tx_tailroom_needed_cnt -= delta;
}

125
static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
J
Johannes Berg 已提交
126
{
127
	struct ieee80211_sub_if_data *sdata = key->sdata;
128
	struct sta_info *sta;
129
	int ret = -EOPNOTSUPP;
J
Johannes Berg 已提交
130

131 132
	might_sleep();

133 134 135 136 137 138 139 140
	if (key->flags & KEY_FLAG_TAINTED) {
		/* If we get here, it's during resume and the key is
		 * tainted so shouldn't be used/programmed any more.
		 * However, its flags may still indicate that it was
		 * programmed into the device (since we're in resume)
		 * so clear that flag now to avoid trying to remove
		 * it again later.
		 */
141 142 143 144 145 146
		if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
		    !(key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
					 IEEE80211_KEY_FLAG_PUT_MIC_SPACE |
					 IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
			increment_tailroom_need_count(sdata);

147
		key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
148
		return -EINVAL;
149
	}
150

151
	if (!key->local->ops->set_key)
152
		goto out_unsupported;
J
Johannes Berg 已提交
153

J
Johannes Berg 已提交
154 155
	assert_key_lock(key->local);

156
	sta = key->sta;
157

158 159 160 161 162
	/*
	 * If this is a per-STA GTK, check if it
	 * is supported; if not, return.
	 */
	if (sta && !(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE) &&
163
	    !ieee80211_hw_check(&key->local->hw, SUPPORTS_PER_STA_GTK))
164 165
		goto out_unsupported;

166 167 168
	if (sta && !sta->uploaded)
		goto out_unsupported;

169 170 171 172 173
	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
		/*
		 * The driver doesn't know anything about VLAN interfaces.
		 * Hence, don't send GTKs for VLAN interfaces to the driver.
		 */
174 175
		if (!(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
			ret = 1;
176
			goto out_unsupported;
177
		}
178
	}
J
Johannes Berg 已提交
179

180 181
	ret = drv_set_key(key->local, SET_KEY, sdata,
			  sta ? &sta->sta : NULL, &key->conf);
J
Johannes Berg 已提交
182

183
	if (!ret) {
J
Johannes Berg 已提交
184
		key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;
185

186 187 188
		if (!(key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
					 IEEE80211_KEY_FLAG_PUT_MIC_SPACE |
					 IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
189
			decrease_tailroom_need_count(sdata, 1);
190

191 192 193
		WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) &&
			(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV));

194 195 196
		WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_MIC_SPACE) &&
			(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC));

197 198
		return 0;
	}
J
Johannes Berg 已提交
199

200
	if (ret != -ENOSPC && ret != -EOPNOTSUPP && ret != 1)
J
Johannes Berg 已提交
201
		sdata_err(sdata,
J
Joe Perches 已提交
202
			  "failed to set key (%d, %pM) to hardware (%d)\n",
203 204
			  key->conf.keyidx,
			  sta ? sta->sta.addr : bcast_addr, ret);
205

206 207 208 209 210 211
 out_unsupported:
	switch (key->conf.cipher) {
	case WLAN_CIPHER_SUITE_WEP40:
	case WLAN_CIPHER_SUITE_WEP104:
	case WLAN_CIPHER_SUITE_TKIP:
	case WLAN_CIPHER_SUITE_CCMP:
J
Jouni Malinen 已提交
212
	case WLAN_CIPHER_SUITE_CCMP_256:
213
	case WLAN_CIPHER_SUITE_AES_CMAC:
214
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
215 216
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
217 218
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
219 220 221
		/* all of these we can do in software - if driver can */
		if (ret == 1)
			return 0;
222
		if (ieee80211_hw_check(&key->local->hw, SW_CRYPTO_CONTROL))
223
			return -EINVAL;
224 225 226
		return 0;
	default:
		return -EINVAL;
227
	}
J
Johannes Berg 已提交
228 229 230 231
}

static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
{
232
	struct ieee80211_sub_if_data *sdata;
233
	struct sta_info *sta;
J
Johannes Berg 已提交
234 235
	int ret;

236 237
	might_sleep();

238
	if (!key || !key->local->ops->set_key)
J
Johannes Berg 已提交
239 240
		return;

J
Johannes Berg 已提交
241 242 243
	assert_key_lock(key->local);

	if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
J
Johannes Berg 已提交
244 245
		return;

246
	sta = key->sta;
247 248
	sdata = key->sdata;

249 250 251
	if (!(key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
				 IEEE80211_KEY_FLAG_PUT_MIC_SPACE |
				 IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
252 253
		increment_tailroom_need_count(sdata);

254
	key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
J
Johannes Berg 已提交
255
	ret = drv_set_key(key->local, DISABLE_KEY, sdata,
256
			  sta ? &sta->sta : NULL, &key->conf);
J
Johannes Berg 已提交
257 258

	if (ret)
J
Johannes Berg 已提交
259
		sdata_err(sdata,
J
Joe Perches 已提交
260
			  "failed to remove key (%d, %pM) from hardware (%d)\n",
261 262
			  key->conf.keyidx,
			  sta ? sta->sta.addr : bcast_addr, ret);
263
}
J
Johannes Berg 已提交
264

265 266 267 268 269 270 271 272
int ieee80211_set_tx_key(struct ieee80211_key *key)
{
	struct sta_info *sta = key->sta;
	struct ieee80211_local *local = key->local;

	assert_key_lock(local);

	sta->ptk_idx = key->conf.keyidx;
273

274 275
	if (!ieee80211_hw_check(&local->hw, AMPDU_KEYBORDER_SUPPORT))
		clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
276 277 278 279 280
	ieee80211_check_fast_xmit(sta);

	return 0;
}

281 282
static void ieee80211_pairwise_rekey(struct ieee80211_key *old,
				     struct ieee80211_key *new)
283
{
284 285 286
	struct ieee80211_local *local = new->local;
	struct sta_info *sta = new->sta;
	int i;
287

288
	assert_key_lock(local);
289

290 291 292
	if (new->conf.flags & IEEE80211_KEY_FLAG_NO_AUTO_TX) {
		/* Extended Key ID key install, initial one or rekey */

293 294
		if (sta->ptk_idx != INVALID_PTK_KEYIDX &&
		    !ieee80211_hw_check(&local->hw, AMPDU_KEYBORDER_SUPPORT)) {
295 296
			/* Aggregation Sessions with Extended Key ID must not
			 * mix MPDUs with different keyIDs within one A-MPDU.
297 298
			 * Tear down running Tx aggregation sessions and block
			 * new Rx/Tx aggregation requests during rekey to
299 300 301 302
			 * ensure there are no A-MPDUs when the driver is not
			 * supporting A-MPDU key borders. (Blocking Tx only
			 * would be sufficient but WLAN_STA_BLOCK_BA gets the
			 * job done for the few ms we need it.)
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
			 */
			set_sta_flag(sta, WLAN_STA_BLOCK_BA);
			mutex_lock(&sta->ampdu_mlme.mtx);
			for (i = 0; i <  IEEE80211_NUM_TIDS; i++)
				___ieee80211_stop_tx_ba_session(sta, i,
								AGG_STOP_LOCAL_REQUEST);
			mutex_unlock(&sta->ampdu_mlme.mtx);
		}
	} else if (old) {
		/* Rekey without Extended Key ID.
		 * Aggregation sessions are OK when running on SW crypto.
		 * A broken remote STA may cause issues not observed with HW
		 * crypto, though.
		 */
		if (!(old->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
			return;
319

320 321
		/* Stop Tx till we are on the new key */
		old->flags |= KEY_FLAG_TAINTED;
322 323 324 325 326 327 328 329 330 331 332 333 334
		ieee80211_clear_fast_xmit(sta);
		if (ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION)) {
			set_sta_flag(sta, WLAN_STA_BLOCK_BA);
			ieee80211_sta_tear_down_BA_sessions(sta,
							    AGG_STOP_LOCAL_REQUEST);
		}
		if (!wiphy_ext_feature_isset(local->hw.wiphy,
					     NL80211_EXT_FEATURE_CAN_REPLACE_PTK0)) {
			pr_warn_ratelimited("Rekeying PTK for STA %pM but driver can't safely do that.",
					    sta->sta.addr);
			/* Flushing the driver queues *may* help prevent
			 * the clear text leaks and freezes.
			 */
335
			ieee80211_flush_queues(local, old->sdata, false);
336 337
		}
	}
338 339 340
}

static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata,
341
					int idx, bool uni, bool multi)
342 343 344
{
	struct ieee80211_key *key = NULL;

J
Johannes Berg 已提交
345 346
	assert_key_lock(sdata->local);

347
	if (idx >= 0 && idx < NUM_DEFAULT_KEYS)
J
Johannes Berg 已提交
348
		key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
349

350
	if (uni) {
351
		rcu_assign_pointer(sdata->default_unicast_key, key);
J
Johannes Berg 已提交
352
		ieee80211_check_fast_xmit_iface(sdata);
353 354
		if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN)
			drv_set_default_unicast_key(sdata->local, sdata, idx);
355 356
	}

357 358
	if (multi)
		rcu_assign_pointer(sdata->default_multicast_key, key);
359

360
	ieee80211_debugfs_key_update_default(sdata);
361 362
}

363 364
void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
			       bool uni, bool multi)
365
{
J
Johannes Berg 已提交
366
	mutex_lock(&sdata->local->key_mtx);
367
	__ieee80211_set_default_key(sdata, idx, uni, multi);
J
Johannes Berg 已提交
368
	mutex_unlock(&sdata->local->key_mtx);
369 370
}

371 372 373 374 375
static void
__ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata, int idx)
{
	struct ieee80211_key *key = NULL;

J
Johannes Berg 已提交
376 377
	assert_key_lock(sdata->local);

378 379
	if (idx >= NUM_DEFAULT_KEYS &&
	    idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
J
Johannes Berg 已提交
380
		key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
381 382 383

	rcu_assign_pointer(sdata->default_mgmt_key, key);

384
	ieee80211_debugfs_key_update_default(sdata);
385 386 387 388 389
}

void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
				    int idx)
{
J
Johannes Berg 已提交
390
	mutex_lock(&sdata->local->key_mtx);
391
	__ieee80211_set_default_mgmt_key(sdata, idx);
J
Johannes Berg 已提交
392
	mutex_unlock(&sdata->local->key_mtx);
393 394
}

395
static int ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
396 397 398 399
				  struct sta_info *sta,
				  bool pairwise,
				  struct ieee80211_key *old,
				  struct ieee80211_key *new)
400
{
401
	int idx;
402
	int ret = 0;
403
	bool defunikey, defmultikey, defmgmtkey;
404

405 406
	/* caller must provide at least one old/new */
	if (WARN_ON(!new && !old))
407
		return 0;
408

409
	if (new)
410
		list_add_tail_rcu(&new->list, &sdata->key_list);
411

412
	WARN_ON(new && old && new->conf.keyidx != old->conf.keyidx);
413

414 415 416 417 418 419 420
	if (new && sta && pairwise) {
		/* Unicast rekey needs special handling. With Extended Key ID
		 * old is still NULL for the first rekey.
		 */
		ieee80211_pairwise_rekey(old, new);
	}

421
	if (old) {
422
		idx = old->conf.keyidx;
423 424 425 426 427 428 429

		if (old->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {
			ieee80211_key_disable_hw_accel(old);

			if (new)
				ret = ieee80211_key_enable_hw_accel(new);
		}
430
	} else {
431
		/* new must be provided in case old is not */
432
		idx = new->conf.keyidx;
433
		if (!new->local->wowlan)
434 435 436 437 438
			ret = ieee80211_key_enable_hw_accel(new);
	}

	if (ret)
		return ret;
439

440 441 442
	if (sta) {
		if (pairwise) {
			rcu_assign_pointer(sta->ptk[idx], new);
443 444 445
			if (new &&
			    !(new->conf.flags & IEEE80211_KEY_FLAG_NO_AUTO_TX)) {
				sta->ptk_idx = idx;
446 447 448
				clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
				ieee80211_check_fast_xmit(sta);
			}
449 450 451
		} else {
			rcu_assign_pointer(sta->gtk[idx], new);
		}
452 453 454 455 456
		/* Only needed for transition from no key -> key.
		 * Still triggers unnecessary when using Extended Key ID
		 * and installing the second key ID the first time.
		 */
		if (new && !old)
457
			ieee80211_check_fast_rx(sta);
458
	} else {
J
Johannes Berg 已提交
459 460 461 462 463 464 465 466 467
		defunikey = old &&
			old == key_mtx_dereference(sdata->local,
						sdata->default_unicast_key);
		defmultikey = old &&
			old == key_mtx_dereference(sdata->local,
						sdata->default_multicast_key);
		defmgmtkey = old &&
			old == key_mtx_dereference(sdata->local,
						sdata->default_mgmt_key);
468

469 470 471 472
		if (defunikey && !new)
			__ieee80211_set_default_key(sdata, -1, true, false);
		if (defmultikey && !new)
			__ieee80211_set_default_key(sdata, -1, false, true);
473 474
		if (defmgmtkey && !new)
			__ieee80211_set_default_mgmt_key(sdata, -1);
475 476

		rcu_assign_pointer(sdata->keys[idx], new);
477 478 479 480 481 482
		if (defunikey && new)
			__ieee80211_set_default_key(sdata, new->conf.keyidx,
						    true, false);
		if (defmultikey && new)
			__ieee80211_set_default_key(sdata, new->conf.keyidx,
						    false, true);
483 484 485
		if (defmgmtkey && new)
			__ieee80211_set_default_mgmt_key(sdata,
							 new->conf.keyidx);
486 487
	}

488
	if (old)
489
		list_del_rcu(&old->list);
490 491

	return 0;
J
Johannes Berg 已提交
492 493
}

494 495 496 497 498
struct ieee80211_key *
ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
		    const u8 *key_data,
		    size_t seq_len, const u8 *seq,
		    const struct ieee80211_cipher_scheme *cs)
499 500
{
	struct ieee80211_key *key;
501
	int i, j, err;
502

J
Johannes Berg 已提交
503 504
	if (WARN_ON(idx < 0 || idx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS))
		return ERR_PTR(-EINVAL);
J
Johannes Berg 已提交
505 506

	key = kzalloc(sizeof(struct ieee80211_key) + key_len, GFP_KERNEL);
507
	if (!key)
508
		return ERR_PTR(-ENOMEM);
J
Johannes Berg 已提交
509 510 511 512 513 514 515 516

	/*
	 * Default to software encryption; we'll later upload the
	 * key to the hardware if possible.
	 */
	key->conf.flags = 0;
	key->flags = 0;

517
	key->conf.cipher = cipher;
J
Johannes Berg 已提交
518 519
	key->conf.keyidx = idx;
	key->conf.keylen = key_len;
520 521 522
	switch (cipher) {
	case WLAN_CIPHER_SUITE_WEP40:
	case WLAN_CIPHER_SUITE_WEP104:
523 524
		key->conf.iv_len = IEEE80211_WEP_IV_LEN;
		key->conf.icv_len = IEEE80211_WEP_ICV_LEN;
525
		break;
526
	case WLAN_CIPHER_SUITE_TKIP:
527 528
		key->conf.iv_len = IEEE80211_TKIP_IV_LEN;
		key->conf.icv_len = IEEE80211_TKIP_ICV_LEN;
529
		if (seq) {
530
			for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
531 532 533 534 535 536
				key->u.tkip.rx[i].iv32 =
					get_unaligned_le32(&seq[2]);
				key->u.tkip.rx[i].iv16 =
					get_unaligned_le16(seq);
			}
		}
537
		spin_lock_init(&key->u.tkip.txlock);
538
		break;
539
	case WLAN_CIPHER_SUITE_CCMP:
540 541
		key->conf.iv_len = IEEE80211_CCMP_HDR_LEN;
		key->conf.icv_len = IEEE80211_CCMP_MIC_LEN;
542
		if (seq) {
543
			for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++)
544
				for (j = 0; j < IEEE80211_CCMP_PN_LEN; j++)
545
					key->u.ccmp.rx_pn[i][j] =
546
						seq[IEEE80211_CCMP_PN_LEN - j - 1];
547
		}
J
Johannes Berg 已提交
548 549 550 551
		/*
		 * Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
J
Jouni Malinen 已提交
552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
		key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt(
			key_data, key_len, IEEE80211_CCMP_MIC_LEN);
		if (IS_ERR(key->u.ccmp.tfm)) {
			err = PTR_ERR(key->u.ccmp.tfm);
			kfree(key);
			return ERR_PTR(err);
		}
		break;
	case WLAN_CIPHER_SUITE_CCMP_256:
		key->conf.iv_len = IEEE80211_CCMP_256_HDR_LEN;
		key->conf.icv_len = IEEE80211_CCMP_256_MIC_LEN;
		for (i = 0; seq && i < IEEE80211_NUM_TIDS + 1; i++)
			for (j = 0; j < IEEE80211_CCMP_256_PN_LEN; j++)
				key->u.ccmp.rx_pn[i][j] =
					seq[IEEE80211_CCMP_256_PN_LEN - j - 1];
		/* Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
		key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt(
			key_data, key_len, IEEE80211_CCMP_256_MIC_LEN);
572 573
		if (IS_ERR(key->u.ccmp.tfm)) {
			err = PTR_ERR(key->u.ccmp.tfm);
574
			kfree(key);
575
			return ERR_PTR(err);
J
Johannes Berg 已提交
576
		}
J
Johannes Berg 已提交
577 578
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
579
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
J
Johannes Berg 已提交
580
		key->conf.iv_len = 0;
581 582 583 584
		if (cipher == WLAN_CIPHER_SUITE_AES_CMAC)
			key->conf.icv_len = sizeof(struct ieee80211_mmie);
		else
			key->conf.icv_len = sizeof(struct ieee80211_mmie_16);
J
Johannes Berg 已提交
585
		if (seq)
586
			for (j = 0; j < IEEE80211_CMAC_PN_LEN; j++)
J
Johannes Berg 已提交
587
				key->u.aes_cmac.rx_pn[j] =
588
					seq[IEEE80211_CMAC_PN_LEN - j - 1];
589 590 591 592 593
		/*
		 * Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
		key->u.aes_cmac.tfm =
594
			ieee80211_aes_cmac_key_setup(key_data, key_len);
595 596
		if (IS_ERR(key->u.aes_cmac.tfm)) {
			err = PTR_ERR(key->u.aes_cmac.tfm);
597
			kfree(key);
598
			return ERR_PTR(err);
599
		}
J
Johannes Berg 已提交
600
		break;
601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
		key->conf.iv_len = 0;
		key->conf.icv_len = sizeof(struct ieee80211_mmie_16);
		if (seq)
			for (j = 0; j < IEEE80211_GMAC_PN_LEN; j++)
				key->u.aes_gmac.rx_pn[j] =
					seq[IEEE80211_GMAC_PN_LEN - j - 1];
		/* Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
		key->u.aes_gmac.tfm =
			ieee80211_aes_gmac_key_setup(key_data, key_len);
		if (IS_ERR(key->u.aes_gmac.tfm)) {
			err = PTR_ERR(key->u.aes_gmac.tfm);
			kfree(key);
			return ERR_PTR(err);
		}
		break;
620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
		key->conf.iv_len = IEEE80211_GCMP_HDR_LEN;
		key->conf.icv_len = IEEE80211_GCMP_MIC_LEN;
		for (i = 0; seq && i < IEEE80211_NUM_TIDS + 1; i++)
			for (j = 0; j < IEEE80211_GCMP_PN_LEN; j++)
				key->u.gcmp.rx_pn[i][j] =
					seq[IEEE80211_GCMP_PN_LEN - j - 1];
		/* Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
		key->u.gcmp.tfm = ieee80211_aes_gcm_key_setup_encrypt(key_data,
								      key_len);
		if (IS_ERR(key->u.gcmp.tfm)) {
			err = PTR_ERR(key->u.gcmp.tfm);
			kfree(key);
			return ERR_PTR(err);
		}
		break;
639 640
	default:
		if (cs) {
641 642 643 644
			if (seq_len && seq_len != cs->pn_len) {
				kfree(key);
				return ERR_PTR(-EINVAL);
			}
645 646 647 648

			key->conf.iv_len = cs->hdr_len;
			key->conf.icv_len = cs->mic_len;
			for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++)
649
				for (j = 0; j < seq_len; j++)
650
					key->u.gen.rx_pn[i][j] =
651
							seq[seq_len - j - 1];
652
			key->flags |= KEY_FLAG_CIPHER_SCHEME;
653
		}
654
	}
J
Johannes Berg 已提交
655 656
	memcpy(key->conf.key, key_data, key_len);
	INIT_LIST_HEAD(&key->list);
657

658 659
	return key;
}
J
Johannes Berg 已提交
660

661 662
static void ieee80211_key_free_common(struct ieee80211_key *key)
{
663 664
	switch (key->conf.cipher) {
	case WLAN_CIPHER_SUITE_CCMP:
J
Jouni Malinen 已提交
665
	case WLAN_CIPHER_SUITE_CCMP_256:
666
		ieee80211_aes_key_free(key->u.ccmp.tfm);
667 668
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
669
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
670
		ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm);
671
		break;
672 673 674 675
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
		ieee80211_aes_gmac_key_free(key->u.aes_gmac.tfm);
		break;
676 677 678 679 680
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
		ieee80211_aes_gcm_key_free(key->u.gcmp.tfm);
		break;
	}
681
	kzfree(key);
682 683
}

684 685
static void __ieee80211_key_destroy(struct ieee80211_key *key,
				    bool delay_tailroom)
J
Johannes Berg 已提交
686
{
687
	if (key->local) {
688 689
		struct ieee80211_sub_if_data *sdata = key->sdata;

690
		ieee80211_debugfs_key_remove(key);
691 692 693 694 695 696 697

		if (delay_tailroom) {
			/* see ieee80211_delayed_tailroom_dec */
			sdata->crypto_tx_tailroom_pending_dec++;
			schedule_delayed_work(&sdata->dec_tailroom_needed_wk,
					      HZ/2);
		} else {
698
			decrease_tailroom_need_count(sdata, 1);
699
		}
700
	}
J
Johannes Berg 已提交
701

702 703 704
	ieee80211_key_free_common(key);
}

705 706 707 708 709 710 711
static void ieee80211_key_destroy(struct ieee80211_key *key,
				  bool delay_tailroom)
{
	if (!key)
		return;

	/*
712 713
	 * Synchronize so the TX path and rcu key iterators
	 * can no longer be using this key before we free/remove it.
714 715 716 717 718 719
	 */
	synchronize_net();

	__ieee80211_key_destroy(key, delay_tailroom);
}

720 721 722 723
void ieee80211_key_free_unused(struct ieee80211_key *key)
{
	WARN_ON(key->sdata || key->local);
	ieee80211_key_free_common(key);
J
Johannes Berg 已提交
724 725
}

726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758
static bool ieee80211_key_identical(struct ieee80211_sub_if_data *sdata,
				    struct ieee80211_key *old,
				    struct ieee80211_key *new)
{
	u8 tkip_old[WLAN_KEY_LEN_TKIP], tkip_new[WLAN_KEY_LEN_TKIP];
	u8 *tk_old, *tk_new;

	if (!old || new->conf.keylen != old->conf.keylen)
		return false;

	tk_old = old->conf.key;
	tk_new = new->conf.key;

	/*
	 * In station mode, don't compare the TX MIC key, as it's never used
	 * and offloaded rekeying may not care to send it to the host. This
	 * is the case in iwlwifi, for example.
	 */
	if (sdata->vif.type == NL80211_IFTYPE_STATION &&
	    new->conf.cipher == WLAN_CIPHER_SUITE_TKIP &&
	    new->conf.keylen == WLAN_KEY_LEN_TKIP &&
	    !(new->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
		memcpy(tkip_old, tk_old, WLAN_KEY_LEN_TKIP);
		memcpy(tkip_new, tk_new, WLAN_KEY_LEN_TKIP);
		memset(tkip_old + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY, 0, 8);
		memset(tkip_new + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY, 0, 8);
		tk_old = tkip_old;
		tk_new = tkip_new;
	}

	return !crypto_memneq(tk_old, tk_new, new->conf.keylen);
}

759 760 761
int ieee80211_key_link(struct ieee80211_key *key,
		       struct ieee80211_sub_if_data *sdata,
		       struct sta_info *sta)
762 763
{
	struct ieee80211_key *old_key;
764 765 766 767 768 769 770 771
	int idx = key->conf.keyidx;
	bool pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE;
	/*
	 * We want to delay tailroom updates only for station - in that
	 * case it helps roaming speed, but in other cases it hurts and
	 * can cause warnings to appear.
	 */
	bool delay_tailroom = sdata->vif.type == NL80211_IFTYPE_STATION;
772
	int ret = -EOPNOTSUPP;
773

J
Johannes Berg 已提交
774
	mutex_lock(&sdata->local->key_mtx);
775

776 777 778
	if (sta && pairwise) {
		struct ieee80211_key *alt_key;

779
		old_key = key_mtx_dereference(sdata->local, sta->ptk[idx]);
780 781 782 783 784
		alt_key = key_mtx_dereference(sdata->local, sta->ptk[idx ^ 1]);

		/* The rekey code assumes that the old and new key are using
		 * the same cipher. Enforce the assumption for pairwise keys.
		 */
785 786
		if ((alt_key && alt_key->conf.cipher != key->conf.cipher) ||
		    (old_key && old_key->conf.cipher != key->conf.cipher))
787 788
			goto out;
	} else if (sta) {
J
Johannes Berg 已提交
789
		old_key = key_mtx_dereference(sdata->local, sta->gtk[idx]);
790
	} else {
J
Johannes Berg 已提交
791
		old_key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
792 793 794 795
	}

	/* Non-pairwise keys must also not switch the cipher on rekey */
	if (!pairwise) {
796
		if (old_key && old_key->conf.cipher != key->conf.cipher)
797 798
			goto out;
	}
799

800 801 802 803
	/*
	 * Silently accept key re-installation without really installing the
	 * new version of the key to avoid nonce reuse or replay issues.
	 */
804
	if (ieee80211_key_identical(sdata, old_key, key)) {
805 806 807 808 809 810 811 812 813
		ieee80211_key_free_unused(key);
		ret = 0;
		goto out;
	}

	key->local = sdata->local;
	key->sdata = sdata;
	key->sta = sta;

814 815
	increment_tailroom_need_count(sdata);

816
	ret = ieee80211_key_replace(sdata, sta, pairwise, old_key, key);
817

818 819 820
	if (!ret) {
		ieee80211_debugfs_key_add(key);
		ieee80211_key_destroy(old_key, delay_tailroom);
821
	} else {
822
		ieee80211_key_free(key, delay_tailroom);
823
	}
824

825
 out:
J
Johannes Berg 已提交
826
	mutex_unlock(&sdata->local->key_mtx);
827 828

	return ret;
829 830
}

831
void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom)
832
{
833 834 835
	if (!key)
		return;

836 837 838
	/*
	 * Replace key with nothingness if it was ever used.
	 */
J
Johannes Berg 已提交
839
	if (key->sdata)
840
		ieee80211_key_replace(key->sdata, key->sta,
841 842
				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
				key, NULL);
843
	ieee80211_key_destroy(key, delay_tailroom);
844
}
845

846
void ieee80211_reenable_keys(struct ieee80211_sub_if_data *sdata)
J
Johannes Berg 已提交
847 848
{
	struct ieee80211_key *key;
849
	struct ieee80211_sub_if_data *vlan;
J
Johannes Berg 已提交
850

J
Johannes Berg 已提交
851
	ASSERT_RTNL();
J
Johannes Berg 已提交
852

853 854 855
	mutex_lock(&sdata->local->key_mtx);

	sdata->crypto_tx_tailroom_needed_cnt = 0;
856
	sdata->crypto_tx_tailroom_pending_dec = 0;
857 858

	if (sdata->vif.type == NL80211_IFTYPE_AP) {
859
		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) {
860
			vlan->crypto_tx_tailroom_needed_cnt = 0;
861 862 863 864 865 866 867 868 869
			vlan->crypto_tx_tailroom_pending_dec = 0;
		}
	}

	if (ieee80211_sdata_running(sdata)) {
		list_for_each_entry(key, &sdata->key_list, list) {
			increment_tailroom_need_count(sdata);
			ieee80211_key_enable_hw_accel(key);
		}
870 871 872 873 874
	}

	mutex_unlock(&sdata->local->key_mtx);
}

875 876 877 878 879 880 881 882 883 884
void ieee80211_iter_keys(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif,
			 void (*iter)(struct ieee80211_hw *hw,
				      struct ieee80211_vif *vif,
				      struct ieee80211_sta *sta,
				      struct ieee80211_key_conf *key,
				      void *data),
			 void *iter_data)
{
	struct ieee80211_local *local = hw_to_local(hw);
885
	struct ieee80211_key *key, *tmp;
886 887 888 889 890 891 892
	struct ieee80211_sub_if_data *sdata;

	ASSERT_RTNL();

	mutex_lock(&local->key_mtx);
	if (vif) {
		sdata = vif_to_sdata(vif);
893
		list_for_each_entry_safe(key, tmp, &sdata->key_list, list)
894 895 896 897 898
			iter(hw, &sdata->vif,
			     key->sta ? &key->sta->sta : NULL,
			     &key->conf, iter_data);
	} else {
		list_for_each_entry(sdata, &local->interfaces, list)
899 900
			list_for_each_entry_safe(key, tmp,
						 &sdata->key_list, list)
901 902 903 904 905 906 907 908
				iter(hw, &sdata->vif,
				     key->sta ? &key->sta->sta : NULL,
				     &key->conf, iter_data);
	}
	mutex_unlock(&local->key_mtx);
}
EXPORT_SYMBOL(ieee80211_iter_keys);

909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955
static void
_ieee80211_iter_keys_rcu(struct ieee80211_hw *hw,
			 struct ieee80211_sub_if_data *sdata,
			 void (*iter)(struct ieee80211_hw *hw,
				      struct ieee80211_vif *vif,
				      struct ieee80211_sta *sta,
				      struct ieee80211_key_conf *key,
				      void *data),
			 void *iter_data)
{
	struct ieee80211_key *key;

	list_for_each_entry_rcu(key, &sdata->key_list, list) {
		/* skip keys of station in removal process */
		if (key->sta && key->sta->removed)
			continue;
		if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
			continue;

		iter(hw, &sdata->vif,
		     key->sta ? &key->sta->sta : NULL,
		     &key->conf, iter_data);
	}
}

void ieee80211_iter_keys_rcu(struct ieee80211_hw *hw,
			     struct ieee80211_vif *vif,
			     void (*iter)(struct ieee80211_hw *hw,
					  struct ieee80211_vif *vif,
					  struct ieee80211_sta *sta,
					  struct ieee80211_key_conf *key,
					  void *data),
			     void *iter_data)
{
	struct ieee80211_local *local = hw_to_local(hw);
	struct ieee80211_sub_if_data *sdata;

	if (vif) {
		sdata = vif_to_sdata(vif);
		_ieee80211_iter_keys_rcu(hw, sdata, iter, iter_data);
	} else {
		list_for_each_entry_rcu(sdata, &local->interfaces, list)
			_ieee80211_iter_keys_rcu(hw, sdata, iter, iter_data);
	}
}
EXPORT_SYMBOL(ieee80211_iter_keys_rcu);

956 957
static void ieee80211_free_keys_iface(struct ieee80211_sub_if_data *sdata,
				      struct list_head *keys)
958 959 960
{
	struct ieee80211_key *key, *tmp;

961 962
	decrease_tailroom_need_count(sdata,
				     sdata->crypto_tx_tailroom_pending_dec);
963 964
	sdata->crypto_tx_tailroom_pending_dec = 0;

965
	ieee80211_debugfs_key_remove_mgmt_default(sdata);
966

967 968 969 970
	list_for_each_entry_safe(key, tmp, &sdata->key_list, list) {
		ieee80211_key_replace(key->sdata, key->sta,
				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
				key, NULL);
971
		list_add_tail(&key->list, keys);
972
	}
973

974
	ieee80211_debugfs_key_update_default(sdata);
975
}
976

977 978 979 980 981
void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata,
			 bool force_synchronize)
{
	struct ieee80211_local *local = sdata->local;
	struct ieee80211_sub_if_data *vlan;
982
	struct ieee80211_sub_if_data *master;
983 984 985 986 987 988 989 990 991 992 993 994
	struct ieee80211_key *key, *tmp;
	LIST_HEAD(keys);

	cancel_delayed_work_sync(&sdata->dec_tailroom_needed_wk);

	mutex_lock(&local->key_mtx);

	ieee80211_free_keys_iface(sdata, &keys);

	if (sdata->vif.type == NL80211_IFTYPE_AP) {
		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
			ieee80211_free_keys_iface(vlan, &keys);
995 996
	}

997 998 999 1000 1001
	if (!list_empty(&keys) || force_synchronize)
		synchronize_net();
	list_for_each_entry_safe(key, tmp, &keys, list)
		__ieee80211_key_destroy(key, false);

1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
		if (sdata->bss) {
			master = container_of(sdata->bss,
					      struct ieee80211_sub_if_data,
					      u.ap);

			WARN_ON_ONCE(sdata->crypto_tx_tailroom_needed_cnt !=
				     master->crypto_tx_tailroom_needed_cnt);
		}
	} else {
		WARN_ON_ONCE(sdata->crypto_tx_tailroom_needed_cnt ||
			     sdata->crypto_tx_tailroom_pending_dec);
	}

1016 1017 1018 1019 1020
	if (sdata->vif.type == NL80211_IFTYPE_AP) {
		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
			WARN_ON_ONCE(vlan->crypto_tx_tailroom_needed_cnt ||
				     vlan->crypto_tx_tailroom_pending_dec);
	}
1021

1022
	mutex_unlock(&local->key_mtx);
J
Johannes Berg 已提交
1023
}
1024

1025 1026 1027
void ieee80211_free_sta_keys(struct ieee80211_local *local,
			     struct sta_info *sta)
{
1028
	struct ieee80211_key *key;
1029 1030 1031
	int i;

	mutex_lock(&local->key_mtx);
1032
	for (i = 0; i < ARRAY_SIZE(sta->gtk); i++) {
1033 1034 1035 1036 1037 1038
		key = key_mtx_dereference(local, sta->gtk[i]);
		if (!key)
			continue;
		ieee80211_key_replace(key->sdata, key->sta,
				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
				key, NULL);
1039 1040
		__ieee80211_key_destroy(key, key->sdata->vif.type ==
					NL80211_IFTYPE_STATION);
1041 1042
	}

1043 1044 1045 1046
	for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
		key = key_mtx_dereference(local, sta->ptk[i]);
		if (!key)
			continue;
1047 1048 1049
		ieee80211_key_replace(key->sdata, key->sta,
				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
				key, NULL);
1050 1051
		__ieee80211_key_destroy(key, key->sdata->vif.type ==
					NL80211_IFTYPE_STATION);
1052
	}
1053 1054 1055 1056

	mutex_unlock(&local->key_mtx);
}

1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
void ieee80211_delayed_tailroom_dec(struct work_struct *wk)
{
	struct ieee80211_sub_if_data *sdata;

	sdata = container_of(wk, struct ieee80211_sub_if_data,
			     dec_tailroom_needed_wk.work);

	/*
	 * The reason for the delayed tailroom needed decrementing is to
	 * make roaming faster: during roaming, all keys are first deleted
	 * and then new keys are installed. The first new key causes the
	 * crypto_tx_tailroom_needed_cnt to go from 0 to 1, which invokes
	 * the cost of synchronize_net() (which can be slow). Avoid this
	 * by deferring the crypto_tx_tailroom_needed_cnt decrementing on
	 * key removal for a while, so if we roam the value is larger than
	 * zero and no 0->1 transition happens.
	 *
	 * The cost is that if the AP switching was from an AP with keys
	 * to one without, we still allocate tailroom while it would no
	 * longer be needed. However, in the typical (fast) roaming case
	 * within an ESS this usually won't happen.
	 */

	mutex_lock(&sdata->local->key_mtx);
1081 1082
	decrease_tailroom_need_count(sdata,
				     sdata->crypto_tx_tailroom_pending_dec);
1083 1084 1085
	sdata->crypto_tx_tailroom_pending_dec = 0;
	mutex_unlock(&sdata->local->key_mtx);
}
1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096

void ieee80211_gtk_rekey_notify(struct ieee80211_vif *vif, const u8 *bssid,
				const u8 *replay_ctr, gfp_t gfp)
{
	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);

	trace_api_gtk_rekey_notify(sdata, bssid, replay_ctr);

	cfg80211_gtk_rekey_notify(sdata->dev, bssid, replay_ctr, gfp);
}
EXPORT_SYMBOL_GPL(ieee80211_gtk_rekey_notify);
1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107

void ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf,
			      int tid, struct ieee80211_key_seq *seq)
{
	struct ieee80211_key *key;
	const u8 *pn;

	key = container_of(keyconf, struct ieee80211_key, conf);

	switch (key->conf.cipher) {
	case WLAN_CIPHER_SUITE_TKIP:
1108
		if (WARN_ON(tid < 0 || tid >= IEEE80211_NUM_TIDS))
1109 1110 1111 1112 1113
			return;
		seq->tkip.iv32 = key->u.tkip.rx[tid].iv32;
		seq->tkip.iv16 = key->u.tkip.rx[tid].iv16;
		break;
	case WLAN_CIPHER_SUITE_CCMP:
J
Jouni Malinen 已提交
1114
	case WLAN_CIPHER_SUITE_CCMP_256:
1115
		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
1116 1117
			return;
		if (tid < 0)
1118
			pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS];
1119 1120
		else
			pn = key->u.ccmp.rx_pn[tid];
1121
		memcpy(seq->ccmp.pn, pn, IEEE80211_CCMP_PN_LEN);
1122 1123
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
1124
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
1125 1126 1127
		if (WARN_ON(tid != 0))
			return;
		pn = key->u.aes_cmac.rx_pn;
1128
		memcpy(seq->aes_cmac.pn, pn, IEEE80211_CMAC_PN_LEN);
1129
		break;
1130 1131 1132 1133 1134 1135 1136
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
		if (WARN_ON(tid != 0))
			return;
		pn = key->u.aes_gmac.rx_pn;
		memcpy(seq->aes_gmac.pn, pn, IEEE80211_GMAC_PN_LEN);
		break;
1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
			return;
		if (tid < 0)
			pn = key->u.gcmp.rx_pn[IEEE80211_NUM_TIDS];
		else
			pn = key->u.gcmp.rx_pn[tid];
		memcpy(seq->gcmp.pn, pn, IEEE80211_GCMP_PN_LEN);
		break;
1147 1148 1149
	}
}
EXPORT_SYMBOL(ieee80211_get_key_rx_seq);
1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166

void ieee80211_set_key_rx_seq(struct ieee80211_key_conf *keyconf,
			      int tid, struct ieee80211_key_seq *seq)
{
	struct ieee80211_key *key;
	u8 *pn;

	key = container_of(keyconf, struct ieee80211_key, conf);

	switch (key->conf.cipher) {
	case WLAN_CIPHER_SUITE_TKIP:
		if (WARN_ON(tid < 0 || tid >= IEEE80211_NUM_TIDS))
			return;
		key->u.tkip.rx[tid].iv32 = seq->tkip.iv32;
		key->u.tkip.rx[tid].iv16 = seq->tkip.iv16;
		break;
	case WLAN_CIPHER_SUITE_CCMP:
J
Jouni Malinen 已提交
1167
	case WLAN_CIPHER_SUITE_CCMP_256:
1168 1169 1170 1171 1172 1173 1174 1175 1176
		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
			return;
		if (tid < 0)
			pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS];
		else
			pn = key->u.ccmp.rx_pn[tid];
		memcpy(pn, seq->ccmp.pn, IEEE80211_CCMP_PN_LEN);
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
1177
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
1178 1179 1180 1181 1182
		if (WARN_ON(tid != 0))
			return;
		pn = key->u.aes_cmac.rx_pn;
		memcpy(pn, seq->aes_cmac.pn, IEEE80211_CMAC_PN_LEN);
		break;
1183 1184 1185 1186 1187 1188 1189
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
		if (WARN_ON(tid != 0))
			return;
		pn = key->u.aes_gmac.rx_pn;
		memcpy(pn, seq->aes_gmac.pn, IEEE80211_GMAC_PN_LEN);
		break;
1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
			return;
		if (tid < 0)
			pn = key->u.gcmp.rx_pn[IEEE80211_NUM_TIDS];
		else
			pn = key->u.gcmp.rx_pn[tid];
		memcpy(pn, seq->gcmp.pn, IEEE80211_GCMP_PN_LEN);
		break;
1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221
	default:
		WARN_ON(1);
		break;
	}
}
EXPORT_SYMBOL_GPL(ieee80211_set_key_rx_seq);

void ieee80211_remove_key(struct ieee80211_key_conf *keyconf)
{
	struct ieee80211_key *key;

	key = container_of(keyconf, struct ieee80211_key, conf);

	assert_key_lock(key->local);

	/*
	 * if key was uploaded, we assume the driver will/has remove(d)
	 * it, so adjust bookkeeping accordingly
	 */
	if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {
		key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;

1222 1223 1224
		if (!(key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
					 IEEE80211_KEY_FLAG_PUT_MIC_SPACE |
					 IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248
			increment_tailroom_need_count(key->sdata);
	}

	ieee80211_key_free(key, false);
}
EXPORT_SYMBOL_GPL(ieee80211_remove_key);

struct ieee80211_key_conf *
ieee80211_gtk_rekey_add(struct ieee80211_vif *vif,
			struct ieee80211_key_conf *keyconf)
{
	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
	struct ieee80211_local *local = sdata->local;
	struct ieee80211_key *key;
	int err;

	if (WARN_ON(!local->wowlan))
		return ERR_PTR(-EINVAL);

	if (WARN_ON(vif->type != NL80211_IFTYPE_STATION))
		return ERR_PTR(-EINVAL);

	key = ieee80211_key_alloc(keyconf->cipher, keyconf->keyidx,
				  keyconf->keylen, keyconf->key,
1249
				  0, NULL, NULL);
1250
	if (IS_ERR(key))
J
Johannes Berg 已提交
1251
		return ERR_CAST(key);
1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262

	if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED)
		key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;

	err = ieee80211_key_link(key, sdata, NULL);
	if (err)
		return ERR_PTR(err);

	return &key->conf;
}
EXPORT_SYMBOL_GPL(ieee80211_gtk_rekey_add);