|
|
/////////////////////////////////////////////////////////////////////////////
// FILE : contman.h //
// DESCRIPTION : include file //
// AUTHOR : //
// HISTORY : //
// Mar 16 1998 jeffspel Created //
// //
// Copyright (C) 1998 Microsoft Corporation All Rights Reserved //
/////////////////////////////////////////////////////////////////////////////
#ifndef __CONTMAN_H__
#define __CONTMAN_H__
#ifdef __cplusplus
extern "C" { #endif
extern LPVOID ContAlloc(ULONG cbLen); extern LPVOID ContRealloc(LPVOID pvMem, ULONG cbLen); extern void ContFree(LPVOID pvMem);
// Display Strings
typedef struct _CSP_STRINGS_ { // RSA
LPWSTR pwszSignWExch; LPWSTR pwszCreateRSASig; LPWSTR pwszCreateRSAExch; LPWSTR pwszRSASigDescr; LPWSTR pwszRSAExchDescr; LPWSTR pwszImportSimple;
// DSS-DH
LPWSTR pwszCreateDSS; LPWSTR pwszCreateDH; LPWSTR pwszImportDHPub; LPWSTR pwszDSSSigDescr; LPWSTR pwszDHExchDescr;
// BOTH
LPWSTR pwszSigning; LPWSTR pwszMigrKeys; LPWSTR pwszImportPrivSig; LPWSTR pwszImportPrivExch; LPWSTR pwszExportPrivSig; LPWSTR pwszExportPrivExch; LPWSTR pwszDeleteSig; LPWSTR pwszDeleteMigrSig; LPWSTR pwszDeleteExch; LPWSTR pwszDeleteMigrExch; LPWSTR pwszAuditCapiKey; } CSP_STRINGS, *PCSP_STRINGS;
#define SZLOCALMACHINECRYPTO "Software\\Microsoft\\Cryptography"
#define SZCRYPTOMACHINEGUID "MachineGuid"
#define KEY_CONTAINER_FILE_FORMAT_VER 2
#define STUFF_TO_GO_INTO_MIX "Hj1diQ6kpUx7VC4m"
typedef struct _KEY_EXPORTABILITY_LENS_ { DWORD cbSigExportability; DWORD cbExchExportability; } KEY_EXPORTABILITY_LENS, *PKEY_EXPORTABILITY_LENS;
typedef struct _KEY_CONTAINER_LENS_ { DWORD dwUIOnKey; DWORD cbName; DWORD cbSigPub; DWORD cbSigEncPriv; DWORD cbExchPub; DWORD cbExchEncPriv; DWORD cbRandom; // length of Random number seed
} KEY_CONTAINER_LENS, *PKEY_CONTAINER_LENS;
typedef struct _KEY_CONTAINER_INFO_ { DWORD dwVersion; KEY_CONTAINER_LENS ContLens; BOOL fCryptSilent; BYTE *pbSigPub; BYTE *pbSigEncPriv; BOOL fSigExportable; BYTE *pbExchPub; BYTE *pbExchEncPriv; BOOL fExchExportable; BYTE *pbRandom; LPSTR pszUserName; WCHAR rgwszFileName[80]; HANDLE hFind; // for enuming containers
DWORD dwiRegEntry; // for enuming containers
DWORD cMaxRegEntry; // for enuming containers
DWORD cbRegEntry; // for enuming containers
CHAR *pchEnumRegEntries; // for enuming containers
BOOL fCryptFirst; // for enuming containers
BOOL fNoMoreFiles; // for enuming containers
DWORD cbOldMachKeyEntry; // for enuming containers
DWORD dwiOldMachKeyEntry; // for enuming containers
DWORD cMaxOldMachKeyEntry; // for enuming containers
CHAR *pchEnumOldMachKeyEntries; // for enuming containers
BOOL fForceHighKeyProtection; // Context items required for caching private keys
BOOL fCachePrivateKeys; DWORD cMaxKeyLifetime; // in milliseconds
DWORD dwSigKeyTimestamp; DWORD dwKeyXKeyTimestamp; } KEY_CONTAINER_INFO, *PKEY_CONTAINER_INFO;
// define flag for leaving old keys in the registry if they are in the .Default
// hive but are user keys
#define LEAVE_OLD_KEYS 1
// define flag indicating that the thread cannot get the SACL info from the
// old registry key when migrating keys
#define PRIVILEDGE_FOR_SACL 2
#define MY_RTL_ENCRYPT_MEMORY_SIZE \
(2 * RTL_ENCRYPT_MEMORY_SIZE) DWORD GetKeySizeForEncryptMemory( IN DWORD cbKey);
DWORD MyRtlEncryptMemory( IN PVOID pvMem, IN DWORD cbMem);
DWORD MyRtlDecryptMemory( IN PVOID pvMem, IN DWORD cbMem);
//
// Just tries to use DPAPI to make sure it works before creating a key
// container.
//
DWORD TryDPAPI();
DWORD MyCryptProtectData( IN DATA_BLOB* pDataIn, IN LPCWSTR szDataDescr, IN OPTIONAL DATA_BLOB* pOptionalEntropy, IN PVOID pvReserved, IN OPTIONAL CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, IN DWORD dwFlags, OUT DATA_BLOB* pDataOut // out encr blob
);
DWORD MyCryptUnprotectData( IN DATA_BLOB* pDataIn, // in encr blob
OUT OPTIONAL LPWSTR* ppszDataDescr, // out
IN OPTIONAL DATA_BLOB* pOptionalEntropy, IN PVOID pvReserved, IN OPTIONAL CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, IN DWORD dwFlags, OUT DATA_BLOB* pDataOut, OUT LPDWORD pdwReprotectFlags);
void FreeEnumOldMachKeyEntries( PKEY_CONTAINER_INFO pInfo );
void FreeEnumRegEntries( PKEY_CONTAINER_INFO pInfo );
void FreeContainerInfo( PKEY_CONTAINER_INFO pInfo );
BOOL WINAPI FIsWinNT(void);
DWORD IsLocalSystem( BOOL *pfIsLocalSystem );
DWORD GetUserTextualSidA( LPSTR lpBuffer, LPDWORD nSize );
DWORD GetUserTextualSidW( LPWSTR lpBuffer, LPDWORD nSize );
DWORD SetMachineGUID();
DWORD SetContainerUserName( IN LPSTR pszUserName, IN PKEY_CONTAINER_INFO pContInfo );
DWORD ReadContainerInfo( IN DWORD dwProvType, IN LPSTR pszContainerName, IN BOOL fMachineKeyset, IN DWORD dwFlags, OUT PKEY_CONTAINER_INFO pContInfo );
DWORD WriteContainerInfo( IN DWORD dwProvType, IN LPWSTR pwszFileName, IN BOOL fMachineKeyset, IN PKEY_CONTAINER_INFO pContInfo );
DWORD DeleteContainerInfo( IN DWORD dwProvType, IN LPSTR pszFileName, IN BOOL fMachineKeyset );
DWORD GetUniqueContainerName( IN KEY_CONTAINER_INFO *pContInfo, OUT BYTE *pbData, OUT DWORD *pcbData );
DWORD GetNextContainer( IN DWORD dwProvType, IN BOOL fMachineKeyset, IN DWORD dwFlags, OUT LPSTR pszNextContainer, IN OUT DWORD *pcbNextContainer, IN OUT HANDLE *phFind );
DWORD SetSecurityOnContainer( IN LPCWSTR wszFileName, IN DWORD dwProvType, IN DWORD fMachineKeyset, IN SECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR pSecurityDescriptor );
//+ ===========================================================================
//
// The function adjusts the token priviledges so that SACL information
// may be set on a key container. If the token priviledges may be set
// indicated by the pUser->dwOldKeyFlags having the PRIVILEDGE_FOR_SACL value set.
// value set then the token privilege is adjusted before the security
// descriptor is set on the container. This is needed for the key
// migration case when keys are being migrated from the registry to files.
//- ============================================================================
DWORD SetSecurityOnContainerWithTokenPriviledges( IN DWORD dwOldKeyFlags, IN LPCWSTR wszFileName, IN DWORD dwProvType, IN DWORD fMachineKeyset, IN SECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR pSecurityDescriptor );
DWORD GetSecurityOnContainer( IN LPCWSTR wszFileName, IN DWORD dwProvType, IN DWORD fMachineKeyset, IN SECURITY_INFORMATION RequestedInformation, OUT PSECURITY_DESCRIPTOR pSecurityDescriptor, IN OUT DWORD *pcbSecurityDescriptor );
// Converts to UNICODE and uses RegOpenKeyExW
DWORD MyRegOpenKeyEx(IN HKEY hRegKey, IN LPSTR pszKeyName, IN DWORD dwReserved, IN REGSAM SAMDesired, OUT HKEY *phNewRegKey);
// Converts to UNICODE and uses RegDeleteKeyW
DWORD MyRegDeleteKey(IN HKEY hRegKey, IN LPSTR pszKeyName);
DWORD AllocAndSetLocationBuff( BOOL fMachineKeySet, DWORD dwProvType, CONST char *pszUserID, HKEY *phTopRegKey, TCHAR **ppszLocBuff, BOOL fUserKeys, BOOL *pfLeaveOldKeys, LPDWORD pcbBuff);
//
// Enumerates the old machine keys in the file system
// keys were in this location in Beta 2 and Beta 3 of NT5/Win2K
//
DWORD EnumOldMachineKeys( IN DWORD dwProvType, IN OUT PKEY_CONTAINER_INFO pContInfo );
DWORD GetNextEnumedOldMachKeys( IN PKEY_CONTAINER_INFO pContInfo, IN BOOL fMachineKeyset, OUT BYTE *pbData, OUT DWORD *pcbData );
//
// Enumerates the keys in the registry into a list of entries
//
DWORD EnumRegKeys( IN OUT PKEY_CONTAINER_INFO pContInfo, IN BOOL fMachineKeySet, IN DWORD dwProvType, OUT BYTE *pbData, IN OUT DWORD *pcbData );
DWORD GetNextEnumedRegKeys( IN PKEY_CONTAINER_INFO pContInfo, OUT BYTE *pbData, OUT DWORD *pcbData );
//+ ===========================================================================
//
// The function adjusts the token priviledges so that SACL information
// may be gotten and then opens the indicated registry key. If the token
// priviledges may be set then the reg key is opened anyway but the
// flags field will not have the PRIVILEDGE_FOR_SACL value set.
//
//- ============================================================================
DWORD OpenRegKeyWithTokenPriviledges( IN HKEY hTopRegKey, IN LPSTR pszRegKey, OUT HKEY *phRegKey, OUT DWORD *pdwFlags);
DWORD LoadStrings();
void UnloadStrings();
typedef struct _EXPO_OFFLOAD_STRUCT { DWORD dwVersion; HMODULE hInst; PFN_OFFLOAD_MOD_EXPO pExpoFunc; } EXPO_OFFLOAD_STRUCT, *PEXPO_OFFLOAD_STRUCT;
//
// Function : FreeOffloadInfo
//
// Description : The function takes a pointer to Offload Information as the
// first parameter of the call. The function frees the
// information.
//
void FreeOffloadInfo( IN OUT PEXPO_OFFLOAD_STRUCT pOffloadInfo );
//
// Function : InitExpOffloadInfo
//
// Description : The function takes a pointer to Offload Information as the
// first parameter of the call. The function checks in the
// registry to see if an offload module has been registered.
// If a module is registered then it loads the module
// and gets the OffloadModExpo function pointer.
//
BOOL InitExpOffloadInfo( IN OUT PEXPO_OFFLOAD_STRUCT *ppExpoOffloadInfo );
//
// Function : ModularExpOffload
//
// Description : This function does the offloading of modular exponentiation.
// The function takes a pointer to Offload Information as the
// first parameter of the call. If this pointer is not NULL
// then the function will use this module and call the function.
// The exponentiation with MOD function will implement
// Y^X MOD P where Y is the buffer pbBase, X is the buffer
// pbExpo and P is the buffer pbModulus. The length of the
// buffer pbExpo is cbExpo and the length of pbBase and
// pbModulus is cbModulus. The resulting value is output
// in the pbResult buffer and has length cbModulus.
// The pReserved and dwFlags parameters are currently ignored.
// If any of these functions fail then the function fails and
// returns FALSE. If successful then the function returns
// TRUE. If the function fails then most likely the caller
// should fall back to using hard linked modular exponentiation.
//
BOOL ModularExpOffload( IN PEXPO_OFFLOAD_STRUCT pOffloadInfo, IN BYTE *pbBase, IN BYTE *pbExpo, IN DWORD cbExpo, IN BYTE *pbModulus, IN DWORD cbModulus, OUT BYTE *pbResult, IN VOID *pReserved, IN DWORD dwFlags );
#ifdef USE_HW_RNG
#ifdef _M_IX86
// stuff for INTEL RNG usage
//
// Function : GetRNGDriverHandle
//
// Description : Gets the handle to the INTEL RNG driver if available, then
// checks if the chipset supports the hardware RNG. If so
// the previous driver handle is closed if necessary and the
// new handle is assigned to the passed in parameter.
//
extern DWORD GetRNGDriverHandle( IN OUT HANDLE *phDriver);
//
// Function : CheckIfRNGAvailable
//
// Description : Checks if the INTEL RNG driver is available, if so then
// checks if the chipset supports the hardware RNG.
//
extern DWORD CheckIfRNGAvailable( void);
//
// Function : HWRNGGenRandom
//
// Description : Uses the passed in handle to the INTEL RNG driver
// to fill the buffer with random bits. Actually uses
// XOR to fill the buffer so that the passed in buffer
// is also mixed in.
//
DWORD HWRNGGenRandom( IN HANDLE hRNGDriver, IN OUT BYTE *pbBuffer, IN DWORD dwLen);
#ifdef TEST_HW_RNG
//
// Function : SetupHWRNGIfRegistered
//
// Description : Checks if there is a registry setting indicating the HW RNG
// is to be used. If the registry entry is there then it attempts
// to get the HW RNG driver handle.
//
extern DWORD SetupHWRNGIfRegistered( OUT HANDLE *phRNGDriver); #endif // TEST_HW_RNG
#endif // _M_IX86
#endif // USE_HW_RNG
//
// Function for managing Force High Key Protection
//
BOOL IsForceHighProtectionEnabled( IN PKEY_CONTAINER_INFO pContInfo);
DWORD InitializeForceHighProtection( IN OUT PKEY_CONTAINER_INFO pContInfo);
//
// Functions for managing cached private keys.
//
BOOL IsPrivateKeyCachingEnabled( IN PKEY_CONTAINER_INFO pContInfo);
BOOL IsCachedKeyValid( IN PKEY_CONTAINER_INFO pContInfo, IN BOOL fSigKey);
DWORD SetCachedKeyTimestamp( IN PKEY_CONTAINER_INFO pContInfo, IN BOOL fSigKey);
DWORD InitializeKeyCacheInfo( IN OUT PKEY_CONTAINER_INFO pContInfo);
#ifdef __cplusplus
} #endif
#endif // __CONTMAN_H__
|