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