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