1 /* 2 * PROJECT: ReactOS Applications Manager 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * FILE: base/applications/rapps/integrity.cpp 5 * PURPOSE: Various integrity check mechanisms 6 * COPYRIGHT: Copyright Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com) 7 * Copyright Mark Jansen 8 */ 9 10 #include "rapps.h" 11 12 #include <sha1.h> 13 14 BOOL VerifyInteg(LPCWSTR lpSHA1Hash, LPCWSTR lpFileName) 15 { 16 BOOL ret = FALSE; 17 18 /* first off, does it exist at all? */ 19 HANDLE file = CreateFileW(lpFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); 20 21 if (file == INVALID_HANDLE_VALUE) 22 return FALSE; 23 24 /* let's grab the actual file size to organize the mmap'ing rounds */ 25 LARGE_INTEGER size; 26 GetFileSizeEx(file, &size); 27 28 /* retrieve a handle to map the file contents to memory */ 29 HANDLE map = CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL); 30 if (map) 31 { 32 /* map that thing in address space */ 33 const unsigned char *file_map = static_cast<const unsigned char *>(MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0)); 34 if (file_map) 35 { 36 SHA_CTX ctx; 37 /* initialize the SHA-1 context */ 38 A_SHAInit(&ctx); 39 40 /* feed the data to the cookie monster */ 41 A_SHAUpdate(&ctx, file_map, size.LowPart); 42 43 /* cool, we don't need this anymore */ 44 UnmapViewOfFile(file_map); 45 46 /* we're done, compute the final hash */ 47 ULONG sha[5]; 48 A_SHAFinal(&ctx, sha); 49 50 WCHAR buf[(sizeof(sha) * 2) + 1]; 51 for (UINT i = 0; i < sizeof(sha); i++) 52 swprintf(buf + 2 * i, L"%02x", ((unsigned char *) sha)[i]); 53 /* does the resulting SHA1 match with the provided one? */ 54 if (!_wcsicmp(buf, lpSHA1Hash)) 55 ret = TRUE; 56 } 57 CloseHandle(map); 58 } 59 CloseHandle(file); 60 return ret; 61 } 62