#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;
u32 PrivacyAlgrthm;
u32 PrivacyKeyIndex;
union Keytype DefKey[4];
u32 DefKeylen[4];
u32 XGrpPrivacy;
u32 XGrpKeyid;
union Keytype XGrpKey[2];
union Keytype XGrptxmickey[2];
union Keytype XGrprxmickey[2];
union pn48 Grptxpn;
union pn48 Grprxpn;
u8 wps_hw_pbc_pressed;
u8 wps_phase;
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;
s32 sw_decrypt;
s32 hw_decrypted;
u32 ndisauthtype;
u32 ndisencryptstatus;
struct wlan_bssid_ex sec_bss;
struct NDIS_802_11_WEP ndiswep;
u8 assoc_info[600];
u8 szofcapability[256];
u8 oidassociation[512];
u8 authenticator_ie[256];
u8 supplicant_ie[256];
u32 last_mic_err_time;
u8 btkip_countermeasure;
u8 btkip_wait_report;
u32 btkip_countermeasure_time;
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;
u32 L, R;
u32 M;
u32 nBytesInM;
};
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_ */