/** @file authenticator.h
|
*
|
* @brief This file contains the data structure for authenticator and supplicant.
|
*
|
* Copyright (C) 2014-2017, Marvell International Ltd.
|
*
|
* This software file (the "File") is distributed by Marvell International
|
* Ltd. under the terms of the GNU General Public License Version 2, June 1991
|
* (the "License"). You may use, redistribute and/or modify this File in
|
* accordance with the terms and conditions of the License, a copy of which
|
* is available by writing to the Free Software Foundation, Inc.,
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
|
* worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
*
|
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
|
* ARE EXPRESSLY DISCLAIMED. The License provides additional details about
|
* this warranty disclaimer.
|
*/
|
|
/******************************************************
|
Change log:
|
03/07/2014: Initial version
|
******************************************************/
|
#ifndef _AUTHENTICATOR_H
|
#define _AUTHENTICATOR_H
|
|
#include "wltypes.h"
|
#include "IEEE_types.h"
|
#include "wl_mib_rom.h"
|
#include "KeyApiStaDefs.h"
|
#include "keyApiStaTypes.h"
|
#include "keyCommonDef.h"
|
#include "keyMgmtApTypes.h"
|
#include "pmkCache_rom.h"
|
|
#include "hostsa_def.h"
|
|
extern const uint8 wpa_oui02[4]; /* WPA TKIP */
|
extern const uint8 wpa_oui04[4]; /* WPA AES */
|
extern const uint8 wpa_oui01[4]; /* WPA WEP-40 */
|
extern const uint8 wpa_oui05[4]; /* WPA WEP-104 */
|
extern const uint8 wpa_oui_none[4]; /* WPA NONE */
|
|
extern const uint8 wpa2_oui02[4]; /* WPA2 TKIP */
|
extern const uint8 wpa2_oui04[4]; /* WPA2 AES */
|
extern const uint8 wpa2_oui01[4]; /* WPA2 WEP-40 */
|
extern const uint8 wpa2_oui05[4]; /* WPA2 WEP-104 */
|
|
extern const uint8 wpa_oui[3];
|
extern const uint8 kde_oui[3];
|
|
typedef enum {
|
NO_MIC_FAILURE,
|
FIRST_MIC_FAIL_IN_60_SEC,
|
SECOND_MIC_FAIL_IN_60_SEC
|
} MIC_Fail_State_e;
|
|
typedef struct {
|
MIC_Fail_State_e status;
|
BOOLEAN MICCounterMeasureEnabled;
|
UINT32 disableStaAsso;
|
} MIC_Error_t;
|
|
typedef struct {
|
UINT8 TKIPICVErrors;
|
UINT8 TKIPLocalMICFailures;
|
UINT8 TKIPCounterMeasuresInvoked;
|
|
} customMIB_RSNStats_t;
|
|
typedef struct {
|
UINT8 kck[16]; /* PTK_KCK = L(PTK, 0, 128); */
|
UINT8 kek[16]; /* PTK_KEK = L(PTK, 128, 128); */
|
UINT8 tk[16]; /* PTK_TK = L(PTK, 256, 128); */
|
|
} CcmPtk_t;
|
|
typedef struct {
|
UINT8 kck[16]; /* PTK_KCK = L(PTK, 0, 128); */
|
UINT8 kek[16]; /* PTK_KEK = L(PTK, 128, 128); */
|
UINT8 tk[16]; /* PTK_TK = L(PTK, 256, 128); */
|
UINT8 rxMicKey[8];
|
UINT8 txMicKey[8];
|
|
} TkipPtk_t;
|
|
typedef struct {
|
MIC_Error_t apMicError;
|
t_void *apMicTimer;
|
|
UINT32 ageOutCnt;
|
UINT32 stateInfo;
|
//key mgmt data
|
apKeyMgmtInfoSta_t keyMgmtInfo;
|
|
t_u8 RSNEnabled;
|
UINT16 deauthReason;
|
|
UINT8 txPauseState;
|
//RateChangeInfo[] is used by MAC HW to decide the start TX rate.
|
//It should be placed in SQ. If staData_t is placed in ITCM/DTCM then put
|
//staRateTable in SQ and use a pointer here
|
//staRateTable RateChangeInfo;
|
UINT16 stickyTimCount;
|
BOOLEAN stickyTimEnabled;
|
|
#ifdef DOT11W
|
/* Peer STA PMF capability */
|
BOOLEAN peerPMFCapable;
|
#endif
|
|
} staData_t;
|
/**connectioninfo*/
|
typedef struct _cm_Connection {
|
/**Hand shake timer*/
|
t_void *HskTimer;
|
/** Timer set flag */
|
t_u8 timer_is_set;
|
/** authenticator Private pointer */
|
t_void *priv;
|
t_u8 mac_addr[MLAN_MAC_ADDR_LENGTH];
|
/**sta data for authenticator*/
|
staData_t staData;
|
/**handshake data*/
|
eapolHskData_t hskData;
|
} cm_Connection;
|
|
typedef struct {
|
IEEEtypes_CapInfo_t CapInfo;
|
UINT32 AssocStationsCnt;
|
|
BOOLEAN updatePassPhrase;
|
|
KeyData_t grpKeyData;
|
UINT8 GNonce[32];
|
|
/* Following two variables contain that multiple of BI which is just
|
** greater than user configured ageout time in normal and PS mode. These
|
** variables get updated at bss_start, and then are used whenever FW
|
** resets STA age.
|
*/
|
UINT32 staAgeOutBcnCnt;
|
UINT32 psStaAgeOutBcnCnt;
|
|
// Store group rekey time as a multiple of beacon interval.
|
UINT32 grpRekeyCntConfigured;
|
UINT32 grpRekeyCntRemaining;
|
|
} BssData_t;
|
|
typedef struct {
|
UINT16 keyExchange:1;
|
UINT16 authenticate:1;
|
UINT16 reserved:14;
|
} Operation_t;
|
|
typedef struct {
|
Cipher_t mcstCipher;
|
UINT8 mcstCipherCount;
|
|
Cipher_t wpaUcstCipher;
|
UINT8 wpaUcstCipherCount;
|
|
Cipher_t wpa2UcstCipher;
|
UINT8 wpa2UcstCipherCount;
|
|
UINT16 AuthKey;
|
UINT16 AuthKeyCount;
|
Operation_t Akmp;
|
UINT32 GrpReKeyTime;
|
UINT8 PSKPassPhrase[PSK_PASS_PHRASE_LEN_MAX];
|
UINT8 PSKPassPhraseLen;
|
UINT8 PSKValue[PMK_LEN_MAX];
|
UINT8 MaxPwsHskRetries;
|
UINT8 MaxGrpHskRetries;
|
UINT32 PwsHskTimeOut;
|
UINT32 GrpHskTimeOut;
|
UINT8 RSNReplayProtEn; /* RSN Replay Attack Protection flag */
|
} apRsnConfig_t;
|
|
typedef struct {
|
UINT8 ieSet;
|
UINT8 version;
|
/* UINT8 akmCnt ; */
|
UINT8 akmTypes;
|
/* UINT8 uCastCnt ; */
|
UINT8 uCastTypes;
|
UINT8 mCastTypes;
|
UINT8 capInfo;
|
} wapi_ie_cfg_t;
|
|
typedef struct {
|
/* The This section only used for initialization of the connPtr */
|
IEEEtypes_SsId_t SsId;
|
IEEEtypes_Len_t SsIdLen;
|
// odd-sized ele clubbed together to keep even alignment
|
IEEEtypes_DtimPeriod_t DtimPeriod;
|
IEEEtypes_BcnInterval_t BcnPeriod;
|
|
IEEEtypes_MacAddr_t BssId;
|
UINT16 RtsThresh;
|
UINT16 FragThresh;
|
UINT8 ShortRetryLim;
|
UINT8 LongRetryLim;
|
|
// Used in MBSS mode for software beacon suppression
|
UINT8 MbssBcnIntFac;
|
UINT8 MbssCurBcnIntCnt;
|
UINT16 Reserved;
|
} CommonMlmeData_t;
|
|
typedef struct {
|
IEEEtypes_SsId_t SsId;
|
IEEEtypes_Len_t SsIdLen;
|
|
UINT8 wpa_ie[MAX_IE_SIZE];
|
UINT16 wpa_ielen;
|
UINT8 rsn_ie[MAX_IE_SIZE];
|
UINT16 rsn_ielen;
|
UINT32 StaAgeOutTime;
|
UINT32 PsStaAgeOutTime;
|
|
/* If the BssAddr field is not aligned on word boundary the hal
|
functions which update mac registers are unsafe for non-word
|
aligned pointers. Avoid direct use of the pointer to BssId
|
field in the hal functions */
|
/* this field is no longer used and we use mibOpdata_p->StaMacAddr
|
in its place now */
|
IEEEtypes_MacAddr_t EepromMacAddr_defunct;
|
IEEEtypes_DataRate_t OpRateSet[IEEEtypes_MAX_DATA_RATES_G];
|
|
// odd-sized ele clubbed together to keep even alignment
|
UINT8 AuthType;
|
UINT8 TxPowerLevel;
|
IEEEtypes_DataRate_t TxDataRate;
|
IEEEtypes_DataRate_t TxMCBCDataRate;
|
UINT8 MaxStaSupported;
|
|
SecurityMode_t SecType;
|
UINT8 Padding1[1]; //****** Use this for adding new members *******
|
BOOLEAN apWmmEn;
|
IEEEtypes_WMM_ParamElement_t apWmmParamSet;
|
|
BOOLEAN ap11nEn;
|
|
cipher_key_buf_t *pWepKeyBuf;
|
cipher_key_buf_t *pGtkKeyBuf;
|
UINT8 ScanChanCount;
|
UINT8 AclStaCnt;
|
|
UINT8 Padding3[1]; //****** Use this for adding new members *******
|
apRsnConfig_t RsnConfig;
|
BOOLEAN apWmmPsEn;
|
channelInfo_t ScanChanList[IEEEtypes_MAX_CHANNELS]; /* Channels to scan */
|
CommonMlmeData_t comData;
|
IEEEtypes_OBSS_ScanParam_t ObssScanParam;
|
|
cipher_key_buf_t *piGtkKeyBuf;
|
UINT32 mgmtFrameSubtypeFwdEn;
|
UINT8 Ht2040CoexEn; // Enable/Disable 2040 Coex feature in uAP
|
|
UINT8 Padding4[1]; //****** Use this for adding new members *******
|
|
wapi_ie_cfg_t wapiCfg;
|
IEEEtypes_ExtCapability_t ExtCap;
|
UINT8 Padding6[1]; //****** Use this for adding new members *******
|
} BssConfig_t;
|
|
typedef struct {
|
BssConfig_t bssConfig;
|
BssData_t bssData;
|
} apInfo_t;
|
#ifdef DRV_EMBEDDED_SUPPLICANT
|
typedef struct {
|
/* This structure is ROM'd */
|
|
UINT8 RSNEnabled:1; /* WPA, WPA2 */
|
UINT8 pmkidValid:1; /* PMKID valid */
|
UINT8 rsnCapValid:1;
|
UINT8 grpMgmtCipherValid:1;
|
UINT8 rsvd:4; /* rsvd */
|
|
SecurityMode_t wpaType;
|
Cipher_t mcstCipher;
|
Cipher_t ucstCipher;
|
AkmSuite_t AKM;
|
UINT8 PMKID[16];
|
|
IEEEtypes_RSNCapability_t rsnCap;
|
|
Cipher_t grpMgmtCipher;
|
|
} RSNConfig_t;
|
|
typedef struct {
|
UINT8 ANonce[NONCE_SIZE];
|
UINT8 SNonce[NONCE_SIZE];
|
UINT8 EAPOL_MIC_Key[EAPOL_MIC_KEY_SIZE];
|
UINT8 EAPOL_Encr_Key[EAPOL_ENCR_KEY_SIZE];
|
UINT32 apCounterLo; /* last valid replay counter from authenticator */
|
UINT32 apCounterHi;
|
UINT32 apCounterZeroDone; /* have we processed replay == 0? */
|
UINT32 staCounterLo; /* counter used in request EAPOL frames */
|
UINT32 staCounterHi;
|
|
BOOLEAN RSNDataTrafficEnabled; /* Enabled after 4way handshake */
|
BOOLEAN RSNSecured; /* Enabled after group key is established */
|
BOOLEAN pwkHandshakeComplete;
|
cipher_key_t *pRxDecryptKey;
|
|
KeyData_t PWKey;
|
KeyData_t GRKey;
|
|
KeyData_t newPWKey;
|
|
MIC_Error_t sta_MIC_Error;
|
t_void *rsnTimer;
|
t_void *micTimer;
|
t_void *deauthDelayTimer; /* hacked in to delay the deauth */
|
|
//phostsa_private psapriv;
|
|
KeyData_t IGtk;
|
|
} keyMgmtInfoSta_t;
|
|
typedef struct supplicantData {
|
BOOLEAN inUse;
|
BOOLEAN suppInitialized;
|
IEEEtypes_SsIdElement_t hashSsId;
|
IEEEtypes_MacAddr_t localBssid;
|
IEEEtypes_MacAddr_t localStaAddr;
|
customMIB_RSNStats_t customMIB_RSNStats;
|
RSNConfig_t customMIB_RSNConfig;
|
keyMgmtInfoSta_t keyMgmtInfoSta;
|
SecurityParams_t currParams;
|
UINT8 wpa_rsn_ie[MAX_IE_SIZE];
|
} supplicantData_t;
|
#endif
|
|
/** supplicant/authenticator private structure */
|
typedef struct _hostsa_private {
|
/** pmlan_private */
|
t_void *pmlan_private;
|
/** pmlan_adapter */
|
t_void *pmlan_adapter;
|
/** Utility functions table */
|
hostsa_util_fns util_fns;
|
/** MLAN APIs table */
|
hostsa_mlan_fns mlan_fns;
|
/**apinf_t*/
|
apInfo_t apinfo;
|
/**group rekey timer*/
|
t_void *GrpRekeytimer;
|
/**Group rekey timer set flag*/
|
t_u8 GrpRekeyTimerIsSet;
|
/**local mac address*/
|
t_u8 curr_addr[MLAN_MAC_ADDR_LENGTH];
|
#ifdef DRV_EMBEDDED_SUPPLICANT
|
/**supplicant data*/
|
supplicantData_t *suppData;
|
#endif
|
/* GTK installed status */
|
t_u8 gtk_installed;
|
} hostsa_private, *phostsa_private;
|
#endif
|