key.c 36.6 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-2020  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 182 183 184 185 186
	/* TKIP countermeasures don't work in encap offload mode */
	if (key->conf.cipher == WLAN_CIPHER_SUITE_TKIP &&
	    sdata->hw_80211_encap) {
		sdata_dbg(sdata, "TKIP is not allowed in hw 80211 encap mode\n");
		return -EINVAL;
	}

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

190
	if (!ret) {
J
Johannes Berg 已提交
191
		key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;
192

193 194 195
		if (!(key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
					 IEEE80211_KEY_FLAG_PUT_MIC_SPACE |
					 IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
196
			decrease_tailroom_need_count(sdata, 1);
197

198 199 200
		WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) &&
			(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV));

201 202 203
		WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_MIC_SPACE) &&
			(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC));

204 205
		return 0;
	}
J
Johannes Berg 已提交
206

207
	if (ret != -ENOSPC && ret != -EOPNOTSUPP && ret != 1)
J
Johannes Berg 已提交
208
		sdata_err(sdata,
J
Joe Perches 已提交
209
			  "failed to set key (%d, %pM) to hardware (%d)\n",
210 211
			  key->conf.keyidx,
			  sta ? sta->sta.addr : bcast_addr, ret);
212

213 214 215 216 217 218
 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 已提交
219
	case WLAN_CIPHER_SUITE_CCMP_256:
220 221 222 223 224 225 226 227
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
		/* We cannot do software crypto of data frames with
		 * encapsulation offload enabled. However for 802.11w to
		 * function properly we need cmac/gmac keys.
		 */
		if (sdata->hw_80211_encap)
			return -EINVAL;
228
		fallthrough;
229

230
	case WLAN_CIPHER_SUITE_AES_CMAC:
231
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
232 233
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
234 235 236
		/* all of these we can do in software - if driver can */
		if (ret == 1)
			return 0;
237
		if (ieee80211_hw_check(&key->local->hw, SW_CRYPTO_CONTROL))
238
			return -EINVAL;
239 240 241
		return 0;
	default:
		return -EINVAL;
242
	}
J
Johannes Berg 已提交
243 244 245 246
}

static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
{
247
	struct ieee80211_sub_if_data *sdata;
248
	struct sta_info *sta;
J
Johannes Berg 已提交
249 250
	int ret;

251 252
	might_sleep();

253
	if (!key || !key->local->ops->set_key)
J
Johannes Berg 已提交
254 255
		return;

J
Johannes Berg 已提交
256 257 258
	assert_key_lock(key->local);

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

261
	sta = key->sta;
262 263
	sdata = key->sdata;

264 265 266
	if (!(key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
				 IEEE80211_KEY_FLAG_PUT_MIC_SPACE |
				 IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
267 268
		increment_tailroom_need_count(sdata);

269
	key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
J
Johannes Berg 已提交
270
	ret = drv_set_key(key->local, DISABLE_KEY, sdata,
271
			  sta ? &sta->sta : NULL, &key->conf);
J
Johannes Berg 已提交
272 273

	if (ret)
J
Johannes Berg 已提交
274
		sdata_err(sdata,
J
Joe Perches 已提交
275
			  "failed to remove key (%d, %pM) from hardware (%d)\n",
276 277
			  key->conf.keyidx,
			  sta ? sta->sta.addr : bcast_addr, ret);
278
}
J
Johannes Berg 已提交
279

280
static int _ieee80211_set_tx_key(struct ieee80211_key *key, bool force)
281 282 283 284 285 286
{
	struct sta_info *sta = key->sta;
	struct ieee80211_local *local = key->local;

	assert_key_lock(local);

287 288
	set_sta_flag(sta, WLAN_STA_USES_ENCRYPTION);

289
	sta->ptk_idx = key->conf.keyidx;
290

291
	if (force || !ieee80211_hw_check(&local->hw, AMPDU_KEYBORDER_SUPPORT))
292
		clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
293 294 295 296 297
	ieee80211_check_fast_xmit(sta);

	return 0;
}

298 299 300 301 302
int ieee80211_set_tx_key(struct ieee80211_key *key)
{
	return _ieee80211_set_tx_key(key, false);
}

303 304
static void ieee80211_pairwise_rekey(struct ieee80211_key *old,
				     struct ieee80211_key *new)
305
{
306 307 308
	struct ieee80211_local *local = new->local;
	struct sta_info *sta = new->sta;
	int i;
309

310
	assert_key_lock(local);
311

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

315 316
		if (sta->ptk_idx != INVALID_PTK_KEYIDX &&
		    !ieee80211_hw_check(&local->hw, AMPDU_KEYBORDER_SUPPORT)) {
317 318
			/* Aggregation Sessions with Extended Key ID must not
			 * mix MPDUs with different keyIDs within one A-MPDU.
319 320
			 * Tear down running Tx aggregation sessions and block
			 * new Rx/Tx aggregation requests during rekey to
321 322 323 324
			 * 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.)
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
			 */
			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;
341

342 343
		/* Stop Tx till we are on the new key */
		old->flags |= KEY_FLAG_TAINTED;
344 345 346 347 348 349 350 351 352 353 354 355 356
		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.
			 */
357
			ieee80211_flush_queues(local, old->sdata, false);
358 359
		}
	}
360 361 362
}

static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata,
363
					int idx, bool uni, bool multi)
