/*++

Copyright (c) 2000, Microsoft Corporation

Module Name:
    eapolutil.h

Abstract:

    Definitions for tools and ends


Revision History:

    sachins, May 04 2000, Created

--*/

#ifndef _EAPOLUTIL_H_
#define _EAPOLUTIL_H_

//
// EAPOL_ZC_INTF
//
// Used to transfer data between 802.1X and Zero Config
//

typedef struct  _EAPOL_ZC_INTF
{
    DWORD                           dwAuthFailCount;
    EAPOL_AUTHENTICATION_TYPE       PreviousAuthenticationType;
    DWORD                           dwSizeOfSSID;
    BYTE                            bSSID[MAX_SSID_LEN];
} EAPOL_ZC_INTF, *PEAPOL_ZC_INTF;

//
// STRUCT: EAPOLUIRESPFUNC
//

typedef DWORD (*EAPOLUIRESPFUNC) (EAPOL_EAP_UI_CONTEXT, EAPOLUI_RESP);

//
// STRUCT: EAPOLUIRESPFUNCMAP
//

typedef struct _EAPOLUIRESPFUNCMAP
{
    DWORD               dwEAPOLUIMsgType;
    EAPOLUIRESPFUNC     EapolRespUIFunc;
    DWORD               dwNumBlobs;
} EAPOLUIRESPFUNCMAP, *PEAPOLUIRESPFUNCMAP;


//
// Definitions and structures used in creating default EAP-TLS connection
// blob in the registry
// Ensure that the EAP-TLS structures defined below are always in sync 
// with those defined in EAP-TLS code directory
//

#define     EAPTLS_CONN_FLAG_REGISTRY           0x00000001
#define     EAPTLS_CONN_FLAG_NO_VALIDATE_CERT   0x00000002
#define     EAPTLS_CONN_FLAG_NO_VALIDATE_NAME   0x00000004

typedef struct _EAPTLS_CONN_PROPERTIES
{
    DWORD       dwVersion;
    DWORD       dwSize;
    DWORD       fFlags;
    DWORD       cbHash;
    BYTE        pbHash[20]; // MAX_HASH_SIZE = 20
    WCHAR       awszServerName[1];
} EAPTLS_CONN_PROPERTIES, *PEAPTLS_CONN_PROPERTIES;


//
// FUNCTION DECLARATIONS
//

extern 
HANDLE
GetCurrentUserTokenW (
        WCHAR       Winsta[],
        DWORD       DesiredAccess
        );

VOID
HostToWireFormat16(
    IN 	   WORD         wHostFormat,
    IN OUT PBYTE        pWireFormat
    );

WORD
WireToHostFormat16(
    IN PBYTE                pWireFormat
    );

VOID
HostToWireFormat32(
    IN 	   DWORD            dwHostFormat,
    IN OUT PBYTE            pWireFormat
    );

DWORD
WireToHostFormat32(
    IN PBYTE pWireFormat
    );

DWORD
ElSetCustomAuthData (
        IN  WCHAR       *pwszGuid,
        IN  DWORD       dwEapTypeId,
        IN  DWORD       dwSizeOfSSID,
        IN  BYTE        *pbSSID,
        IN  BYTE        *pbConnInfo,
        IN  DWORD       *pdwInfoSize
        );

DWORD
ElGetCustomAuthData (
        IN  WCHAR           *pwszGuid,
        IN  DWORD           dwEapTypeId,
        IN  DWORD           dwSizeOfSSID,
        IN  BYTE            *pbSSID,
        IN  OUT BYTE        *pbConnInfo,
        IN  OUT DWORD       *pdwInfoSize
        );

DWORD
ElReAuthenticateInterface (
        IN  WCHAR           *pwszGuid);

DWORD
WINAPI
ElReAuthenticateInterfaceWorker (
        IN  PVOID           pvContext);

DWORD
ElSetEapUserInfo (
        IN  HANDLE      hToken,
        IN  WCHAR       *pwszGuid,
        IN  DWORD       dwEapTypeId,
        IN  DWORD       dwSizeOfSSID,
        IN  BYTE        *pbSSID,
        IN  BYTE        *pbUserInfo,
        IN  DWORD       dwInfoSize
        );

DWORD
ElGetEapUserInfo (
        IN  HANDLE          hToken,
        IN  WCHAR           *pwszGuid,
        IN  DWORD           dwEapTypeId,
        IN  DWORD           dwSizeOfSSID,
        IN  BYTE            *pbSSID,
        IN  OUT BYTE        *pbUserInfo,
        IN  OUT DWORD       *pdwInfoSize
        );

