375 lines
11 KiB
C
375 lines
11 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1996 - 1999
|
||
|
//
|
||
|
// File: crypthlp.h
|
||
|
//
|
||
|
// Contents: Misc internal crypt/certificate helper APIs
|
||
|
//
|
||
|
// APIs: I_CryptGetDefaultCryptProv
|
||
|
// I_CryptGetDefaultCryptProvForEncrypt
|
||
|
// I_CryptGetFileVersion
|
||
|
// I_CertSyncStoreEx
|
||
|
// I_CertSyncStore
|
||
|
// I_CertUpdateStore
|
||
|
// I_RecursiveCreateDirectory
|
||
|
// I_RecursiveDeleteDirectory
|
||
|
// I_CryptReadTrustedPublisherDWORDValueFromRegistry
|
||
|
// I_CryptZeroFileTime
|
||
|
// I_CryptIsZeroFileTime
|
||
|
// I_CryptIncrementFileTimeBySeconds
|
||
|
// I_CryptDecrementFileTimeBySeconds
|
||
|
// I_CryptSubtractFileTimes
|
||
|
// I_CryptIncrementFileTimeByMilliseconds
|
||
|
// I_CryptDecrementFileTimeByMilliseconds
|
||
|
// I_CryptRemainingMilliseconds
|
||
|
//
|
||
|
// History: 01-Jun-97 philh created
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef __CRYPTHLP_H__
|
||
|
#define __CRYPTHLP_H__
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Cross Cert Distribution Retrieval Times
|
||
|
//
|
||
|
|
||
|
// 8 hours
|
||
|
#define XCERT_DEFAULT_SYNC_DELTA_TIME (60 * 60 * 8)
|
||
|
// 1 hour
|
||
|
#define XCERT_MIN_SYNC_DELTA_TIME (60 * 60)
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Acquire default CryptProv according to the public key algorithm supported
|
||
|
// by the provider type. The provider is acquired with only
|
||
|
// CRYPT_VERIFYCONTEXT.
|
||
|
//
|
||
|
// Setting aiPubKey to 0, gets the default provider for RSA_FULL.
|
||
|
//
|
||
|
// Note, the returned CryptProv must not be released. Once acquired, the
|
||
|
// CryptProv isn't released until ProcessDetach. This allows the returned
|
||
|
// HCRYPTPROVs to be shared.
|
||
|
//--------------------------------------------------------------------------
|
||
|
HCRYPTPROV
|
||
|
WINAPI
|
||
|
I_CryptGetDefaultCryptProv(
|
||
|
IN ALG_ID aiPubKey
|
||
|
);
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Acquire default CryptProv according to the public key algorithm, encrypt
|
||
|
// key algorithm and encrypt key length supported by the provider type.
|
||
|
//
|
||
|
// dwBitLen = 0, assumes the aiEncrypt's default bit length. For example,
|
||
|
// CALG_RC2 has a default bit length of 40.
|
||
|
//
|
||
|
// Note, the returned CryptProv must not be released. Once acquired, the
|
||
|
// CryptProv isn't released until ProcessDetach. This allows the returned
|
||
|
// CryptProvs to be shared.
|
||
|
//--------------------------------------------------------------------------
|
||
|
HCRYPTPROV
|
||
|
WINAPI
|
||
|
I_CryptGetDefaultCryptProvForEncrypt(
|
||
|
IN ALG_ID aiPubKey,
|
||
|
IN ALG_ID aiEncrypt,
|
||
|
IN DWORD dwBitLen
|
||
|
);
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// crypt32.dll release version numbers
|
||
|
//--------------------------------------------------------------------------
|
||
|
#define IE4_CRYPT32_DLL_VER_MS (( 5 << 16) | 101 )
|
||
|
#define IE4_CRYPT32_DLL_VER_LS (( 1670 << 16) | 1 )
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Get file version of the specified file
|
||
|
//--------------------------------------------------------------------------
|
||
|
BOOL
|
||
|
WINAPI
|
||
|
I_CryptGetFileVersion(
|
||
|
IN LPCWSTR pwszFilename,
|
||
|
OUT DWORD *pdwFileVersionMS, /* e.g. 0x00030075 = "3.75" */
|
||
|
OUT DWORD *pdwFileVersionLS /* e.g. 0x00000031 = "0.31" */
|
||
|
);
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Synchronize the original store with the new store.
|
||
|
//
|
||
|
// Assumptions: Both are cache stores. The new store is temporary
|
||
|
// and local to the caller. The new store's contexts can be deleted or
|
||
|
// moved to the original store.
|
||
|
//--------------------------------------------------------------------------
|
||
|
BOOL
|
||
|
WINAPI
|
||
|
I_CertSyncStore(
|
||
|
IN OUT HCERTSTORE hOriginalStore,
|
||
|
IN OUT HCERTSTORE hNewStore
|
||
|
);
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Synchronize the original store with the new store.
|
||
|
//
|
||
|
// Assumptions: Both are cache stores. The new store is temporary
|
||
|
// and local to the caller. The new store's contexts can be deleted or
|
||
|
// moved to the original store.
|
||
|
//
|
||
|
// Setting ICERT_SYNC_STORE_INHIBIT_SYNC_PROPERTY_IN_FLAG in dwInFlags
|
||
|
// inhibits the syncing of properties.
|
||
|
//
|
||
|
// ICERT_SYNC_STORE_CHANGED_OUT_FLAG is returned and set in *pdwOutFlags
|
||
|
// if any contexts were added or deleted from the original store.
|
||
|
//--------------------------------------------------------------------------
|
||
|
BOOL
|
||
|
WINAPI
|
||
|
I_CertSyncStoreEx(
|
||
|
IN OUT HCERTSTORE hOriginalStore,
|
||
|
IN OUT HCERTSTORE hNewStore,
|
||
|
IN DWORD dwInFlags,
|
||
|
OUT OPTIONAL DWORD *pdwOutFlags,
|
||
|
IN OUT OPTIONAL void *pvReserved
|
||
|
);
|
||
|
|
||
|
#define ICERT_SYNC_STORE_INHIBIT_SYNC_PROPERTY_IN_FLAG 0x00000001
|
||
|
#define ICERT_SYNC_STORE_CHANGED_OUT_FLAG 0x00010000
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Update the original store with contexts from the new store.
|
||
|
//
|
||
|
// Assumptions: Both are cache stores. The new store is temporary
|
||
|
// and local to the caller. The new store's contexts can be deleted or
|
||
|
// moved to the original store.
|
||
|
//--------------------------------------------------------------------------
|
||
|
BOOL
|
||
|
WINAPI
|
||
|
I_CertUpdateStore(
|
||
|
IN OUT HCERTSTORE hOriginalStore,
|
||
|
IN OUT HCERTSTORE hNewStore,
|
||
|
IN DWORD dwReserved,
|
||
|
IN OUT void *pvReserved
|
||
|
);
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Recursively creates a full directory path
|
||
|
//--------------------------------------------------------------------------
|
||
|
BOOL
|
||
|
I_RecursiveCreateDirectory(
|
||
|
IN LPCWSTR pwszDir,
|
||
|
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes
|
||
|
);
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Recursively deletes a whole directory
|
||
|
//--------------------------------------------------------------------------
|
||
|
BOOL
|
||
|
I_RecursiveDeleteDirectory(
|
||
|
IN LPCWSTR pwszDelete
|
||
|
);
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Recursively copies a whole directory
|
||
|
//--------------------------------------------------------------------------
|
||
|
BOOL
|
||
|
I_RecursiveCopyDirectory(
|
||
|
IN LPCWSTR pwszDirFrom,
|
||
|
IN LPCWSTR pwszDirTo
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// First checks if the registry value exists in GPO Policies section. If
|
||
|
// not, checks the LocalMachine section.
|
||
|
//--------------------------------------------------------------------------
|
||
|
BOOL
|
||
|
I_CryptReadTrustedPublisherDWORDValueFromRegistry(
|
||
|
IN LPCWSTR pwszValueName,
|
||
|
OUT DWORD *pdwValue
|
||
|
);
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Zero's the filetime
|
||
|
//--------------------------------------------------------------------------
|
||
|
__inline
|
||
|
void
|
||
|
WINAPI
|
||
|
I_CryptZeroFileTime(
|
||
|
OUT LPFILETIME pft
|
||
|
)
|
||
|
{
|
||
|
pft->dwLowDateTime = 0;
|
||
|
pft->dwHighDateTime = 0;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Check for a filetime of 0. Normally, this indicates the filetime
|
||
|
// wasn't specified.
|
||
|
//--------------------------------------------------------------------------
|
||
|
__inline
|
||
|
BOOL
|
||
|
WINAPI
|
||
|
I_CryptIsZeroFileTime(
|
||
|
IN LPFILETIME pft
|
||
|
)
|
||
|
{
|
||
|
if (0 == pft->dwLowDateTime && 0 == pft->dwHighDateTime)
|
||
|
return TRUE;
|
||
|
else
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Increment the filetime by the specified number of seconds.
|
||
|
//
|
||
|
// Filetime is in units of 100 nanoseconds. Each second has
|
||
|
// 10**7 100 nanoseconds.
|
||
|
//--------------------------------------------------------------------------
|
||
|
__inline
|
||
|
void
|
||
|
WINAPI
|
||
|
I_CryptIncrementFileTimeBySeconds(
|
||
|
IN LPFILETIME pftSrc,
|
||
|
IN DWORD dwSeconds,
|
||
|
OUT LPFILETIME pftDst
|
||
|
)
|
||
|
{
|
||
|
*(((DWORDLONG UNALIGNED *) pftDst)) =
|
||
|
*(((DWORDLONG UNALIGNED *) pftSrc)) +
|
||
|
(((DWORDLONG) dwSeconds) * 10000000i64);
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Decrement the filetime by the specified number of seconds.
|
||
|
//
|
||
|
// Filetime is in units of 100 nanoseconds. Each second has
|
||
|
// 10**7 100 nanoseconds.
|
||
|
//--------------------------------------------------------------------------
|
||
|
__inline
|
||
|
void
|
||
|
WINAPI
|
||
|
I_CryptDecrementFileTimeBySeconds(
|
||
|
IN LPFILETIME pftSrc,
|
||
|
IN DWORD dwSeconds,
|
||
|
OUT LPFILETIME pftDst
|
||
|
)
|
||
|
{
|
||
|
*(((DWORDLONG UNALIGNED *) pftDst)) =
|
||
|
*(((DWORDLONG UNALIGNED *) pftSrc)) -
|
||
|
(((DWORDLONG) dwSeconds) * 10000000i64);
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Subtract two filetimes and return the number of seconds.
|
||
|
//
|
||
|
// The second filetime is subtracted from the first. If the first filetime
|
||
|
// is before the second, then, 0 seconds is returned.
|
||
|
//
|
||
|
// Filetime is in units of 100 nanoseconds. Each second has
|
||
|
// 10**7 100 nanoseconds.
|
||
|
//--------------------------------------------------------------------------
|
||
|
__inline
|
||
|
DWORD
|
||
|
WINAPI
|
||
|
I_CryptSubtractFileTimes(
|
||
|
IN LPFILETIME pftFirst,
|
||
|
IN LPFILETIME pftSecond
|
||
|
)
|
||
|
{
|
||
|
DWORDLONG qwDiff;
|
||
|
|
||
|
if (0 >= CompareFileTime(pftFirst, pftSecond))
|
||
|
return 0;
|
||
|
|
||
|
|
||
|
qwDiff = *(((DWORDLONG UNALIGNED *) pftFirst)) -
|
||
|
*(((DWORDLONG UNALIGNED *) pftSecond));
|
||
|
|
||
|
return (DWORD) (qwDiff / 10000000i64);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Increment the filetime by the specified number of milliseconds.
|
||
|
//
|
||
|
// Filetime is in units of 100 nanoseconds. Each millisecond has
|
||
|
// 10**4 100 nanoseconds.
|
||
|
//--------------------------------------------------------------------------
|
||
|
__inline
|
||
|
void
|
||
|
WINAPI
|
||
|
I_CryptIncrementFileTimeByMilliseconds(
|
||
|
IN LPFILETIME pftSrc,
|
||
|
IN DWORD dwMilliseconds,
|
||
|
OUT LPFILETIME pftDst
|
||
|
)
|
||
|
{
|
||
|
*(((DWORDLONG UNALIGNED *) pftDst)) =
|
||
|
*(((DWORDLONG UNALIGNED *) pftSrc)) +
|
||
|
(((DWORDLONG) dwMilliseconds) * 10000i64);
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Decrement the filetime by the specified number of milliseconds.
|
||
|
//
|
||
|
// Filetime is in units of 100 nanoseconds. Each millisecond has
|
||
|
// 10**4 100 nanoseconds.
|
||
|
//--------------------------------------------------------------------------
|
||
|
__inline
|
||
|
void
|
||
|
WINAPI
|
||
|
I_CryptDecrementFileTimeByMilliseconds(
|
||
|
IN LPFILETIME pftSrc,
|
||
|
IN DWORD dwMilliseconds,
|
||
|
OUT LPFILETIME pftDst
|
||
|
)
|
||
|
{
|
||
|
*(((DWORDLONG UNALIGNED *) pftDst)) =
|
||
|
*(((DWORDLONG UNALIGNED *) pftSrc)) -
|
||
|
(((DWORDLONG) dwMilliseconds) * 10000i64);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
// Return the number of milliseconds remaining before the specified end
|
||
|
// filetime.
|
||
|
//
|
||
|
// The current filetime is subtracted from the end filetime. If the current
|
||
|
// filetime is after or the same as the end filetime, then, 0 milliseconds
|
||
|
// is returned.
|
||
|
//
|
||
|
// Filetime is in units of 100 nanoseconds. Each millisecond has
|
||
|
// 10**4 100 nanoseconds.
|
||
|
//--------------------------------------------------------------------------
|
||
|
__inline
|
||
|
DWORD
|
||
|
WINAPI
|
||
|
I_CryptRemainingMilliseconds(
|
||
|
IN LPFILETIME pftEnd
|
||
|
)
|
||
|
{
|
||
|
FILETIME ftCurrent;
|
||
|
DWORDLONG qwDiff;
|
||
|
|
||
|
GetSystemTimeAsFileTime(&ftCurrent);
|
||
|
|
||
|
if (0 >= CompareFileTime(pftEnd, &ftCurrent))
|
||
|
return 0;
|
||
|
|
||
|
|
||
|
qwDiff = *(((DWORDLONG UNALIGNED *) pftEnd)) -
|
||
|
*(((DWORDLONG UNALIGNED *) &ftCurrent));
|
||
|
|
||
|
return (DWORD) (qwDiff / 10000i64);
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
} // Balance extern "C" above
|
||
|
#endif
|
||
|
|
||
|
#endif
|