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 !ieee80211_hw_check(&key->local->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 (ieee80211_hw_check(&key->local->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()
271 rcu_assign_pointer(sdata->default_multicast_key, key); in __ieee80211_set_default_key()
287 struct ieee80211_key *key = NULL; in __ieee80211_set_default_mgmt_key() local
293 key = key_mtx_dereference(sdata->local, sdata->keys[idx]); in __ieee80211_set_default_mgmt_key()
295 rcu_assign_pointer(sdata->default_mgmt_key, key); in __ieee80211_set_default_mgmt_key()
380 struct ieee80211_key *key; in ieee80211_key_alloc() local
386 key = kzalloc(sizeof(struct ieee80211_key) + key_len, GFP_KERNEL); in ieee80211_key_alloc()
387 if (!key) in ieee80211_key_alloc()
394 key->conf.flags = 0; in ieee80211_key_alloc()
395 key->flags = 0; in ieee80211_key_alloc()
397 key->conf.cipher = cipher; in ieee80211_key_alloc()
398 key->conf.keyidx = idx; in ieee80211_key_alloc()
399 key->conf.keylen = key_len; in ieee80211_key_alloc()
403 key->conf.iv_len = IEEE80211_WEP_IV_LEN; in ieee80211_key_alloc()
404 key->conf.icv_len = IEEE80211_WEP_ICV_LEN; in ieee80211_key_alloc()
407 key->conf.iv_len = IEEE80211_TKIP_IV_LEN; in ieee80211_key_alloc()
408 key->conf.icv_len = IEEE80211_TKIP_ICV_LEN; in ieee80211_key_alloc()
411 key->u.tkip.rx[i].iv32 = in ieee80211_key_alloc()
413 key->u.tkip.rx[i].iv16 = in ieee80211_key_alloc()
417 spin_lock_init(&key->u.tkip.txlock); in ieee80211_key_alloc()
420 key->conf.iv_len = IEEE80211_CCMP_HDR_LEN; in ieee80211_key_alloc()
421 key->conf.icv_len = IEEE80211_CCMP_MIC_LEN; in ieee80211_key_alloc()
425 key->u.ccmp.rx_pn[i][j] = in ieee80211_key_alloc()
432 key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt( in ieee80211_key_alloc()
434 if (IS_ERR(key->u.ccmp.tfm)) { in ieee80211_key_alloc()
435 err = PTR_ERR(key->u.ccmp.tfm); in ieee80211_key_alloc()
436 kfree(key); in ieee80211_key_alloc()
441 key->conf.iv_len = IEEE80211_CCMP_256_HDR_LEN; in ieee80211_key_alloc()
442 key->conf.icv_len = IEEE80211_CCMP_256_MIC_LEN; in ieee80211_key_alloc()
445 key->u.ccmp.rx_pn[i][j] = in ieee80211_key_alloc()
450 key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt( in ieee80211_key_alloc()
452 if (IS_ERR(key->u.ccmp.tfm)) { in ieee80211_key_alloc()
453 err = PTR_ERR(key->u.ccmp.tfm); in ieee80211_key_alloc()
454 kfree(key); in ieee80211_key_alloc()
460 key->conf.iv_len = 0; in ieee80211_key_alloc()
462 key->conf.icv_len = sizeof(struct ieee80211_mmie); in ieee80211_key_alloc()
464 key->conf.icv_len = sizeof(struct ieee80211_mmie_16); in ieee80211_key_alloc()
467 key->u.aes_cmac.rx_pn[j] = in ieee80211_key_alloc()
473 key->u.aes_cmac.tfm = in ieee80211_key_alloc()
475 if (IS_ERR(key->u.aes_cmac.tfm)) { in ieee80211_key_alloc()
476 err = PTR_ERR(key->u.aes_cmac.tfm); in ieee80211_key_alloc()
477 kfree(key); in ieee80211_key_alloc()
483 key->conf.iv_len = 0; in ieee80211_key_alloc()
484 key->conf.icv_len = sizeof(struct ieee80211_mmie_16); in ieee80211_key_alloc()
487 key->u.aes_gmac.rx_pn[j] = in ieee80211_key_alloc()
492 key->u.aes_gmac.tfm = in ieee80211_key_alloc()
494 if (IS_ERR(key->u.aes_gmac.tfm)) { in ieee80211_key_alloc()
495 err = PTR_ERR(key->u.aes_gmac.tfm); in ieee80211_key_alloc()
496 kfree(key); in ieee80211_key_alloc()
502 key->conf.iv_len = IEEE80211_GCMP_HDR_LEN; in ieee80211_key_alloc()
503 key->conf.icv_len = IEEE80211_GCMP_MIC_LEN; in ieee80211_key_alloc()
506 key->u.gcmp.rx_pn[i][j] = in ieee80211_key_alloc()
511 key->u.gcmp.tfm = ieee80211_aes_gcm_key_setup_encrypt(key_data, in ieee80211_key_alloc()
513 if (IS_ERR(key->u.gcmp.tfm)) { in ieee80211_key_alloc()
514 err = PTR_ERR(key->u.gcmp.tfm); in ieee80211_key_alloc()
515 kfree(key); in ieee80211_key_alloc()
522 kfree(key); in ieee80211_key_alloc()
526 key->conf.iv_len = cs->hdr_len; in ieee80211_key_alloc()
527 key->conf.icv_len = cs->mic_len; in ieee80211_key_alloc()
530 key->u.gen.rx_pn[i][j] = in ieee80211_key_alloc()
532 key->flags |= KEY_FLAG_CIPHER_SCHEME; in ieee80211_key_alloc()
535 memcpy(key->conf.key, key_data, key_len); in ieee80211_key_alloc()
536 INIT_LIST_HEAD(&key->list); in ieee80211_key_alloc()
538 return key; in ieee80211_key_alloc()
541 static void ieee80211_key_free_common(struct ieee80211_key *key) in ieee80211_key_free_common() argument
543 switch (key->conf.cipher) { in ieee80211_key_free_common()
546 ieee80211_aes_key_free(key->u.ccmp.tfm); in ieee80211_key_free_common()
550 ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm); in ieee80211_key_free_common()
554 ieee80211_aes_gmac_key_free(key->u.aes_gmac.tfm); in ieee80211_key_free_common()
558 ieee80211_aes_gcm_key_free(key->u.gcmp.tfm); in ieee80211_key_free_common()
561 kzfree(key); in ieee80211_key_free_common()
564 static void __ieee80211_key_destroy(struct ieee80211_key *key, in __ieee80211_key_destroy() argument
567 if (key->local) in __ieee80211_key_destroy()
568 ieee80211_key_disable_hw_accel(key); in __ieee80211_key_destroy()
570 if (key->local) { in __ieee80211_key_destroy()
571 struct ieee80211_sub_if_data *sdata = key->sdata; in __ieee80211_key_destroy()
573 ieee80211_debugfs_key_remove(key); in __ieee80211_key_destroy()
585 ieee80211_key_free_common(key); in __ieee80211_key_destroy()
588 static void ieee80211_key_destroy(struct ieee80211_key *key, in ieee80211_key_destroy() argument
591 if (!key) in ieee80211_key_destroy()
600 __ieee80211_key_destroy(key, delay_tailroom); in ieee80211_key_destroy()
603 void ieee80211_key_free_unused(struct ieee80211_key *key) in ieee80211_key_free_unused() argument
605 WARN_ON(key->sdata || key->local); in ieee80211_key_free_unused()
606 ieee80211_key_free_common(key); in ieee80211_key_free_unused()
609 int ieee80211_key_link(struct ieee80211_key *key, in ieee80211_key_link() argument
618 pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE; in ieee80211_key_link()
619 idx = key->conf.keyidx; in ieee80211_key_link()
620 key->local = sdata->local; in ieee80211_key_link()
621 key->sdata = sdata; in ieee80211_key_link()
622 key->sta = sta; in ieee80211_key_link()
635 ieee80211_key_replace(sdata, sta, pairwise, old_key, key); in ieee80211_key_link()
638 ieee80211_debugfs_key_add(key); in ieee80211_key_link()
641 ret = ieee80211_key_enable_hw_accel(key); in ieee80211_key_link()
643 ieee80211_key_free(key, true); in ieee80211_key_link()
653 void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom) in ieee80211_key_free() argument
655 if (!key) in ieee80211_key_free()
661 if (key->sdata) in ieee80211_key_free()
662 ieee80211_key_replace(key->sdata, key->sta, in ieee80211_key_free()
663 key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE, in ieee80211_key_free()
664 key, NULL); in ieee80211_key_free()
665 ieee80211_key_destroy(key, delay_tailroom); in ieee80211_key_free()
670 struct ieee80211_key *key; in ieee80211_enable_keys() local
689 list_for_each_entry(key, &sdata->key_list, list) { in ieee80211_enable_keys()
691 ieee80211_key_enable_hw_accel(key); in ieee80211_enable_keys()
718 struct ieee80211_key_conf *key, in ieee80211_iter_keys() argument
723 struct ieee80211_key *key, *tmp; in ieee80211_iter_keys() local
731 list_for_each_entry_safe(key, tmp, &sdata->key_list, list) in ieee80211_iter_keys()
733 key->sta ? &key->sta->sta : NULL, in ieee80211_iter_keys()
734 &key->conf, iter_data); in ieee80211_iter_keys()
737 list_for_each_entry_safe(key, tmp, in ieee80211_iter_keys()
740 key->sta ? &key->sta->sta : NULL, in ieee80211_iter_keys()
741 &key->conf, iter_data); in ieee80211_iter_keys()
750 struct ieee80211_key *key, *tmp; in ieee80211_free_keys_iface() local
758 list_for_each_entry_safe(key, tmp, &sdata->key_list, list) { in ieee80211_free_keys_iface()
759 ieee80211_key_replace(key->sdata, key->sta, in ieee80211_free_keys_iface()
760 key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE, in ieee80211_free_keys_iface()
761 key, NULL); in ieee80211_free_keys_iface()
762 list_add_tail(&key->list, keys); in ieee80211_free_keys_iface()
774 struct ieee80211_key *key, *tmp; in ieee80211_free_keys() local
790 list_for_each_entry_safe(key, tmp, &keys, list) in ieee80211_free_keys()
791 __ieee80211_key_destroy(key, false); in ieee80211_free_keys()
819 struct ieee80211_key *key; in ieee80211_free_sta_keys() local
824 key = key_mtx_dereference(local, sta->gtk[i]); in ieee80211_free_sta_keys()
825 if (!key) in ieee80211_free_sta_keys()
827 ieee80211_key_replace(key->sdata, key->sta, in ieee80211_free_sta_keys()
828 key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE, in ieee80211_free_sta_keys()
829 key, NULL); in ieee80211_free_sta_keys()
830 __ieee80211_key_destroy(key, true); in ieee80211_free_sta_keys()
834 key = key_mtx_dereference(local, sta->ptk[i]); in ieee80211_free_sta_keys()
835 if (!key) in ieee80211_free_sta_keys()
837 ieee80211_key_replace(key->sdata, key->sta, in ieee80211_free_sta_keys()
838 key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE, in ieee80211_free_sta_keys()
839 key, NULL); in ieee80211_free_sta_keys()
840 __ieee80211_key_destroy(key, true); in ieee80211_free_sta_keys()
890 struct ieee80211_key *key; in ieee80211_get_key_tx_seq() local
896 key = container_of(keyconf, struct ieee80211_key, conf); in ieee80211_get_key_tx_seq()
898 switch (key->conf.cipher) { in ieee80211_get_key_tx_seq()
900 seq->tkip.iv32 = key->u.tkip.tx.iv32; in ieee80211_get_key_tx_seq()
901 seq->tkip.iv16 = key->u.tkip.tx.iv16; in ieee80211_get_key_tx_seq()
917 pn64 = atomic64_read(&key->conf.tx_pn); in ieee80211_get_key_tx_seq()
934 struct ieee80211_key *key; in ieee80211_get_key_rx_seq() local
937 key = container_of(keyconf, struct ieee80211_key, conf); in ieee80211_get_key_rx_seq()
939 switch (key->conf.cipher) { in ieee80211_get_key_rx_seq()
943 seq->tkip.iv32 = key->u.tkip.rx[tid].iv32; in ieee80211_get_key_rx_seq()
944 seq->tkip.iv16 = key->u.tkip.rx[tid].iv16; in ieee80211_get_key_rx_seq()
951 pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS]; in ieee80211_get_key_rx_seq()
953 pn = key->u.ccmp.rx_pn[tid]; in ieee80211_get_key_rx_seq()
960 pn = key->u.aes_cmac.rx_pn; in ieee80211_get_key_rx_seq()
967 pn = key->u.aes_gmac.rx_pn; in ieee80211_get_key_rx_seq()
975 pn = key->u.gcmp.rx_pn[IEEE80211_NUM_TIDS]; in ieee80211_get_key_rx_seq()
977 pn = key->u.gcmp.rx_pn[tid]; in ieee80211_get_key_rx_seq()
987 struct ieee80211_key *key; in ieee80211_set_key_tx_seq() local
990 key = container_of(keyconf, struct ieee80211_key, conf); in ieee80211_set_key_tx_seq()
992 switch (key->conf.cipher) { in ieee80211_set_key_tx_seq()
994 key->u.tkip.tx.iv32 = seq->tkip.iv32; in ieee80211_set_key_tx_seq()
995 key->u.tkip.tx.iv16 = seq->tkip.iv16; in ieee80211_set_key_tx_seq()
1017 atomic64_set(&key->conf.tx_pn, pn64); in ieee80211_set_key_tx_seq()
1029 struct ieee80211_key *key; in ieee80211_set_key_rx_seq() local
1032 key = container_of(keyconf, struct ieee80211_key, conf); in ieee80211_set_key_rx_seq()
1034 switch (key->conf.cipher) { in ieee80211_set_key_rx_seq()
1038 key->u.tkip.rx[tid].iv32 = seq->tkip.iv32; in ieee80211_set_key_rx_seq()
1039 key->u.tkip.rx[tid].iv16 = seq->tkip.iv16; in ieee80211_set_key_rx_seq()
1046 pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS]; in ieee80211_set_key_rx_seq()
1048 pn = key->u.ccmp.rx_pn[tid]; in ieee80211_set_key_rx_seq()
1055 pn = key->u.aes_cmac.rx_pn; in ieee80211_set_key_rx_seq()
1062 pn = key->u.aes_gmac.rx_pn; in ieee80211_set_key_rx_seq()
1070 pn = key->u.gcmp.rx_pn[IEEE80211_NUM_TIDS]; in ieee80211_set_key_rx_seq()
1072 pn = key->u.gcmp.rx_pn[tid]; in ieee80211_set_key_rx_seq()
1084 struct ieee80211_key *key; in ieee80211_remove_key() local
1086 key = container_of(keyconf, struct ieee80211_key, conf); in ieee80211_remove_key()
1088 assert_key_lock(key->local); in ieee80211_remove_key()
1094 if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) { in ieee80211_remove_key()
1095 key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; in ieee80211_remove_key()
1097 if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || in ieee80211_remove_key()
1098 (key->conf.flags & IEEE80211_KEY_FLAG_RESERVE_TAILROOM))) in ieee80211_remove_key()
1099 increment_tailroom_need_count(key->sdata); in ieee80211_remove_key()
1102 ieee80211_key_free(key, false); in ieee80211_remove_key()
1112 struct ieee80211_key *key; in ieee80211_gtk_rekey_add() local
1121 key = ieee80211_key_alloc(keyconf->cipher, keyconf->keyidx, in ieee80211_gtk_rekey_add()
1122 keyconf->keylen, keyconf->key, in ieee80211_gtk_rekey_add()
1124 if (IS_ERR(key)) in ieee80211_gtk_rekey_add()
1125 return ERR_CAST(key); in ieee80211_gtk_rekey_add()
1128 key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT; in ieee80211_gtk_rekey_add()
1130 err = ieee80211_key_link(key, sdata, NULL); in ieee80211_gtk_rekey_add()
1134 return &key->conf; in ieee80211_gtk_rekey_add()