You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
271 lines
5.7 KiB
271 lines
5.7 KiB
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
credcach.hxx
|
|
|
|
Abstract:
|
|
|
|
This module contains the public definitions to the credential cache
|
|
|
|
Author:
|
|
|
|
John Ludeman (johnl) 18-Oct-1995
|
|
|
|
Revision History:
|
|
--*/
|
|
|
|
#ifndef _CREDCACH_HXX_
|
|
#define _CREDCACH_HXX_
|
|
|
|
#include <tracelog.h>
|
|
|
|
#define IIS3
|
|
#include <mapctxt.h>
|
|
|
|
#include <refb.hxx>
|
|
#include <certmap.h>
|
|
#include <imd.h>
|
|
#include "sslinfo.hxx"
|
|
|
|
#ifndef DEFINE_SIMSSL_GLOBAL
|
|
#define EXTERN extern
|
|
#else
|
|
#define EXTERN
|
|
#endif
|
|
|
|
//
|
|
// Constants
|
|
//
|
|
|
|
#define MAX_SECRET_NAME 255
|
|
#define MAX_ADDRESS_LEN 64
|
|
#define SHA1_HASH_LEN 20
|
|
#define MAX_SSL_ID_LEN 2*SHA1_HASH_LEN + 1
|
|
|
|
#define SSL_SERVICE_KEYS_MD_PATH "/LM/%S/SSLKEYS"
|
|
#define SSL_SERVICE_KEYS_MD_PATH_W L"/LM/%s/SSLKEYS"
|
|
|
|
//
|
|
// The maximum number of providers we'll support
|
|
//
|
|
|
|
#define MAX_PROVIDERS 7
|
|
|
|
typedef struct _ENC_PROVIDER
|
|
{
|
|
WCHAR * pszName;
|
|
DWORD dwFlags;
|
|
BOOL fEnabled;
|
|
} ENC_PROVIDER, *PENC_PROVIDER;
|
|
|
|
|
|
typedef PSecurityFunctionTableW (APIENTRY *INITSECURITYINTERFACE) (VOID);
|
|
|
|
extern PSecurityFunctionTableW g_pSecFuncTableW;
|
|
|
|
#define g_EnumerateSecurityPackages \
|
|
(*(g_pSecFuncTableW->EnumerateSecurityPackagesW))
|
|
#define g_AcquireCredentialsHandle \
|
|
(*(g_pSecFuncTableW->AcquireCredentialsHandleW))
|
|
#define g_FreeCredentialsHandle \
|
|
(*(g_pSecFuncTableW->FreeCredentialHandle))
|
|
#define g_InitializeSecurityContext \
|
|
(*(g_pSecFuncTableW->InitializeSecurityContextW))
|
|
#define g_AcceptSecurityContext \
|
|
(*(g_pSecFuncTableW->AcceptSecurityContext))
|
|
#define g_CompleteAuthToken \
|
|
(*(g_pSecFuncTableW->CompleteAuthToken))
|
|
#define g_DeleteSecurityContext \
|
|
(*(g_pSecFuncTableW->DeleteSecurityContext))
|
|
#define g_QueryContextAttributes \
|
|
(*(g_pSecFuncTableW->QueryContextAttributesW))
|
|
#define g_QuerySecurityContextToken \
|
|
(*(g_pSecFuncTableW->QuerySecurityContextToken))
|
|
#define g_FreeContextBuffer \
|
|
(*(g_pSecFuncTableW->FreeContextBuffer))
|
|
#define g_SealMessage \
|
|
(*((SEAL_MESSAGE_FN)g_pSecFuncTableW->Reserved3))
|
|
#define g_UnsealMessage \
|
|
(*((UNSEAL_MESSAGE_FN)g_pSecFuncTableW->Reserved4))
|
|
|
|
|
|
//
|
|
// Cached credential item. This contains an array of credentials for each
|
|
// security package. There is one of these for every installed key
|
|
//
|
|
|
|
BOOL
|
|
TerminateCertMapping(
|
|
HMAPPER** ppMappers,
|
|
DWORD cNbMappers
|
|
);
|
|
|
|
//
|
|
// Lock for the credential cache
|
|
//
|
|
|
|
EXTERN CRITICAL_SECTION csGlobalLock;
|
|
|
|
//
|
|
// Locks the credential cache
|
|
//
|
|
|
|
#define LockGlobals() EnterCriticalSection( &csGlobalLock )
|
|
#define UnlockGlobals() LeaveCriticalSection( &csGlobalLock );
|
|
|
|
class CRED_CACHE_ITEM
|
|
{
|
|
public:
|
|
|
|
CRED_CACHE_ITEM()
|
|
{
|
|
m_lRef = 1;
|
|
m_fValid = FALSE;
|
|
m_cCred = 0;
|
|
m_cCredMap = 0;
|
|
m_pSslInfo = NULL;
|
|
}
|
|
|
|
~CRED_CACHE_ITEM();
|
|
|
|
VOID AddRef()
|
|
{
|
|
InterlockedIncrement( &m_lRef );
|
|
}
|
|
|
|
VOID Release()
|
|
{
|
|
if ( !InterlockedDecrement( &m_lRef ) )
|
|
{
|
|
delete this;
|
|
}
|
|
}
|
|
|
|
//
|
|
// The "SSL info" blob identifying this credential handle set
|
|
//
|
|
CHAR m_achSSLIdBlob[MAX_SSL_ID_LEN];
|
|
|
|
//
|
|
// The IP address for this credential handle set
|
|
//
|
|
// CHAR m_achAddr[MAX_ADDRESS_LEN+1];
|
|
LPVOID m_pvInstanceId;
|
|
|
|
//
|
|
// m_fValid is FALSE if there isn't a matching key set on the
|
|
// server
|
|
//
|
|
|
|
BOOL m_fValid;
|
|
LONG m_lRef;
|
|
|
|
DWORD m_cCred; // Count of credentials
|
|
CredHandle m_ahCred[MAX_PROVIDERS];
|
|
DWORD m_cCredMap; // Count of credentials w/ mapping
|
|
CredHandle m_ahCredMap[MAX_PROVIDERS];
|
|
DWORD m_acbTrailer[MAX_PROVIDERS];
|
|
DWORD m_acbHeader[MAX_PROVIDERS];
|
|
DWORD m_acbBlockSize[MAX_PROVIDERS];
|
|
RefBlob* m_pBlob11;
|
|
RefBlob* m_pBlobW;
|
|
IIS_SSL_INFO *m_pSslInfo;
|
|
HMAPPER** m_ppMappers;
|
|
DWORD m_cNbMappers;
|
|
|
|
LIST_ENTRY m_ListEntry;
|
|
};
|
|
|
|
|
|
class INSTANCE_CACHE_ITEM
|
|
{
|
|
public:
|
|
|
|
~INSTANCE_CACHE_ITEM()
|
|
{
|
|
if ( m_fValid )
|
|
{
|
|
m_pcci->Release();
|
|
}
|
|
}
|
|
|
|
//
|
|
// The IP address for this credential handle set
|
|
//
|
|
//CHAR m_achId[MAX_ADDRESS_LEN+1];
|
|
//DWORD m_cbId;
|
|
LPVOID m_pvInstanceId;
|
|
|
|
CRED_CACHE_ITEM* m_pcci;
|
|
|
|
//
|
|
// m_fValid is FALSE if there isn't a matching key set on the
|
|
// server
|
|
//
|
|
|
|
BOOL m_fValid;
|
|
|
|
LIST_ENTRY m_ListEntry;
|
|
};
|
|
|
|
|
|
//
|
|
// Array of encryption providers
|
|
//
|
|
|
|
extern ENC_PROVIDER* pEncProviders;
|
|
extern CRED_CACHE_ITEM* g_pcciClient;
|
|
|
|
VOID
|
|
InitCredCache(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
FreeCredCache(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
LookupFullyQualifiedCredential(
|
|
IN WCHAR * pwszServerPrefix,
|
|
IN CHAR * pszIpAddress,
|
|
IN DWORD cbAddress,
|
|
IN CHAR * pszPort,
|
|
IN DWORD cbPort,
|
|
IN LPVOID pvInstanceId,
|
|
OUT CRED_CACHE_ITEM * * ppCCI,
|
|
IN PVOID pvsmc,
|
|
IN DWORD dwInstanceId
|
|
);
|
|
|
|
VOID
|
|
ReleaseCredential(
|
|
CRED_CACHE_ITEM * pcci
|
|
);
|
|
|
|
BOOL
|
|
LookupClientCredential(
|
|
IN WCHAR* pwszServerPrefix,
|
|
IN BOOL fUseCertificate,
|
|
OUT CRED_CACHE_ITEM * * ppCCI
|
|
);
|
|
|
|
BOOL
|
|
GetSecretW(
|
|
WCHAR * pszSecretName,
|
|
UNICODE_STRING * * ppSecretValue
|
|
);
|
|
|
|
BOOL
|
|
InitializeCredentials(
|
|
VOID
|
|
);
|
|
|
|
#define CERT_DER_PREFIX 17
|
|
|
|
#endif // _CREDCACH_HXX_
|
|
|