//+----------------------------------------------------------------------- // // Microsoft Windows // // Copyright (c) Microsoft Corporation 2000 // // File: krnldgst.h // // Contents: declarations, constants for Kernel Mode context manager // // // History: KDamour 13Apr00 Created // //------------------------------------------------------------------------ #ifndef NTDIGEST_KRNLDGST_H #define NTDIGEST_KRNLDGST_H #ifndef UNICODE #define UNICODE #endif // UNICODE #define DES_BLOCKSIZE 8 #define RC4_BLOCKSIZE 1 // This structure contains the state info for the User mode // security context. // For longhorn - pull out the common context info between usermode // and kernel mode to share helper functions for verify/make signature... typedef struct _DIGEST_KERNELCONTEXT{ // // Global list of all Contexts // (Serialized by UserContextCritSect) // KSEC_LIST_ENTRY List; // // Handle to the LsaContext // This will have the handle to the context in LSAMode Address space // ULONG_PTR LsaContext; // // Timeout the context after awhile. // TimeStamp ExpirationTime; // Time inwhich session key expires // // Used to prevent this Context from being deleted prematurely. // (Serialized by Interlocked*) // LONG lReferences; // // Flag to indicate that Context is not attached to List - skip when scanning list // BOOL bUnlinked; // // Digest Parameters for this context // DIGEST_TYPE typeDigest; // // QOP selected for this context // QOP_TYPE typeQOP; // // Digest Parameters for this context // ALGORITHM_TYPE typeAlgorithm; // // Cipher to use for encrypt/decrypt // CIPHER_TYPE typeCipher; // // Charset used for digest directive values // CHARSET_TYPE typeCharset; // // Token Handle of authenticated user // Only valid when in AuthenticatedState. // Filled in only by AcceptSecurityContext - so we are the server // Mapped to UserMode Client space from LSA TokenHandle // It will be NULL is struct is from InitializeSecurityContext - so we are client // HANDLE ClientTokenHandle; // // Maintain the context requirements // ULONG ContextReq; // // Maintain a copy of the credential UseFlags (we can tell if inbound or outbound) // ULONG CredentialUseFlags; // Flags FLAG_CONTEXT_AUTHZID_PROVIDED ULONG ulFlags; // Nonce Count ULONG ulNC; // Maxbuffer for auth-int and auth-conf processing ULONG ulSendMaxBuf; ULONG ulRecvMaxBuf; // SASL sequence numbering DWORD dwSendSeqNum; // Makesignature/verifysignature server to client sequence number DWORD dwRecvSeqNum; // Makesignature/verifysignature server to client sequence number // // Hex(H(A1)) sent from DC and stored in context for future // auth without going to the DC. Binary version is derived from HEX(H(A1)) // and is used in SASL mode for integrity protection and encryption // STRING strSessionKey; BYTE bSessionKey[MD5_HASH_BYTESIZE]; // Account name used in token creation for securityContext session UNICODE_STRING ustrAccountName; // // Values utilized in the Initial Digest Auth ChallResponse // STRING strParam[MD5_AUTH_LAST]; // points to owned memory - will need to free up! } DIGEST_KERNELCONTEXT, * PDIGEST_KERNELCONTEXT; extern "C" { KspInitPackageFn WDigestInitKernelPackage; KspDeleteContextFn WDigestDeleteKernelContext; KspInitContextFn WDigestInitKernelContext; KspMapHandleFn WDigestMapKernelHandle; KspMakeSignatureFn WDigestMakeSignature; KspVerifySignatureFn WDigestVerifySignature; KspSealMessageFn WDigestSealMessage; KspUnsealMessageFn WDigestUnsealMessage; KspGetTokenFn WDigestGetContextToken; KspQueryAttributesFn WDigestQueryContextAttributes; KspCompleteTokenFn WDigestCompleteToken; SpExportSecurityContextFn WDigestExportSecurityContext; SpImportSecurityContextFn WDigestImportSecurityContext; KspSetPagingModeFn WDigestSetPagingMode ; // // Useful macros // #define WDigestKAllocate( _x_ ) ExAllocatePoolWithTag( WDigestPoolType, (_x_) , 'CvsM') #define WDigestKFree( _x_ ) ExFreePool(_x_) #define MAYBE_PAGED_CODE() \ if ( WDigestPoolType == PagedPool ) \ { \ PAGED_CODE(); \ } #define WDigestReferenceContext( Context, Remove ) \ KSecReferenceListEntry( (PKSEC_LIST_ENTRY) Context, \ WDIGEST_CONTEXT_SIGNATURE, \ Remove ) NTSTATUS NTAPI WDigestInitKernelPackage( IN PSECPKG_KERNEL_FUNCTIONS pKernelFunctions); NTSTATUS NTAPI WDigestDeleteKernelContext( IN ULONG_PTR pKernelContextHandle, OUT PULONG_PTR pLsaContextHandle); VOID WDigestDerefContext( PDIGEST_KERNELCONTEXT pContext); NTSTATUS WDigestFreeKernelContext ( PDIGEST_KERNELCONTEXT pKernelContext); NTSTATUS NTAPI WDigestInitKernelContext( IN ULONG_PTR LsaContextHandle, IN PSecBuffer PackedContext, OUT PULONG_PTR NewContextHandle); NTSTATUS DigestKernelUnpackContext( IN PDIGEST_PACKED_USERCONTEXT pPackedUserContext, OUT PDIGEST_KERNELCONTEXT pContext); NTSTATUS KernelContextPrint( PDIGEST_KERNELCONTEXT pContext); NTSTATUS NTAPI WDigestMapKernelHandle( IN ULONG_PTR KernelContextHandle, OUT PULONG_PTR LsaContextHandle); NTSTATUS NTAPI DigestKernelHTTPHelper( IN PDIGEST_KERNELCONTEXT pContext, IN eSignSealOp Op, IN OUT PSecBufferDesc pSecBuff, IN ULONG MessageSeqNo); NTSTATUS NTAPI WDigestMakeSignature( IN ULONG_PTR KernelContextHandle, IN ULONG fQOP, IN PSecBufferDesc pMessage, IN ULONG MessageSeqNo); NTSTATUS NTAPI WDigestVerifySignature( IN ULONG_PTR KernelContextHandle, IN PSecBufferDesc pMessage, IN ULONG MessageSeqNo, OUT PULONG pfQOP); NTSTATUS NTAPI DigestKernelProcessParameters( IN PDIGEST_KERNELCONTEXT pContext, IN PDIGEST_PARAMETER pDigest, OUT PSecBuffer pFirstOutputToken); NTSTATUS NTAPI WDigestSealMessage( IN ULONG_PTR KernelContextHandle, IN ULONG fQOP, IN PSecBufferDesc pMessage, IN ULONG MessageSeqNo); NTSTATUS NTAPI WDigestUnsealMessage( IN ULONG_PTR KernelContextHandle, IN PSecBufferDesc pMessage, IN ULONG MessageSeqNo, OUT PULONG pfQOP); NTSTATUS NTAPI WDigestGetContextToken( IN ULONG_PTR KernelContextHandle, OUT PHANDLE ImpersonationToken, OUT OPTIONAL PACCESS_TOKEN *RawToken); NTSTATUS NTAPI WDigestQueryContextAttributes( IN ULONG_PTR KernelContextHandle, IN ULONG Attribute, IN OUT PVOID Buffer); NTSTATUS NTAPI WDigestCompleteToken( IN ULONG_PTR ContextHandle, IN PSecBufferDesc InputBuffer); NTSTATUS WDigestImportSecurityContext( IN PSecBuffer PackedContext, IN OPTIONAL HANDLE TokenHandle, OUT PULONG_PTR ContextHandle); NTSTATUS WDigestImportSecurityContext( IN PSecBuffer PackedContext, IN OPTIONAL HANDLE TokenHandle, OUT PULONG_PTR ContextHandle); NTSTATUS WDigestSetPagingMode( BOOLEAN Pagable); } // extern "C" #endif // NTDIGEST_KRNLDGST_H