/*++ Copyright (C) Microsoft Corporation, 1999 Module Name: FrontCrypt Abstract: This file provides the implementation for the Crypto API V1.0 Front End. Author: Doug Barlow (dbarlow) 8/22/1999 Notes: ?Notes? --*/ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include // All the Windows definitions. #include "cspUtils.h" LONG FCryptAcquireContext( HCRYPTPROV *phProv, LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptAcquireContextA( phProv, pszContainer, pszProvider, dwProvType, dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptAcquireContext( HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptAcquireContextW( phProv, pszContainer, pszProvider, dwProvType, dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptReleaseContext( HCRYPTPROV hProv, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptReleaseContext( hProv, dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptGenKey( HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptGenKey( hProv, Algid, dwFlags, phKey); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptDeriveKey( HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptDeriveKey( hProv, Algid, hBaseData, dwFlags, phKey); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptDestroyKey( HCRYPTKEY hKey) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptDestroyKey( hKey); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptSetKeyParam( HCRYPTKEY hKey, DWORD dwParam, LPCBYTE pbData, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptSetKeyParam( hKey, dwParam, const_cast(pbData), dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptGetKeyParam( HCRYPTKEY hKey, DWORD dwParam, CBuffer &bfData, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; DWORD dwLen; LPBYTE pbVal; for (;;) { dwLen = bfData.Space(); pbVal = bfData.Access(); fSts = CryptGetKeyParam( hKey, dwParam, pbVal, &dwLen, dwFlags); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfData.Space(dwLen); else break; } else if (NULL == pbVal) { bfData.Space(dwLen); } else { lSts = ERROR_SUCCESS; bfData.Length(dwLen); break; } } return lSts; } LONG FCryptSetHashParam( HCRYPTHASH hHash, DWORD dwParam, LPCBYTE pbData, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptSetHashParam( hHash, dwParam, const_cast(pbData), dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptGetHashParam( HCRYPTHASH hHash, DWORD dwParam, CBuffer &bfData, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; DWORD dwLen; LPBYTE pbVal; for (;;) { dwLen = bfData.Space(); pbVal = bfData.Access(); fSts = CryptGetHashParam( hHash, dwParam, pbVal, &dwLen, dwFlags); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfData.Space(dwLen); else break; } else if (NULL == pbVal) { bfData.Space(dwLen); } else { lSts = ERROR_SUCCESS; bfData.Length(dwLen); break; } } return lSts; } LONG FCryptSetProvParam( HCRYPTPROV hProv, DWORD dwParam, LPCBYTE pbData, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptSetProvParam( hProv, dwParam, const_cast(pbData), dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptGetProvParam( HCRYPTPROV hProv, DWORD dwParam, CBuffer &bfData, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; DWORD dwLen; LPBYTE pbVal; for (;;) { dwLen = bfData.Space(); pbVal = bfData.Access(); fSts = CryptGetProvParam( hProv, dwParam, pbVal, &dwLen, dwFlags); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfData.Space(dwLen); else break; } else if (NULL == pbVal) { bfData.Space(dwLen); } else { lSts = ERROR_SUCCESS; bfData.Length(dwLen); break; } } return lSts; } LONG FCryptGenRandom( HCRYPTPROV hProv, DWORD dwLen, CBuffer &bfBuffer) { BOOL fSts; LONG lSts = ERROR_SUCCESS; bfBuffer.Space(dwLen); fSts = CryptGenRandom( hProv, dwLen, bfBuffer); if (!fSts) lSts = GetLastError(); bfBuffer.Length(dwLen); return lSts; } LONG FCryptGetUserKey( HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptGetUserKey( hProv, dwKeySpec, phUserKey); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptExportKey( HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType, DWORD dwFlags, CBuffer &bfData) { BOOL fSts; LONG lSts = ERROR_SUCCESS; DWORD dwLen; LPBYTE pbVal; for (;;) { dwLen = bfData.Space(); pbVal = bfData.Access(); fSts = CryptExportKey( hKey, hExpKey, dwBlobType, dwFlags, pbVal, &dwLen); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfData.Space(dwLen); else break; } else if (NULL == pbVal) { bfData.Space(dwLen); } else { lSts = ERROR_SUCCESS; bfData.Length(dwLen); break; } } return lSts; } LONG FCryptImportKey( HCRYPTPROV hProv, LPCBYTE pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptImportKey( hProv, pbData, dwDataLen, hPubKey, dwFlags, phKey); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptEncrypt( HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, CBuffer &bfData) { BOOL fSts; LONG lSts = ERROR_SUCCESS; DWORD dwLen; for (;;) { dwLen = bfData.Length(); fSts = CryptEncrypt( hKey, hHash, Final, dwFlags, bfData, &dwLen, bfData.Space()); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfData.Extend(dwLen); else break; } else { lSts = ERROR_SUCCESS; bfData.Length(dwLen); break; } } return lSts; } LONG FCryptDecrypt( HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, CBuffer &bfData) { BOOL fSts; LONG lSts = ERROR_SUCCESS; DWORD dwLen; for (;;) { dwLen = bfData.Space(); fSts = CryptDecrypt( hKey, hHash, Final, dwFlags, bfData, &dwLen); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfData.Extend(dwLen); else break; } else { lSts = ERROR_SUCCESS; bfData.Length(dwLen); break; } } return lSts; } LONG FCryptCreateHash( HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptCreateHash( hProv, Algid, hKey, dwFlags, phHash); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptHashData( HCRYPTHASH hHash, LPCBYTE pbData, DWORD dwDataLen, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptHashData( hHash, pbData, dwDataLen, dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptHashSessionKey( HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptHashSessionKey( hHash, hKey, dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptDestroyHash( HCRYPTHASH hHash) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptDestroyHash( hHash); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptSignHash( HCRYPTHASH hHash, DWORD dwKeySpec, LPCSTR sDescription, DWORD dwFlags, CBuffer &bfSignature) { BOOL fSts; LONG lSts = ERROR_SUCCESS; DWORD dwLen; LPBYTE pbVal; for (;;) { dwLen = bfSignature.Space(); pbVal = bfSignature.Access(); fSts = CryptSignHashA( hHash, dwKeySpec, sDescription, dwFlags, pbVal, &dwLen); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfSignature.Space(dwLen); else break; } else if (NULL == pbVal) { bfSignature.Space(dwLen); } else { lSts = ERROR_SUCCESS; bfSignature.Length(dwLen); break; } } return lSts; } LONG FCryptSignHash( HCRYPTHASH hHash, DWORD dwKeySpec, LPCWSTR sDescription, DWORD dwFlags, CBuffer &bfSignature) { BOOL fSts; LONG lSts = ERROR_SUCCESS; DWORD dwLen; LPBYTE pbVal; for (;;) { dwLen = bfSignature.Space(); pbVal = bfSignature.Access(); fSts = CryptSignHashW( hHash, dwKeySpec, sDescription, dwFlags, pbVal, &dwLen); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfSignature.Space(dwLen); else break; } else if (NULL == pbVal) { bfSignature.Space(dwLen); } else { lSts = ERROR_SUCCESS; bfSignature.Length(dwLen); break; } } return lSts; } LONG FCryptVerifySignature( HCRYPTHASH hHash, LPCBYTE pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCSTR sDescription, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptVerifySignatureA( hHash, pbSignature, dwSigLen, hPubKey, sDescription, dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptVerifySignature( HCRYPTHASH hHash, LPCBYTE pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCWSTR sDescription, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptVerifySignatureW( hHash, pbSignature, dwSigLen, hPubKey, sDescription, dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptSetProvider( LPCSTR pszProvName, DWORD dwProvType) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptSetProviderA( pszProvName, dwProvType); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptSetProvider( LPCWSTR pszProvName, DWORD dwProvType) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptSetProviderW( pszProvName, dwProvType); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptSetProviderEx( LPCSTR pszProvName, DWORD dwProvType, DWORD * pdwReserved, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptSetProviderExA( pszProvName, dwProvType, pdwReserved, dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptSetProviderEx( LPCWSTR pszProvName, DWORD dwProvType, DWORD * pdwReserved, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptSetProviderExW( pszProvName, dwProvType, pdwReserved, dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptGetDefaultProvider( DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags, CBuffer &bfProvName) { BOOL fSts; LONG lSts; DWORD dwLen; LPTSTR szVal; for (;;) { dwLen = bfProvName.Space(); szVal = (LPTSTR)bfProvName.Access(); fSts = CryptGetDefaultProvider( dwProvType, pdwReserved, dwFlags, szVal, &dwLen); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfProvName.Space(dwLen); else if ((ERROR_INVALID_PARAMETER == lSts) && (0 == dwFlags)) { // // This is a workaround for a bug in advapi. // If there's no user default provider defined, // it returns "invalid parameter". This fix // forces a retry against the machine default. // dwFlags = CRYPT_MACHINE_DEFAULT; } else break; } else if (NULL == szVal) { bfProvName.Space(dwLen); } else { lSts = ERROR_SUCCESS; bfProvName.Length(dwLen); break; } } return lSts; } LONG FCryptEnumProviderTypes( DWORD dwIndex, DWORD * pdwReserved, DWORD dwFlags, DWORD * pdwProvType, CBuffer &bfTypeName) { BOOL fSts; LONG lSts = ERROR_SUCCESS; DWORD dwLen; LPTSTR szVal; for (;;) { dwLen = bfTypeName.Space(); szVal = (LPTSTR)bfTypeName.Access(); fSts = CryptEnumProviderTypes( dwIndex, pdwReserved, dwFlags, pdwProvType, szVal, &dwLen); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfTypeName.Space(dwLen); else break; } else if (NULL == szVal) { bfTypeName.Space(dwLen); } else { lSts = ERROR_SUCCESS; bfTypeName.Length(dwLen); break; } } return lSts; } LONG FCryptEnumProviders( DWORD dwIndex, DWORD * pdwReserved, DWORD dwFlags, DWORD * pdwProvType, CBuffer &bfProvName) { BOOL fSts; LONG lSts = ERROR_SUCCESS; DWORD dwLen; LPTSTR szVal; for (;;) { dwLen = bfProvName.Space(); szVal = (LPTSTR)bfProvName.Access(); fSts = CryptEnumProviders( dwIndex, pdwReserved, dwFlags, pdwProvType, szVal, &dwLen); if (!fSts) { lSts = GetLastError(); if (ERROR_MORE_DATA == lSts) bfProvName.Space(dwLen); else break; } else if (NULL == szVal) { bfProvName.Space(dwLen); } else { lSts = ERROR_SUCCESS; bfProvName.Length(dwLen); break; } } return lSts; } LONG FCryptContextAddRef( HCRYPTPROV hProv, DWORD * pdwReserved, DWORD dwFlags) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptContextAddRef( hProv, pdwReserved, dwFlags); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptDuplicateKey( HCRYPTKEY hKey, DWORD * pdwReserved, DWORD dwFlags, HCRYPTKEY * phKey) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptDuplicateKey( hKey, pdwReserved, dwFlags, phKey); if (!fSts) lSts = GetLastError(); return lSts; } LONG FCryptDuplicateHash( HCRYPTHASH hHash, DWORD * pdwReserved, DWORD dwFlags, HCRYPTHASH * phHash) { BOOL fSts; LONG lSts = ERROR_SUCCESS; fSts = CryptDuplicateHash( hHash, pdwReserved, dwFlags, phHash); if (!fSts) lSts = GetLastError(); return lSts; }