1
2
3
4
5
6
7
8
9
10#ifndef IEEE80211_KEY_H
11#define IEEE80211_KEY_H
12
13#include <linux/types.h>
14#include <linux/list.h>
15#include <linux/crypto.h>
16#include <linux/rcupdate.h>
17#include <net/mac80211.h>
18
19#define WEP_IV_LEN 4
20#define WEP_ICV_LEN 4
21#define ALG_TKIP_KEY_LEN 32
22#define ALG_CCMP_KEY_LEN 16
23#define CCMP_HDR_LEN 8
24#define CCMP_MIC_LEN 8
25#define CCMP_TK_LEN 16
26#define CCMP_PN_LEN 6
27#define TKIP_IV_LEN 8
28#define TKIP_ICV_LEN 4
29
30#define NUM_RX_DATA_QUEUES 17
31
32struct ieee80211_local;
33struct ieee80211_sub_if_data;
34struct sta_info;
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52enum ieee80211_internal_key_flags {
53 KEY_FLAG_UPLOADED_TO_HARDWARE = BIT(0),
54 KEY_FLAG_TODO_DELETE = BIT(1),
55 KEY_FLAG_TODO_HWACCEL_ADD = BIT(2),
56 KEY_FLAG_TODO_HWACCEL_REMOVE = BIT(3),
57 KEY_FLAG_TODO_DEFKEY = BIT(4),
58 KEY_FLAG_TODO_ADD_DEBUGFS = BIT(5),
59 KEY_FLAG_TODO_DEFMGMTKEY = BIT(6),
60};
61
62struct tkip_ctx {
63 u32 iv32;
64 u16 iv16;
65 u16 p1k[5];
66 int initialized;
67};
68
69struct ieee80211_key {
70 struct ieee80211_local *local;
71 struct ieee80211_sub_if_data *sdata;
72 struct sta_info *sta;
73
74
75 struct list_head list;
76
77 struct list_head todo;
78
79
80 unsigned int flags;
81
82 union {
83 struct {
84
85 struct tkip_ctx tx;
86
87
88 struct tkip_ctx rx[NUM_RX_DATA_QUEUES];
89 } tkip;
90 struct {
91 u8 tx_pn[6];
92 u8 rx_pn[NUM_RX_DATA_QUEUES][6];
93 struct crypto_cipher *tfm;
94 u32 replays;
95
96#ifndef AES_BLOCK_LEN
97#define AES_BLOCK_LEN 16
98#endif
99 u8 tx_crypto_buf[6 * AES_BLOCK_LEN];
100 u8 rx_crypto_buf[6 * AES_BLOCK_LEN];
101 } ccmp;
102 struct {
103 u8 tx_pn[6];
104 u8 rx_pn[6];
105 struct crypto_cipher *tfm;
106 u32 replays;
107 u32 icverrors;
108
109 u8 tx_crypto_buf[2 * AES_BLOCK_LEN];
110 u8 rx_crypto_buf[2 * AES_BLOCK_LEN];
111 } aes_cmac;
112 } u;
113
114
115 int tx_rx_count;
116
117#ifdef CONFIG_MAC80211_DEBUGFS
118 struct {
119 struct dentry *stalink;
120 struct dentry *dir;
121 struct dentry *keylen;
122 struct dentry *flags;
123 struct dentry *keyidx;
124 struct dentry *hw_key_idx;
125 struct dentry *tx_rx_count;
126 struct dentry *algorithm;
127 struct dentry *tx_spec;
128 struct dentry *rx_spec;
129 struct dentry *replays;
130 struct dentry *icverrors;
131 struct dentry *key;
132 struct dentry *ifindex;
133 int cnt;
134 } debugfs;
135#endif
136
137
138
139
140
141 struct ieee80211_key_conf conf;
142};
143
144struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg,
145 int idx,
146 size_t key_len,
147 const u8 *key_data,
148 size_t seq_len, const u8 *seq);
149
150
151
152
153void ieee80211_key_link(struct ieee80211_key *key,
154 struct ieee80211_sub_if_data *sdata,
155 struct sta_info *sta);
156void ieee80211_key_free(struct ieee80211_key *key);
157void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx);
158void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
159 int idx);
160void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata);
161void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata);
162void ieee80211_disable_keys(struct ieee80211_sub_if_data *sdata);
163
164void ieee80211_key_todo(void);
165
166#endif
167