364 365 366
{
	struct ieee80211_key *key = NULL;

J
Johannes Berg 已提交
367 368
	assert_key_lock(sdata->local);

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

372
	if (uni) {
373
		rcu_assign_pointer(sdata->default_unicast_key, key);
J
Johannes Berg 已提交
374
		ieee80211_check_fast_xmit_iface(sdata);
375 376
		if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN)
			drv_set_default_unicast_key(sdata->local, sdata, idx);
377 378
	}

379 380
	if (multi)
		rcu_assign_pointer(sdata->default_multicast_key, key);
381

382
	ieee80211_debugfs_key_update_default(sdata);
383 384
}

385 386
void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
			       bool uni, bool multi)
387
{
J
Johannes Berg 已提交
388
	mutex_lock(&sdata->local->key_mtx);
389
	__ieee80211_set_default_key(sdata, idx, uni, multi);
J
Johannes Berg 已提交
390
	mutex_unlock(&sdata->local->key_mtx);
391 392
}

393 394 395 396 397
static void
__ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata, int idx)
{
	struct ieee80211_key *key = NULL;

J
Johannes Berg 已提交
398 399
	assert_key_lock(sdata->local);

400 401
	if (idx >= NUM_DEFAULT_KEYS &&
	    idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
J
Johannes Berg 已提交
402
		key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
403 404 405

	rcu_assign_pointer(sdata->default_mgmt_key, key);

406
	ieee80211_debugfs_key_update_default(sdata);
407 408 409 410 411
}

void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
				    int idx)
{
J
Johannes Berg 已提交
412
	mutex_lock(&sdata->local->key_mtx);
413
	__ieee80211_set_default_mgmt_key(sdata, idx);
J
Johannes Berg 已提交
414
	mutex_unlock(&sdata->local->key_mtx);
415 416
}

417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441
static void
__ieee80211_set_default_beacon_key(struct ieee80211_sub_if_data *sdata, int idx)
{
	struct ieee80211_key *key = NULL;

	assert_key_lock(sdata->local);

	if (idx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS &&
	    idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS +
	    NUM_DEFAULT_BEACON_KEYS)
		key = key_mtx_dereference(sdata->local, sdata->keys[idx]);

	rcu_assign_pointer(sdata->default_beacon_key, key);

	ieee80211_debugfs_key_update_default(sdata);
}

void ieee80211_set_default_beacon_key(struct ieee80211_sub_if_data *sdata,
				      int idx)
{
	mutex_lock(&sdata->local->key_mtx);
	__ieee80211_set_default_beacon_key(sdata, idx);
	mutex_unlock(&sdata->local->key_mtx);
}

442
static int ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
443 444 445 446
				  struct sta_info *sta,
				  bool pairwise,
				  struct ieee80211_key *old,
				  struct ieee80211_key *new)
447
{
448
	int idx;
449
	int ret = 0;
450
	bool defunikey, defmultikey, defmgmtkey, defbeaconkey;
451

452 453
	/* caller must provide at least one old/new */
	if (WARN_ON(!new && !old))
454
		return 0;
455

456
	if (new)
457
		list_add_tail_rcu(&new->list, &sdata->key_list);
458

459
	WARN_ON(new && old && new->conf.keyidx != old->conf.keyidx);
460

461 462 463 464 465 466 467
	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);
	}

