diff options
Diffstat (limited to 'net/mac80211/key.h')
-rw-r--r-- | net/mac80211/key.h | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/net/mac80211/key.h b/net/mac80211/key.h new file mode 100644 index 000000000000..f52c3df1fe9a --- /dev/null +++ b/net/mac80211/key.h | |||
@@ -0,0 +1,161 @@ | |||
1 | /* | ||
2 | * Copyright 2002-2004, Instant802 Networks, Inc. | ||
3 | * Copyright 2005, Devicescape Software, Inc. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
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 | /* ALG_TKIP | ||
20 | * struct ieee80211_key::key is encoded as a 256-bit (32 byte) data block: | ||
21 | * Temporal Encryption Key (128 bits) | ||
22 | * Temporal Authenticator Tx MIC Key (64 bits) | ||
23 | * Temporal Authenticator Rx MIC Key (64 bits) | ||
24 | */ | ||
25 | |||
26 | #define WEP_IV_LEN 4 | ||
27 | #define WEP_ICV_LEN 4 | ||
28 | |||
29 | #define ALG_TKIP_KEY_LEN 32 | ||
30 | /* Starting offsets for each key */ | ||
31 | #define ALG_TKIP_TEMP_ENCR_KEY 0 | ||
32 | #define ALG_TKIP_TEMP_AUTH_TX_MIC_KEY 16 | ||
33 | #define ALG_TKIP_TEMP_AUTH_RX_MIC_KEY 24 | ||
34 | #define TKIP_IV_LEN 8 | ||
35 | #define TKIP_ICV_LEN 4 | ||
36 | |||
37 | #define ALG_CCMP_KEY_LEN 16 | ||
38 | #define CCMP_HDR_LEN 8 | ||
39 | #define CCMP_MIC_LEN 8 | ||
40 | #define CCMP_TK_LEN 16 | ||
41 | #define CCMP_PN_LEN 6 | ||
42 | |||
43 | #define NUM_RX_DATA_QUEUES 17 | ||
44 | |||
45 | struct ieee80211_local; | ||
46 | struct ieee80211_sub_if_data; | ||
47 | struct sta_info; | ||
48 | |||
49 | /** | ||
50 | * enum ieee80211_internal_key_flags - internal key flags | ||
51 | * | ||
52 | * @KEY_FLAG_UPLOADED_TO_HARDWARE: Indicates that this key is present | ||
53 | * in the hardware for TX crypto hardware acceleration. | ||
54 | * @KEY_FLAG_TODO_DELETE: Key is marked for deletion and will, after an | ||
55 | * RCU grace period, no longer be reachable other than from the | ||
56 | * todo list. | ||
57 | * @KEY_FLAG_TODO_HWACCEL_ADD: Key needs to be added to hardware acceleration. | ||
58 | * @KEY_FLAG_TODO_HWACCEL_REMOVE: Key needs to be removed from hardware | ||
59 | * acceleration. | ||
60 | * @KEY_FLAG_TODO_DEFKEY: Key is default key and debugfs needs to be updated. | ||
61 | * @KEY_FLAG_TODO_ADD_DEBUGFS: Key needs to be added to debugfs. | ||
62 | */ | ||
63 | enum ieee80211_internal_key_flags { | ||
64 | KEY_FLAG_UPLOADED_TO_HARDWARE = BIT(0), | ||
65 | KEY_FLAG_TODO_DELETE = BIT(1), | ||
66 | KEY_FLAG_TODO_HWACCEL_ADD = BIT(2), | ||
67 | KEY_FLAG_TODO_HWACCEL_REMOVE = BIT(3), | ||
68 | KEY_FLAG_TODO_DEFKEY = BIT(4), | ||
69 | KEY_FLAG_TODO_ADD_DEBUGFS = BIT(5), | ||
70 | }; | ||
71 | |||
72 | struct ieee80211_key { | ||
73 | struct ieee80211_local *local; | ||
74 | struct ieee80211_sub_if_data *sdata; | ||
75 | struct sta_info *sta; | ||
76 | |||
77 | /* for sdata list */ | ||
78 | struct list_head list; | ||
79 | /* for todo list */ | ||
80 | struct list_head todo; | ||
81 | |||
82 | /* protected by todo lock! */ | ||
83 | unsigned int flags; | ||
84 | |||
85 | union { | ||
86 | struct { | ||
87 | /* last used TSC */ | ||
88 | u32 iv32; | ||
89 | u16 iv16; | ||
90 | u16 p1k[5]; | ||
91 | int tx_initialized; | ||
92 | |||
93 | /* last received RSC */ | ||
94 | u32 iv32_rx[NUM_RX_DATA_QUEUES]; | ||
95 | u16 iv16_rx[NUM_RX_DATA_QUEUES]; | ||
96 | u16 p1k_rx[NUM_RX_DATA_QUEUES][5]; | ||
97 | int rx_initialized[NUM_RX_DATA_QUEUES]; | ||
98 | } tkip; | ||
99 | struct { | ||
100 | u8 tx_pn[6]; | ||
101 | u8 rx_pn[NUM_RX_DATA_QUEUES][6]; | ||
102 | struct crypto_cipher *tfm; | ||
103 | u32 replays; /* dot11RSNAStatsCCMPReplays */ | ||
104 | /* scratch buffers for virt_to_page() (crypto API) */ | ||
105 | #ifndef AES_BLOCK_LEN | ||
106 | #define AES_BLOCK_LEN 16 | ||
107 | #endif | ||
108 | u8 tx_crypto_buf[6 * AES_BLOCK_LEN]; | ||
109 | u8 rx_crypto_buf[6 * AES_BLOCK_LEN]; | ||
110 | } ccmp; | ||
111 | } u; | ||
112 | |||
113 | /* number of times this key has been used */ | ||
114 | int tx_rx_count; | ||
115 | |||
116 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
117 | struct { | ||
118 | struct dentry *stalink; | ||
119 | struct dentry *dir; | ||
120 | struct dentry *keylen; | ||
121 | struct dentry *flags; | ||
122 | struct dentry *keyidx; | ||
123 | struct dentry *hw_key_idx; | ||
124 | struct dentry *tx_rx_count; | ||
125 | struct dentry *algorithm; | ||
126 | struct dentry *tx_spec; | ||
127 | struct dentry *rx_spec; | ||
128 | struct dentry *replays; | ||
129 | struct dentry *key; | ||
130 | struct dentry *ifindex; | ||
131 | int cnt; | ||
132 | } debugfs; | ||
133 | #endif | ||
134 | |||
135 | /* | ||
136 | * key config, must be last because it contains key | ||
137 | * material as variable length member | ||
138 | */ | ||
139 | struct ieee80211_key_conf conf; | ||
140 | }; | ||
141 | |||
142 | struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg, | ||
143 | int idx, | ||
144 | size_t key_len, | ||
145 | const u8 *key_data); | ||
146 | /* | ||
147 | * Insert a key into data structures (sdata, sta if necessary) | ||
148 | * to make it used, free old key. | ||
149 | */ | ||
150 | void ieee80211_key_link(struct ieee80211_key *key, | ||
151 | struct ieee80211_sub_if_data *sdata, | ||
152 | struct sta_info *sta); | ||
153 | void ieee80211_key_free(struct ieee80211_key *key); | ||
154 | void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx); | ||
155 | void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata); | ||
156 | void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata); | ||
157 | void ieee80211_disable_keys(struct ieee80211_sub_if_data *sdata); | ||
158 | |||
159 | void ieee80211_key_todo(void); | ||
160 | |||
161 | #endif /* IEEE80211_KEY_H */ | ||