WiFi: add rtl8189es/etv support, Optimization wifi configuration.
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8189es / include / rtw_security.h
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *                                        
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #ifndef __RTW_SECURITY_H_
21 #define __RTW_SECURITY_H_
22
23
24 #define _NO_PRIVACY_            0x0
25 #define _WEP40_                         0x1
26 #define _TKIP_                          0x2
27 #define _TKIP_WTMIC_            0x3
28 #define _AES_                           0x4
29 #define _WEP104_                        0x5
30 #define _WEP_WPA_MIXED_ 0x07  // WEP + WPA
31 #define _SMS4_                          0x06
32 #ifdef CONFIG_IEEE80211W
33 #define _BIP_                           0x8 
34 #endif //CONFIG_IEEE80211W
35 #define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))
36
37 const char *security_type_str(u8 value);
38
39 #define _WPA_IE_ID_     0xdd
40 #define _WPA2_IE_ID_    0x30
41
42 #define SHA256_MAC_LEN 32
43 #define AES_BLOCK_SIZE 16
44 #define AES_PRIV_SIZE (4 * 44)
45
46 #define RTW_KEK_LEN 16
47 #define RTW_KCK_LEN 16
48 #define RTW_REPLAY_CTR_LEN 8
49
50 typedef enum {
51         ENCRYP_PROTOCOL_OPENSYS,   //open system
52         ENCRYP_PROTOCOL_WEP,       //WEP
53         ENCRYP_PROTOCOL_WPA,       //WPA
54         ENCRYP_PROTOCOL_WPA2,      //WPA2
55         ENCRYP_PROTOCOL_WAPI,      //WAPI: Not support in this version
56         ENCRYP_PROTOCOL_MAX
57 }ENCRYP_PROTOCOL_E;
58
59
60 #ifndef Ndis802_11AuthModeWPA2
61 #define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)
62 #endif
63
64 #ifndef Ndis802_11AuthModeWPA2PSK
65 #define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)
66 #endif
67
68 union pn48      {
69         
70         u64     val;
71         
72 #ifdef CONFIG_LITTLE_ENDIAN
73
74 struct {
75   u8 TSC0;
76   u8 TSC1;
77   u8 TSC2;
78   u8 TSC3;
79   u8 TSC4;
80   u8 TSC5;
81   u8 TSC6;
82   u8 TSC7;
83 } _byte_;
84  
85 #elif defined(CONFIG_BIG_ENDIAN)
86
87 struct {
88   u8 TSC7;
89   u8 TSC6;
90   u8 TSC5;
91   u8 TSC4;
92   u8 TSC3;
93   u8 TSC2;
94   u8 TSC1;
95   u8 TSC0;
96 } _byte_;
97  
98 #endif
99
100 };
101
102 union Keytype {
103         u8   skey[16];
104         u32    lkey[4];
105 };
106
107
108 typedef struct _RT_PMKID_LIST
109 {
110         u8                                              bUsed;
111         u8                                              Bssid[6];
112         u8                                              PMKID[16];
113         u8                                              SsidBuf[33];
114         u8*                                             ssid_octet;
115         u16                                             ssid_length;
116 } RT_PMKID_LIST, *PRT_PMKID_LIST;
117
118
119 struct security_priv
120 {
121         u32       dot11AuthAlgrthm;             // 802.11 auth, could be open, shared, 8021x and authswitch 
122         u32       dot11PrivacyAlgrthm;  // This specify the privacy for shared auth. algorithm.
123
124         /* WEP */
125         u32       dot11PrivacyKeyIndex; // this is only valid for legendary wep, 0~3 for key id. (tx key index)
126         union Keytype dot11DefKey[4];                   // this is only valid for def. key      
127         u32     dot11DefKeylen[4];
128         u8      key_mask; /* use to restore wep key after hal_init */
129
130         u32 dot118021XGrpPrivacy;       // This specify the privacy algthm. used for Grp key 
131         u32     dot118021XGrpKeyid;             // key id used for Grp Key ( tx key index)
132         union Keytype   dot118021XGrpKey[4];    // 802.1x Group Key, for inx0 and inx1  
133         union Keytype   dot118021XGrptxmickey[4];
134         union Keytype   dot118021XGrprxmickey[4];
135         union pn48              dot11Grptxpn;                   // PN48 used for Grp Key xmit.
136         union pn48              dot11Grprxpn;                   // PN48 used for Grp Key recv.
137 #ifdef CONFIG_IEEE80211W
138         u32     dot11wBIPKeyid;                                         // key id used for BIP Key ( tx key index)
139         union Keytype   dot11wBIPKey[6];                // BIP Key, for index4 and index5
140         union pn48              dot11wBIPtxpn;                  // PN48 used for Grp Key xmit.
141         union pn48              dot11wBIPrxpn;                  // PN48 used for Grp Key recv.
142 #endif //CONFIG_IEEE80211W
143 #ifdef CONFIG_AP_MODE
144         //extend security capabilities for AP_MODE 
145         unsigned int dot8021xalg;//0:disable, 1:psk, 2:802.1x
146         unsigned int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2
147         unsigned int wpa_group_cipher;
148         unsigned int wpa2_group_cipher;
149         unsigned int wpa_pairwise_cipher;
150         unsigned int wpa2_pairwise_cipher;      
151 #endif
152
153         u8 wps_ie[MAX_WPS_IE_LEN];//added in assoc req
154         int wps_ie_len;
155         
156         
157         u8      binstallGrpkey;
158 #ifdef CONFIG_GTK_OL
159         u8      binstallKCK_KEK;
160 #endif //CONFIG_GTK_OL
161 #ifdef CONFIG_IEEE80211W
162         u8      binstallBIPkey;
163 #endif //CONFIG_IEEE80211W
164         u8      busetkipkey;
165         //_timer tkip_timer;
166         u8      bcheck_grpkey;
167         u8      bgrpkey_handshake;
168         
169         //u8    packet_cnt;//unused, removed
170         
171         s32     sw_encrypt;//from registry_priv
172         s32     sw_decrypt;//from registry_priv
173         
174         s32     hw_decrypted;//if the rx packets is hw_decrypted==_FALSE, it means the hw has not been ready.
175
176
177         //keeps the auth_type & enc_status from upper layer ioctl(wpa_supplicant or wzc)
178         u32 ndisauthtype;       // NDIS_802_11_AUTHENTICATION_MODE
179         u32 ndisencryptstatus;  // NDIS_802_11_ENCRYPTION_STATUS
180
181         WLAN_BSSID_EX sec_bss;  //for joinbss (h2c buffer) usage
182
183         NDIS_802_11_WEP ndiswep;
184 #ifdef PLATFORM_WINDOWS
185         u8 KeyMaterial[16];// variable length depending on above field.
186 #endif
187
188         u8 assoc_info[600];
189         u8 szofcapability[256]; //for wpa2 usage
190         u8 oidassociation[512]; //for wpa/wpa2 usage
191         u8 authenticator_ie[256];  //store ap security information element
192         u8 supplicant_ie[256];  //store sta security information element
193
194
195         //for tkip countermeasure
196         u32 last_mic_err_time;  
197         u8      btkip_countermeasure;
198         u8      btkip_wait_report;
199         u32 btkip_countermeasure_time;
200
201         //---------------------------------------------------------------------------
202         // For WPA2 Pre-Authentication.
203         //---------------------------------------------------------------------------
204         //u8                            RegEnablePreAuth;                               // Default value: Pre-Authentication enabled or not, from registry "EnablePreAuth". Added by Annie, 2005-11-01.
205         //u8                            EnablePreAuthentication;                        // Current Value: Pre-Authentication enabled or not.
206         RT_PMKID_LIST           PMKIDList[NUM_PMKID_CACHE];     // Renamed from PreAuthKey[NUM_PRE_AUTH_KEY]. Annie, 2006-10-13.
207         u8                              PMKIDIndex;
208         //u32                           PMKIDCount;                                             // Added by Annie, 2006-10-13.
209         //u8                            szCapability[256];                              // For WPA2-PSK using zero-config, by Annie, 2005-09-20.
210
211         u8 bWepDefaultKeyIdxSet;
212         
213 #define DBG_SW_SEC_CNT
214 #ifdef DBG_SW_SEC_CNT
215         u64 wep_sw_enc_cnt_bc;
216         u64 wep_sw_enc_cnt_mc;
217         u64 wep_sw_enc_cnt_uc;
218         u64 wep_sw_dec_cnt_bc;
219         u64 wep_sw_dec_cnt_mc;
220         u64 wep_sw_dec_cnt_uc;
221
222         u64 tkip_sw_enc_cnt_bc;
223         u64 tkip_sw_enc_cnt_mc;
224         u64 tkip_sw_enc_cnt_uc;
225         u64 tkip_sw_dec_cnt_bc;
226         u64 tkip_sw_dec_cnt_mc;
227         u64 tkip_sw_dec_cnt_uc;
228
229         u64 aes_sw_enc_cnt_bc;
230         u64 aes_sw_enc_cnt_mc;
231         u64 aes_sw_enc_cnt_uc;
232         u64 aes_sw_dec_cnt_bc;
233         u64 aes_sw_dec_cnt_mc;
234         u64 aes_sw_dec_cnt_uc;
235 #endif /* DBG_SW_SEC_CNT */     
236 };
237
238 struct sha256_state {
239         u64 length;
240         u32 state[8], curlen;
241         u8 buf[64];
242 };
243
244 #define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\
245 do{\
246         switch(psecuritypriv->dot11AuthAlgrthm)\
247         {\
248                 case dot11AuthAlgrthm_Open:\
249                 case dot11AuthAlgrthm_Shared:\
250                 case dot11AuthAlgrthm_Auto:\
251                         encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\
252                         break;\
253                 case dot11AuthAlgrthm_8021X:\
254                         if(bmcst)\
255                                 encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\
256                         else\
257                                 encry_algo =(u8) psta->dot118021XPrivacy;\
258                         break;\
259              case dot11AuthAlgrthm_WAPI:\
260                      encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\
261                      break;\
262         }\
263 }while(0)
264
265 #define _AES_IV_LEN_ 8
266
267 #define SET_ICE_IV_LEN( iv_len, icv_len, encrypt)\
268 do{\
269         switch(encrypt)\
270         {\
271                 case _WEP40_:\
272                 case _WEP104_:\
273                         iv_len = 4;\
274                         icv_len = 4;\
275                         break;\
276                 case _TKIP_:\
277                         iv_len = 8;\
278                         icv_len = 4;\
279                         break;\
280                 case _AES_:\
281                         iv_len = 8;\
282                         icv_len = 8;\
283                         break;\
284                 case _SMS4_:\
285                         iv_len = 18;\
286                         icv_len = 16;\
287                         break;\
288                 default:\
289                         iv_len = 0;\
290                         icv_len = 0;\
291                         break;\
292         }\
293 }while(0)
294
295
296 #define GET_TKIP_PN(iv,dot11txpn)\
297 do{\
298         dot11txpn._byte_.TSC0=iv[2];\
299         dot11txpn._byte_.TSC1=iv[0];\
300         dot11txpn._byte_.TSC2=iv[4];\
301         dot11txpn._byte_.TSC3=iv[5];\
302         dot11txpn._byte_.TSC4=iv[6];\
303         dot11txpn._byte_.TSC5=iv[7];\
304 }while(0)
305
306
307 #define ROL32( A, n )   ( ((A) << (n)) | ( ((A)>>(32-(n)))  & ( (1UL << (n)) - 1 ) ) )
308 #define ROR32( A, n )   ROL32( (A), 32-(n) )
309
310 struct mic_data
311 {
312         u32  K0, K1;         // Key
313         u32  L, R;           // Current state
314         u32  M;              // Message accumulator (single word)
315         u32     nBytesInM;      // # bytes in M
316 };
317
318 extern const u32 Te0[256];
319 extern const u32 Te1[256];
320 extern const u32 Te2[256];
321 extern const u32 Te3[256];
322 extern const u32 Te4[256];
323 extern const u32 Td0[256];
324 extern const u32 Td1[256];
325 extern const u32 Td2[256];
326 extern const u32 Td3[256];
327 extern const u32 Td4[256];
328 extern const u32 rcon[10];
329 extern const u8 Td4s[256];
330 extern const u8 rcons[10];
331
332 #define RCON(i) (rcons[(i)] << 24)
333
334 static inline u32 rotr(u32 val, int bits)
335 {
336         return (val >> bits) | (val << (32 - bits));
337 }
338
339 #define TE0(i) Te0[((i) >> 24) & 0xff]
340 #define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
341 #define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
342 #define TE3(i) rotr(Te0[(i) & 0xff], 24)
343 #define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
344 #define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
345 #define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
346 #define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
347 #define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
348 #define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
349 #define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
350 #define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
351 #define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff)
352
353 #define TD0(i) Td0[((i) >> 24) & 0xff]
354 #define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
355 #define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
356 #define TD3(i) rotr(Td0[(i) & 0xff], 24)
357 #define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24)
358 #define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16)
359 #define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8)
360 #define TD44(i) (Td4s[(i) & 0xff])
361 #define TD0_(i) Td0[(i) & 0xff]
362 #define TD1_(i) rotr(Td0[(i) & 0xff], 8)
363 #define TD2_(i) rotr(Td0[(i) & 0xff], 16)
364 #define TD3_(i) rotr(Td0[(i) & 0xff], 24)
365
366 #define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
367                         ((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
368
369 #define PUTU32(ct, st) { \
370 (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
371 (ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
372
373 #define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \
374                          (((u32) (a)[2]) << 8) | ((u32) (a)[3]))
375
376 #define WPA_PUT_LE16(a, val)                    \
377         do {                                    \
378                 (a)[1] = ((u16) (val)) >> 8;    \
379                 (a)[0] = ((u16) (val)) & 0xff;  \
380         } while (0)
381
382 #define WPA_PUT_BE32(a, val)                                    \
383         do {                                                    \
384                 (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff);   \
385                 (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff);   \
386                 (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff);    \
387                 (a)[3] = (u8) (((u32) (val)) & 0xff);           \
388         } while (0)
389
390 #define WPA_PUT_BE64(a, val)                            \
391         do {                                            \
392                 (a)[0] = (u8) (((u64) (val)) >> 56);    \
393                 (a)[1] = (u8) (((u64) (val)) >> 48);    \
394                 (a)[2] = (u8) (((u64) (val)) >> 40);    \
395                 (a)[3] = (u8) (((u64) (val)) >> 32);    \
396                 (a)[4] = (u8) (((u64) (val)) >> 24);    \
397                 (a)[5] = (u8) (((u64) (val)) >> 16);    \
398                 (a)[6] = (u8) (((u64) (val)) >> 8);     \
399                 (a)[7] = (u8) (((u64) (val)) & 0xff);   \
400         } while (0)
401         
402 /* ===== start - public domain SHA256 implementation ===== */
403
404 /* This is based on SHA256 implementation in LibTomCrypt that was released into
405  * public domain by Tom St Denis. */
406
407 /* the K array */
408 static const unsigned long K[64] = {
409         0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
410         0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
411         0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
412         0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
413         0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
414         0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
415         0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
416         0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
417         0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
418         0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
419         0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
420         0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
421         0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
422 };
423
424
425 /* Various logical functions */
426 #define RORc(x, y) \
427 ( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
428    ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
429 #define Ch(x,y,z)       (z ^ (x & (y ^ z)))
430 #define Maj(x,y,z)      (((x | y) & z) | (x & y)) 
431 #define S(x, n)         RORc((x), (n))
432 #define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))
433 #define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
434 #define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
435 #define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
436 #define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
437 #ifndef MIN
438 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
439 #endif
440 #ifdef CONFIG_IEEE80211W
441 int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac);
442 #endif //CONFIG_IEEE80211W
443 void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key );
444 void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b );
445 void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nBytes );
446 void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst );
447
448 void rtw_seccalctkipmic(
449         u8 * key,
450         u8 *header,
451         u8 *data,
452         u32 data_len,
453         u8 *Miccode,
454         u8   priority);
455
456 u32 rtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe);
457 u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe);
458 void rtw_wep_encrypt(_adapter *padapter, u8  *pxmitframe);
459
460 u32 rtw_aes_decrypt(_adapter *padapter, u8  *precvframe);
461 u32 rtw_tkip_decrypt(_adapter *padapter, u8  *precvframe);
462 void rtw_wep_decrypt(_adapter *padapter, u8  *precvframe);
463 #ifdef CONFIG_IEEE80211W
464 u32     rtw_BIP_verify(_adapter *padapter, u8 *precvframe);
465 #endif //CONFIG_IEEE80211W
466 #ifdef CONFIG_TDLS
467 void wpa_tdls_generate_tpk(_adapter *padapter, PVOID sta);
468 int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, 
469                                                 u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie,
470                                                 u8 *mic);
471 int tdls_verify_mic(u8 *kck, u8 trans_seq, 
472                                                 u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie);
473 #endif //CONFIG_TDLS
474
475 void rtw_use_tkipkey_handler(RTW_TIMER_HDL_ARGS);
476
477 void rtw_sec_restore_wep_key(_adapter *adapter);
478 u8 rtw_handle_tkip_countermeasure(_adapter* adapter, const char *caller);
479
480 #endif  //__RTL871X_SECURITY_H_
481