468
	if (old) {
469
		idx = old->conf.keyidx;
470 471 472 473 474 475 476

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

			if (new)
				ret = ieee80211_key_enable_hw_accel(new);
		}
477
	} else {
478
		/* new must be provided in case old is not */
479
		idx = new->conf.keyidx;
480
		if (!new->local->wowlan)
481 482 483 484 485
			ret = ieee80211_key_enable_hw_accel(new);
	}

	if (ret)
		return ret;
486

487 488 489
	if (sta) {
		if (pairwise) {
			rcu_assign_pointer(sta->ptk[idx], new);
490
			if (new &&
491 492
			    !(new->conf.flags & IEEE80211_KEY_FLAG_NO_AUTO_TX))
				_ieee80211_set_tx_key(new, true);
493 494 495
		} else {
			rcu_assign_pointer(sta->gtk[idx], new);
		}
496 497 498 499 500
		/* 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)
501
			ieee80211_check_fast_rx(sta);
502
	} else {
J
Johannes Berg 已提交
503 504 505 506 507 508 509 510 511
		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);
512 513 514
		defbeaconkey = old &&
			old == key_mtx_dereference(sdata->local,
						   sdata->default_beacon_key);
515

516 517 518 519
		if (defunikey && !new)
			__ieee80211_set_default_key(sdata, -1, true, false);
		if (defmultikey && !new)
			__ieee80211_set_default_key(sdata, -1, false, true);
520 521
		if (defmgmtkey && !new)
			__ieee80211_set_default_mgmt_key(sdata, -1);
522 523
		if (defbeaconkey && !new)
			__ieee80211_set_default_beacon_key(sdata, -1);
524 525

		rcu_assign_pointer(sdata->keys[idx], new);
526 527 528 529 530 531
		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);
532 533 534
		if (defmgmtkey && new)
			__ieee80211_set_default_mgmt_key(sdata,
							 new->conf.keyidx);
535 536 537
		if (defbeaconkey && new)
			__ieee80211_set_default_beacon_key(sdata,
							   new->conf.keyidx);
538 539
	}

540
	if (old)
541
		list_del_rcu(&old->list);
542 543

	return 0;
J
Johannes Berg 已提交
544 545
}

546 547 548 549 550
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)
551 552
{
	struct ieee80211_key *key;
553
	int i, j, err;
554

555 556 557
	if (WARN_ON(idx < 0 ||
		    idx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS +
		    NUM_DEFAULT_BEACON_KEYS))
J
Johannes Berg 已提交
558
		return ERR_PTR(-EINVAL);
J
Johannes Berg 已提交
559 560

	key = kzalloc(sizeof(struct ieee80211_key) + key_len, GFP_KERNEL);
561
	if (!key)
562
		return ERR_PTR(-ENOMEM);
J
Johannes Berg 已提交
563 564 565 566 567 568 569 570

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

571
	key->conf.cipher = cipher;
J
Johannes Berg 已提交
572 573
	key->conf.keyidx = idx;
	key->conf.keylen = key_len;
574 575 576
	switch (cipher) {
	case WLAN_CIPHER_SUITE_WEP40:
	case WLAN_CIPHER_SUITE_WEP104:
577 578
		key->conf.iv_len = IEEE80211_WEP_IV_LEN;
		key->conf.icv_len = IEEE80211_WEP_ICV_LEN;
579
		break;
580
	case WLAN_CIPHER_SUITE_TKIP:
581 582
		key->conf.iv_len = IEEE80211_TKIP_IV_LEN;
		key->conf.icv_len = IEEE80211_TKIP_ICV_LEN;
583
		if (seq) {
584
			for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
585 586 587 588 589 590
				key->u.tkip.rx[i].iv32 =
					get_unaligned_le32(&seq[2]);
				key->u.tkip.rx[i].iv16 =
					get_unaligned_le16(seq);
			}
		}
591
		spin_lock_init(&key->u.tkip.txlock);
592
		break;
593
	case WLAN_CIPHER_SUITE_CCMP:
594 595
		key->conf.iv_len = IEEE80211_CCMP_HDR_LEN;
		key->conf.icv_len = IEEE80211_CCMP_MIC_LEN;
596
		if (seq) {
597
			for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++)
598
				for (j = 0; j < IEEE80211_CCMP_PN_LEN; j++)
599
					key->u.ccmp.rx_pn[i][j] =
600
						seq[IEEE80211_CCMP_PN_LEN - j - 1];
601
		}
J
Johannes Berg 已提交
602 603 604 605
		/*
		 * Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
J
Jouni Malinen 已提交
606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
		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);
626 627
		if (IS_ERR(key->u.ccmp.tfm)) {
			err = PTR_ERR(key->u.ccmp.tfm);
628
			kfree(key);
629
			return ERR_PTR(err);
J
Johannes Berg 已提交
630
		}
J
Johannes Berg 已提交
631 632
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
633
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
J
Johannes Berg 已提交
634
		key->conf.iv_len = 0;
635 636 637 638
		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 已提交
639
		if (seq)
640
			for (j = 0; j < IEEE80211_CMAC_PN_LEN; j++)
J
Johannes Berg 已提交
641
				key->u.aes_cmac.rx_pn[j] =
642
					seq[IEEE80211_CMAC_PN_LEN - j - 1];
643 644 645 646 647
		/*
		 * 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 =
648
			ieee80211_aes_cmac_key_setup(key_data, key_len);
649 650
		if (IS_ERR(key->u.aes_cmac.tfm)) {
			err = PTR_ERR(key->u.aes_cmac.tfm);
651
			kfree(key);
652
			return ERR_PTR(err);
653
		}
J
Johannes Berg 已提交
654
		break;
655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
	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;
674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692
	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;
693 694
	default:
		if (cs) {
695 696 697 698
			if (seq_len && seq_len != cs->pn_len) {
				kfree(key);
				return ERR_PTR(-EINVAL);
			}
699 700 701 702

			key->conf.iv_len = cs->hdr_len;
			key->conf.icv_len = cs->mic_len;
			for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++)
703
				for (j = 0; j < seq_len; j++)
704
					key->u.gen.rx_pn[i][j] =
705
							seq[seq_len - j - 1];
706
			key->flags |= KEY_FLAG_CIPHER_SCHEME;
707
		}
708
	}
J
Johannes Berg 已提交
709 710
	memcpy(key->conf.key, key_data, key_len);
	INIT_LIST_HEAD(&key->list);
711

712 713
	return key;
}
J
Johannes Berg 已提交
714

715 716
static void ieee80211_key_free_common(struct ieee80211_key *key)
{
717 718
	switch (key->conf.cipher) {
	case WLAN_CIPHER_SUITE_CCMP:
J
Jouni Malinen 已提交
719
	case WLAN_CIPHER_SUITE_CCMP_256:
720
		ieee80211_aes_key_free(key->u.ccmp.tfm);
721 722
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
723
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
724
		ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm);
725
		break;
726 727 728 729
	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;
730 731 732 733 734
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
		ieee80211_aes_gcm_key_free(key->u.gcmp.tfm);
		break;
	}
735
	kzfree(key);
736 737
}

738 739
static void __ieee80211_key_destroy(struct ieee80211_key *key,
				    bool delay_tailroom)
J
Johannes Berg 已提交
740
{
741
	if (key->local) {
742 743
		struct ieee80211_sub_if_data *sdata = key->sdata;

744
		ieee80211_debugfs_key_remove(key);
745 746 747 748 749 750 751

		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 {
752
			decrease_tailroom_need_count(sdata, 1);
753
		}
754
	}
J
Johannes Berg 已提交
755

756 757 758
	ieee80211_key_free_common(key);
}

759 760 761 762 763 764 765
static void ieee80211_key_destroy(struct ieee80211_key *key,
				  bool delay_tailroom)
{
	if (!key)
		return;

	/*
766 767
	 * Synchronize so the TX path and rcu key iterators
	 * can no longer be using this key before we free/remove it.
768 769 770 771 772 773
	 */
	synchronize_net();

	__ieee80211_key_destroy(key, delay_tailroom);
}