DWORD
ElDeleteEapUserInfo (
        IN  HANDLE          hToken,
        IN  WCHAR           *pwszGUID,
        IN  DWORD           dwEapTypeId,
        IN  DWORD           dwSizeOfSSID,
        IN  BYTE            *pbSSID
        );

DWORD
ElSetInterfaceParams (
        IN  WCHAR           *pwszGUID,
        IN  EAPOL_INTF_PARAMS  *pIntfParams
        );

DWORD
ElGetInterfaceParams (
        IN  WCHAR           *pwszGUID,
        IN  OUT EAPOL_INTF_PARAMS  *pIntfParams
        );

DWORD
ElQueryInterfaceState (
        IN  WCHAR           *pwszGUID,
        IN  OUT EAPOL_INTF_STATE  *pIntfState
        );

DWORD
ElGetEapData (
        IN  DWORD   dwEapType,
        IN  DWORD   dwSizeOfIn,
        IN  BYTE    *pbBufferIn,
        IN  DWORD   dwOffset,
        IN  DWORD   *pdwSizeOfOut,
        IN  PBYTE   *ppbBufferOut
        );

DWORD
ElSetEapData (
        IN  DWORD   dwEapType,
        IN  DWORD   *pdwSizeOfIn,
        IN  PBYTE   *ppbBufferIn,
        IN  DWORD   dwOffset,
        IN  DWORD   dwAuthData,
        IN  PBYTE   pbAuthData
        );

DWORD
ElGetEapKeyFromToken (
        IN  HANDLE      hUserToken,
        OUT HKEY        *phkey
        );

DWORD
ElInitRegPortData (
        IN  WCHAR       *pszDeviceGUID
        );

DWORD
ElCreateDefaultEapData (
        IN OUT  DWORD       *pdwSizeOfEapData,
        IN OUT  BYTE        *pbEapData
        );

RAS_AUTH_ATTRIBUTE *
ElAuthAttributeGetVendorSpecific (
        IN  DWORD                       dwVendorId,
        IN  DWORD                       dwVendorType,
        IN  RAS_AUTH_ATTRIBUTE          *pAttributes
        );

RAS_AUTH_ATTRIBUTE *
ElAuthAttributeGetFirst (
        IN  RAS_AUTH_ATTRIBUTE_TYPE     raaType,
        IN  RAS_AUTH_ATTRIBUTE          *pAttributes,
        OUT HANDLE                      *phAttribute
        );

RAS_AUTH_ATTRIBUTE *
ElAuthAttributeGetNext (
        IN  OUT HANDLE                  *phAttribute,
        IN  RAS_AUTH_ATTRIBUTE_TYPE     raaType
        );

RAS_AUTH_ATTRIBUTE *
ElAuthAttributeGet (
        IN  RAS_AUTH_ATTRIBUTE_TYPE     raaType,
        IN  RAS_AUTH_ATTRIBUTE          *pAttributes
        );

VOID
ElReverseString (
        IN  CHAR        *psz 
    );

CHAR*
ElEncodePw (
        IN OUT CHAR     *pszPassword 
    );

CHAR*
ElDecodePw (
        IN OUT CHAR     *pszPassword 
    );

DWORD
ElSecureEncodePw (
    IN  BYTE        *pbPassword,
    IN  DWORD       dwSizeOfPassword,
    OUT DATA_BLOB   *pDataBlob
    );

DWORD
ElSecureDecodePw (
    IN  DATA_BLOB   *pDataBlob,
    OUT PBYTE       *ppbPassword,
    OUT DWORD       *pdwSizeOfPassword
    );

VOID
ElEncryptBlockUsingMD5 (
        IN  BYTE        *pbSecret,
        IN  ULONG       ulSecretLen,
        IN  OUT BYTE    *pbBuf,
        IN  ULONG       ulBufLen
        );

VOID
ElDecryptBlockUsingMD5 (
        IN  BYTE        *pbSecret,
        IN  ULONG       ulSecretLen,
        IN  OUT BYTE    *pbBuf,
        IN  ULONG       ulBufLen
        );

VOID
ElGetHMACMD5Digest (
        IN      BYTE        *pbBuf,     
        IN      DWORD       dwBufLen,   
        IN      BYTE        *pbKey,
        IN      DWORD       dwKeyLen,
        IN OUT  VOID        *pvDigest
        );

DWORD
ElWmiGetValue (
        IN  GUID        *pGuid,
        IN  CHAR        *pszInstanceName,
        IN  OUT BYTE    *pbOutputBuffer,
        IN  OUT DWORD   *pdwOutputBufferSize
        );

