blob: b2bb87a7fd1866176481a5eef9a86a3f99e4bb2b [file] [log] [blame]
/** @file authenticator.h
*
* @brief This file contains the data structure for authenticator and supplicant.
*
* Copyright (C) 2014, 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
} hostsa_private, *phostsa_private;
#endif