774 775 776 777
void ieee80211_key_free_unused(struct ieee80211_key *key)
{
	WARN_ON(key->sdata || key->local);
	ieee80211_key_free_common(key);
J
Johannes Berg 已提交
778 779
}

780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812
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);
}

813 814 815
int ieee80211_key_link(struct ieee80211_key *key,
		       struct ieee80211_sub_if_data *sdata,
		       struct sta_info *sta)
816 817
{
	struct ieee80211_key *old_key;
818 819 820 821 822 823 824 825
	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;
826
	int ret = -EOPNOTSUPP;
827

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

830 831 832
	if (sta && pairwise) {
		struct ieee80211_key *alt_key;

833
		old_key = key_mtx_dereference(sdata->local, sta->ptk[idx]);
834 835 836 837 838
		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.
		 */
839 840
		if ((alt_key && alt_key->conf.cipher != key->conf.cipher) ||
		    (old_key && old_key->conf.cipher != key->conf.cipher))
841 842
			goto out;
	} else if (sta) {
J
Johannes Berg 已提交
843
		old_key = key_mtx_dereference(sdata->local, sta->gtk[idx]);
844
	} else {
J
Johannes Berg 已提交
845
		old_key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
846 847 848 849
	}

	/* Non-pairwise keys must also not switch the cipher on rekey */
	if (!pairwise) {
850
		if (old_key && old_key->conf.cipher != key->conf.cipher)
851 852
			goto out;
	}
853

854 855 856 857
	/*
	 * Silently accept key re-installation without really installing the
	 * new version of the key to avoid nonce reuse or replay issues.
	 */
858
	if (ieee80211_key_identical(sdata, old_key, key)) {
859 860 861 862 863 864 865 866 867
		ieee80211_key_free_unused(key);
		ret = 0;
		goto out;
	}

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

868 869
	increment_tailroom_need_count(sdata);

870
	ret = ieee80211_key_replace(sdata, sta, pairwise, old_key, key);
871

872 873 874
	if (!ret) {
		ieee80211_debugfs_key_add(key);
		ieee80211_key_destroy(old_key, delay_tailroom);
875
	} else {
876
		ieee80211_key_free(key, delay_tailroom);
877
	}
878

879
 out:
J
Johannes Berg 已提交
880
	mutex_unlock(&sdata->local->key_mtx);
881 882

	return ret;
883 884
}

