| 1 |
|
| 2 | |
| 3 | * Copyright 2002-2004, Instant802 Networks, Inc.
|
| 4 | * Copyright 2005, Devicescape Software, Inc.
|
| 5 | * Copyright (C) 2019, 2022-2023 Intel Corporation
|
| 6 |
|
| 7 |
|
| 8 | #ifndef IEEE80211_KEY_H
|
| 9 | #define IEEE80211_KEY_H
|
| 10 |
|
| 11 | #include <linux/types.h>
|
| 12 | #include <linux/list.h>
|
| 13 | #include <linux/crypto.h>
|
| 14 | #include <linux/rcupdate.h>
|
| 15 | #include <crypto/aes-cbc-macs.h>
|
| 16 | #include <crypto/arc4.h>
|
| 17 | #include <net/mac80211.h>
|
| 18 |
|
| 19 | #define NUM_DEFAULT_KEYS 4
|
| 20 | #define NUM_DEFAULT_MGMT_KEYS 2
|
| 21 | #define NUM_DEFAULT_BEACON_KEYS 2
|
| 22 | #define INVALID_PTK_KEYIDX 2
|
| 23 |
|
| 24 | struct ieee80211_local;
|
| 25 | struct ieee80211_sub_if_data;
|
| 26 | struct ieee80211_link_data;
|
| 27 | struct sta_info;
|
| 28 |
|
| 29 | |
| 30 | * enum ieee80211_internal_key_flags - internal key flags
|
| 31 | *
|
| 32 | * @KEY_FLAG_UPLOADED_TO_HARDWARE: Indicates that this key is present
|
| 33 | * in the hardware for TX crypto hardware acceleration.
|
| 34 | * @KEY_FLAG_TAINTED: Key is tainted and packets should be dropped.
|
| 35 |
|
| 36 | enum ieee80211_internal_key_flags {
|
| 37 | KEY_FLAG_UPLOADED_TO_HARDWARE = BIT(0),
|
| 38 | KEY_FLAG_TAINTED = BIT(1),
|
| 39 | };
|
| 40 |
|
| 41 | enum ieee80211_internal_tkip_state {
|
| 42 | TKIP_STATE_NOT_INIT,
|
| 43 | TKIP_STATE_PHASE1_DONE,
|
| 44 | TKIP_STATE_PHASE1_HW_UPLOADED,
|
| 45 | };
|
| 46 |
|
| 47 | struct tkip_ctx {
|
| 48 | u16 p1k[5];
|
| 49 | u32 p1k_iv32;
|
| 50 | enum ieee80211_internal_tkip_state state;
|
| 51 | };
|
| 52 |
|
| 53 | struct tkip_ctx_rx {
|
| 54 | struct tkip_ctx ctx;
|
| 55 | u32 iv32;
|
| 56 | u16 iv16;
|
| 57 | };
|
| 58 |
|
| 59 | struct ieee80211_key {
|
| 60 | struct ieee80211_local *local;
|
| 61 | struct ieee80211_sub_if_data *sdata;
|
| 62 | struct sta_info *sta;
|
| 63 |
|
| 64 |
|
| 65 | struct list_head list;
|
| 66 |
|
| 67 |
|
| 68 | unsigned int flags;
|
| 69 |
|
| 70 | union {
|
| 71 | struct {
|
| 72 |
|
| 73 | spinlock_t txlock;
|
| 74 |
|
| 75 |
|
| 76 | struct tkip_ctx tx;
|
| 77 |
|
| 78 |
|
| 79 | struct tkip_ctx_rx rx[IEEE80211_NUM_TIDS];
|
| 80 |
|
| 81 |
|
| 82 | u32 mic_failures;
|
| 83 | } tkip;
|
| 84 | struct {
|
| 85 | |
| 86 | * Last received packet number. The first
|
| 87 | * IEEE80211_NUM_TIDS counters are used with Data
|
| 88 | * frames and the last counter is used with Robust
|
| 89 | * Management frames.
|
| 90 |
|
| 91 | u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
|
| 92 | struct crypto_aead *tfm;
|
| 93 | u32 replays;
|
| 94 | } ccmp;
|
| 95 | struct {
|
| 96 | u8 rx_pn[IEEE80211_CMAC_PN_LEN];
|
| 97 | struct aes_cmac_key key;
|
| 98 | u32 replays;
|
| 99 | u32 icverrors;
|
| 100 | } aes_cmac;
|
| 101 | struct {
|
| 102 | u8 rx_pn[IEEE80211_GMAC_PN_LEN];
|
| 103 | struct crypto_aead *tfm;
|
| 104 | u32 replays;
|
| 105 | u32 icverrors;
|
| 106 | } aes_gmac;
|
| 107 | struct {
|
| 108 | |
| 109 | * IEEE80211_NUM_TIDS counters are used with Data
|
| 110 | * frames and the last counter is used with Robust
|
| 111 | * Management frames.
|
| 112 |
|
| 113 | u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_GCMP_PN_LEN];
|
| 114 | struct crypto_aead *tfm;
|
| 115 | u32 replays;
|
| 116 | } gcmp;
|
| 117 | struct {
|
| 118 |
|
| 119 | u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_MAX_PN_LEN];
|
| 120 | } gen;
|
| 121 | } u;
|
| 122 |
|
| 123 | #ifdef CONFIG_MAC80211_DEBUGFS
|
| 124 | struct {
|
| 125 | struct dentry *stalink;
|
| 126 | struct dentry *dir;
|
| 127 | int cnt;
|
| 128 | } debugfs;
|
| 129 | #endif
|
| 130 |
|
| 131 | unsigned int color;
|
| 132 |
|
| 133 | |
| 134 | * key config, must be last because it contains key
|
| 135 | * material as variable length member
|
| 136 |
|
| 137 | struct ieee80211_key_conf conf;
|
| 138 | };
|
| 139 |
|
| 140 | struct ieee80211_key *
|
| 141 | ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
|
| 142 | const u8 *key_data,
|
| 143 | size_t seq_len, const u8 *seq);
|
| 144 | |
| 145 | * Insert a key into data structures (sdata, sta if necessary)
|
| 146 | * to make it used, free old key. On failure, also free the new key.
|
| 147 |
|
| 148 | int ieee80211_key_link(struct ieee80211_key *key,
|
| 149 | struct ieee80211_link_data *link,
|
| 150 | struct sta_info *sta);
|
| 151 | int ieee80211_set_tx_key(struct ieee80211_key *key);
|
| 152 | void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom);
|
| 153 | void ieee80211_key_free_unused(struct ieee80211_key *key);
|
| 154 | void ieee80211_set_default_key(struct ieee80211_link_data *link, int idx,
|
| 155 | bool uni, bool multi);
|
| 156 | void ieee80211_set_default_mgmt_key(struct ieee80211_link_data *link,
|
| 157 | int idx);
|
| 158 | void ieee80211_set_default_beacon_key(struct ieee80211_link_data *link,
|
| 159 | int idx);
|
| 160 | void ieee80211_remove_link_keys(struct ieee80211_link_data *link,
|
| 161 | struct list_head *keys);
|
| 162 | void ieee80211_free_key_list(struct ieee80211_local *local,
|
| 163 | struct list_head *keys);
|
| 164 | void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata,
|
| 165 | bool force_synchronize);
|
| 166 | void ieee80211_free_sta_keys(struct ieee80211_local *local,
|
| 167 | struct sta_info *sta);
|
| 168 | void ieee80211_reenable_keys(struct ieee80211_sub_if_data *sdata);
|
| 169 | int ieee80211_key_switch_links(struct ieee80211_sub_if_data *sdata,
|
| 170 | unsigned long del_links_mask,
|
| 171 | unsigned long add_links_mask);
|
| 172 | void ieee80211_delayed_tailroom_dec(struct wiphy *wiphy,
|
| 173 | struct wiphy_work *wk);
|
| 174 |
|
| 175 | #endif
|