//+---------------------------------------------------------------------------- // // File: cryptfnc.h // // Module: CMSECURE.LIB // // Synopsis: Definition for the cryptfnc class that provides // an easy to use interface to the CryptoAPI. // // Copyright (c) 1996-1999 Microsoft Corporation // // Author: AshishS Created 12/03/96 // henryt modified for CM 5/21/97 // //+---------------------------------------------------------------------------- #ifndef _CRYPTFNC_INC_ #define _CRYPTFNC_INC_ #include #include #include #include #include "cmuufns.h" #include "cmsecure.h" #include "cmdebug.h" //#include "cmutil.h" //************************************************************************ // define's //************************************************************************ #define CRYPT_FNC_NO_ERROR 0 #define CRYPT_FNC_INIT_NOT_CALLED 1 #define CRYPT_FNC_INTERNAL_ERROR 2 #define CRYPT_FNC_BAD_KEY 3 #define CRYPT_FNC_INSUFFICIENT_BUFFER 4 #define CRYPT_FNC_OUT_OF_MEMORY 5 #define DEFAULT_CRYPTO_EXTRA_BUFFER_SIZE 256 #define CM_CRYPTO_CONTAINER TEXT("CM Crypto Container") //************************************************************************ // Typedefs for Advapi Linkage //************************************************************************ typedef BOOL (WINAPI* pfnCryptAcquireContextSpec)(HCRYPTPROV *, LPCTSTR, LPCTSTR, DWORD, DWORD); typedef BOOL (WINAPI* pfnCryptCreateHashSpec)(HCRYPTPROV, ALG_ID, HCRYPTKEY, DWORD, HCRYPTHASH *); typedef BOOL (WINAPI* pfnCryptDecryptSpec)(HCRYPTKEY, HCRYPTHASH, BOOL, DWORD, BYTE *, DWORD *); typedef BOOL (WINAPI* pfnCryptDeriveKeySpec)(HCRYPTPROV, ALG_ID, HCRYPTHASH, DWORD, HCRYPTKEY *); typedef BOOL (WINAPI* pfnCryptDestroyHashSpec)(HCRYPTHASH); typedef BOOL (WINAPI* pfnCryptDestroyKeySpec)(HCRYPTKEY); typedef BOOL (WINAPI* pfnCryptEncryptSpec)(HCRYPTKEY, HCRYPTHASH, BOOL, DWORD, BYTE *, DWORD *, DWORD); typedef BOOL (WINAPI* pfnCryptHashDataSpec)(HCRYPTHASH, CONST BYTE *, DWORD, DWORD); typedef BOOL (WINAPI* pfnCryptReleaseContextSpec)(HCRYPTPROV , ULONG_PTR); typedef BOOL (WINAPI* pfnCryptGenRandomSpec)(HCRYPTPROV, DWORD, BYTE*); typedef struct _Advapi32LinkageStruct { HINSTANCE hInstAdvApi32; union { struct { pfnCryptAcquireContextSpec pfnCryptAcquireContext; pfnCryptCreateHashSpec pfnCryptCreateHash; pfnCryptDecryptSpec pfnCryptDecrypt; pfnCryptDeriveKeySpec pfnCryptDeriveKey; pfnCryptDestroyHashSpec pfnCryptDestroyHash; pfnCryptDestroyKeySpec pfnCryptDestroyKey; pfnCryptEncryptSpec pfnCryptEncrypt; pfnCryptHashDataSpec pfnCryptHashData; pfnCryptReleaseContextSpec pfnCryptReleaseContext; pfnCryptGenRandomSpec pfnCryptGenRandom; }; void *apvPfn[11]; // The size of apvPfn[] should always be 1 size bigger than // the number of functions. }; } Advapi32LinkageStruct; //************************************************************************ // function prototypes //************************************************************************ class CCryptFunctions { protected: HCRYPTPROV m_hProv; Advapi32LinkageStruct m_AdvApiLink; BOOL m_fnCryptAcquireContext(HCRYPTPROV *phProv, LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags); BOOL m_fnCryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash); BOOL m_fnCryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen); BOOL m_fnCryptDeriveKey(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey); BOOL m_fnCryptDestroyHash(HCRYPTHASH hHash); BOOL m_fnCryptDestroyKey(HCRYPTKEY hKey); BOOL m_fnCryptEncrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen); BOOL m_fnCryptHashData(HCRYPTHASH hHash, CONST BYTE *pbData, DWORD dwDataLen, DWORD dwFlags); BOOL m_fnCryptReleaseContext(HCRYPTPROV hProv, ULONG_PTR dwFlags); BOOL m_pfnCryptGenRandom(HCRYPTPROV hProv, DWORD dwLen, BYTE* pbBuffer); public: CCryptFunctions(); ~CCryptFunctions(); BOOL GenerateSessionKeyFromPassword( HCRYPTKEY *phKey, // location to store the session key LPTSTR pszPassword, // password to generate the session key from DWORD dwEncKeyLen); // how many bits of encryption BOOL InitCrypt(); BOOL EncryptDataWithKey( LPTSTR pszKey, PBYTE pbData, DWORD dwDataLength, PBYTE *ppbEncryptedData, DWORD *pdwEncryptedBufferLen, PFN_CMSECUREALLOC pfnAlloc, PFN_CMSECUREFREE pfnFree, DWORD dwEncKeyLen); DWORD DecryptDataWithKey( LPTSTR pszKey, PBYTE pbEncryptedData, DWORD dwEncrytedDataLen, PBYTE *ppbData, DWORD *pdwDataBufferLength, PFN_CMSECUREALLOC pfnAlloc, PFN_CMSECUREFREE pfnFree, DWORD dwEncKeyLen); BOOL GenerateRandomKey(PBYTE pbData, DWORD cbData); }; #endif // _CRYPTFNC_INC_