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