885
void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom)
886
{
887 888 889
	if (!key)
		return;

890 891 892
	/*
	 * Replace key with nothingness if it was ever used.
	 */
J
Johannes Berg 已提交
893
	if (key->sdata)
894
		ieee80211_key_replace(key->sdata, key->sta,
895 896
				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
				key, NULL);
897
	ieee80211_key_destroy(key, delay_tailroom);
898
}
899

900
void ieee80211_reenable_keys(struct ieee80211_sub_if_data *sdata)
J
Johannes Berg 已提交
901 902
{
	struct ieee80211_key *key;
903
	struct ieee80211_sub_if_data *vlan;
J
Johannes Berg 已提交
904

J
Johannes Berg 已提交
905
	ASSERT_RTNL();
J
Johannes Berg 已提交
906

907 908 909
	mutex_lock(&sdata->local->key_mtx);

	sdata->crypto_tx_tailroom_needed_cnt = 0;
910
	sdata->crypto_tx_tailroom_pending_dec = 0;
911 912

	if (sdata->vif.type == NL80211_IFTYPE_AP) {
913
		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) {
914
			vlan->crypto_tx_tailroom_needed_cnt = 0;
915 916 917 918 919 920 921 922 923
			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);
		}
924 925 926 927 928
	}

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

929 930 931 932 933 934 935 936 937 938
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);
939
	struct ieee80211_key *key, *tmp;
940 941 942 943 944 945 946
	struct ieee80211_sub_if_data *sdata;

	ASSERT_RTNL();

	mutex_lock(&local->key_mtx);
	if (vif) {
		sdata = vif_to_sdata(vif);
947
		list_for_each_entry_safe(key, tmp, &sdata->key_list, list)
948 949 950 951 952
			iter(hw, &sdata->vif,
			     key->sta ? &key->sta->sta : NULL,
			     &key->conf, iter_data);
	} else {
		list_for_each_entry(sdata, &local->interfaces, list)
953 954
			list_for_each_entry_safe(key, tmp,
						 &sdata->key_list, list)
955 956 957 958 959 960 961 962
				iter(hw, &sdata->vif,
				     key->sta ? &key->sta->sta : NULL,
				     &key->conf, iter_data);
	}
	mutex_unlock(&local->key_mtx);
}
EXPORT_SYMBOL(ieee80211_iter_keys);

963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
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);

1010 1011
static void ieee80211_free_keys_iface(struct ieee80211_sub_if_data *sdata,
				      struct list_head *keys)
