332 lines
7.9 KiB
C
332 lines
7.9 KiB
C
|
//+-----------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation 1992 - 1996
|
||
|
//
|
||
|
// File: ctxtmgr.h
|
||
|
//
|
||
|
// Contents: Structures and prototyps for Kerberos context list
|
||
|
//
|
||
|
//
|
||
|
// History: 17-April-1996 Created MikeSw
|
||
|
//
|
||
|
//------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef __CTXTMGR_H__
|
||
|
#define __CTXTMGR_H__
|
||
|
|
||
|
//
|
||
|
// All global variables declared as EXTERN will be allocated in the file
|
||
|
// that defines CTXTMGR_ALLOCATE
|
||
|
//
|
||
|
#ifdef EXTERN
|
||
|
#undef EXTERN
|
||
|
#endif
|
||
|
|
||
|
#ifdef CTXTMGR_ALLOCATE
|
||
|
#define EXTERN
|
||
|
#else
|
||
|
#define EXTERN extern
|
||
|
#endif
|
||
|
|
||
|
#ifdef WIN32_CHICAGO
|
||
|
EXTERN CRITICAL_SECTION KerbContextResource;
|
||
|
#else // WIN32_CHICAGO
|
||
|
EXTERN RTL_RESOURCE KerbContextResource;
|
||
|
#endif // WIN32_CHICAGO
|
||
|
|
||
|
#define KERB_USERLIST_COUNT (16) // count of lists
|
||
|
|
||
|
EXTERN KERBEROS_LIST KerbContextList[ KERB_USERLIST_COUNT ];
|
||
|
EXTERN BOOLEAN KerberosContextsInitialized;
|
||
|
|
||
|
#define KerbGetContextHandle(_Context_) ((LSA_SEC_HANDLE)(_Context_))
|
||
|
|
||
|
//
|
||
|
// Context flags - these are attributes of a context and are stored in
|
||
|
// the ContextAttributes field of a KERB_CONTEXT.
|
||
|
//
|
||
|
|
||
|
#define KERB_CONTEXT_MAPPED 0x1
|
||
|
#define KERB_CONTEXT_OUTBOUND 0x2
|
||
|
#define KERB_CONTEXT_INBOUND 0x4
|
||
|
#define KERB_CONTEXT_USED_SUPPLIED_CREDS 0x8
|
||
|
#define KERB_CONTEXT_USER_TO_USER 0x10
|
||
|
#define KERB_CONTEXT_REQ_SERVER_NAME 0x20
|
||
|
#define KERB_CONTEXT_REQ_SERVER_REALM 0x40
|
||
|
#define KERB_CONTEXT_IMPORTED 0x80
|
||
|
#define KERB_CONTEXT_EXPORTED 0x100
|
||
|
#define KERB_CONTEXT_USING_CREDMAN 0x200
|
||
|
|
||
|
//
|
||
|
// NOTICE: The logon session resource, credential resource, and context
|
||
|
// resource must all be acquired carefully to prevent deadlock. They
|
||
|
// can only be acquired in this order:
|
||
|
//
|
||
|
// 1. Logon Sessions
|
||
|
// 2. Credentials
|
||
|
// 3. Contexts
|
||
|
//
|
||
|
|
||
|
#if DBG
|
||
|
#ifdef WIN32_CHICAGO
|
||
|
#define KerbWriteLockContexts() \
|
||
|
{ \
|
||
|
DebugLog((DEB_TRACE_LOCKS,"Write locking Contexts\n")); \
|
||
|
EnterCriticalSection(&KerbContextResource); \
|
||
|
KerbGlobalContextsLocked = GetCurrentThreadId(); \
|
||
|
}
|
||
|
#define KerbReadLockContexts() \
|
||
|
{ \
|
||
|
DebugLog((DEB_TRACE_LOCKS,"Read locking Contexts\n")); \
|
||
|
EnterCriticalSection(&KerbContextResource); \
|
||
|
KerbGlobalContextsLocked = GetCurrentThreadId(); \
|
||
|
}
|
||
|
#define KerbUnlockContexts() \
|
||
|
{ \
|
||
|
DebugLog((DEB_TRACE_LOCKS,"Unlocking Contexts\n")); \
|
||
|
KerbGlobalContextsLocked = 0; \
|
||
|
LeaveCriticalSection(&KerbContextResource); \
|
||
|
}
|
||
|
#else // WIN32_CHICAGO
|
||
|
#define KerbWriteLockContexts() \
|
||
|
{ \
|
||
|
DebugLog((DEB_TRACE_LOCKS,"Write locking Contexts\n")); \
|
||
|
RtlAcquireResourceExclusive(&KerbContextResource,TRUE); \
|
||
|
KerbGlobalContextsLocked = GetCurrentThreadId(); \
|
||
|
}
|
||
|
#define KerbReadLockContexts() \
|
||
|
{ \
|
||
|
DebugLog((DEB_TRACE_LOCKS,"Read locking Contexts\n")); \
|
||
|
RtlAcquireResourceShared(&KerbContextResource, TRUE); \
|
||
|
KerbGlobalContextsLocked = GetCurrentThreadId(); \
|
||
|
}
|
||
|
#define KerbUnlockContexts() \
|
||
|
{ \
|
||
|
DebugLog((DEB_TRACE_LOCKS,"Unlocking Contexts\n")); \
|
||
|
KerbGlobalContextsLocked = 0; \
|
||
|
RtlReleaseResource(&KerbContextResource); \
|
||
|
}
|
||
|
#endif // WIN32_CHICAGO
|
||
|
#else
|
||
|
#ifdef WIN32_CHICAGO
|
||
|
#define KerbWriteLockContexts() \
|
||
|
EnterCriticalSection(&KerbContextResource)
|
||
|
#define KerbReadLockContexts() \
|
||
|
EnterCriticalSection(&KerbContextResource)
|
||
|
#define KerbUnlockContexts() \
|
||
|
LeaveCriticalSection(&KerbContextResource)
|
||
|
#else // WIN32_CHICAGO
|
||
|
#define KerbWriteLockContexts() \
|
||
|
RtlAcquireResourceExclusive(&KerbContextResource,TRUE);
|
||
|
#define KerbReadLockContexts() \
|
||
|
RtlAcquireResourceShared(&KerbContextResource, TRUE);
|
||
|
#define KerbUnlockContexts() \
|
||
|
RtlReleaseResource(&KerbContextResource);
|
||
|
#endif // WIN32_CHICAGO
|
||
|
#endif
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbInitContextList(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
KerbFreeContextList(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbAllocateContext(
|
||
|
PKERB_CONTEXT * NewContext
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbInsertContext(
|
||
|
IN PKERB_CONTEXT Context
|
||
|
);
|
||
|
|
||
|
|
||
|
SECURITY_STATUS
|
||
|
KerbReferenceContext(
|
||
|
IN LSA_SEC_HANDLE ContextHandle,
|
||
|
IN BOOLEAN RemoveFromList,
|
||
|
OUT PKERB_CONTEXT * FoundContext
|
||
|
);
|
||
|
|
||
|
|
||
|
VOID
|
||
|
KerbDereferenceContext(
|
||
|
IN PKERB_CONTEXT Context
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
KerbReferenceContextByPointer(
|
||
|
IN PKERB_CONTEXT Context,
|
||
|
IN BOOLEAN RemoveFromList
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbCreateClientContext(
|
||
|
IN PKERB_LOGON_SESSION LogonSession,
|
||
|
IN PKERB_CREDENTIAL Credential,
|
||
|
IN OPTIONAL PKERB_CREDMAN_CRED CredManCredentials,
|
||
|
IN OPTIONAL PKERB_TICKET_CACHE_ENTRY TicketCacheEntry,
|
||
|
IN OPTIONAL PUNICODE_STRING TargetName,
|
||
|
IN ULONG Nonce,
|
||
|
IN ULONG ContextFlags,
|
||
|
IN ULONG ContextAttributes,
|
||
|
IN OPTIONAL PKERB_ENCRYPTION_KEY SubSessionKey,
|
||
|
OUT PKERB_CONTEXT * NewContext,
|
||
|
OUT PTimeStamp ContextLifetime
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbCreateServerContext(
|
||
|
IN PKERB_LOGON_SESSION LogonSession,
|
||
|
IN PKERB_CREDENTIAL Credential,
|
||
|
IN PKERB_ENCRYPTED_TICKET InternalTicket,
|
||
|
IN PKERB_AP_REQUEST ApRequest,
|
||
|
IN PKERB_ENCRYPTION_KEY SessionKey,
|
||
|
IN PLUID LogonId,
|
||
|
IN OUT PSID * UserSid,
|
||
|
IN ULONG ContextFlags,
|
||
|
IN ULONG ContextAttributes,
|
||
|
IN ULONG Nonce,
|
||
|
IN ULONG ReceiveNonce,
|
||
|
IN OUT PHANDLE TokenHandle,
|
||
|
IN PUNICODE_STRING ClientName,
|
||
|
IN PUNICODE_STRING ClientDomain,
|
||
|
OUT PKERB_CONTEXT * NewContext,
|
||
|
OUT PTimeStamp ContextLifetime
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbUpdateServerContext(
|
||
|
IN PKERB_CONTEXT Context,
|
||
|
IN PKERB_ENCRYPTED_TICKET InternalTicket,
|
||
|
IN PKERB_AP_REQUEST ApRequest,
|
||
|
IN PKERB_ENCRYPTION_KEY SessionKey,
|
||
|
IN PLUID LogonId,
|
||
|
IN OUT PSID * UserSid,
|
||
|
IN ULONG ContextFlags,
|
||
|
IN ULONG ContextAttributes,
|
||
|
IN ULONG Nonce,
|
||
|
IN ULONG ReceiveNonce,
|
||
|
IN OUT PHANDLE TokenHandle,
|
||
|
IN PUNICODE_STRING ClientName,
|
||
|
IN PUNICODE_STRING ClientDomain,
|
||
|
OUT PTimeStamp ContextLifetime
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbCreateEmptyContext(
|
||
|
IN PKERB_CREDENTIAL Credential,
|
||
|
IN ULONG ContextFlags,
|
||
|
IN ULONG ContextAttributes,
|
||
|
IN PLUID LogonId,
|
||
|
OUT PKERB_CONTEXT * NewContext,
|
||
|
OUT PTimeStamp ContextLifetime
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbMapContext(
|
||
|
IN PKERB_CONTEXT Context,
|
||
|
OUT PBOOLEAN MappedContext,
|
||
|
OUT PSecBuffer ContextData
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbCreateUserModeContext(
|
||
|
IN LSA_SEC_HANDLE ContextHandle,
|
||
|
IN PSecBuffer MarshalledContext,
|
||
|
OUT PKERB_CONTEXT * NewContext
|
||
|
);
|
||
|
|
||
|
SECURITY_STATUS
|
||
|
KerbReferenceContextByLsaHandle(
|
||
|
IN LSA_SEC_HANDLE ContextHandle,
|
||
|
IN BOOLEAN RemoveFromList,
|
||
|
OUT PKERB_CONTEXT * FoundContext
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbUpdateClientContext(
|
||
|
IN PKERB_CONTEXT Context,
|
||
|
IN PKERB_TICKET_CACHE_ENTRY TicketCacheEntry,
|
||
|
IN ULONG Nonce,
|
||
|
IN ULONG ReceiveNonce,
|
||
|
IN ULONG ContextFlags,
|
||
|
IN ULONG ContextAttribs,
|
||
|
IN OPTIONAL PKERB_ENCRYPTION_KEY SubSessionKey,
|
||
|
OUT PTimeStamp ContextLifetime
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbCreateSKeyEntry(
|
||
|
IN KERB_ENCRYPTION_KEY* pSessionKey,
|
||
|
IN FILETIME* pExpireTime
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbDoesSKeyExist(
|
||
|
IN KERB_ENCRYPTION_KEY* pKey,
|
||
|
OUT BOOLEAN* pbExist
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbEqualKey(
|
||
|
IN KERB_ENCRYPTION_KEY* pKeyFoo,
|
||
|
IN KERB_ENCRYPTION_KEY* pKeyBar,
|
||
|
OUT BOOLEAN* pbEqual
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbInsertSKey(
|
||
|
IN KERB_SESSION_KEY_ENTRY* pSKeyEntry
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
KerbTrimSKeyList(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
KerbNetworkServiceSKeyListCleanupCallback(
|
||
|
IN VOID* pContext,
|
||
|
IN BOOLEAN bTimeOut
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbCreateSKeyTimer(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
KerbFreeSKeyTimer(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
KerbFreeSKeyEntry(
|
||
|
IN KERB_SESSION_KEY_ENTRY* pSKeyEntry
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
KerbProcessTargetNames(
|
||
|
IN PUNICODE_STRING TargetName,
|
||
|
IN OPTIONAL PUNICODE_STRING SuppTargetName,
|
||
|
IN ULONG Flags,
|
||
|
IN OUT ULONG *ProcessFlags,
|
||
|
OUT PKERB_INTERNAL_NAME * FinalTarget,
|
||
|
OUT PUNICODE_STRING TargetRealm,
|
||
|
OUT OPTIONAL PKERB_SPN_CACHE_ENTRY * SpnCacheEntry
|
||
|
);
|
||
|
|
||
|
#define KERB_CRACK_NAME_USE_WKSTA_REALM 0x1
|
||
|
#define KERB_CRACK_NAME_REALM_SUPPLIED 0x2
|
||
|
|
||
|
#endif // __CTXTMGR_H__
|