//+------------------------------------------------------------------------- // 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