17f8a0fba8c345f538674410139a08d1037594c7aLarry Finger/******************************************************************************
27f8a0fba8c345f538674410139a08d1037594c7aLarry Finger *
37f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
47f8a0fba8c345f538674410139a08d1037594c7aLarry Finger *
57f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * This program is free software; you can redistribute it and/or modify it
67f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * under the terms of version 2 of the GNU General Public License as
77f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * published by the Free Software Foundation.
87f8a0fba8c345f538674410139a08d1037594c7aLarry Finger *
97f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * This program is distributed in the hope that it will be useful, but WITHOUT
107f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
117f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
127f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * more details.
137f8a0fba8c345f538674410139a08d1037594c7aLarry Finger *
147f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * You should have received a copy of the GNU General Public License along with
157f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * this program; if not, write to the Free Software Foundation, Inc.,
167f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
177f8a0fba8c345f538674410139a08d1037594c7aLarry Finger *
187f8a0fba8c345f538674410139a08d1037594c7aLarry Finger *
197f8a0fba8c345f538674410139a08d1037594c7aLarry Finger ******************************************************************************/
207f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#ifndef __RTW_SECURITY_H_
217f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define __RTW_SECURITY_H_
227f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
237f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#include <osdep_service.h>
247f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#include <drv_types.h>
257f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
267f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define _NO_PRIVACY_			0x0
277f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define _WEP40_				0x1
287f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define _TKIP_				0x2
297f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define _TKIP_WTMIC_			0x3
307f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define _AES_				0x4
317f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define _WEP104_			0x5
327f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define _WEP_WPA_MIXED_			0x07  /*  WEP + WPA */
337f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define _SMS4_				0x06
347f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
357f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))
367f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
377f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define _WPA_IE_ID_	0xdd
387f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define _WPA2_IE_ID_	0x30
397f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
407f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define SHA256_MAC_LEN 32
417f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define AES_BLOCK_SIZE 16
427f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define AES_PRIV_SIZE (4 * 44)
437f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
447f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerenum {
457f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	ENCRYP_PROTOCOL_OPENSYS,   /* open system */
467f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	ENCRYP_PROTOCOL_WEP,       /* WEP */
477f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	ENCRYP_PROTOCOL_WPA,       /* WPA */
487f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	ENCRYP_PROTOCOL_WPA2,      /* WPA2 */
497f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	ENCRYP_PROTOCOL_WAPI,      /* WAPI: Not support in this version */
507f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	ENCRYP_PROTOCOL_MAX
517f8a0fba8c345f538674410139a08d1037594c7aLarry Finger};
527f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
537f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
547f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#ifndef Ndis802_11AuthModeWPA2
557f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)
567f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#endif
577f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
587f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#ifndef Ndis802_11AuthModeWPA2PSK
597f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)
607f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#endif
617f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
627f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerunion pn48	{
637f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u64	val;
647f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
657f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#ifdef __LITTLE_ENDIAN
667f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	struct {
677f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC0;
687f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC1;
697f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC2;
707f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC3;
717f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC4;
727f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC5;
737f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC6;
747f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC7;
757f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	} _byte_;
767f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
777f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#elif defined(__BIG_ENDIAN)
787f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
797f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	struct {
807f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC7;
817f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC6;
827f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC5;
837f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC4;
847f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC3;
857f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC2;
867f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC1;
877f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		u8 TSC0;
887f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	} _byte_;
897f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#endif
907f8a0fba8c345f538674410139a08d1037594c7aLarry Finger};
917f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
927f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerunion Keytype {
937f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8   skey[16];
947f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32    lkey[4];
957f8a0fba8c345f538674410139a08d1037594c7aLarry Finger};
967f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
977f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerstruct rt_pmkid_list {
987f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	bUsed;
997f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	Bssid[6];
1007f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	PMKID[16];
1017f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	SsidBuf[33];
1027f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	*ssid_octet;
1037f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u16	ssid_length;
1047f8a0fba8c345f538674410139a08d1037594c7aLarry Finger};
1057f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
1067f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerstruct security_priv {
1077f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32	  dot11AuthAlgrthm;	/*  802.11 auth, could be open,
1087f8a0fba8c345f538674410139a08d1037594c7aLarry Finger					 * shared, 8021x and authswitch */
1097f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32	  dot11PrivacyAlgrthm;	/*  This specify the privacy for
1107f8a0fba8c345f538674410139a08d1037594c7aLarry Finger					 * shared auth. algorithm. */
1117f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	/* WEP */
1127f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32	  dot11PrivacyKeyIndex;	/*  this is only valid for legendary
1137f8a0fba8c345f538674410139a08d1037594c7aLarry Finger					 * wep, 0~3 for key id.(tx key index) */
1147f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	union Keytype dot11DefKey[4];	/*  this is only valid for def. key */
1157f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32	dot11DefKeylen[4];
1167f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32 dot118021XGrpPrivacy;	/*  This specify the privacy algthm.
1177f8a0fba8c345f538674410139a08d1037594c7aLarry Finger					 * used for Grp key */
1187f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32	dot118021XGrpKeyid;	/*  key id used for Grp Key
1197f8a0fba8c345f538674410139a08d1037594c7aLarry Finger					 * ( tx key index) */
1207f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	union Keytype	dot118021XGrpKey[4];	/*  802.1x Group Key,
1217f8a0fba8c345f538674410139a08d1037594c7aLarry Finger						 * for inx0 and inx1 */
1227f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	union Keytype	dot118021XGrptxmickey[4];
1237f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	union Keytype	dot118021XGrprxmickey[4];
1247f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	union pn48	dot11Grptxpn;		/* PN48 used for Grp Key xmit.*/
1257f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	union pn48	dot11Grprxpn;		/* PN48 used for Grp Key recv.*/
1267f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#ifdef CONFIG_88EU_AP_MODE
1277f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	/* extend security capabilities for AP_MODE */
1287f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	unsigned int dot8021xalg;/* 0:disable, 1:psk, 2:802.1x */
1297f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	unsigned int wpa_psk;/* 0:disable, bit(0): WPA, bit(1):WPA2 */
1307f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	unsigned int wpa_group_cipher;
1317f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	unsigned int wpa2_group_cipher;
1327f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	unsigned int wpa_pairwise_cipher;
1337f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	unsigned int wpa2_pairwise_cipher;
1347f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#endif
1357f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8 wps_ie[MAX_WPS_IE_LEN];/* added in assoc req */
1367f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	int wps_ie_len;
1377f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	binstallGrpkey;
1387f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	busetkipkey;
1397f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	bcheck_grpkey;
1407f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	bgrpkey_handshake;
1417f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	s32	sw_encrypt;/* from registry_priv */
1427f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	s32	sw_decrypt;/* from registry_priv */
1437f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	s32	hw_decrypted;/* if the rx packets is hw_decrypted==false,i
1447f8a0fba8c345f538674410139a08d1037594c7aLarry Finger			      * it means the hw has not been ready. */
1457f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
1467f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	/* keeps the auth_type & enc_status from upper layer
1477f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	 * ioctl(wpa_supplicant or wzc) */
1487f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32 ndisauthtype;	/*  NDIS_802_11_AUTHENTICATION_MODE */
1497f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32 ndisencryptstatus;	/*  NDIS_802_11_ENCRYPTION_STATUS */
1507f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	struct wlan_bssid_ex sec_bss;  /* for joinbss (h2c buffer) usage */
1517f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	struct ndis_802_11_wep ndiswep;
1527f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8 assoc_info[600];
1537f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8 szofcapability[256]; /* for wpa2 usage */
1547f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8 oidassociation[512]; /* for wpa/wpa2 usage */
1557f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8 authenticator_ie[256];  /* store ap security information element */
1567f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8 supplicant_ie[256];  /* store sta security information element */
1577f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
1587f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	/* for tkip countermeasure */
1597f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32 last_mic_err_time;
1607f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	btkip_countermeasure;
1617f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	btkip_wait_report;
1627f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32 btkip_countermeasure_time;
1637f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
1647f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	/*  */
1657f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	/*  For WPA2 Pre-Authentication. */
1667f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	/*  */
1677f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	struct rt_pmkid_list PMKIDList[NUM_PMKID_CACHE];
1687f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8	PMKIDIndex;
1697f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8 bWepDefaultKeyIdxSet;
1707f8a0fba8c345f538674410139a08d1037594c7aLarry Finger};
1717f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
1727f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerstruct sha256_state {
1737f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u64 length;
1747f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32 state[8], curlen;
1757f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u8 buf[64];
1767f8a0fba8c345f538674410139a08d1037594c7aLarry Finger};
1777f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
1787f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)		\
1797f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerdo {									\
1807f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	switch (psecuritypriv->dot11AuthAlgrthm) {			\
1817f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	case dot11AuthAlgrthm_Open:					\
1827f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	case dot11AuthAlgrthm_Shared:					\
1837f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	case dot11AuthAlgrthm_Auto:					\
1847f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;	\
1857f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		break;							\
1867f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	case dot11AuthAlgrthm_8021X:					\
1877f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		if (bmcst)						\
1887f8a0fba8c345f538674410139a08d1037594c7aLarry Finger			encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\
1897f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		else							\
1907f8a0fba8c345f538674410139a08d1037594c7aLarry Finger			encry_algo = (u8)psta->dot118021XPrivacy;	\
1917f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		break;							\
1927f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	case dot11AuthAlgrthm_WAPI:					\
1937f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;	\
1947f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		break;							\
1957f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	}								\
1967f8a0fba8c345f538674410139a08d1037594c7aLarry Finger} while (0)
1977f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
1987f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define SET_ICE_IV_LEN(iv_len, icv_len, encrypt)			\
1997f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerdo {									\
2007f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	switch (encrypt) {						\
2017f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	case _WEP40_:							\
2027f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	case _WEP104_:							\
2037f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		iv_len = 4;						\
2047f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		icv_len = 4;						\
2057f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		break;							\
2067f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	case _TKIP_:							\
2077f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		iv_len = 8;						\
2087f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		icv_len = 4;						\
2097f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		break;							\
2107f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	case _AES_:							\
2117f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		iv_len = 8;						\
2127f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		icv_len = 8;						\
2137f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		break;							\
2147f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	case _SMS4_:							\
2157f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		iv_len = 18;						\
2167f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		icv_len = 16;						\
2177f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		break;							\
2187f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	default:							\
2197f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		iv_len = 0;						\
2207f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		icv_len = 0;						\
2217f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		break;							\
2227f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	}								\
2237f8a0fba8c345f538674410139a08d1037594c7aLarry Finger} while (0)
2247f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2257f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2267f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define GET_TKIP_PN(iv, dot11txpn)					\
2277f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerdo {									\
2287f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	dot11txpn._byte_.TSC0 = iv[2];					\
2297f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	dot11txpn._byte_.TSC1 = iv[0];					\
2307f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	dot11txpn._byte_.TSC2 = iv[4];					\
2317f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	dot11txpn._byte_.TSC3 = iv[5];					\
2327f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	dot11txpn._byte_.TSC4 = iv[6];					\
2337f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	dot11txpn._byte_.TSC5 = iv[7];					\
2347f8a0fba8c345f538674410139a08d1037594c7aLarry Finger} while (0)
2357f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2367f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2377f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define ROL32(A, n)	(((A) << (n)) | (((A)>>(32-(n)))  & ((1UL << (n)) - 1)))
2387f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define ROR32(A, n)	ROL32((A), 32-(n))
2397f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2407f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerstruct mic_data {
2417f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32  K0, K1;         /*  Key */
2427f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32  L, R;           /*  Current state */
2437f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32  M;              /*  Message accumulator (single word) */
2447f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	u32  nBytesInM;      /*  # bytes in M */
2457f8a0fba8c345f538674410139a08d1037594c7aLarry Finger};
2467f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2477f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 Te0[256];
2487f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 Te1[256];
2497f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 Te2[256];
2507f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 Te3[256];
2517f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 Te4[256];
2527f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 Td0[256];
2537f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 Td1[256];
2547f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 Td2[256];
2557f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 Td3[256];
2567f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 Td4[256];
2577f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u32 rcon[10];
2587f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u8 Td4s[256];
2597f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerextern const u8 rcons[10];
2607f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2617f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define RCON(i) (rcons[(i)] << 24)
2627f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2637f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerstatic inline u32 rotr(u32 val, int bits)
2647f8a0fba8c345f538674410139a08d1037594c7aLarry Finger{
2657f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	return (val >> bits) | (val << (32 - bits));
2667f8a0fba8c345f538674410139a08d1037594c7aLarry Finger}
2677f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2687f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE0(i) Te0[((i) >> 24) & 0xff]
2697f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
2707f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
2717f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE3(i) rotr(Te0[(i) & 0xff], 24)
2727f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
2737f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
2747f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
2757f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
2767f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
2777f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
2787f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
2797f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
2807f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff)
2817f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2827f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD0(i) Td0[((i) >> 24) & 0xff]
2837f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
2847f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
2857f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD3(i) rotr(Td0[(i) & 0xff], 24)
2867f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24)
2877f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16)
2887f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8)
2897f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD44(i) (Td4s[(i) & 0xff])
2907f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD0_(i) Td0[(i) & 0xff]
2917f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD1_(i) rotr(Td0[(i) & 0xff], 8)
2927f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD2_(i) rotr(Td0[(i) & 0xff], 16)
2937f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define TD3_(i) rotr(Td0[(i) & 0xff], 24)
2947f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2957f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
2967f8a0fba8c345f538674410139a08d1037594c7aLarry Finger			((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
2977f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
2987f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define PUTU32(ct, st) { \
2997f8a0fba8c345f538674410139a08d1037594c7aLarry Finger(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
3007f8a0fba8c345f538674410139a08d1037594c7aLarry Finger(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
3017f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
3027f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define WPA_GET_BE32(a) ((((u32)(a)[0]) << 24) | (((u32)(a)[1]) << 16) | \
3037f8a0fba8c345f538674410139a08d1037594c7aLarry Finger			 (((u32)(a)[2]) << 8) | ((u32)(a)[3]))
3047f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
3057f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define WPA_PUT_LE16(a, val)			\
3067f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	do {					\
3077f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[1] = ((u16)(val)) >> 8;	\
3087f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[0] = ((u16)(val)) & 0xff;	\
3097f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	} while (0)
3107f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
3117f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define WPA_PUT_BE32(a, val)					\
3127f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	do {							\
3137f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[0] = (u8)((((u32)(val)) >> 24) & 0xff);	\
3147f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[1] = (u8)((((u32)(val)) >> 16) & 0xff);	\
3157f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[2] = (u8)((((u32)(val)) >> 8) & 0xff);	\
3167f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[3] = (u8)(((u32)(val)) & 0xff);		\
3177f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	} while (0)
3187f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
3197f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define WPA_PUT_BE64(a, val)				\
3207f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	do {						\
3217f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[0] = (u8)(((u64)(val)) >> 56);	\
3227f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[1] = (u8)(((u64)(val)) >> 48);	\
3237f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[2] = (u8)(((u64)(val)) >> 40);	\
3247f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[3] = (u8)(((u64)(val)) >> 32);	\
3257f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[4] = (u8)(((u64)(val)) >> 24);	\
3267f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[5] = (u8)(((u64)(val)) >> 16);	\
3277f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[6] = (u8)(((u64)(val)) >> 8);	\
3287f8a0fba8c345f538674410139a08d1037594c7aLarry Finger		(a)[7] = (u8)(((u64)(val)) & 0xff);	\
3297f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	} while (0)
3307f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
3317f8a0fba8c345f538674410139a08d1037594c7aLarry Finger/* ===== start - public domain SHA256 implementation ===== */
3327f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
3337f8a0fba8c345f538674410139a08d1037594c7aLarry Finger/* This is based on SHA256 implementation in LibTomCrypt that was released into
3347f8a0fba8c345f538674410139a08d1037594c7aLarry Finger * public domain by Tom St Denis. */
3357f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
3367f8a0fba8c345f538674410139a08d1037594c7aLarry Finger/* the K array */
3377f8a0fba8c345f538674410139a08d1037594c7aLarry Fingerstatic const unsigned long K[64] = {
3387f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
3397f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
3407f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
3417f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
3427f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
3437f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
3447f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
3457f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
3467f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
3477f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
3487f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
3497f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
3507f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
3517f8a0fba8c345f538674410139a08d1037594c7aLarry Finger};
3527f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
3537f8a0fba8c345f538674410139a08d1037594c7aLarry Finger/* Various logical functions */
3547f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define RORc(x, y) \
3557f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	(((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long)((y)&31)) | \
3567f8a0fba8c345f538674410139a08d1037594c7aLarry Finger	 ((unsigned long)(x) << (unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
3573f35c7ff10679459ca3515c19de8c578d1904976Tim Jester-Pfadt#define Ch(x, y , z)       (z ^ (x & (y ^ z)))
3587f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define Maj(x, y, z)      (((x | y) & z) | (x & y))
3597f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define S(x, n)         RORc((x), (n))
3607f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))
3617f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
3627f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
3637f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
3647f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
3657f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#ifndef MIN
3667f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#define MIN(x, y) (((x) < (y)) ? (x) : (y))
3677f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#endif
3687f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
3697f8a0fba8c345f538674410139a08d1037594c7aLarry Fingervoid rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key);
3707f8a0fba8c345f538674410139a08d1037594c7aLarry Fingervoid rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b);
3717f8a0fba8c345f538674410139a08d1037594c7aLarry Fingervoid rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nBytes);
3727f8a0fba8c345f538674410139a08d1037594c7aLarry Fingervoid rtw_secgetmic(struct mic_data *pmicdata, u8 *dst);
3737f8a0fba8c345f538674410139a08d1037594c7aLarry Fingervoid rtw_seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len,
3747f8a0fba8c345f538674410139a08d1037594c7aLarry Finger			u8 *Miccode, u8   priority);
3757f8a0fba8c345f538674410139a08d1037594c7aLarry Fingeru32 rtw_aes_encrypt(struct adapter *padapter, u8 *pxmitframe);
3767f8a0fba8c345f538674410139a08d1037594c7aLarry Fingeru32 rtw_tkip_encrypt(struct adapter *padapter, u8 *pxmitframe);
3777f8a0fba8c345f538674410139a08d1037594c7aLarry Fingervoid rtw_wep_encrypt(struct adapter *padapter, u8  *pxmitframe);
3787f8a0fba8c345f538674410139a08d1037594c7aLarry Fingeru32 rtw_aes_decrypt(struct adapter *padapter, u8  *precvframe);
3797f8a0fba8c345f538674410139a08d1037594c7aLarry Fingeru32 rtw_tkip_decrypt(struct adapter *padapter, u8  *precvframe);
3807f8a0fba8c345f538674410139a08d1037594c7aLarry Fingervoid rtw_wep_decrypt(struct adapter *padapter, u8  *precvframe);
3817f8a0fba8c345f538674410139a08d1037594c7aLarry Finger
3827f8a0fba8c345f538674410139a08d1037594c7aLarry Finger#endif	/* __RTL871X_SECURITY_H_ */
383