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