Lines Matching refs:key
125 static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) in ieee80211_key_enable_hw_accel() argument
133 if (key->flags & KEY_FLAG_TAINTED) { in ieee80211_key_enable_hw_accel()
141 key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; in ieee80211_key_enable_hw_accel()
145 if (!key->local->ops->set_key) in ieee80211_key_enable_hw_accel()
148 assert_key_lock(key->local); in ieee80211_key_enable_hw_accel()
150 sta = key->sta; in ieee80211_key_enable_hw_accel()
156 if (sta && !(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE) && in ieee80211_key_enable_hw_accel()
157 !(key->local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK)) in ieee80211_key_enable_hw_accel()
163 sdata = key->sdata; in ieee80211_key_enable_hw_accel()
169 if (!(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE)) in ieee80211_key_enable_hw_accel()
173 ret = drv_set_key(key->local, SET_KEY, sdata, in ieee80211_key_enable_hw_accel()
174 sta ? &sta->sta : NULL, &key->conf); in ieee80211_key_enable_hw_accel()
177 key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; in ieee80211_key_enable_hw_accel()
179 if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || in ieee80211_key_enable_hw_accel()
180 (key->conf.flags & IEEE80211_KEY_FLAG_RESERVE_TAILROOM))) in ieee80211_key_enable_hw_accel()
183 WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) && in ieee80211_key_enable_hw_accel()
184 (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)); in ieee80211_key_enable_hw_accel()
192 key->conf.keyidx, in ieee80211_key_enable_hw_accel()
196 switch (key->conf.cipher) { in ieee80211_key_enable_hw_accel()
211 if (key->local->hw.flags & IEEE80211_HW_SW_CRYPTO_CONTROL) in ieee80211_key_enable_hw_accel()
219 static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key) in ieee80211_key_disable_hw_accel() argument
227 if (!key || !key->local->ops->set_key) in ieee80211_key_disable_hw_accel()
230 assert_key_lock(key->local); in ieee80211_key_disable_hw_accel()
232 if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) in ieee80211_key_disable_hw_accel()
235 sta = key->sta; in ieee80211_key_disable_hw_accel()
236 sdata = key->sdata; in ieee80211_key_disable_hw_accel()
238 if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || in ieee80211_key_disable_hw_accel()
239 (key->conf.flags & IEEE80211_KEY_FLAG_RESERVE_TAILROOM))) in ieee80211_key_disable_hw_accel()
242 ret = drv_set_key(key->local, DISABLE_KEY, sdata, in ieee80211_key_disable_hw_accel()
243 sta ? &sta->sta : NULL, &key->conf); in ieee80211_key_disable_hw_accel()
248 key->conf.keyidx, in ieee80211_key_disable_hw_accel()
251 key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; in ieee80211_key_disable_hw_accel()
257 struct ieee80211_key *key = NULL; in __ieee80211_set_default_key() local
262 key = key_mtx_dereference(sdata->local, sdata->keys[idx]); in __ieee80211_set_default_key()
265 rcu_assign_pointer(sdata->default_unicast_key, key); in __ieee80211_set_default_key()
270 rcu_assign_pointer(sdata->default_multicast_key, key); in __ieee80211_set_default_key()
286 struct ieee80211_key *key = NULL; in __ieee80211_set_default_mgmt_key() local
292 key = key_mtx_dereference(sdata->local, sdata->keys[idx]); in __ieee80211_set_default_mgmt_key()
294 rcu_assign_pointer(sdata->default_mgmt_key, key); in __ieee80211_set_default_mgmt_key()
379 struct ieee80211_key *key; in ieee80211_key_alloc() local
385 key = kzalloc(sizeof(struct ieee80211_key) + key_len, GFP_KERNEL); in ieee80211_key_alloc()
386 if (!key) in ieee80211_key_alloc()
393 key->conf.flags = 0; in ieee80211_key_alloc()
394 key->flags = 0; in ieee80211_key_alloc()
396 key->conf.cipher = cipher; in ieee80211_key_alloc()
397 key->conf.keyidx = idx; in ieee80211_key_alloc()
398 key->conf.keylen = key_len; in ieee80211_key_alloc()
402 key->conf.iv_len = IEEE80211_WEP_IV_LEN; in ieee80211_key_alloc()
403 key->conf.icv_len = IEEE80211_WEP_ICV_LEN; in ieee80211_key_alloc()
406 key->conf.iv_len = IEEE80211_TKIP_IV_LEN; in ieee80211_key_alloc()
407 key->conf.icv_len = IEEE80211_TKIP_ICV_LEN; in ieee80211_key_alloc()
410 key->u.tkip.rx[i].iv32 = in ieee80211_key_alloc()
412 key->u.tkip.rx[i].iv16 = in ieee80211_key_alloc()
416 spin_lock_init(&key->u.tkip.txlock); in ieee80211_key_alloc()
419 key->conf.iv_len = IEEE80211_CCMP_HDR_LEN; in ieee80211_key_alloc()
420 key->conf.icv_len = IEEE80211_CCMP_MIC_LEN; in ieee80211_key_alloc()
424 key->u.ccmp.rx_pn[i][j] = in ieee80211_key_alloc()
431 key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt( in ieee80211_key_alloc()
433 if (IS_ERR(key->u.ccmp.tfm)) { in ieee80211_key_alloc()
434 err = PTR_ERR(key->u.ccmp.tfm); in ieee80211_key_alloc()
435 kfree(key); in ieee80211_key_alloc()
440 key->conf.iv_len = IEEE80211_CCMP_256_HDR_LEN; in ieee80211_key_alloc()
441 key->conf.icv_len = IEEE80211_CCMP_256_MIC_LEN; in ieee80211_key_alloc()
444 key->u.ccmp.rx_pn[i][j] = in ieee80211_key_alloc()
449 key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt( in ieee80211_key_alloc()
451 if (IS_ERR(key->u.ccmp.tfm)) { in ieee80211_key_alloc()
452 err = PTR_ERR(key->u.ccmp.tfm); in ieee80211_key_alloc()
453 kfree(key); in ieee80211_key_alloc()
459 key->conf.iv_len = 0; in ieee80211_key_alloc()
461 key->conf.icv_len = sizeof(struct ieee80211_mmie); in ieee80211_key_alloc()
463 key->conf.icv_len = sizeof(struct ieee80211_mmie_16); in ieee80211_key_alloc()
466 key->u.aes_cmac.rx_pn[j] = in ieee80211_key_alloc()
472 key->u.aes_cmac.tfm = in ieee80211_key_alloc()
474 if (IS_ERR(key->u.aes_cmac.tfm)) { in ieee80211_key_alloc()
475 err = PTR_ERR(key->u.aes_cmac.tfm); in ieee80211_key_alloc()
476 kfree(key); in ieee80211_key_alloc()
482 key->conf.iv_len = 0; in ieee80211_key_alloc()
483 key->conf.icv_len = sizeof(struct ieee80211_mmie_16); in ieee80211_key_alloc()
486 key->u.aes_gmac.rx_pn[j] = in ieee80211_key_alloc()
491 key->u.aes_gmac.tfm = in ieee80211_key_alloc()
493 if (IS_ERR(key->u.aes_gmac.tfm)) { in ieee80211_key_alloc()
494 err = PTR_ERR(key->u.aes_gmac.tfm); in ieee80211_key_alloc()
495 kfree(key); in ieee80211_key_alloc()
501 key->conf.iv_len = IEEE80211_GCMP_HDR_LEN; in ieee80211_key_alloc()
502 key->conf.icv_len = IEEE80211_GCMP_MIC_LEN; in ieee80211_key_alloc()
505 key->u.gcmp.rx_pn[i][j] = in ieee80211_key_alloc()
510 key->u.gcmp.tfm = ieee80211_aes_gcm_key_setup_encrypt(key_data, in ieee80211_key_alloc()
512 if (IS_ERR(key->u.gcmp.tfm)) { in ieee80211_key_alloc()
513 err = PTR_ERR(key->u.gcmp.tfm); in ieee80211_key_alloc()
514 kfree(key); in ieee80211_key_alloc()
523 key->conf.iv_len = cs->hdr_len; in ieee80211_key_alloc()
524 key->conf.icv_len = cs->mic_len; in ieee80211_key_alloc()
527 key->u.gen.rx_pn[i][j] = in ieee80211_key_alloc()
529 key->flags |= KEY_FLAG_CIPHER_SCHEME; in ieee80211_key_alloc()
532 memcpy(key->conf.key, key_data, key_len); in ieee80211_key_alloc()
533 INIT_LIST_HEAD(&key->list); in ieee80211_key_alloc()
535 return key; in ieee80211_key_alloc()
538 static void ieee80211_key_free_common(struct ieee80211_key *key) in ieee80211_key_free_common() argument
540 switch (key->conf.cipher) { in ieee80211_key_free_common()
543 ieee80211_aes_key_free(key->u.ccmp.tfm); in ieee80211_key_free_common()
547 ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm); in ieee80211_key_free_common()
551 ieee80211_aes_gmac_key_free(key->u.aes_gmac.tfm); in ieee80211_key_free_common()
555 ieee80211_aes_gcm_key_free(key->u.gcmp.tfm); in ieee80211_key_free_common()
558 kzfree(key); in ieee80211_key_free_common()
561 static void __ieee80211_key_destroy(struct ieee80211_key *key, in __ieee80211_key_destroy() argument
564 if (key->local) in __ieee80211_key_destroy()
565 ieee80211_key_disable_hw_accel(key); in __ieee80211_key_destroy()
567 if (key->local) { in __ieee80211_key_destroy()
568 struct ieee80211_sub_if_data *sdata = key->sdata; in __ieee80211_key_destroy()
570 ieee80211_debugfs_key_remove(key); in __ieee80211_key_destroy()
582 ieee80211_key_free_common(key); in __ieee80211_key_destroy()
585 static void ieee80211_key_destroy(struct ieee80211_key *key, in ieee80211_key_destroy() argument
588 if (!key) in ieee80211_key_destroy()
597 __ieee80211_key_destroy(key, delay_tailroom); in ieee80211_key_destroy()
600 void ieee80211_key_free_unused(struct ieee80211_key *key) in ieee80211_key_free_unused() argument
602 WARN_ON(key->sdata || key->local); in ieee80211_key_free_unused()
603 ieee80211_key_free_common(key); in ieee80211_key_free_unused()
606 int ieee80211_key_link(struct ieee80211_key *key, in ieee80211_key_link() argument
615 pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE; in ieee80211_key_link()
616 idx = key->conf.keyidx; in ieee80211_key_link()
617 key->local = sdata->local; in ieee80211_key_link()
618 key->sdata = sdata; in ieee80211_key_link()
619 key->sta = sta; in ieee80211_key_link()
632 ieee80211_key_replace(sdata, sta, pairwise, old_key, key); in ieee80211_key_link()
635 ieee80211_debugfs_key_add(key); in ieee80211_key_link()
638 ret = ieee80211_key_enable_hw_accel(key); in ieee80211_key_link()
640 ieee80211_key_free(key, true); in ieee80211_key_link()
650 void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom) in ieee80211_key_free() argument
652 if (!key) in ieee80211_key_free()
658 if (key->sdata) in ieee80211_key_free()
659 ieee80211_key_replace(key->sdata, key->sta, in ieee80211_key_free()
660 key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE, in ieee80211_key_free()
661 key, NULL); in ieee80211_key_free()
662 ieee80211_key_destroy(key, delay_tailroom); in ieee80211_key_free()
667 struct ieee80211_key *key; in ieee80211_enable_keys() local
686 list_for_each_entry(key, &sdata->key_list, list) { in ieee80211_enable_keys()
688 ieee80211_key_enable_hw_accel(key); in ieee80211_enable_keys()
715 struct ieee80211_key_conf *key, in ieee80211_iter_keys() argument
720 struct ieee80211_key *key, *tmp; in ieee80211_iter_keys() local
728 list_for_each_entry_safe(key, tmp, &sdata->key_list, list) in ieee80211_iter_keys()
730 key->sta ? &key->sta->sta : NULL, in ieee80211_iter_keys()
731 &key->conf, iter_data); in ieee80211_iter_keys()
734 list_for_each_entry_safe(key, tmp, in ieee80211_iter_keys()
737 key->sta ? &key->sta->sta : NULL, in ieee80211_iter_keys()
738 &key->conf, iter_data); in ieee80211_iter_keys()
747 struct ieee80211_key *key, *tmp; in ieee80211_free_keys_iface() local
755 list_for_each_entry_safe(key, tmp, &sdata->key_list, list) { in ieee80211_free_keys_iface()
756 ieee80211_key_replace(key->sdata, key->sta, in ieee80211_free_keys_iface()
757 key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE, in ieee80211_free_keys_iface()
758 key, NULL); in ieee80211_free_keys_iface()
759 list_add_tail(&key->list, keys); in ieee80211_free_keys_iface()
771 struct ieee80211_key *key, *tmp; in ieee80211_free_keys() local
787 list_for_each_entry_safe(key, tmp, &keys, list) in ieee80211_free_keys()
788 __ieee80211_key_destroy(key, false); in ieee80211_free_keys()
816 struct ieee80211_key *key; in ieee80211_free_sta_keys() local
821 key = key_mtx_dereference(local, sta->gtk[i]); in ieee80211_free_sta_keys()
822 if (!key) in ieee80211_free_sta_keys()
824 ieee80211_key_replace(key->sdata, key->sta, in ieee80211_free_sta_keys()
825 key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE, in ieee80211_free_sta_keys()
826 key, NULL); in ieee80211_free_sta_keys()
827 __ieee80211_key_destroy(key, true); in ieee80211_free_sta_keys()
831 key = key_mtx_dereference(local, sta->ptk[i]); in ieee80211_free_sta_keys()
832 if (!key) in ieee80211_free_sta_keys()
834 ieee80211_key_replace(key->sdata, key->sta, in ieee80211_free_sta_keys()
835 key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE, in ieee80211_free_sta_keys()
836 key, NULL); in ieee80211_free_sta_keys()
837 __ieee80211_key_destroy(key, true); in ieee80211_free_sta_keys()
887 struct ieee80211_key *key; in ieee80211_get_key_tx_seq() local
893 key = container_of(keyconf, struct ieee80211_key, conf); in ieee80211_get_key_tx_seq()
895 switch (key->conf.cipher) { in ieee80211_get_key_tx_seq()
897 seq->tkip.iv32 = key->u.tkip.tx.iv32; in ieee80211_get_key_tx_seq()
898 seq->tkip.iv16 = key->u.tkip.tx.iv16; in ieee80211_get_key_tx_seq()
902 pn64 = atomic64_read(&key->u.ccmp.tx_pn); in ieee80211_get_key_tx_seq()
912 pn64 = atomic64_read(&key->u.aes_cmac.tx_pn); in ieee80211_get_key_tx_seq()
922 pn64 = atomic64_read(&key->u.aes_gmac.tx_pn); in ieee80211_get_key_tx_seq()
932 pn64 = atomic64_read(&key->u.gcmp.tx_pn); in ieee80211_get_key_tx_seq()
949 struct ieee80211_key *key; in ieee80211_get_key_rx_seq() local
952 key = container_of(keyconf, struct ieee80211_key, conf); in ieee80211_get_key_rx_seq()
954 switch (key->conf.cipher) { in ieee80211_get_key_rx_seq()
958 seq->tkip.iv32 = key->u.tkip.rx[tid].iv32; in ieee80211_get_key_rx_seq()
959 seq->tkip.iv16 = key->u.tkip.rx[tid].iv16; in ieee80211_get_key_rx_seq()
966 pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS]; in ieee80211_get_key_rx_seq()
968 pn = key->u.ccmp.rx_pn[tid]; in ieee80211_get_key_rx_seq()
975 pn = key->u.aes_cmac.rx_pn; in ieee80211_get_key_rx_seq()
982 pn = key->u.aes_gmac.rx_pn; in ieee80211_get_key_rx_seq()
990 pn = key->u.gcmp.rx_pn[IEEE80211_NUM_TIDS]; in ieee80211_get_key_rx_seq()
992 pn = key->u.gcmp.rx_pn[tid]; in ieee80211_get_key_rx_seq()
1002 struct ieee80211_key *key; in ieee80211_set_key_tx_seq() local
1005 key = container_of(keyconf, struct ieee80211_key, conf); in ieee80211_set_key_tx_seq()
1007 switch (key->conf.cipher) { in ieee80211_set_key_tx_seq()
1009 key->u.tkip.tx.iv32 = seq->tkip.iv32; in ieee80211_set_key_tx_seq()
1010 key->u.tkip.tx.iv16 = seq->tkip.iv16; in ieee80211_set_key_tx_seq()
1020 atomic64_set(&key->u.ccmp.tx_pn, pn64); in ieee80211_set_key_tx_seq()
1030 atomic64_set(&key->u.aes_cmac.tx_pn, pn64); in ieee80211_set_key_tx_seq()
1040 atomic64_set(&key->u.aes_gmac.tx_pn, pn64); in ieee80211_set_key_tx_seq()
1050 atomic64_set(&key->u.gcmp.tx_pn, pn64); in ieee80211_set_key_tx_seq()
1062 struct ieee80211_key *key; in ieee80211_set_key_rx_seq() local
1065 key = container_of(keyconf, struct ieee80211_key, conf); in ieee80211_set_key_rx_seq()
1067 switch (key->conf.cipher) { in ieee80211_set_key_rx_seq()
1071 key->u.tkip.rx[tid].iv32 = seq->tkip.iv32; in ieee80211_set_key_rx_seq()
1072 key->u.tkip.rx[tid].iv16 = seq->tkip.iv16; in ieee80211_set_key_rx_seq()
1079 pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS]; in ieee80211_set_key_rx_seq()
1081 pn = key->u.ccmp.rx_pn[tid]; in ieee80211_set_key_rx_seq()
1088 pn = key->u.aes_cmac.rx_pn; in ieee80211_set_key_rx_seq()
1095 pn = key->u.aes_gmac.rx_pn; in ieee80211_set_key_rx_seq()
1103 pn = key->u.gcmp.rx_pn[IEEE80211_NUM_TIDS]; in ieee80211_set_key_rx_seq()
1105 pn = key->u.gcmp.rx_pn[tid]; in ieee80211_set_key_rx_seq()
1117 struct ieee80211_key *key; in ieee80211_remove_key() local
1119 key = container_of(keyconf, struct ieee80211_key, conf); in ieee80211_remove_key()
1121 assert_key_lock(key->local); in ieee80211_remove_key()
1127 if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) { in ieee80211_remove_key()
1128 key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; in ieee80211_remove_key()
1130 if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || in ieee80211_remove_key()
1131 (key->conf.flags & IEEE80211_KEY_FLAG_RESERVE_TAILROOM))) in ieee80211_remove_key()
1132 increment_tailroom_need_count(key->sdata); in ieee80211_remove_key()
1135 ieee80211_key_free(key, false); in ieee80211_remove_key()
1145 struct ieee80211_key *key; in ieee80211_gtk_rekey_add() local
1154 key = ieee80211_key_alloc(keyconf->cipher, keyconf->keyidx, in ieee80211_gtk_rekey_add()
1155 keyconf->keylen, keyconf->key, in ieee80211_gtk_rekey_add()
1157 if (IS_ERR(key)) in ieee80211_gtk_rekey_add()
1158 return ERR_CAST(key); in ieee80211_gtk_rekey_add()
1161 key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT; in ieee80211_gtk_rekey_add()
1163 err = ieee80211_key_link(key, sdata, NULL); in ieee80211_gtk_rekey_add()
1167 return &key->conf; in ieee80211_gtk_rekey_add()