/* SPDX-License-Identifier: GPL-2.0 */
/******************************************************************************
 *
 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
 *
 * 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);
void r8712_aes_decrypt(struct _adapter *padapter, u8  *precvframe);
void r8712_tkip_decrypt(struct _adapter *padapter, u8  *precvframe);
void r8712_wep_decrypt(struct _adapter *padapter, u8  *precvframe);
void r8712_use_tkipkey_handler(struct timer_list *t);

#endif	/*__RTL871X_SECURITY_H_ */

