/******************************************************************************
 *
 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
 *
 * Modifications for inclusion into the Linux staging tree are
 * Copyright(c) 2010 Larry Finger. All rights reserved.
 *
 * Contact information:
 * WLAN FAE <wlanfae@realtek.com>
 * Larry Finger <Larry.Finger@lwfinger.net>
 *
 ******************************************************************************/
#ifndef __RTL871X_SECURITY_H_
#define __RTL871X_SECURITY_H_

#include "osdep_service.h"
#include "drv_types.h"

#define _NO_PRIVACY_	0x0
#define _WEP40_		0x1
#define _TKIP_		0x2
#define _TKIP_WTMIC_	0x3
#define _AES_		0x4
#define _WEP104_	0x5

#define _WPA_IE_ID_	0xdd
#define _WPA2_IE_ID_	0x30

#ifndef Ndis802_11AuthModeWPA2
#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)
#endif

#ifndef Ndis802_11AuthModeWPA2PSK
#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)
#endif

union pn48 {
	u64 val;
#if defined(__BIG_ENDIAN)
	struct {
		u8 TSC7;
		u8 TSC6;
		u8 TSC5;
		u8 TSC4;
		u8 TSC3;
		u8 TSC2;
		u8 TSC1;
		u8 TSC0;
	} _byte_;
#else
	struct {
		u8 TSC0;
		u8 TSC1;
		u8 TSC2;
		u8 TSC3;
		u8 TSC4;
		u8 TSC5;
		u8 TSC6;
		u8 TSC7;
	} _byte_;
#endif
};

union Keytype {
	u8 skey[16];
	u32 lkey[4];
};

struct RT_PMKID_LIST {
	u8 bUsed;
	u8 Bssid[6];
	u8 PMKID[16];
	u8 SsidBuf[33];
	u8 *ssid_octet;
	u16 ssid_length;
};

struct security_priv {
	u32 AuthAlgrthm;		/* 802.11 auth, could be open, shared,
					 * 8021x and authswitch */
	u32 PrivacyAlgrthm;		/* This specify the privacy for shared
					 * auth. algorithm. */
	u32 PrivacyKeyIndex;		/* this is only valid for legendary
					 * wep, 0~3 for key id. */
	union Keytype DefKey[4];	/* this is only valid for def. key */
	u32 DefKeylen[4];
	u32 XGrpPrivacy;		/* This specify the privacy algthm.
					 * used for Grp key */
	u32 XGrpKeyid;			/* key id used for Grp Key */
	union Keytype	XGrpKey[2];	/* 802.1x Group Key, for
					 * inx0 and inx1 */
	union Keytype	XGrptxmickey[2];
	union Keytype	XGrprxmickey[2];
	union pn48 Grptxpn;		/* PN48 used for Grp Key xmit. */
	union pn48 Grprxpn;		/* PN48 used for Grp Key recv. */
	u8 wps_hw_pbc_pressed;/*for hw pbc pressed*/
	u8 wps_phase;/*for wps*/
	u8 wps_ie[MAX_WPA_IE_LEN<<2];
	int wps_ie_len;
	u8	binstallGrpkey;
	u8	busetkipkey;
	struct timer_list tkip_timer;
	u8	bcheck_grpkey;
	u8	bgrpkey_handshake;
	s32	sw_encrypt;	/* from registry_priv */
	s32	sw_decrypt;	/* from registry_priv */
	s32	hw_decrypted;	/* if the rx packets is hw_decrypted==false,
				 * it means the hw has not been ready. */
	u32 ndisauthtype;	/* keeps the auth_type & enc_status from upper
				 * layer ioctl(wpa_supplicant or wzc) */
	u32 ndisencryptstatus;
	struct wlan_bssid_ex sec_bss;  /* for joinbss (h2c buffer) usage */
	struct NDIS_802_11_WEP ndiswep;
	u8 assoc_info[600];
	u8 szofcapability[256]; /* for wpa2 usage */
	u8 oidassociation[512]; /* for wpa/wpa2 usage */
	u8 authenticator_ie[256];  /* store ap security information element */
	u8 supplicant_ie[256];  /* store sta security information element */
	/* for tkip countermeasure */
	u32 last_mic_err_time;
	u8	btkip_countermeasure;
	u8	btkip_wait_report;
	u32 btkip_countermeasure_time;
	/*-------------------------------------------------------------------
	 * For WPA2 Pre-Authentication.
	 *------------------------------------------------------------------ */
	struct RT_PMKID_LIST		PMKIDList[NUM_PMKID_CACHE];
	u8				PMKIDIndex;
};

#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst) \
do { \
	switch (psecuritypriv->AuthAlgrthm) { \
	case 0: \
	case 1: \
	case 3: \
		encry_algo = (u8)psecuritypriv->PrivacyAlgrthm; \
		break; \
	case 2: \
		if (bmcst) \
			encry_algo = (u8)psecuritypriv->XGrpPrivacy; \
		else \
			encry_algo = (u8)psta->XPrivacy; \
		break; \
	} \
} while (0)
#define SET_ICE_IV_LEN(iv_len, icv_len, encrypt)\
do {\
	switch (encrypt) { \
	case _WEP40_: \
	case _WEP104_: \
		iv_len = 4; \
		icv_len = 4; \
		break; \
	case _TKIP_: \
		iv_len = 8; \
		icv_len = 4; \
		break; \
	case _AES_: \
		iv_len = 8; \
		icv_len = 8; \
		break; \
	default: \
		iv_len = 0; \
		icv_len = 0; \
		break; \
	} \
} while (0)
#define GET_TKIP_PN(iv, txpn) \
do {\
	txpn._byte_.TSC0 = iv[2];\
	txpn._byte_.TSC1 = iv[0];\
	txpn._byte_.TSC2 = iv[4];\
	txpn._byte_.TSC3 = iv[5];\
	txpn._byte_.TSC4 = iv[6];\
	txpn._byte_.TSC5 = iv[7];\
} while (0)

#define ROL32(A, n) (((A) << (n)) | (((A)>>(32-(n)))  & ((1UL << (n)) - 1)))
#define ROR32(A, n) ROL32((A), 32 - (n))

struct mic_data {
	u32  K0, K1;         /* Key */
	u32  L, R;           /* Current state */
	u32  M;              /* Message accumulator (single word) */
	u32  nBytesInM;      /* # bytes in M */
};

void seccalctkipmic(
	u8  *key,
	u8  *header,
	u8  *data,
	u32  data_len,
	u8  *Miccode,
	u8   priority);

void r8712_secmicsetkey(struct mic_data *pmicdata, u8 *key);
void r8712_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nBytes);
void r8712_secgetmic(struct mic_data *pmicdata, u8 *dst);
u32 r8712_aes_encrypt(struct _adapter *padapter, u8 *pxmitframe);
u32 r8712_tkip_encrypt(struct _adapter *padapter, u8 *pxmitframe);
void r8712_wep_encrypt(struct _adapter *padapter, u8  *pxmitframe);
u32 r8712_aes_decrypt(struct _adapter *padapter, u8  *precvframe);
u32 r8712_tkip_decrypt(struct _adapter *padapter, u8  *precvframe);
void r8712_wep_decrypt(struct _adapter *padapter, u8  *precvframe);
void r8712_use_tkipkey_handler(unsigned long data);

#endif	/*__RTL871X_SECURITY_H_ */

