xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_security.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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 
rotr(u32 val,int bits)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 
491