1
2
3
4#ifndef __RTW_SECURITY_H_
5#define __RTW_SECURITY_H_
6
7#include "osdep_service.h"
8#include "drv_types.h"
9#include <crypto/arc4.h>
10
11#define _NO_PRIVACY_ 0x0
12#define _WEP40_ 0x1
13#define _TKIP_ 0x2
14#define _TKIP_WTMIC_ 0x3
15#define _AES_ 0x4
16#define _WEP104_ 0x5
17#define _WEP_WPA_MIXED_ 0x07
18#define _SMS4_ 0x06
19
20#define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))
21
22#define _WPA_IE_ID_ 0xdd
23#define _WPA2_IE_ID_ 0x30
24
25#define SHA256_MAC_LEN 32
26#define AES_BLOCK_SIZE 16
27#define AES_PRIV_SIZE (4 * 44)
28
29enum {
30 ENCRYP_PROTOCOL_OPENSYS,
31 ENCRYP_PROTOCOL_WEP,
32 ENCRYP_PROTOCOL_WPA,
33 ENCRYP_PROTOCOL_WPA2,
34 ENCRYP_PROTOCOL_WAPI,
35 ENCRYP_PROTOCOL_MAX
36};
37
38#ifndef Ndis802_11AuthModeWPA2
39#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)
40#endif
41
42#ifndef Ndis802_11AuthModeWPA2PSK
43#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)
44#endif
45
46union pn48 {
47 u64 val;
48
49#ifdef __LITTLE_ENDIAN
50 struct {
51 u8 TSC0;
52 u8 TSC1;
53 u8 TSC2;
54 u8 TSC3;
55 u8 TSC4;
56 u8 TSC5;
57 u8 TSC6;
58 u8 TSC7;
59 } _byte_;
60
61#elif defined(__BIG_ENDIAN)
62
63 struct {
64 u8 TSC7;
65 u8 TSC6;
66 u8 TSC5;
67 u8 TSC4;
68 u8 TSC3;
69 u8 TSC2;
70 u8 TSC1;
71 u8 TSC0;
72 } _byte_;
73#endif
74};
75
76union Keytype {
77 u8 skey[16];
78 u32 lkey[4];
79};
80
81struct rt_pmkid_list {
82 u8 bUsed;
83 u8 Bssid[6];
84 u8 PMKID[16];
85 u8 SsidBuf[33];
86 u8 *ssid_octet;
87 u16 ssid_length;
88};
89
90struct security_priv {
91 u32 dot11AuthAlgrthm;
92
93 u32 dot11PrivacyAlgrthm;
94
95
96 u32 dot11PrivacyKeyIndex;
97
98 union Keytype dot11DefKey[4];
99 u32 dot11DefKeylen[4];
100 u32 dot118021XGrpPrivacy;
101
102 u32 dot118021XGrpKeyid;
103
104 union Keytype dot118021XGrpKey[4];
105
106 union Keytype dot118021XGrptxmickey[4];
107 union Keytype dot118021XGrprxmickey[4];
108 union pn48 dot11Grptxpn;
109 union pn48 dot11Grprxpn;
110
111 struct arc4_ctx xmit_arc4_ctx;
112 struct arc4_ctx recv_arc4_ctx;
113
114
115 unsigned int dot8021xalg;
116 unsigned int wpa_psk;
117 unsigned int wpa_group_cipher;
118 unsigned int wpa2_group_cipher;
119 unsigned int wpa_pairwise_cipher;
120 unsigned int wpa2_pairwise_cipher;
121 u8 wps_ie[MAX_WPS_IE_LEN];
122 int wps_ie_len;
123 u8 binstallGrpkey;
124 u8 busetkipkey;
125 u8 bcheck_grpkey;
126 u8 bgrpkey_handshake;
127 s32 sw_encrypt;
128 s32 sw_decrypt;
129 s32 hw_decrypted;
130
131
132
133
134 u32 ndisauthtype;
135 u32 ndisencryptstatus;
136 struct wlan_bssid_ex sec_bss;
137 struct ndis_802_11_wep ndiswep;
138 u8 assoc_info[600];
139 u8 szofcapability[256];
140 u8 oidassociation[512];
141 u8 authenticator_ie[256];
142 u8 supplicant_ie[256];
143
144
145 u32 last_mic_err_time;
146 u8 btkip_countermeasure;
147 u8 btkip_wait_report;
148 u32 btkip_countermeasure_time;
149
150
151
152
153 struct rt_pmkid_list PMKIDList[NUM_PMKID_CACHE];
154 u8 PMKIDIndex;
155 u8 bWepDefaultKeyIdxSet;
156};
157
158#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst) \
159do { \
160 switch (psecuritypriv->dot11AuthAlgrthm) { \
161 case dot11AuthAlgrthm_Open: \
162 case dot11AuthAlgrthm_Shared: \
163 case dot11AuthAlgrthm_Auto: \
164 encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm; \
165 break; \
166 case dot11AuthAlgrthm_8021X: \
167 if (bmcst) \
168 encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\
169 else \
170 encry_algo = (u8)psta->dot118021XPrivacy; \
171 break; \
172 case dot11AuthAlgrthm_WAPI: \
173 encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm; \
174 break; \
175 } \
176} while (0)
177
178#define SET_ICE_IV_LEN(iv_len, icv_len, encrypt) \
179do { \
180 switch (encrypt) { \
181 case _WEP40_: \
182 case _WEP104_: \
183 iv_len = 4; \
184 icv_len = 4; \
185 break; \
186 case _TKIP_: \
187 iv_len = 8; \
188 icv_len = 4; \
189 break; \
190 case _AES_: \
191 iv_len = 8; \
192 icv_len = 8; \
193 break; \
194 case _SMS4_: \
195 iv_len = 18; \
196 icv_len = 16; \
197 break; \
198 default: \
199 iv_len = 0; \
200 icv_len = 0; \
201 break; \
202 } \
203} while (0)
204
205#define GET_TKIP_PN(iv, dot11txpn) \
206do { \
207 dot11txpn._byte_.TSC0 = iv[2]; \
208 dot11txpn._byte_.TSC1 = iv[0]; \
209 dot11txpn._byte_.TSC2 = iv[4]; \
210 dot11txpn._byte_.TSC3 = iv[5]; \
211 dot11txpn._byte_.TSC4 = iv[6]; \
212 dot11txpn._byte_.TSC5 = iv[7]; \
213} while (0)
214
215#define ROL32(A, n) (((A) << (n)) | (((A)>>(32-(n))) & ((1UL << (n)) - 1)))
216#define ROR32(A, n) ROL32((A), 32-(n))
217
218struct mic_data {
219 u32 K0, K1;
220 u32 L, R;
221 u32 M;
222 u32 nBytesInM;
223};
224
225extern const u32 Te0[256];
226extern const u32 Te1[256];
227extern const u32 Te2[256];
228extern const u32 Te3[256];
229extern const u32 Te4[256];
230extern const u32 Td0[256];
231extern const u32 Td1[256];
232extern const u32 Td2[256];
233extern const u32 Td3[256];
234extern const u32 Td4[256];
235extern const u32 rcon[10];
236extern const u8 Td4s[256];
237extern const u8 rcons[10];
238
239#define RCON(i) (rcons[(i)] << 24)
240
241static inline u32 rotr(u32 val, int bits)
242{
243 return (val >> bits) | (val << (32 - bits));
244}
245
246#define TE0(i) Te0[((i) >> 24) & 0xff]
247#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
248#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
249#define TE3(i) rotr(Te0[(i) & 0xff], 24)
250#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
251#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
252#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
253#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
254#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
255#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
256#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
257#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
258#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff)
259
260#define TD0(i) Td0[((i) >> 24) & 0xff]
261#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
262#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
263#define TD3(i) rotr(Td0[(i) & 0xff], 24)
264#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24)
265#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16)
266#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8)
267#define TD44(i) (Td4s[(i) & 0xff])
268#define TD0_(i) Td0[(i) & 0xff]
269#define TD1_(i) rotr(Td0[(i) & 0xff], 8)
270#define TD2_(i) rotr(Td0[(i) & 0xff], 16)
271#define TD3_(i) rotr(Td0[(i) & 0xff], 24)
272
273#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
274 ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3]))
275
276#define PUTU32(ct, st) { \
277(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
278(ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); }
279
280#define WPA_GET_BE32(a) ((((u32)(a)[0]) << 24) | (((u32)(a)[1]) << 16) | \
281 (((u32)(a)[2]) << 8) | ((u32)(a)[3]))
282
283#define WPA_PUT_LE16(a, val) \
284 do { \
285 (a)[1] = ((u16)(val)) >> 8; \
286 (a)[0] = ((u16)(val)) & 0xff; \
287 } while (0)
288
289#define WPA_PUT_BE32(a, val) \
290 do { \
291 (a)[0] = (u8)((((u32)(val)) >> 24) & 0xff); \
292 (a)[1] = (u8)((((u32)(val)) >> 16) & 0xff); \
293 (a)[2] = (u8)((((u32)(val)) >> 8) & 0xff); \
294 (a)[3] = (u8)(((u32)(val)) & 0xff); \
295 } while (0)
296
297#define WPA_PUT_BE64(a, val) \
298 do { \
299 (a)[0] = (u8)(((u64)(val)) >> 56); \
300 (a)[1] = (u8)(((u64)(val)) >> 48); \
301 (a)[2] = (u8)(((u64)(val)) >> 40); \
302 (a)[3] = (u8)(((u64)(val)) >> 32); \
303 (a)[4] = (u8)(((u64)(val)) >> 24); \
304 (a)[5] = (u8)(((u64)(val)) >> 16); \
305 (a)[6] = (u8)(((u64)(val)) >> 8); \
306 (a)[7] = (u8)(((u64)(val)) & 0xff); \
307 } while (0)
308
309
310
311
312
313
314
315#define RORc(x, y) \
316 (((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long)((y)&31)) | \
317 ((unsigned long)(x) << (unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
318#define Ch(x, y ,z) (z ^ (x & (y ^ z)))
319#define Maj(x, y, z) (((x | y) & z) | (x & y))
320#define S(x, n) RORc((x), (n))
321#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n))
322#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22))
323#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
324#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
325#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
326#ifndef MIN
327#define MIN(x, y) (((x) < (y)) ? (x) : (y))
328#endif
329
330void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key);
331void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b);
332void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nBytes);
333void rtw_secgetmic(struct mic_data *pmicdata, u8 *dst);
334void rtw_seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len,
335 u8 *Miccode, u8 priority);
336u32 rtw_aes_encrypt(struct adapter *padapter, struct xmit_frame *pxmitframe);
337u32 rtw_tkip_encrypt(struct adapter *padapter, struct xmit_frame *pxmitframe);
338void rtw_wep_encrypt(struct adapter *padapter, struct xmit_frame *pxmitframe);
339u32 rtw_aes_decrypt(struct adapter *padapter, struct recv_frame *precvframe);
340u32 rtw_tkip_decrypt(struct adapter *padapter, struct recv_frame *precvframe);
341void rtw_wep_decrypt(struct adapter *padapter, struct recv_frame *precvframe);
342
343#endif
344