HRESULT GetHash(LPCTSTR szFileName, ALG_ID iHashAlg, PBYTE pbHash, DWORD *pdwHash) { #define MAX_ARRAY_SIZE 16384 #define HASH_BUFFER_SIZE (MAX_ARRAY_SIZE-4) HRESULT hr = E_FAIL; HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; DWORD dwBufferLen; BYTE pbBuffer[MAX_ARRAY_SIZE]; HANDLE hSourceFile = INVALID_HANDLE_VALUE; if(!WszCryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { hr = FusionpHresultFromLastError(); goto exit; } if(!CryptCreateHash(hProv, iHashAlg, 0, 0, &hHash)) { hr = FusionpHresultFromLastError(); goto exit; } // Open source file. hSourceFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (hSourceFile == INVALID_HANDLE_VALUE) { hr = FusionpHresultFromLastError(); goto exit; } while ( ReadFile (hSourceFile, pbBuffer, HASH_BUFFER_SIZE, &dwBufferLen, NULL) && dwBufferLen ) { // Add data to hash object. if(!CryptHashData(hHash, pbBuffer, dwBufferLen, 0)) { goto exit; } } if(!CryptGetHashParam(hHash, HP_HASHVAL, pbHash, pdwHash, 0)) goto exit; hr = S_OK; exit: if (hHash) CryptDestroyHash(hHash); if (hProv) CryptReleaseContext(hProv,0); if (hSourceFile != INVALID_HANDLE_VALUE) CloseHandle(hSourceFile); return hr; }
HRESULT CAssemblyStream::Init (LPOLESTR pszPath, DWORD dwFormat) { HRESULT hr = S_OK; DWORD cwPath; BOOL bRet; CCriticalSection cs(&g_csInitClb); ASSERT(pszPath); _dwFormat = dwFormat; cwPath = lstrlen(pszPath) + 1; ASSERT(cwPath < MAX_PATH); memcpy(_szPath, pszPath, sizeof(TCHAR) * cwPath); _hf = CreateFile(pszPath, GENERIC_WRITE, 0 /* no sharing */, NULL, CREATE_NEW, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (_hf == INVALID_HANDLE_VALUE) { hr = HRESULT_FROM_WIN32(GetLastError()); ReleaseParent(hr); goto Exit; } if (!g_hProv) { hr = cs.Lock(); if (FAILED(hr)) { goto Exit; } bRet=TRUE; if(!g_hProv) { bRet = WszCryptAcquireContext(&g_hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); } cs.Unlock(); if (!bRet) { hr = HRESULT_FROM_WIN32(GetLastError()); ReleaseParent(hr); goto Exit; } } bRet = CryptCreateHash(g_hProv, CALG_SHA1, 0, 0, &_hHash); if (!bRet) { hr = HRESULT_FROM_WIN32(GetLastError()); ReleaseParent(hr); goto Exit; } Exit: return hr; }
HRESULT GetHash(LPCTSTR szFileName, ALG_ID iHashAlg, PBYTE pbHash, DWORD *pdwHash) { #define MAX_ARRAY_SIZE 16384 #define HASH_BUFFER_SIZE (MAX_ARRAY_SIZE-4) HRESULT hr = E_FAIL; HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; DWORD dwBufferLen; BYTE *pbBuffer = NULL; HANDLE hSourceFile = INVALID_HANDLE_VALUE; pbBuffer = NEW(BYTE[MAX_ARRAY_SIZE]); if (!pbBuffer) { hr = E_OUTOFMEMORY; goto exit; } if(!WszCryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto exit; } if(!CryptCreateHash(hProv, iHashAlg, 0, 0, &hHash)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto exit; } // Open source file. hSourceFile = WszCreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (hSourceFile == INVALID_HANDLE_VALUE) { hr = HRESULT_FROM_WIN32(GetLastError()); goto exit; } while (TRUE) { if (!ReadFile (hSourceFile, pbBuffer, HASH_BUFFER_SIZE, &dwBufferLen, NULL)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto exit; } if (!dwBufferLen) { break; } // Add data to hash object. if(!CryptHashData(hHash, pbBuffer, dwBufferLen, 0)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto exit; } } if(!CryptGetHashParam(hHash, HP_HASHVAL, pbHash, pdwHash, 0)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto exit; } hr = S_OK; exit: SAFEDELETEARRAY(pbBuffer); if (hHash) CryptDestroyHash(hHash); if (hProv) CryptReleaseContext(hProv,0); if (hSourceFile != INVALID_HANDLE_VALUE) CloseHandle(hSourceFile); return hr; }
HRESULT GetHash(__in LPWSTR moduleName, ALG_ID iHashAlg, BYTE** pbCurrentValue, // should be NULL DWORD *cbCurrentValue) { HRESULT hr = E_FAIL; HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; DWORD dwCount = sizeof(DWORD); PBYTE pbBuffer = NULL; DWORD dwBufferLen; HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE hMapFile = NULL; hFile = WszCreateFile(moduleName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); if (hFile == INVALID_HANDLE_VALUE) return E_FAIL; dwBufferLen = SafeGetFileSize(hFile,NULL); if (dwBufferLen == 0xffffffff) { hr = HRESULT_FROM_WIN32(GetLastError()); goto exit; } hMapFile = WszCreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); if (hMapFile == NULL) goto exit; pbBuffer = (PBYTE) MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0); if (pbBuffer == NULL) goto exit; // No need to late bind this stuff, all these crypto API entry points happen // to live in ADVAPI32. if ((!WszCryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) || (!CryptCreateHash(hProv, iHashAlg, 0, 0, &hHash)) || (!CryptHashData(hHash, pbBuffer, dwBufferLen, 0)) || (!CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE *) cbCurrentValue, &dwCount, 0))) { hr = HRESULT_FROM_WIN32(GetLastError()); goto exit; } *pbCurrentValue = new BYTE[*cbCurrentValue]; if (!(*pbCurrentValue)) { hr = E_OUTOFMEMORY; goto exit; } if(!CryptGetHashParam(hHash, HP_HASHVAL, *pbCurrentValue, cbCurrentValue, 0)) { hr = HRESULT_FROM_WIN32(GetLastError()); delete[] *pbCurrentValue; *pbCurrentValue = 0; goto exit; } hr = S_OK; exit: if (pbBuffer) UnmapViewOfFile(pbBuffer); if (hMapFile) CloseHandle(hMapFile); CloseHandle(hFile); if (hHash) CryptDestroyHash(hHash); if (hProv) CryptReleaseContext(hProv, 0); return hr; }