2 * Copyright 2002-2005, Instant802 Networks, Inc.
3 * Copyright 2005-2006, Devicescape Software, Inc.
4 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
5 * Copyright 2007-2008 Johannes Berg <johannes@sipsolutions.net>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/if_ether.h>
13 #include <linux/etherdevice.h>
14 #include <linux/list.h>
15 #include <linux/rcupdate.h>
16 #include <linux/rtnetlink.h>
17 #include <linux/slab.h>
18 #include <net/mac80211.h>
19 #include "ieee80211_i.h"
20 #include "driver-ops.h"
21 #include "debugfs_key.h"
27 * DOC: Key handling basics
29 * Key handling in mac80211 is done based on per-interface (sub_if_data)
30 * keys and per-station keys. Since each station belongs to an interface,
31 * each station key also belongs to that interface.
33 * Hardware acceleration is done on a best-effort basis, for each key
34 * that is eligible the hardware is asked to enable that key but if
35 * it cannot do that they key is simply kept for software encryption.
36 * There is currently no way of knowing this except by looking into
39 * All key operations are protected internally.
41 * Within mac80211, key references are, just as STA structure references,
42 * protected by RCU. Note, however, that some things are unprotected,
43 * namely the key->sta dereferences within the hardware acceleration
44 * functions. This means that sta_info_destroy() must remove the key
45 * which waits for an RCU grace period.
48 static const u8 bcast_addr
[ETH_ALEN
] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
50 static void assert_key_lock(struct ieee80211_local
*local
)
52 WARN_ON(!mutex_is_locked(&local
->key_mtx
));
55 static struct ieee80211_sta
*get_sta_for_key(struct ieee80211_key
*key
)
58 return &key
->sta
->sta
;
63 static int ieee80211_key_enable_hw_accel(struct ieee80211_key
*key
)
65 struct ieee80211_sub_if_data
*sdata
;
66 struct ieee80211_sta
*sta
;
71 if (!key
->local
->ops
->set_key
) {
76 assert_key_lock(key
->local
);
78 sta
= get_sta_for_key(key
);
81 if (sdata
->vif
.type
== NL80211_IFTYPE_AP_VLAN
)
82 sdata
= container_of(sdata
->bss
,
83 struct ieee80211_sub_if_data
,
86 ret
= drv_set_key(key
->local
, SET_KEY
, sdata
, sta
, &key
->conf
);
89 key
->flags
|= KEY_FLAG_UPLOADED_TO_HARDWARE
;
91 if (ret
&& ret
!= -ENOSPC
&& ret
!= -EOPNOTSUPP
)
92 wiphy_err(key
->local
->hw
.wiphy
,
93 "failed to set key (%d, %pM) to hardware (%d)\n",
94 key
->conf
.keyidx
, sta
? sta
->addr
: bcast_addr
, ret
);
98 switch (key
->conf
.cipher
) {
99 case WLAN_CIPHER_SUITE_WEP40
:
100 case WLAN_CIPHER_SUITE_WEP104
:
101 case WLAN_CIPHER_SUITE_TKIP
:
102 case WLAN_CIPHER_SUITE_CCMP
:
103 case WLAN_CIPHER_SUITE_AES_CMAC
:
104 /* all of these we can do in software */
115 static void ieee80211_key_disable_hw_accel(struct ieee80211_key
*key
)
117 struct ieee80211_sub_if_data
*sdata
;
118 struct ieee80211_sta
*sta
;
123 if (!key
|| !key
->local
->ops
->set_key
)
126 assert_key_lock(key
->local
);
128 if (!(key
->flags
& KEY_FLAG_UPLOADED_TO_HARDWARE
))
131 sta
= get_sta_for_key(key
);
134 if (sdata
->vif
.type
== NL80211_IFTYPE_AP_VLAN
)
135 sdata
= container_of(sdata
->bss
,
136 struct ieee80211_sub_if_data
,
139 ret
= drv_set_key(key
->local
, DISABLE_KEY
, sdata
,
143 wiphy_err(key
->local
->hw
.wiphy
,
144 "failed to remove key (%d, %pM) from hardware (%d)\n",
145 key
->conf
.keyidx
, sta
? sta
->addr
: bcast_addr
, ret
);
147 key
->flags
&= ~KEY_FLAG_UPLOADED_TO_HARDWARE
;
150 static void __ieee80211_set_default_key(struct ieee80211_sub_if_data
*sdata
,
153 struct ieee80211_key
*key
= NULL
;
155 assert_key_lock(sdata
->local
);
157 if (idx
>= 0 && idx
< NUM_DEFAULT_KEYS
)
158 key
= sdata
->keys
[idx
];
160 rcu_assign_pointer(sdata
->default_key
, key
);
163 ieee80211_debugfs_key_remove_default(key
->sdata
);
164 ieee80211_debugfs_key_add_default(key
->sdata
);
168 void ieee80211_set_default_key(struct ieee80211_sub_if_data
*sdata
, int idx
)
170 mutex_lock(&sdata
->local
->key_mtx
);
171 __ieee80211_set_default_key(sdata
, idx
);
172 mutex_unlock(&sdata
->local
->key_mtx
);
176 __ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data
*sdata
, int idx
)
178 struct ieee80211_key
*key
= NULL
;
180 assert_key_lock(sdata
->local
);
182 if (idx
>= NUM_DEFAULT_KEYS
&&
183 idx
< NUM_DEFAULT_KEYS
+ NUM_DEFAULT_MGMT_KEYS
)
184 key
= sdata
->keys
[idx
];
186 rcu_assign_pointer(sdata
->default_mgmt_key
, key
);
189 ieee80211_debugfs_key_remove_mgmt_default(key
->sdata
);
190 ieee80211_debugfs_key_add_mgmt_default(key
->sdata
);
194 void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data
*sdata
,
197 mutex_lock(&sdata
->local
->key_mtx
);
198 __ieee80211_set_default_mgmt_key(sdata
, idx
);
199 mutex_unlock(&sdata
->local
->key_mtx
);
203 static void __ieee80211_key_replace(struct ieee80211_sub_if_data
*sdata
,
204 struct sta_info
*sta
,
205 struct ieee80211_key
*old
,
206 struct ieee80211_key
*new)
208 int idx
, defkey
, defmgmtkey
;
211 list_add(&new->list
, &sdata
->key_list
);
214 rcu_assign_pointer(sta
->key
, new);
216 WARN_ON(new && old
&& new->conf
.keyidx
!= old
->conf
.keyidx
);
219 idx
= old
->conf
.keyidx
;
221 idx
= new->conf
.keyidx
;
223 defkey
= old
&& sdata
->default_key
== old
;
224 defmgmtkey
= old
&& sdata
->default_mgmt_key
== old
;
227 __ieee80211_set_default_key(sdata
, -1);
228 if (defmgmtkey
&& !new)
229 __ieee80211_set_default_mgmt_key(sdata
, -1);
231 rcu_assign_pointer(sdata
->keys
[idx
], new);
233 __ieee80211_set_default_key(sdata
, new->conf
.keyidx
);
234 if (defmgmtkey
&& new)
235 __ieee80211_set_default_mgmt_key(sdata
,
241 * We'll use an empty list to indicate that the key
242 * has already been removed.
244 list_del_init(&old
->list
);
248 struct ieee80211_key
*ieee80211_key_alloc(u32 cipher
, int idx
, size_t key_len
,
250 size_t seq_len
, const u8
*seq
)
252 struct ieee80211_key
*key
;
255 BUG_ON(idx
< 0 || idx
>= NUM_DEFAULT_KEYS
+ NUM_DEFAULT_MGMT_KEYS
);
257 key
= kzalloc(sizeof(struct ieee80211_key
) + key_len
, GFP_KERNEL
);
259 return ERR_PTR(-ENOMEM
);
262 * Default to software encryption; we'll later upload the
263 * key to the hardware if possible.
268 key
->conf
.cipher
= cipher
;
269 key
->conf
.keyidx
= idx
;
270 key
->conf
.keylen
= key_len
;
272 case WLAN_CIPHER_SUITE_WEP40
:
273 case WLAN_CIPHER_SUITE_WEP104
:
274 key
->conf
.iv_len
= WEP_IV_LEN
;
275 key
->conf
.icv_len
= WEP_ICV_LEN
;
277 case WLAN_CIPHER_SUITE_TKIP
:
278 key
->conf
.iv_len
= TKIP_IV_LEN
;
279 key
->conf
.icv_len
= TKIP_ICV_LEN
;
281 for (i
= 0; i
< NUM_RX_DATA_QUEUES
; i
++) {
282 key
->u
.tkip
.rx
[i
].iv32
=
283 get_unaligned_le32(&seq
[2]);
284 key
->u
.tkip
.rx
[i
].iv16
=
285 get_unaligned_le16(seq
);
289 case WLAN_CIPHER_SUITE_CCMP
:
290 key
->conf
.iv_len
= CCMP_HDR_LEN
;
291 key
->conf
.icv_len
= CCMP_MIC_LEN
;
293 for (i
= 0; i
< NUM_RX_DATA_QUEUES
+ 1; i
++)
294 for (j
= 0; j
< CCMP_PN_LEN
; j
++)
295 key
->u
.ccmp
.rx_pn
[i
][j
] =
296 seq
[CCMP_PN_LEN
- j
- 1];
299 * Initialize AES key state here as an optimization so that
300 * it does not need to be initialized for every packet.
302 key
->u
.ccmp
.tfm
= ieee80211_aes_key_setup_encrypt(key_data
);
303 if (IS_ERR(key
->u
.ccmp
.tfm
)) {
304 err
= PTR_ERR(key
->u
.ccmp
.tfm
);
309 case WLAN_CIPHER_SUITE_AES_CMAC
:
310 key
->conf
.iv_len
= 0;
311 key
->conf
.icv_len
= sizeof(struct ieee80211_mmie
);
313 for (j
= 0; j
< 6; j
++)
314 key
->u
.aes_cmac
.rx_pn
[j
] = seq
[6 - j
- 1];
316 * Initialize AES key state here as an optimization so that
317 * it does not need to be initialized for every packet.
319 key
->u
.aes_cmac
.tfm
=
320 ieee80211_aes_cmac_key_setup(key_data
);
321 if (IS_ERR(key
->u
.aes_cmac
.tfm
)) {
322 err
= PTR_ERR(key
->u
.aes_cmac
.tfm
);
328 memcpy(key
->conf
.key
, key_data
, key_len
);
329 INIT_LIST_HEAD(&key
->list
);
334 static void __ieee80211_key_destroy(struct ieee80211_key
*key
)
340 ieee80211_key_disable_hw_accel(key
);
342 if (key
->conf
.cipher
== WLAN_CIPHER_SUITE_CCMP
)
343 ieee80211_aes_key_free(key
->u
.ccmp
.tfm
);
344 if (key
->conf
.cipher
== WLAN_CIPHER_SUITE_AES_CMAC
)
345 ieee80211_aes_cmac_key_free(key
->u
.aes_cmac
.tfm
);
347 ieee80211_debugfs_key_remove(key
);
352 int ieee80211_key_link(struct ieee80211_key
*key
,
353 struct ieee80211_sub_if_data
*sdata
,
354 struct sta_info
*sta
)
356 struct ieee80211_key
*old_key
;
362 idx
= key
->conf
.keyidx
;
363 key
->local
= sdata
->local
;
369 * some hardware cannot handle TKIP with QoS, so
370 * we indicate whether QoS could be in use.
372 if (test_sta_flags(sta
, WLAN_STA_WME
))
373 key
->conf
.flags
|= IEEE80211_KEY_FLAG_WMM_STA
;
376 * This key is for a specific sta interface,
377 * inform the driver that it should try to store
378 * this key as pairwise key.
380 key
->conf
.flags
|= IEEE80211_KEY_FLAG_PAIRWISE
;
382 if (sdata
->vif
.type
== NL80211_IFTYPE_STATION
) {
386 * We're getting a sta pointer in,
387 * so must be under RCU read lock.
390 /* same here, the AP could be using QoS */
391 ap
= sta_info_get(key
->sdata
, key
->sdata
->u
.mgd
.bssid
);
393 if (test_sta_flags(ap
, WLAN_STA_WME
))
395 IEEE80211_KEY_FLAG_WMM_STA
;
400 mutex_lock(&sdata
->local
->key_mtx
);
405 old_key
= sdata
->keys
[idx
];
407 __ieee80211_key_replace(sdata
, sta
, old_key
, key
);
408 __ieee80211_key_destroy(old_key
);
410 ieee80211_debugfs_key_add(key
);
412 ret
= ieee80211_key_enable_hw_accel(key
);
414 mutex_unlock(&sdata
->local
->key_mtx
);
419 static void __ieee80211_key_free(struct ieee80211_key
*key
)
422 * Replace key with nothingness if it was ever used.
425 __ieee80211_key_replace(key
->sdata
, key
->sta
,
427 __ieee80211_key_destroy(key
);
430 void ieee80211_key_free(struct ieee80211_local
*local
,
431 struct ieee80211_key
*key
)
436 mutex_lock(&local
->key_mtx
);
437 __ieee80211_key_free(key
);
438 mutex_unlock(&local
->key_mtx
);
441 void ieee80211_enable_keys(struct ieee80211_sub_if_data
*sdata
)
443 struct ieee80211_key
*key
;
447 if (WARN_ON(!ieee80211_sdata_running(sdata
)))
450 mutex_lock(&sdata
->local
->key_mtx
);
452 list_for_each_entry(key
, &sdata
->key_list
, list
)
453 ieee80211_key_enable_hw_accel(key
);
455 mutex_unlock(&sdata
->local
->key_mtx
);
458 void ieee80211_disable_keys(struct ieee80211_sub_if_data
*sdata
)
460 struct ieee80211_key
*key
;
464 mutex_lock(&sdata
->local
->key_mtx
);
466 list_for_each_entry(key
, &sdata
->key_list
, list
)
467 ieee80211_key_disable_hw_accel(key
);
469 mutex_unlock(&sdata
->local
->key_mtx
);
472 void ieee80211_free_keys(struct ieee80211_sub_if_data
*sdata
)
474 struct ieee80211_key
*key
, *tmp
;
476 mutex_lock(&sdata
->local
->key_mtx
);
478 ieee80211_debugfs_key_remove_default(sdata
);
479 ieee80211_debugfs_key_remove_mgmt_default(sdata
);
481 list_for_each_entry_safe(key
, tmp
, &sdata
->key_list
, list
)
482 __ieee80211_key_free(key
);
484 mutex_unlock(&sdata
->local
->key_mtx
);