diff options
Diffstat (limited to 'net/mac80211/key.h')
-rw-r--r-- | net/mac80211/key.h | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/net/mac80211/key.h b/net/mac80211/key.h new file mode 100644 index 000000000000..467890c6fe81 --- /dev/null +++ b/net/mac80211/key.h | |||
@@ -0,0 +1,157 @@ | |||
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: Key needs to be added to hardware acceleration. | ||
58 | * @KEY_FLAG_TODO_DEFKEY: Key is default key and debugfs needs to be updated. | ||
59 | * @KEY_FLAG_TODO_ADD_DEBUGFS: Key needs to be added to debugfs. | ||
60 | */ | ||
61 | enum ieee80211_internal_key_flags { | ||
62 | KEY_FLAG_UPLOADED_TO_HARDWARE = BIT(0), | ||
63 | KEY_FLAG_TODO_DELETE = BIT(1), | ||
64 | KEY_FLAG_TODO_HWACCEL = BIT(2), | ||
65 | KEY_FLAG_TODO_DEFKEY = BIT(3), | ||
66 | KEY_FLAG_TODO_ADD_DEBUGFS = BIT(4), | ||
67 | }; | ||
68 | |||
69 | struct ieee80211_key { | ||
70 | struct ieee80211_local *local; | ||
71 | struct ieee80211_sub_if_data *sdata; | ||
72 | struct sta_info *sta; | ||
73 | |||
74 | /* for sdata list */ | ||
75 | struct list_head list; | ||
76 | /* for todo list */ | ||
77 | struct list_head todo; | ||
78 | |||
79 | /* protected by todo lock! */ | ||
80 | unsigned int flags; | ||
81 | |||
82 | union { | ||
83 | struct { | ||
84 | /* last used TSC */ | ||
85 | u32 iv32; | ||
86 | u16 iv16; | ||
87 | u16 p1k[5]; | ||
88 | int tx_initialized; | ||
89 | |||
90 | /* last received RSC */ | ||
91 | u32 iv32_rx[NUM_RX_DATA_QUEUES]; | ||
92 | u16 iv16_rx[NUM_RX_DATA_QUEUES]; | ||
93 | u16 p1k_rx[NUM_RX_DATA_QUEUES][5]; | ||
94 | int rx_initialized[NUM_RX_DATA_QUEUES]; | ||
95 | } tkip; | ||
96 | struct { | ||
97 | u8 tx_pn[6]; | ||
98 | u8 rx_pn[NUM_RX_DATA_QUEUES][6]; | ||
99 | struct crypto_cipher *tfm; | ||
100 | u32 replays; /* dot11RSNAStatsCCMPReplays */ | ||
101 | /* scratch buffers for virt_to_page() (crypto API) */ | ||
102 | #ifndef AES_BLOCK_LEN | ||
103 | #define AES_BLOCK_LEN 16 | ||
104 | #endif | ||
105 | u8 tx_crypto_buf[6 * AES_BLOCK_LEN]; | ||
106 | u8 rx_crypto_buf[6 * AES_BLOCK_LEN]; | ||
107 | } ccmp; | ||
108 | } u; | ||
109 | |||
110 | /* number of times this key has been used */ | ||
111 | int tx_rx_count; | ||
112 | |||
113 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
114 | struct { | ||
115 | struct dentry *stalink; | ||
116 | struct dentry *dir; | ||
117 | struct dentry *keylen; | ||
118 | struct dentry *flags; | ||
119 | struct dentry *keyidx; | ||
120 | struct dentry *hw_key_idx; | ||
121 | struct dentry *tx_rx_count; | ||
122 | struct dentry *algorithm; | ||
123 | struct dentry *tx_spec; | ||
124 | struct dentry *rx_spec; | ||
125 | struct dentry *replays; | ||
126 | struct dentry *key; | ||
127 | struct dentry *ifindex; | ||
128 | } debugfs; | ||
129 | #endif | ||
130 | |||
131 | /* | ||
132 | * key config, must be last because it contains key | ||
133 | * material as variable length member | ||
134 | */ | ||
135 | struct ieee80211_key_conf conf; | ||
136 | }; | ||
137 | |||
138 | struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg, | ||
139 | int idx, | ||
140 | size_t key_len, | ||
141 | const u8 *key_data); | ||
142 | /* | ||
143 | * Insert a key into data structures (sdata, sta if necessary) | ||
144 | * to make it used, free old key. | ||
145 | */ | ||
146 | void ieee80211_key_link(struct ieee80211_key *key, | ||
147 | struct ieee80211_sub_if_data *sdata, | ||
148 | struct sta_info *sta); | ||
149 | void ieee80211_key_free(struct ieee80211_key *key); | ||
150 | void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx); | ||
151 | void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata); | ||
152 | void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata); | ||
153 | void ieee80211_disable_keys(struct ieee80211_sub_if_data *sdata); | ||
154 | |||
155 | void ieee80211_key_todo(void); | ||
156 | |||
157 | #endif /* IEEE80211_KEY_H */ | ||