windows-nt/Source/XPSP1/NT/ds/security/inc/crypthlp.h

375 lines
11 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------------
// 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