1012 1013 1014
{
	struct ieee80211_key *key, *tmp;

1015 1016
	decrease_tailroom_need_count(sdata,
				     sdata->crypto_tx_tailroom_pending_dec);
1017 1018
	sdata->crypto_tx_tailroom_pending_dec = 0;

1019
	ieee80211_debugfs_key_remove_mgmt_default(sdata);
1020
	ieee80211_debugfs_key_remove_beacon_default(sdata);
1021

1022 1023 1024 1025
	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);
1026
		list_add_tail(&key->list, keys);
1027
	}
1028

1029
	ieee80211_debugfs_key_update_default(sdata);
1030
}
1031

1032 1033 1034 1035 1036
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;
1037
	struct ieee80211_sub_if_data *master;
1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
	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);
1050 1051
	}

1052 1053 1054 1055 1056
	if (!list_empty(&keys) || force_synchronize)
		synchronize_net();
	list_for_each_entry_safe(key, tmp, &keys, list)
		__ieee80211_key_destroy(key, false);

1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070
	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);
	}

1071 1072 1073 1074 1075
	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);
	}
1076

1077
	mutex_unlock(&local->key_mtx);
J
Johannes Berg 已提交
1078
}
1079

1080 1081 1082
void ieee80211_free_sta_keys(struct ieee80211_local *local,
			     struct sta_info *sta)
{
1083
	struct ieee80211_key *key;
1084 1085 1086
	int i;

	mutex_lock(&local->key_mtx);
1087
	for (i = 0; i < ARRAY_SIZE(sta->gtk); i++) {
1088 1089 1090 1091 1092 1093
		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);
1094 1095
		__ieee80211_key_destroy(key, key->sdata->vif.type ==
					NL80211_IFTYPE_STATION);
1096 1097
	}

1098 1099 1100 1101
	for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
		key = key_mtx_dereference(local, sta->ptk[i]);
		if (!key)
			continue;
1102 1103 1104
		ieee80211_key_replace(key->sdata, key->sta,
				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
				key, NULL);
1105 1106
		__ieee80211_key_destroy(key, key->sdata->vif.type ==
					NL80211_IFTYPE_STATION);
1107
	}
1108 1109 1110 1111

	mutex_unlock(&local->key_mtx);
}

1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135
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);
1136 1137
	decrease_tailroom_need_count(sdata,
				     sdata->crypto_tx_tailroom_pending_dec);
1138 1139 1140
	sdata->crypto_tx_tailroom_pending_dec = 0;
	mutex_unlock(&sdata->local->key_mtx);
}
1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151

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);
1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162

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:
1163
		if (WARN_ON(tid < 0 || tid >= IEEE80211_NUM_TIDS))
1164 1165 1166 1167 1168
			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 已提交
1169
	case WLAN_CIPHER_SUITE_CCMP_256:
1170
		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
1171 1172
			return;
		if (tid < 0)
1173
			pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS];
1174 1175
		else
			pn = key->u.ccmp.rx_pn[tid];
1176
		memcpy(seq->ccmp.pn, pn, IEEE80211_CCMP_PN_LEN);
1177 1178
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
1179
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
1180 1181 1182
		if (WARN_ON(tid != 0))
			return;
		pn = key->u.aes_cmac.rx_pn;
1183
		memcpy(seq->aes_cmac.pn, pn, IEEE80211_CMAC_PN_LEN);
1184
		break;
1185 1186 1187 1188 1189 1190 1191
	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;
1192 1193 1194 1195 1196 1197 1198 1199 1200 1201
	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;
1202 1203 1204
	}
}
EXPORT_SYMBOL(ieee80211_get_key_rx_seq);
1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221

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 已提交
1222
	case WLAN_CIPHER_SUITE_CCMP_256:
1223 1224 1225 1226 1227 1228 1229 1230 1231
		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:
1232
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
1233 1234 1235 1236 1237
		if (WARN_ON(tid != 0))
			return;
		pn = key->u.aes_cmac.rx_pn;
		memcpy(pn, seq->aes_cmac.pn, IEEE80211_CMAC_PN_LEN);
		break;
1238 1239 1240 1241 1242 1243 1244
	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;
1245 1246 1247 1248 1249 1250 1251 1252 1253 1254
	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;
1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276
	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;

1277 1278 1279
		if (!(key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
					 IEEE80211_KEY_FLAG_PUT_MIC_SPACE |
					 IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303
			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,
1304
				  0, NULL, NULL);
1305
	if (IS_ERR(key))
J
Johannes Berg 已提交
1306
		return ERR_CAST(key);
1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317

	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);