DWORD
ElWmiSetValue (
        IN  GUID        *pGuid,
        IN  CHAR        *pszInstanceName,
        IN  BYTE        *pbInputBuffer,
        IN  DWORD       dwInputBufferSize
        );

DWORD
ElNdisuioSetOIDValue (
        IN  HANDLE      hInterface,
        IN  NDIS_OID    Oid,
        IN  BYTE        *pbOidData,
        IN  ULONG       ulOidDataLength
        );

DWORD
ElNdisuioQueryOIDValue (
        IN  HANDLE      hInterface,
        IN  NDIS_OID    Oid,
        IN  BYTE        *pbOidData,
        IN  ULONG       *pulOidDataLength
        );

DWORD 
ElGuidFromString (
        IN  OUT GUID        *pGuid,
        IN      WCHAR       *pwszGuidString
        );

DWORD
ElGetLoggedOnUserName (
        IN      HANDLE      hToken,
        OUT     PWCHAR      *ppwszActiveUserName
        );

DWORD
ElGetMachineName (
        IN      EAPOL_PCB       *pPCB
        );

DWORD
ElUpdateRegistryInterfaceList (
        IN      PNDIS_ENUM_INTF     Interfaces
        );

DWORD
ElEnumAndUpdateRegistryInterfaceList (
        );

DWORD
WINAPI
ElWatchGlobalRegistryParams (
        IN      PVOID       pvContext
        );

DWORD
ElReadGlobalRegistryParams ();

DWORD
WINAPI
ElWatchEapConfigRegistryParams (
        IN      PVOID       pvContext
        );

DWORD
ElReadGlobalRegistryParams ();

DWORD 
ElPostEapConfigChanged (
        IN      WCHAR               *pwszGuid,
        IN      EAPOL_INTF_PARAMS   *pIntfParams   
        );

DWORD
WINAPI
ElProcessEapConfigChange (
        IN      PVOID       pvContext
        );

VOID
ElStringToGuid (
        IN      WCHAR       *pwszGuid,
        OUT     LPGUID      pGuid      
        );

DWORD
ElGetIdentity (
        IN      EAPOL_PCB   *pPCB
        );

HANDLE
ElNLAConnectLPC ();

VOID
ElNLACleanupLPC ();

VOID
ElNLARegister_802_1X ( 
        IN      PLOCATION_802_1X plocation 
        );

VOID
ElNLADelete_802_1X (
        IN      PLOCATION_802_1X plocation
        );

DWORD
ElGetInterfaceNdisStatistics (  
        IN      WCHAR           *pszInterfaceName,
        IN OUT  NIC_STATISTICS  *pStats
        );

DWORD
ElCheckUserLoggedOn (
        );

DWORD
ElCheckUserModuleReady (
        );

DWORD 
ElGetWinStationUserToken (
        IN  DWORD       dwSessionId,
        IN  PHANDLE     pUserToken
        );

#ifdef  ZEROCONFIG_LINKED

DWORD
ElZeroConfigEvent (
        IN      DWORD               dwHandle,
        IN      WCHAR               *pwszGuid,
        IN      NDIS_802_11_SSID    ndSSID,
        IN      PRAW_DATA           prdUserData
        );

DWORD
ElZeroConfigNotify (
        IN      DWORD               dwHandle,
        IN      DWORD               dwCmdCode,
        IN      WCHAR               *pwszGuid,
        IN      EAPOL_ZC_INTF       *pZCData
        );

#endif // ZEROCONFIG_LINKED

DWORD
ElNetmanNotify (
        IN  EAPOL_PCB           *pPCB,
        IN  EAPOL_NCS_STATUS    Status,
        IN  WCHAR               *pwszDisplayMessage
        );

DWORD
ElPostShowBalloonMessage (
        IN  EAPOL_PCB           *pPCB,
        IN  DWORD               cbCookie,
        IN  BYTE                *pbCookie,
        IN  DWORD               cbMessageLen,
        IN  WCHAR               *pwszMessage
        );

DWORD
ElProcessReauthResponse (
        IN  EAPOL_EAP_UI_CONTEXT    EapolUIContext,
        IN  EAPOLUI_RESP            EapolUIResp
        );

DWORD
WINAPI
ElIPPnPWorker (
        IN      PVOID       pvContext
        );

DWORD
ElUpdateRegistry (
        );

DWORD
ElRegistryUpdateXPBeta2 (
        );

DWORD
ElRegistryUpdateXPSP1 (
        );

DWORD
ElReadPolicyParams (
        );

#endif // _EAPOLUTIL_H_