xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8822bs/include/rtw_security.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2017 Realtek Corporation.
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 _SMS4_				0x06
26 #define _WEP_WPA_MIXED_		0x07 /* WEP + WPA */
27 #define _BIP_				0x8
28 
29 /* 802.11W use wrong key */
30 #define IEEE80211W_RIGHT_KEY	0x0
31 #define IEEE80211W_WRONG_KEY	0x1
32 #define IEEE80211W_NO_KEY		0x2
33 
34 #define CCMPH_2_PN(ch)	((ch) & 0x000000000000ffff) \
35 			| (((ch) & 0xffffffff00000000) >> 16)
36 
37 #define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))
38 
39 const char *security_type_str(u8 value);
40 
41 #define _WPA_IE_ID_	0xdd
42 #define _WPA2_IE_ID_	0x30
43 
44 #define SHA256_MAC_LEN 32
45 #define AES_BLOCK_SIZE 16
46 #define AES_PRIV_SIZE (4 * 44)
47 
48 #define RTW_KEK_LEN 16
49 #define RTW_KCK_LEN 16
50 #define RTW_TKIP_MIC_LEN 8
51 #define RTW_REPLAY_CTR_LEN 8
52 
53 #define INVALID_SEC_MAC_CAM_ID	0xFF
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 	u8						bUsed;
115 	u8						Bssid[6];
116 	u8						PMKID[16];
117 	u8						SsidBuf[33];
118 	u8						*ssid_octet;
119 	u16						ssid_length;
120 } RT_PMKID_LIST, *PRT_PMKID_LIST;
121 
122 
123 struct security_priv {
124 	u32	  dot11AuthAlgrthm;		/* 802.11 auth, could be open, shared, 8021x and authswitch */
125 	u32	  dot11PrivacyAlgrthm;	/* This specify the privacy for shared auth. algorithm. */
126 
127 	/* WEP */
128 	u32	  dot11PrivacyKeyIndex;	/* this is only valid for legendary wep, 0~3 for key id. (tx key index) */
129 	union Keytype dot11DefKey[6];			/* this is only valid for def. key	 */
130 	u32	dot11DefKeylen[6];
131 	u8	dot11Def_camid[6];
132 	u8 	key_mask; /* use to restore wep key after hal_init */
133 
134 	u32 dot118021XGrpPrivacy;	/* This specify the privacy algthm. used for Grp key */
135 	u32	dot118021XGrpKeyid;		/* key id used for Grp Key ( tx key index) */
136 	union Keytype	dot118021XGrpKey[6];	/* 802.1x Group Key, for inx0 and inx1	 */
137 	union Keytype	dot118021XGrptxmickey[6];
138 	union Keytype	dot118021XGrprxmickey[6];
139 	union pn48		dot11Grptxpn;			/* PN48 used for Grp Key xmit. */
140 	union pn48		dot11Grprxpn;			/* PN48 used for Grp Key recv. */
141 	u8				iv_seq[4][8];
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 BIP xmit. */
146 	union pn48		dot11wBIPrxpn;			/* PN48 used for BIP 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 	u8 mfp_opt;
157 #endif
158 #ifdef CONFIG_CONCURRENT_MODE
159 	u8	dot118021x_bmc_cam_id;
160 #endif
161 	/*IEEE802.11-2012 Std. Table 8-101 AKM Suite Selectors*/
162 	u32	rsn_akm_suite_type;
163 
164 	u8 wps_ie[MAX_WPS_IE_LEN];/* added in assoc req */
165 	int wps_ie_len;
166 
167 	u8 owe_ie[MAX_OWE_IE_LEN];/* added in assoc req */
168 	int owe_ie_len;
169 
170 	u8	binstallGrpkey;
171 #ifdef CONFIG_GTK_OL
172 	u8	binstallKCK_KEK;
173 #endif /* CONFIG_GTK_OL */
174 #ifdef CONFIG_IEEE80211W
175 	u8	binstallBIPkey;
176 #endif /* CONFIG_IEEE80211W */
177 	u8	busetkipkey;
178 	u8	bcheck_grpkey;
179 	u8	bgrpkey_handshake;
180 
181 	u8	auth_alg;
182 	u8	auth_type;
183 	u8	extauth_status;
184 	/* u8	packet_cnt; */ /* unused, removed */
185 
186 	s32	sw_encrypt;/* from registry_priv */
187 	s32	sw_decrypt;/* from registry_priv */
188 
189 	s32 	hw_decrypted;/* if the rx packets is hw_decrypted==_FALSE, it means the hw has not been ready. */
190 
191 
192 	/* keeps the auth_type & enc_status from upper layer ioctl(wpa_supplicant or wzc) */
193 	u32 ndisauthtype;	/* NDIS_802_11_AUTHENTICATION_MODE */
194 	u32 ndisencryptstatus;	/* NDIS_802_11_ENCRYPTION_STATUS */
195 
196 	NDIS_802_11_WEP ndiswep;
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 	systime last_mic_err_time;
207 	u8	btkip_countermeasure;
208 	u8	btkip_wait_report;
209 	systime 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 #ifdef CONFIG_IEEE80211W
249 #define SEC_IS_BIP_KEY_INSTALLED(sec) ((sec)->binstallBIPkey)
250 #else
251 #define SEC_IS_BIP_KEY_INSTALLED(sec) _FALSE
252 #endif
253 
254 struct sha256_state {
255 	u64 length;
256 	u32 state[8], curlen;
257 	u8 buf[64];
258 };
259 
260 #define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\
261 	do {\
262 		switch (psecuritypriv->dot11AuthAlgrthm) {\
263 		case dot11AuthAlgrthm_Open:\
264 		case dot11AuthAlgrthm_Shared:\
265 		case dot11AuthAlgrthm_Auto:\
266 			encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\
267 			break;\
268 		case dot11AuthAlgrthm_8021X:\
269 			if (bmcst)\
270 				encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\
271 			else\
272 				encry_algo = (u8) psta->dot118021XPrivacy;\
273 			break;\
274 		case dot11AuthAlgrthm_WAPI:\
275 			encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\
276 			break;\
277 		} \
278 	} while (0)
279 
280 #define _AES_IV_LEN_ 8
281 
282 #define SET_ICE_IV_LEN(iv_len, icv_len, encrypt)\
283 	do {\
284 		switch (encrypt) {\
285 		case _WEP40_:\
286 		case _WEP104_:\
287 			iv_len = 4;\
288 			icv_len = 4;\
289 			break;\
290 		case _TKIP_:\
291 			iv_len = 8;\
292 			icv_len = 4;\
293 			break;\
294 		case _AES_:\
295 			iv_len = 8;\
296 			icv_len = 8;\
297 			break;\
298 		case _SMS4_:\
299 			iv_len = 18;\
300 			icv_len = 16;\
301 			break;\
302 		default:\
303 			iv_len = 0;\
304 			icv_len = 0;\
305 			break;\
306 		} \
307 	} while (0)
308 
309 
310 #define GET_TKIP_PN(iv, dot11txpn)\
311 	do {\
312 		dot11txpn._byte_.TSC0 = iv[2];\
313 		dot11txpn._byte_.TSC1 = iv[0];\
314 		dot11txpn._byte_.TSC2 = iv[4];\
315 		dot11txpn._byte_.TSC3 = iv[5];\
316 		dot11txpn._byte_.TSC4 = iv[6];\
317 		dot11txpn._byte_.TSC5 = iv[7];\
318 	} while (0)
319 
320 
321 #define ROL32(A, n)	(((A) << (n)) | (((A)>>(32-(n)))  & ((1UL << (n)) - 1)))
322 #define ROR32(A, n)	ROL32((A), 32-(n))
323 
324 struct mic_data {
325 	u32  K0, K1;         /* Key */
326 	u32  L, R;           /* Current state */
327 	u32  M;              /* Message accumulator (single word) */
328 	u32     nBytesInM;      /*  # bytes in M */
329 };
330 
331 extern const u32 Te0[256];
332 extern const u32 Te1[256];
333 extern const u32 Te2[256];
334 extern const u32 Te3[256];
335 extern const u32 Te4[256];
336 extern const u32 Td0[256];
337 extern const u32 Td1[256];
338 extern const u32 Td2[256];
339 extern const u32 Td3[256];
340 extern const u32 Td4[256];
341 extern const u32 rcon[10];
342 extern const u8 Td4s[256];
343 extern const u8 rcons[10];
344 
345 #define RCON(i) (rcons[(i)] << 24)
346 
rotr(u32 val,int bits)347 static inline u32 rotr(u32 val, int bits)
348 {
349 	return (val >> bits) | (val << (32 - bits));
350 }
351 
352 #define TE0(i) Te0[((i) >> 24) & 0xff]
353 #define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
354 #define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
355 #define TE3(i) rotr(Te0[(i) & 0xff], 24)
356 #define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
357 #define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
358 #define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
359 #define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
360 #define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
361 #define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
362 #define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
363 #define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
364 #define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff)
365 
366 #define TD0(i) Td0[((i) >> 24) & 0xff]
367 #define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
368 #define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
369 #define TD3(i) rotr(Td0[(i) & 0xff], 24)
370 #define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24)
371 #define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16)
372 #define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8)
373 #define TD44(i) (Td4s[(i) & 0xff])
374 #define TD0_(i) Td0[(i) & 0xff]
375 #define TD1_(i) rotr(Td0[(i) & 0xff], 8)
376 #define TD2_(i) rotr(Td0[(i) & 0xff], 16)
377 #define TD3_(i) rotr(Td0[(i) & 0xff], 24)
378 
379 #define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
380 			((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
381 
382 #define PUTU32(ct, st) { \
383 		(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
384 		(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
385 
386 #define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \
387 			 (((u32) (a)[2]) << 8) | ((u32) (a)[3]))
388 
389 #define WPA_PUT_LE16(a, val)			\
390 	do {					\
391 		(a)[1] = ((u16) (val)) >> 8;	\
392 		(a)[0] = ((u16) (val)) & 0xff;	\
393 	} while (0)
394 
395 #define WPA_PUT_BE32(a, val)					\
396 	do {							\
397 		(a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff);	\
398 		(a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff);	\
399 		(a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff);	\
400 		(a)[3] = (u8) (((u32) (val)) & 0xff);		\
401 	} while (0)
402 
403 #define WPA_PUT_BE64(a, val)				\
404 	do {						\
405 		(a)[0] = (u8) (((u64) (val)) >> 56);	\
406 		(a)[1] = (u8) (((u64) (val)) >> 48);	\
407 		(a)[2] = (u8) (((u64) (val)) >> 40);	\
408 		(a)[3] = (u8) (((u64) (val)) >> 32);	\
409 		(a)[4] = (u8) (((u64) (val)) >> 24);	\
410 		(a)[5] = (u8) (((u64) (val)) >> 16);	\
411 		(a)[6] = (u8) (((u64) (val)) >> 8);	\
412 		(a)[7] = (u8) (((u64) (val)) & 0xff);	\
413 	} while (0)
414 
415 /* the K array */
416 static const unsigned long K[64] = {
417 	0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
418 	0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
419 	0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
420 	0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
421 	0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
422 	0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
423 	0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
424 	0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
425 	0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
426 	0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
427 	0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
428 	0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
429 	0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
430 };
431 
432 
433 /* Various logical functions */
434 #define RORc(x, y) \
435 	(((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
436 	  ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
437 #define Ch(x, y, z)       (z ^ (x & (y ^ z)))
438 #define Maj(x, y, z)      (((x | y) & z) | (x & y))
439 #define S(x, n)         RORc((x), (n))
440 #define R(x, n)         (((x) & 0xFFFFFFFFUL)>>(n))
441 #define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
442 #define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
443 #define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
444 #define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
445 #ifndef MIN
446 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
447 #endif
448 #ifdef CONFIG_IEEE80211W
449 int omac1_aes_128(const u8 *key, const u8 *data, size_t data_len, u8 *mac);
450 #endif /* CONFIG_IEEE80211W */
451 #ifdef CONFIG_RTW_MESH_AEK
452 int aes_siv_encrypt(const u8 *key, const u8 *pw, size_t pwlen
453 	, size_t num_elem, const u8 *addr[], const size_t *len, u8 *out);
454 int aes_siv_decrypt(const u8 *key, const u8 *iv_crypt, size_t iv_c_len
455 	, size_t num_elem, const u8 *addr[], const size_t *len, u8 *out);
456 #endif
457 void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key);
458 void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b);
459 void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nBytes);
460 void rtw_secgetmic(struct mic_data *pmicdata, u8 *dst);
461 
462 void rtw_seccalctkipmic(
463 	u8 *key,
464 	u8 *header,
465 	u8 *data,
466 	u32 data_len,
467 	u8 *Miccode,
468 	u8   priority);
469 
470 u32 rtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe);
471 u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe);
472 void rtw_wep_encrypt(_adapter *padapter, u8  *pxmitframe);
473 
474 u32 rtw_aes_decrypt(_adapter *padapter, u8  *precvframe);
475 u32 rtw_tkip_decrypt(_adapter *padapter, u8  *precvframe);
476 void rtw_wep_decrypt(_adapter *padapter, u8  *precvframe);
477 #ifdef CONFIG_IEEE80211W
478 u32	rtw_BIP_verify(_adapter *padapter, u8 *whdr_pos, sint flen
479 	, const u8 *key, u16 id, u64* ipn);
480 #endif
481 #ifdef CONFIG_TDLS
482 void wpa_tdls_generate_tpk(_adapter *padapter, void *sta);
483 int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq,
484 			u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie,
485 			u8 *mic);
486 int wpa_tdls_teardown_ftie_mic(u8 *kck, u8 *lnkid, u16 reason,
487 			u8 dialog_token, u8 trans_seq, u8 *ftie, u8 *mic);
488 int tdls_verify_mic(u8 *kck, u8 trans_seq,
489 			u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie);
490 #endif /* CONFIG_TDLS */
491 
492 void rtw_sec_restore_wep_key(_adapter *adapter);
493 u8 rtw_handle_tkip_countermeasure(_adapter *adapter, const char *caller);
494 
495 #ifdef CONFIG_WOWLAN
496 u16 rtw_calc_crc(u8  *pdata, int length);
497 #endif /*CONFIG_WOWLAN*/
498 
499 #define rtw_sec_chk_auth_alg(a, s) \
500 	((a)->securitypriv.auth_alg == (s))
501 
502 #define rtw_sec_chk_auth_type(a, s) \
503 	((a)->securitypriv.auth_type == (s))
504 
505 #endif /* __RTL871X_SECURITY_H_ */
506