windows-nt/Source/XPSP1/NT/ds/security/protocols/xtcb/usermode.c
2020-09-26 16:20:57 +08:00

414 lines
9 KiB
C

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1997.
//
// File: usermode.c
//
// Contents: User mode entry points for test package
//
// Classes:
//
// Functions:
//
// History: 2-21-97 RichardW Created
//
//----------------------------------------------------------------------------
#include "xtcbpkg.h"
PSECPKG_DLL_FUNCTIONS UserTable ;
SECPKG_USER_FUNCTION_TABLE XtcbUserTable =
{
XtcbInstanceInit,
XtcbInitUserModeContext,
XtcbMakeSignature,
XtcbVerifySignature,
XtcbSealMessage,
XtcbUnsealMessage,
XtcbGetContextToken,
XtcbQueryContextAttributes,
XtcbCompleteAuthToken,
XtcbDeleteUserModeContext
};
NTSTATUS
SEC_ENTRY
SpUserModeInitialize(
IN ULONG LsaVersion,
OUT PULONG PackageVersion,
OUT PSECPKG_USER_FUNCTION_TABLE * UserFunctionTable,
OUT PULONG pcTables)
{
if (LsaVersion != SECPKG_INTERFACE_VERSION)
{
DebugLog((DEB_ERROR,"Invalid LSA version: %d\n", LsaVersion));
return(STATUS_INVALID_PARAMETER);
}
*PackageVersion = SECPKG_INTERFACE_VERSION ;
*UserFunctionTable = &XtcbUserTable;
*pcTables = 1;
return( STATUS_SUCCESS );
}
NTSTATUS NTAPI
XtcbInstanceInit(
IN ULONG Version,
IN PSECPKG_DLL_FUNCTIONS DllFunctionTable,
OUT PVOID * UserFunctionTable
)
{
NTSTATUS Status = STATUS_SUCCESS;
XtcbUserContextInit();
UserTable = DllFunctionTable ;
return(Status);
}
//+-------------------------------------------------------------------------
//
// Function: XtcbDeleteUserModeContext
//
// Synopsis: Deletes a user mode context by unlinking it and then
// dereferencing it.
//
// Effects:
//
// Arguments: ContextHandle - Lsa context handle of the context to delete
//
// Requires:
//
// Returns: STATUS_SUCCESS on success, STATUS_INVALID_HANDLE if the
// context can't be located
//
// Notes:
//
//
//--------------------------------------------------------------------------
NTSTATUS NTAPI
XtcbDeleteUserModeContext(
IN LSA_SEC_HANDLE ContextHandle
)
{
XtcbDeleteUserContext( ContextHandle );
return( SEC_E_OK );
}
//+-------------------------------------------------------------------------
//
// Function: XtcbInitUserModeContext
//
// Synopsis: Creates a user-mode context from a packed LSA mode context
//
// Effects:
//
// Arguments: ContextHandle - Lsa mode context handle for the context
// PackedContext - A marshalled buffer containing the LSA
// mode context.
//
// Requires:
//
// Returns: STATUS_SUCCESS or STATUS_INSUFFICIENT_RESOURCES
//
// Notes:
//
//
//--------------------------------------------------------------------------
NTSTATUS NTAPI
XtcbInitUserModeContext(
IN LSA_SEC_HANDLE ContextHandle,
IN PSecBuffer PackedContext
)
{
SECURITY_STATUS scRet = SEC_E_INVALID_HANDLE ;
scRet = XtcbAddUserContext( ContextHandle, PackedContext );
if ( NT_SUCCESS( scRet ) )
{
FreeContextBuffer( PackedContext->pvBuffer );
}
return( scRet );
}
//+-------------------------------------------------------------------------
//
// Function: XtcbMakeSignature
//
// Synopsis: Signs a message buffer by calculatinga checksum over all
// the non-read only data buffers and encrypting the checksum
// along with a nonce.
//
// Effects:
//
// Arguments: ContextHandle - Handle of the context to use to sign the
// message.
// QualityOfProtection - Unused flags.
// MessageBuffers - Contains an array of buffers to sign and
// to store the signature.
// MessageSequenceNumber - Sequence number for this message,
// only used in datagram cases.
//
// Requires: STATUS_INVALID_HANDLE - the context could not be found or
// was not configured for message integrity.
// STATUS_INVALID_PARAMETER - the signature buffer could not
// be found.
// STATUS_BUFFER_TOO_SMALL - the signature buffer is too small
// to hold the signature
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
NTSTATUS NTAPI
XtcbMakeSignature(
IN LSA_SEC_HANDLE ContextHandle,
IN ULONG QualityOfProtection,
IN PSecBufferDesc MessageBuffers,
IN ULONG MessageSequenceNumber
)
{
return( SEC_E_UNSUPPORTED_FUNCTION );
}
//+-------------------------------------------------------------------------
//
// Function: XtcbVerifySignature
//
// Synopsis: Verifies a signed message buffer by calculating a checksum over all
// the non-read only data buffers and encrypting the checksum
// along with a nonce.
//
// Effects:
//
// Arguments: ContextHandle - Handle of the context to use to sign the
// message.
// MessageBuffers - Contains an array of signed buffers and
// a signature buffer.
// MessageSequenceNumber - Sequence number for this message,
// only used in datagram cases.
// QualityOfProtection - Unused flags.
//
// Requires: STATUS_INVALID_HANDLE - the context could not be found or
// was not configured for message integrity.
// STATUS_INVALID_PARAMETER - the signature buffer could not
// be found or was too small.
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
NTSTATUS NTAPI
XtcbVerifySignature(
IN LSA_SEC_HANDLE ContextHandle,
IN PSecBufferDesc MessageBuffers,
IN ULONG MessageSequenceNumber,
OUT PULONG QualityOfProtection
)
{
return( SEC_E_UNSUPPORTED_FUNCTION );
}
NTSTATUS NTAPI
XtcbSealMessage(
IN LSA_SEC_HANDLE ContextHandle,
IN ULONG QualityOfProtection,
IN PSecBufferDesc pMessage,
IN ULONG MessageSequenceNumber
)
{
return( SEC_E_CONTEXT_EXPIRED );
}
NTSTATUS NTAPI
XtcbUnsealMessage(
IN LSA_SEC_HANDLE ContextHandle,
IN PSecBufferDesc pMessage,
IN ULONG MessageSequenceNumber,
OUT PULONG QualityOfProtection
)
{
// Output Buffer Types
return( SEC_E_CONTEXT_EXPIRED );
}
//+-------------------------------------------------------------------------
//
// Function: SpGetContextToken
//
// Synopsis: returns a pointer to the token for a server-side context
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
NTSTATUS NTAPI
XtcbGetContextToken(
IN LSA_SEC_HANDLE ContextHandle,
OUT PHANDLE ImpersonationToken
)
{
PXTCB_USER_CONTEXT Context ;
Context = XtcbFindUserContext( ContextHandle );
if ( Context )
{
*ImpersonationToken = Context->Token ;
return SEC_E_OK ;
}
else
{
return SEC_E_INVALID_HANDLE ;
}
}
//+-------------------------------------------------------------------------
//
// Function: SpQueryContextAttributes
//
// Synopsis: Querys attributes of the specified context
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
NTSTATUS NTAPI
XtcbQueryContextAttributes(
IN LSA_SEC_HANDLE ContextHandle,
IN ULONG ContextAttribute,
IN OUT PVOID pBuffer
)
{
PXTCB_USER_CONTEXT Context ;
PSecPkgContext_Sizes Sizes ;
PSecPkgContext_NamesW Names ;
PSecPkgContext_Lifespan Lifespan ;
PSecPkgContext_DceInfo DceInfo ;
PSecPkgContext_Authority Authority ;
SECURITY_STATUS Status ;
int len ;
Context = XtcbFindUserContext( ContextHandle );
if ( !Context )
{
return SEC_E_INVALID_HANDLE ;
}
switch ( ContextAttribute )
{
case SECPKG_ATTR_SIZES:
Sizes = (PSecPkgContext_Sizes) pBuffer ;
ZeroMemory( Sizes, sizeof( SecPkgContext_Sizes ) );
Status = SEC_E_OK ;
break;
case SECPKG_ATTR_NAMES:
Status = SEC_E_OK ;
break;
case SECPKG_ATTR_LIFESPAN:
Status = SEC_E_OK ;
break;
default:
Status = SEC_E_UNSUPPORTED_FUNCTION ;
}
return Status ;
}
//+-------------------------------------------------------------------------
//
// Function: SpCompleteAuthToken
//
// Synopsis: Completes a context (in Kerberos case, does nothing)
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
NTSTATUS
NTAPI
XtcbCompleteAuthToken(
IN LSA_SEC_HANDLE ContextHandle,
IN PSecBufferDesc InputBuffer
)
{
return(STATUS_SUCCESS);
}