1
2
3
4
5
6
7#ifndef IEEE80211_KEY_H
8#define IEEE80211_KEY_H
9
10#include <linux/types.h>
11#include <linux/list.h>
12#include <linux/crypto.h>
13#include <linux/rcupdate.h>
14#include <crypto/arc4.h>
15#include <net/mac80211.h>
16
17#define NUM_DEFAULT_KEYS 4
18#define NUM_DEFAULT_MGMT_KEYS 2
19#define INVALID_PTK_KEYIDX 2
20
21struct ieee80211_local;
22struct ieee80211_sub_if_data;
23struct sta_info;
24
25
26
27
28
29
30
31
32
33enum ieee80211_internal_key_flags {
34 KEY_FLAG_UPLOADED_TO_HARDWARE = BIT(0),
35 KEY_FLAG_TAINTED = BIT(1),
36 KEY_FLAG_CIPHER_SCHEME = BIT(2),
37};
38
39enum ieee80211_internal_tkip_state {
40 TKIP_STATE_NOT_INIT,
41 TKIP_STATE_PHASE1_DONE,
42 TKIP_STATE_PHASE1_HW_UPLOADED,
43};
44
45struct tkip_ctx {
46 u16 p1k[5];
47 u32 p1k_iv32;
48 enum ieee80211_internal_tkip_state state;
49};
50
51struct tkip_ctx_rx {
52 struct tkip_ctx ctx;
53 u32 iv32;
54 u16 iv16;
55};
56
57struct ieee80211_key {
58 struct ieee80211_local *local;
59 struct ieee80211_sub_if_data *sdata;
60 struct sta_info *sta;
61
62
63 struct list_head list;
64
65
66 unsigned int flags;
67
68 union {
69 struct {
70
71 spinlock_t txlock;
72
73
74 struct tkip_ctx tx;
75
76
77 struct tkip_ctx_rx rx[IEEE80211_NUM_TIDS];
78
79
80 u32 mic_failures;
81 } tkip;
82 struct {
83
84
85
86
87
88
89 u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
90 struct crypto_aead *tfm;
91 u32 replays;
92 } ccmp;
93 struct {
94 u8 rx_pn[IEEE80211_CMAC_PN_LEN];
95 struct crypto_shash *tfm;
96 u32 replays;
97 u32 icverrors;
98 } aes_cmac;
99 struct {
100 u8 rx_pn[IEEE80211_GMAC_PN_LEN];
101 struct crypto_aead *tfm;
102 u32 replays;
103 u32 icverrors;
104 } aes_gmac;
105 struct {
106
107
108
109
110
111 u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_GCMP_PN_LEN];
112 struct crypto_aead *tfm;
113 u32 replays;
114 } gcmp;
115 struct {
116
117 u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_MAX_PN_LEN];
118 } gen;
119 } u;
120
121#ifdef CONFIG_MAC80211_DEBUGFS
122 struct {
123 struct dentry *stalink;
124 struct dentry *dir;
125 int cnt;
126 } debugfs;
127#endif
128
129
130
131
132
133 struct ieee80211_key_conf conf;
134};
135
136struct ieee80211_key *
137ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
138 const u8 *key_data,
139 size_t seq_len, const u8 *seq,
140 const struct ieee80211_cipher_scheme *cs);
141
142
143
144
145int ieee80211_key_link(struct ieee80211_key *key,
146 struct ieee80211_sub_if_data *sdata,
147 struct sta_info *sta);
148int ieee80211_set_tx_key(struct ieee80211_key *key);
149void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom);
150void ieee80211_key_free_unused(struct ieee80211_key *key);
151void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
152 bool uni, bool multi);
153void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
154 int idx);
155void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata,
156 bool force_synchronize);
157void ieee80211_free_sta_keys(struct ieee80211_local *local,
158 struct sta_info *sta);
159void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata);
160void ieee80211_reset_crypto_tx_tailroom(struct ieee80211_sub_if_data *sdata);
161
162#define key_mtx_dereference(local, ref) \
163 rcu_dereference_protected(ref, lockdep_is_held(&((local)->key_mtx)))
164
165void ieee80211_delayed_tailroom_dec(struct work_struct *wk);
166
167#endif
168