windows-nt/Source/XPSP1/NT/public/sdk/inc/raseapif.h
2020-09-26 16:20:57 +08:00

650 lines
24 KiB
C

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
raseapif.h
Abstract:
Defines interface between a third party authentication module
and the Remote Access Service PPP engine.
--*/
#ifndef _RASEAPIF_
#define _RASEAPIF_
#if _MSC_VER > 1000
#pragma once
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if(WINVER >= 0x0500)
//
// Defines used for installtion of EAP DLL
//
// Custom EAP DLL (ex. Name=Sample.dll, Type=(decimal 40) regsitry installation)
//
// HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\PPP\EAP\40)
// Path (REG_EXPAND_SZ) %SystemRoot%\system32\sample.dll
// ConfigUIPath (REG_EXPAND_SZ) %SystemRoot%\system32\sample.dll
// InteractiveUIPath (REG_EXPAND_SZ) %SystemRoot%\system32\sample.dll
// IdentityPath (REG_EXPAND_SZ) %SystemRoot%\system32\sample.dll
// FriendlyName (REG_SZ) Sample EAP Protocol
// RequireConfigUI (REG_DWORD) 1
// ConfigCLSID (REG_SZ) {0000031A-0000-0000-C000-000000000046}
// StandaloneSupported (REG_DWORD) 1
//
#define RAS_EAP_REGISTRY_LOCATION \
TEXT("System\\CurrentControlSet\\Services\\Rasman\\PPP\\EAP")
#define RAS_EAP_VALUENAME_PATH TEXT("Path")
#define RAS_EAP_VALUENAME_CONFIGUI TEXT("ConfigUIPath")
#define RAS_EAP_VALUENAME_INTERACTIVEUI TEXT("InteractiveUIPath")
#define RAS_EAP_VALUENAME_IDENTITY TEXT("IdentityPath")
#define RAS_EAP_VALUENAME_FRIENDLY_NAME TEXT("FriendlyName")
#define RAS_EAP_VALUENAME_DEFAULT_DATA TEXT("ConfigData")
#define RAS_EAP_VALUENAME_REQUIRE_CONFIGUI TEXT("RequireConfigUI")
#define RAS_EAP_VALUENAME_ENCRYPTION TEXT("MPPEEncryptionSupported")
#define RAS_EAP_VALUENAME_INVOKE_NAMEDLG TEXT("InvokeUsernameDialog")
#define RAS_EAP_VALUENAME_INVOKE_PWDDLG TEXT("InvokePasswordDialog")
#define RAS_EAP_VALUENAME_CONFIG_CLSID TEXT("ConfigCLSID")
#define RAS_EAP_VALUENAME_STANDALONE_SUPPORTED TEXT("StandaloneSupported")
#define RAS_EAP_VALUENAME_ROLES_SUPPORTED TEXT("RolesSupported")
// Flags for RolesSupported.
#define RAS_EAP_ROLE_AUTHENTICATOR 0x00000001
#define RAS_EAP_ROLE_AUTHENTICATEE 0x00000002
#define RAS_EAP_ROLE_DISABLED_IN_VPN_CLIENT 0x00000004
//
// Following flags describe the hosting of EAP
// methods in PEAP or in EAP. If this role is
// missing the default behavior is to show the
// EAP method in PEAP and in EAP.
//
#define RAS_EAP_ROLE_EXCLUDE_IN_EAP 0x00000004
#define RAS_EAP_ROLE_EXCLUDE_IN_PEAP 0x00000008
#define RAS_EAP_ROLE_WIRELESS_EAP 0x00000010
#define RAS_EAP_ROLE_VPN_EAP 0x00000020
typedef enum _RAS_AUTH_ATTRIBUTE_TYPE_
{
raatMinimum = 0, // Undefined
raatUserName, // Value field is a Pointer
raatUserPassword, // Value field is a Pointer
raatMD5CHAPPassword, // Value field is a Pointer
raatNASIPAddress, // Value field is a 32 bit integral value
raatNASPort, // Value field is a 32 bit integral value
raatServiceType, // Value field is a 32 bit integral value
raatFramedProtocol, // Value field is a 32 bit integral value
raatFramedIPAddress, // Value field is a 32 bit integral value
raatFramedIPNetmask, // Value field is a 32 bit integral value
raatFramedRouting = 10, // Value field is a 32 bit integral value
raatFilterId, // Value field is a Pointer
raatFramedMTU, // Value field is a 32 bit integral value
raatFramedCompression, // Value field is a 32 bit integral value
raatLoginIPHost, // Value field is a 32 bit integral value
raatLoginService, // Value field is a 32 bit integral value
raatLoginTCPPort, // Value field is a 32 bit integral value
raatUnassigned17, // Undefined
raatReplyMessage, // Value field is a Pointer
raatCallbackNumber, // Value field is a Pointer
raatCallbackId =20, // Value field is a Pointer
raatUnassigned21, // Undefined
raatFramedRoute, // Value field is a Pointer
raatFramedIPXNetwork, // Value field is a 32 bit integral value
raatState, // Value field is a Pointer
raatClass, // Value field is a Pointer
raatVendorSpecific, // Value field is a Pointer
raatSessionTimeout, // Value field is a 32 bit integral value
raatIdleTimeout, // Value field is a 32 bit integral value
raatTerminationAction, // Value field is a 32 bit integral value
raatCalledStationId = 30, // Value field is a Pointer
raatCallingStationId, // Value field is a Pointer
raatNASIdentifier, // Value field is a Pointer
raatProxyState, // Value field is a Pointer
raatLoginLATService, // Value field is a Pointer
raatLoginLATNode, // Value field is a Pointer
raatLoginLATGroup, // Value field is a Pointer
raatFramedAppleTalkLink, // Value field is a 32 bit integral value
raatFramedAppleTalkNetwork, // Value field is a 32 bit integral value
raatFramedAppleTalkZone, // Value field is a Pointer
raatAcctStatusType = 40, // Value field is a 32 bit integral value
raatAcctDelayTime, // Value field is a 32 bit integral value
raatAcctInputOctets, // Value field is a 32 bit integral value
raatAcctOutputOctets, // Value field is a 32 bit integral value
raatAcctSessionId, // Value field is a Pointer
raatAcctAuthentic, // Value field is a 32 bit integral value
raatAcctSessionTime, // Value field is a 32 bit integral value
raatAcctInputPackets, // Value field is a 32 bit integral value
raatAcctOutputPackets, // Value field is a 32 bit integral value
raatAcctTerminateCause, // Value field is a 32 bit integral value
raatAcctMultiSessionId = 50, // Value field is a Pointer
raatAcctLinkCount, // Value field is a 32 bit integral value
raatAcctEventTimeStamp = 55, // Value field is a 32 bit integral value
raatMD5CHAPChallenge = 60, // Value field is a Pointer
raatNASPortType, // Value field is a 32 bit integral value
raatPortLimit, // Value field is a 32 bit integral value
raatLoginLATPort, // Value field is a Pointer
raatTunnelType, // Value field is a 32 bit integral value
raatTunnelMediumType, // Value field is a 32 bit integral value
raatTunnelClientEndpoint, // Value field is a Pointer
raatTunnelServerEndpoint, // Value field is a Pointer
raatARAPPassword = 70, // Value field is a Pointer
raatARAPFeatures, // Value field is a Pointer
raatARAPZoneAccess, // Value field is a 32 bit integral value
raatARAPSecurity, // Value field is a 32 bit integral value
raatARAPSecurityData, // Value field is a Pointer
raatPasswordRetry, // Value field is a 32 bit integral value
raatPrompt, // Value field is a 32 bit integral value
raatConnectInfo, // Value field is a Pointer
raatConfigurationToken, // Value field is a Pointer
raatEAPMessage, // Value field is a Pointer
raatSignature = 80, // Value field is a Pointer
raatARAPChallengeResponse = 84, // Value field is a Pointer
raatAcctInterimInterval = 85, // Value field is a 32 bit integral value
raatARAPGuestLogon = 8096, // Value field is a 32 bit integral value
raatCertificateOID, // Value field is a Pointer
raatReserved = 0xFFFFFFFF // Undefined
}RAS_AUTH_ATTRIBUTE_TYPE;
//
// VSA attribute ids for ARAP
//
#define raatARAPChallenge 33
#define raatARAPOldPassword 19
#define raatARAPNewPassword 20
#define raatARAPPasswordChangeReason 21
//
// Value is set to the 32 bit integral value or a pointer to data.
// 32 bit integral values should be in host format, not network format.
// Length for a 32 bit integral value can be 1, 2 or 4. The array of
// attributes must be terminated with an attribute of type raatMinimum.
//
typedef struct _RAS_AUTH_ATTRIBUTE
{
RAS_AUTH_ATTRIBUTE_TYPE raaType;
DWORD dwLength;
PVOID Value;
}RAS_AUTH_ATTRIBUTE, *PRAS_AUTH_ATTRIBUTE;
//
// EAP packet codes from EAP spec.
//
#define EAPCODE_Request 1
#define EAPCODE_Response 2
#define EAPCODE_Success 3
#define EAPCODE_Failure 4
#define MAXEAPCODE 4
//
// Values of the fFlags field in PPP_EAP_INPUT
// These have the same values as the RASEAPF_ flags in ras.h
//
#define RAS_EAP_FLAG_ROUTER 0x00000001 // This is a router
#define RAS_EAP_FLAG_NON_INTERACTIVE 0x00000002 // No UI should be displayed
#define RAS_EAP_FLAG_LOGON 0x00000004 // The user data was
// obtained from Winlogon
#define RAS_EAP_FLAG_PREVIEW 0x00000008 // User has checked
// "Prompt for information
// before dialing"
#define RAS_EAP_FLAG_FIRST_LINK 0x00000010 // This is the first link
#define RAS_EAP_FLAG_MACHINE_AUTH 0x00000020 // Use the default machine cert
// or user cert based on the
// application logon context
#define RAS_EAP_FLAG_GUEST_ACCESS 0x00000040 // Request to provide guest
// access.
#define RAS_EAP_FLAG_8021X_AUTH 0x00000080 // Anything specific to 8021x
// to be done in TLS
typedef struct _PPP_EAP_PACKET
{
BYTE Code; // 1-Request, 2-Response, 3-Success, 4-Failure
BYTE Id; // Id of this packet
BYTE Length[2]; // Length of this packet
BYTE Data[1]; // Data - First byte is Type for Request/Response
}PPP_EAP_PACKET, *PPPP_EAP_PACKET;
#define PPP_EAP_PACKET_HDR_LEN ( sizeof( PPP_EAP_PACKET ) - 1 )
//
// Interface structure between the engine and APs. This is passed to the
// AP's via the RasCpBegin call.
//
typedef struct _PPP_EAP_INPUT
{
//
// Size of this structure
//
DWORD dwSizeInBytes;
//
// The following five fields are valid only in RasEapBegin call
//
DWORD fFlags; // See RAS_EAP_FLAG_*
BOOL fAuthenticator; // Act as authenticator or authenticatee
WCHAR * pwszIdentity; // Users's identity
WCHAR * pwszPassword; // Client's account password. Only valid when
// fAuthenticator is FALSE.
BYTE bInitialId; // Initial packet identifier. Must be used for
// the first EAP packet sent by the DLL and
// incremented by one for each subsequent
// request packet.
//
// During the RasEapBegin call on the authenticator side, pUserAttributes
// contains the set of attributes for the currently dialed in user, e.g.,
// the port used, NAS IP Address, etc.
//
// When the fAuthenticationComplete flag is TRUE, pUserAttributes contains
// attributes (if any) returned by the authentication provider.
//
// This memory is not owned by the EAP DLL and should be treated as
// read-only.
//
RAS_AUTH_ATTRIBUTE * pUserAttributes;
//
// The next two fields are used only if the EAP DLL is using the
// currently configured authentication provider ex: RADIUS or Windows NT
// domain authentication, and the fAuthenticator field above is set to
// TRUE.
//
//
// Indicates that the authenticator has completed authentication.
// Ignore this field if an authentication provider is not being used.
//
BOOL fAuthenticationComplete;
//
// Result of the authentication process by the authentication provider.
// NO_ERROR indicates success, otherwise it is a value from winerror.h,
// raserror.h or mprerror.h indicating failure reason.
//
DWORD dwAuthResultCode;
//
// Valid only on the authenticatee side. This may be used on the
// authenticatee side to impersonate the user being authenticated.
//
OPTIONAL HANDLE hTokenImpersonateUser;
//
// This variable should be examined only by the authenticatee side.
// The EAP specification states that the success packet may be lost and
// since it is a non-acknowledged packet, reception of an NCP packet should
// be interpreted as a success packet. This varable is set to TRUE in this
// case only on the authenticatee side
//
BOOL fSuccessPacketReceived;
//
// Will be set to TRUE only when the user dismissed the interactive
// UI that was invoked by the EAP dll
//
BOOL fDataReceivedFromInteractiveUI;
//
// Data received from the Interactive UI. Will be set to
// non-NULL when fDataReceivedFromInteractiveUI is set to TRUE and
// RasEapInvokeInteractiveUI returned non-NULL data. This buffer will be
// freed by the PPP engine on return from the RasEapMakeMessage call. A
// copy of this data should be made in the EAP Dll's memory space.
//
OPTIONAL PBYTE pDataFromInteractiveUI;
//
// Size in bytes of data pointed to by pInteractiveConnectionData. This may
// be 0 if there was no data passed back by RasEapInvokeInteractiveUI.
//
DWORD dwSizeOfDataFromInteractiveUI;
//
// Connection data received from the Config UI. Will be set to non-NULL
// when the RasEapBegin call is made and the RasEapInvokeConfigUI
// returned non-NULL data. This buffer will be freed by the PPP engine
// on return from the RasEapBegin call. A copy of this data should
// be made in the EAP Dll's memory space.
//
OPTIONAL PBYTE pConnectionData;
//
// Size in bytes of data pointed to by pConnectionData. This may be
// 0 if there was no data passed back by the RasEapInvokeConfigUI call.
//
DWORD dwSizeOfConnectionData;
//
// User data received from the Identity UI or Interactive UI. Will be set
// to non-NULL when the RasEapBegin call is made if such data exists.
// This buffer will be freed by the PPP engine on return from the
// RasEapBegin call. A copy of this data should be made in the EAP Dll's
// memory space.
//
OPTIONAL PBYTE pUserData;
//
// Size in bytes of data pointed to by pUserData. This may be 0 if there
// is no data.
//
DWORD dwSizeOfUserData;
//
// Reserved.
//
HANDLE hReserved;
}PPP_EAP_INPUT, *PPPP_EAP_INPUT;
typedef enum _PPP_EAP_ACTION
{
//
// These actions are provided by the EAP DLL as output from the
// RasEapMakeMessage API. They tell the PPP engine what action (if any) to
// take on the EAP DLL's behalf, and eventually inform the engine that the
// EAP DLL has finished authentication.
//
EAPACTION_NoAction, // Be passive, i.e. listen without timeout (default)
EAPACTION_Authenticate, // Invoke the back-end authenticator.
EAPACTION_Done, // End auth session, dwAuthResultCode is set
EAPACTION_SendAndDone, // As above but send message without timeout first
EAPACTION_Send, // Send message, don't timeout waiting for reply
EAPACTION_SendWithTimeout, // Send message, timeout if reply not received
EAPACTION_SendWithTimeoutInteractive // As above, but don't increment
// retry count
}PPP_EAP_ACTION;
typedef struct _PPP_EAP_OUTPUT
{
//
// Size of this structure
//
DWORD dwSizeInBytes;
//
// Action that the PPP engine should take
//
PPP_EAP_ACTION Action;
//
// dwAuthResultCode is valid only with an Action code of Done or
// SendAndDone. Zero value indicates succesful authentication.
// Non-zero indicates unsuccessful authentication with the value
// indicating the reason for authentication failure.
// Non-zero return codes should be only from winerror.h, raserror.h and
// mprerror.h
//
DWORD dwAuthResultCode;
//
// When Action is EAPACTION_Authenticate, pUserAttributes may contain
// additional attributes necessary to authenticate the user, e.g.,
// User-Password. If no credentials are presented, the back-end
// authenticator will assume the user is authentic and only retrieve
// authorizations.
//
// When Action is EAPACTION_Done, EAPACTION_SendAndDone, or EAPACTION_Send,
// pUserAttributes may contain additional attributes for the user. These
// attributes will overwrite any attributes of the same type returned by
// the back-end authenticator.
//
// It is up to the EAP DLL to free this memory in RasEapEnd call.
//
OPTIONAL RAS_AUTH_ATTRIBUTE * pUserAttributes;
//
// Flag set to true will cause the RasEapInvokeInteractiveUI call to be
// made.
//
BOOL fInvokeInteractiveUI;
//
// Pointer to context data, if any, to be sent to the UI. The EAP dll
// is responsible for freeing this buffer in the RasEapEnd call or when
// a response from the user for this invocation is obtained.
//
OPTIONAL PBYTE pUIContextData;
//
// Size in bytes of the data pointed to by pUIContextData. Ignored if
// pUIContextData is NULL
//
DWORD dwSizeOfUIContextData;
//
// When set to TRUE, indicates that the information pointed to by
// pConnectionData should be saved in the phonebook. Only valid on
// the authenticatee side.
//
BOOL fSaveConnectionData;
//
// If fSaveConnectionData above is true, the data pointed to by
// pConnectionData will be saved in the phonebook. This data
// must be freed by the DLL when the RasEapEnd call is made.
//
OPTIONAL PBYTE pConnectionData;
//
// Size, in bytes, of the data pointed to by pConnectionData
//
DWORD dwSizeOfConnectionData;
//
// When set to TRUE, indicates that the information pointed to by
// pUserData should be saved in the registry for this user. Only valid
// on the authenticatee side.
//
BOOL fSaveUserData;
//
// If fSaveUserData above is true, the data pointed to by pUserData will be
// saved in the registry for this user. This data must be freed by the DLL
// when the RasEapEnd call is made.
//
OPTIONAL PBYTE pUserData;
//
// Size, in bytes, of the data pointed to by pUserData
//
DWORD dwSizeOfUserData;
}PPP_EAP_OUTPUT, *PPPP_EAP_OUTPUT;
typedef struct _PPP_EAP_INFO
{
//
// Size of this structure
//
DWORD dwSizeInBytes;
DWORD dwEapTypeId;
//
// Called to initialize/uninitialize this module. This will be called before
// any other call is made. fInitialize will be TRUE iff the module has to be
// initialized. Must return errorcodes only from winerror.h, raserror.h or
// mprerror.h
//
DWORD (APIENTRY *RasEapInitialize)( IN BOOL fInitialize );
//
// Called to get a context buffer for this EAP session and pass
// initialization information. This will be called before any other
// call is made, except RasEapInitialize. Must return errorcodes only from
// winerror.h, raserror.h or mprerror.h
//
DWORD (APIENTRY *RasEapBegin)( OUT VOID ** ppWorkBuffer,
IN PPP_EAP_INPUT * pPppEapInput );
//
// Called to free the context buffer for this EAP session.
// Called after this session is completed successfully or not, provided
// the RasEapBegin call for this EAP session returned successfully.
// Must return errorcodes only from winerror.h, raserror.h or mprerror.h
//
DWORD (APIENTRY *RasEapEnd)( IN VOID * pWorkBuffer );
//
// Called to process an incomming packet and/or send a packet.
// cbSendPacket is the size in bytes of the buffer pointed to by
// pSendPacket. Must return errorcodes only from winerror.h, raserror.h or
// mprerror.h. Error return code indicates an error occurance during the
// authentication process.
//
DWORD (APIENTRY *RasEapMakeMessage)(
IN VOID* pWorkBuf,
IN PPP_EAP_PACKET* pReceivePacket,
OUT PPP_EAP_PACKET* pSendPacket,
IN DWORD cbSendPacket,
OUT PPP_EAP_OUTPUT* pEapOutput,
IN PPP_EAP_INPUT* pEapInput );
}PPP_EAP_INFO, *PPPP_EAP_INFO;
//
// RasEapGetInfo should be exported by the 3rd party EAP dll installed in the
// registry via the Path value.
//
DWORD APIENTRY
RasEapGetInfo(
IN DWORD dwEapTypeId,
OUT PPP_EAP_INFO* pEapInfo
);
//
// RasEapFreeMemory should be exported by the 3rd party EAP dlls installed in
// the registry via the InteractiveUIPath, ConfigUIPath, and IdentityPath
// values.
//
DWORD APIENTRY
RasEapFreeMemory(
IN BYTE* pMemory
);
//
// RasEapInvokeInteractiveUI and RasEapFreeMemory should be exported by the
// 3rd party EAP dll installed in the registry via the InteractiveUIPath
// value.
//
DWORD APIENTRY
RasEapInvokeInteractiveUI(
IN DWORD dwEapTypeId,
IN HWND hwndParent,
IN BYTE* pUIContextData,
IN DWORD dwSizeOfUIContextData,
OUT BYTE** ppDataFromInteractiveUI,
OUT DWORD* pdwSizeOfDataFromInteractiveUI
);
//
// RasEapInvokeConfigUI and RasEapFreeMemory should be exported by the
// 3rd party EAP dll installed in the registry via the ConfigUIPath value.
//
DWORD APIENTRY
RasEapInvokeConfigUI(
IN DWORD dwEapTypeId,
IN HWND hwndParent,
IN DWORD dwFlags,
IN BYTE* pConnectionDataIn,
IN DWORD dwSizeOfConnectionDataIn,
OUT BYTE** ppConnectionDataOut,
OUT DWORD* pdwSizeOfConnectionDataOut
);
//
// RasEapGetIdentity and RasEapFreeMemory should be exported by the
// 3rd party EAP dll installed in the registry via the IdentityPath value.
//
DWORD APIENTRY
RasEapGetIdentity(
IN DWORD dwEapTypeId,
IN HWND hwndParent,
IN DWORD dwFlags,
IN const WCHAR* pwszPhonebook,
IN const WCHAR* pwszEntry,
IN BYTE* pConnectionDataIn,
IN DWORD dwSizeOfConnectionDataIn,
IN BYTE* pUserDataIn,
IN DWORD dwSizeOfUserDataIn,
OUT BYTE** ppUserDataOut,
OUT DWORD* pdwSizeOfUserDataOut,
OUT WCHAR** ppwszIdentity
);
#endif /* WINVER >= 0x0500 */
#ifdef __cplusplus
}
#endif
#endif // _RASEAPIF_