2024-09-09 08:59:52 +00:00

218 lines
7.2 KiB
C
Executable File

#ifndef LIB1X_KMSM_H
#define LIB1X_KMSM_H
#include "1x_common.h"
#define TRUE 1
#define FALSE 0
#define SWAP(a, b) { tmp = b; b = a; a = tmp;}
#define NumGroupKey 4
#define REJECT_EAPOLSTART_COUNTER 3
typedef enum {SUCCESS = 0, ERROR_NULL_PSK = -1, ERROR_TIMEOUT = -2, ERROR_MIC_FAIL = -3,
ERROR_SET_PTK = -4, ERROR_NONEEQUL_REPLAYCOUNTER = -5,
ERROR_EQUALSMALLER_REPLAYCOUNTER = -6, ERROR_NONEQUAL_NONCE = -7, ERROR_AESKEYWRAP_MIC_FAIL = -8,
ERROR_LARGER_REPLAYCOUNTER = -9, ERROR_UNMATCHED_GROUPKEY_LEN = -10,
#ifdef RTL_WPA2_CLIENT
ERROR_NONEQUAL_RSNIE = -11, ERROR_RECV_4WAY_MESSAGE2_AGAIN = -12, ERROR_PMKID_PSK = -13, ERROR_PMKID_TLS = -14, ERROR_SECOND_RSNIE = -15} KMSM_ERROR_ID;
#else
ERROR_NONEQUAL_RSNIE = -11, ERROR_RECV_4WAY_MESSAGE2_AGAIN = -12} KMSM_ERROR_ID;
#endif
#define KM_STRERROR_NULL_PSK "NUUL Pairwise Share Key"
#define KM_STRERROR_TIMEOUT "Time Out"
#define KM_STRERROR_MIC_FAIL "MIC Failure"
#define KM_STRERROR_SET_PTK "Fail to set Pairwise Transient Key"
#define KM_STRERROR_NONEEQUL_REPLAYCOUNTER "Non Equal Replay "
#define KM_STRERROR_EQUALSMALLER_REPLAYCOUNTER "Equal/Smaller Replay "
#define KM_STRERROR_NONEQUAL_NONCE "Non Equal Nonce received in 3rd Message"
#define KM_STRERROR_AESKEYWRAP_MIC_FAIL "AES_WRAP MIC Fail"
#define KM_STRERROR_LARGER_REPLAYCOUNTER "Larger Replay "
#define KM_STRERROR_UNMATCHED_GROUPKEY_LEN "Invalid Group key length received"
#define KM_STRERROR_NONEQUAL_RSNIE "Non Equal RSN Information Element received"
typedef enum { akmsm_DEAUTHENTICATE, akmsm_DISCONNECTED, akmsm_INITIALIZE, \
akmsm_AUTHENTICATION, akmsm_INITPMK, akmsm_INITPSK, \
akmsm_PTKSTART, akmsm_PTKINITNEGOTIATING, \
akmsm_PTKINITDONE, akmsm_UPDATEKEYS, akmsm_MICFAILURE,\
akmsm_SETKEYS, akmsm_SETKEYSDONE, \
// Added states that are not in IEEE 802.11i/D3.0 8.5.6.1
// but appears in state machine diagram in Figure 53(p.113)
akmsm_DISCONNECT, akmsm_AUTHENTICATION2, aksm_INITPSK, aksm_PTKINITDONE, \
akmsm_INTEGRITYFAILURE, \
// Added states
akmsm_ERRORHANDLE} AUTH_PAIRWISEKEY_STATE;
typedef enum {gkmsm_REKEYNEGOTIATING, gkmsm_REKEYESTABLISHED, gkmsm_KEYERROR} AUTH_GROUPKEY_STATE;
typedef enum {
akmsm_EVENT_NoEvent,
akmsm_EVENT_AssociationRequest, akmsm_EVENT_ReAssociationRequest,
akmsm_EVENT_AuthenticationRequest, akmsm_EVENT_ReAuthenticationRequest,
akmsm_EVENT_AuthenticationSuccess,
akmsm_EVENT_Disconnect, akmsm_EVENT_DeauthenticationRequest, akmsm_EVENT_Init, akmsm_EVENT_Disassociate,
akmsm_EVENT_IntegrityFailure, akmsm_EVENT_EAPOLKeyRecvd,
akmsm_EVENT_TimeOut}Auth_Key_Manage_Event;
struct Global_Params_tag;
typedef struct Auth_GroupKeyManage_tag
{
// The Variables.
BOOLEAN GTKAuthenticator;
int GKeyDoneStations;
BOOLEAN GTKRekey;
BOOLEAN GInitAKeys;
BOOLEAN GInitDone;
BOOLEAN GUpdateStationKeys;
//int GNoStations; //== auth->NumOfSupplicant
BOOLEAN GkeyReady;
BOOLEAN GKeyFailure; //added by Emily
OCTET_STRING GNonce;
u_char GTK[NumGroupKey][GTK_LEN];
u_char GMK[GMK_LEN];
int GN;
int GM;
#ifdef CONFIG_IEEE80211W
unsigned char IGTK[2][IGTK_LEN];
int GN_igtk, GM_igtk;
union PN48 IGTK_PN;
#endif //CONFIG_IEEE80211W
u_long GRekeyCounts;
BOOLEAN GResetCounter;
}AGKeyManage_SM;
typedef struct Auth_PairwiseKeyManage_tag
{
// The machine state
AUTH_PAIRWISEKEY_STATE state;
AUTH_GROUPKEY_STATE gstate;
// The Variables.
//802.1x related variable
BOOLEAN eapStart;
u_long SessionTimeout;
u_long SessionTimeoutCounter;
u_long SessionTimeoutEnabled;
u_long IdleTimeout;
u_long IdleTimeoutCounter;
u_long IdleTimeoutEnabled;
u_long InterimTimeout;
u_long InterimTimeoutCounter;
u_long InterimTimeoutEnabled;
//-----------Event
BOOLEAN AuthenticationRequest;
BOOLEAN ReAuthenticationRequest;
BOOLEAN DeauthenticationRequest;
BOOLEAN Disconnect;
BOOLEAN Init;
BOOLEAN Pair;
BOOLEAN RadiusKeyAvailable;
BOOLEAN EAPOLKeyReceived;
BOOLEAN EAPOLKeySend; //added by Emily
BOOLEAN TimeoutEvt;
int TimeoutCtr;
//sc_yang
int TickCnt;
BOOLEAN L2Failure;
BOOLEAN MICVerified;
BOOLEAN IntegrityFailed;
BOOLEAN PInitAKeys;
//int ; //sc_yang
OCTET_STRING ANonce;
OCTET_STRING SNonce; //added by Emily
u_char PMK[PMK_LEN];
#ifdef RTL_WPA2
u_char PMKID[PMKID_LEN];
#endif
u_char PTK[PTK_LEN];
OCTET_STRING SuppInfoElement;
OCTET_STRING AuthInfoElement;
LARGE_INTEGER CurrentReplayCounter;
LARGE_INTEGER ReplayCounterStarted; // david+1-11-2007
u_short ErrorRsn;
struct Global_Params_tag *global;
BOOLEAN IfCalcMIC;
BOOLEAN bWaitForPacket;
int IgnoreEAPOLStartCounter;
//Abocom
/*
u_long SessionTimeout;
u_long IdleTimeout;
u_long InterimTimeout;
u_long SessionTimeoutCounter;
u_long IdleTimeoutCounter;
u_long InterimTimeoutCounter;
*/
}APKeyManage_SM;
int lib1x_akmsm_SendEAPOL_proc(Global_Params * global);
int lib1x_akmsm_ProcessEAPOL_proc(Global_Params * global);
int lib1x_akmsm_trans( Global_Params * global);
void lib1x_akmsm_execute( Global_Params * global);
void lib1x_akmsm_dump(Global_Params * global );
void lib1x_skmsm_execute( Global_Params * global);
int lib1x_skmsm_ProcessEAPOL_proc(Global_Params * global);
void lib1x_akmsm_EAPOLStart_Timer_proc(Dot1x_Authenticator * auth);
void lib1x_akmsm_Account_Timer_proc(Dot1x_Authenticator * auth);
int lib1x_akmsm_Disconnect( Global_Params * global);
int MIN(u_char * ucStr1, u_char * ucStr2, u_long ulLen);
void CalcPTK(u_char *addr1, u_char *addr2, u_char *nonce1,
u_char *nonce2, u_char * keyin, int keyinlen,
u_char * keyout, int keyoutlen
#ifdef CONFIG_IEEE80211W
,int use_sha256
#endif /* CONFIG_IEEE80211W */
);
void GenNonce(u_char * nonce, u_char * szRandom);
char * KM_STRERR(int err);
void KeyDump(char *fun, u_char *buf, int siz, char *comment);
OCTET32_INTEGER * INCOctet32_INTEGER(OCTET32_INTEGER * x);
int _tmain();
#endif //LIB1X_KMSM_H