From 361280b22b5d74c9c4b17389d4930eb28c512f01 Mon Sep 17 00:00:00 2001 From: Paul Vriens Date: Sun, 24 Jun 2007 19:27:48 +0200 Subject: [PATCH] wintrust/tests: Add tests for CryptCATAdminCalcHashFromFileHandle. --- dlls/wintrust/tests/crypt.c | 135 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/dlls/wintrust/tests/crypt.c b/dlls/wintrust/tests/crypt.c index a4f1b70bd26..600299aa497 100644 --- a/dlls/wintrust/tests/crypt.c +++ b/dlls/wintrust/tests/crypt.c @@ -26,10 +26,15 @@ #include "wine/test.h" +static char selfname[MAX_PATH]; + +static CHAR CURR_DIR[MAX_PATH]; + static HMODULE hWintrust = 0; static BOOL (WINAPI * pCryptCATAdminAcquireContext)(HCATADMIN*, const GUID*, DWORD); static BOOL (WINAPI * pCryptCATAdminReleaseContext)(HCATADMIN, DWORD); +static BOOL (WINAPI * pCryptCATAdminCalcHashFromFileHandle)(HANDLE hFile, DWORD*, BYTE*, DWORD); #define WINTRUST_GET_PROC(func) \ p ## func = (void*)GetProcAddress(hWintrust, #func); \ @@ -49,6 +54,7 @@ static BOOL InitFunctionPtrs(void) WINTRUST_GET_PROC(CryptCATAdminAcquireContext) WINTRUST_GET_PROC(CryptCATAdminReleaseContext) + WINTRUST_GET_PROC(CryptCATAdminCalcHashFromFileHandle) return TRUE; } @@ -159,12 +165,141 @@ static void test_context(void) ok(ret, "Expected success\n"); } +/* TODO: Check whether SHA-1 is the algorithm that's always used */ +static void test_calchash(void) +{ + BOOL ret; + HANDLE file; + DWORD hashsize = 0; + BYTE* hash; + BYTE expectedhash[20] = {0x3a,0xa1,0x19,0x08,0xec,0xa6,0x0d,0x2e,0x7e,0xcc,0x7a,0xca,0xf5,0xb8,0x2e,0x62,0x6a,0xda,0xf0,0x19}; + CHAR temp[MAX_PATH]; + DWORD written; + + if (!pCryptCATAdminCalcHashFromFileHandle) + { + skip("CryptCATAdminCalcHashFromFileHandle is not available\n"); + return; + } + + /* All NULL */ + SetLastError(0xdeadbeef); + ret = pCryptCATAdminCalcHashFromFileHandle(NULL, NULL, NULL, 0); + todo_wine + { + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + } + + /* NULL filehandle, rest is legal */ + SetLastError(0xdeadbeef); + ret = pCryptCATAdminCalcHashFromFileHandle(NULL, &hashsize, NULL, 0); + todo_wine + { + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + } + + /* Correct filehandle, rest is NULL */ + file = CreateFileA(selfname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + SetLastError(0xdeadbeef); + ret = pCryptCATAdminCalcHashFromFileHandle(file, NULL, NULL, 0); + todo_wine + { + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + } + CloseHandle(file); + + /* All OK, but dwFlags set to 1 */ + file = CreateFileA(selfname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + SetLastError(0xdeadbeef); + ret = pCryptCATAdminCalcHashFromFileHandle(file, &hashsize, NULL, 1); + todo_wine + { + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + } + CloseHandle(file); + + /* All OK, requesting the size of the hash */ + file = CreateFileA(selfname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + SetLastError(0xdeadbeef); + ret = pCryptCATAdminCalcHashFromFileHandle(file, &hashsize, NULL, 0); + ok(ret, "Expected success\n"); + todo_wine + { + ok(hashsize == 20," Expected a hash size of 20, got %d\n", hashsize); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError()); + } + CloseHandle(file); + + /* All OK, retrieve the hash + * Double the hash buffer to see what happens to the size parameter + */ + file = CreateFileA(selfname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + hashsize *= 2; + hash = HeapAlloc(GetProcessHeap(), 0, hashsize); + SetLastError(0xdeadbeef); + ret = pCryptCATAdminCalcHashFromFileHandle(file, &hashsize, hash, 0); + ok(ret, "Expected success\n"); + todo_wine + { + ok(hashsize == 20," Expected a hash size of 20, got %d\n", hashsize); + ok(GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %d\n", GetLastError()); + } + CloseHandle(file); + HeapFree(GetProcessHeap(), 0, hash); + + /* Do the same test with a file created and filled by ourselves (and we thus + * have a known hash for). + */ + GetTempFileNameA(CURR_DIR, "hsh", 0, temp); + file = CreateFileA(temp, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + WriteFile(file, "Text in this file is needed to create a know hash", 49, &written, NULL); + CloseHandle(file); + + /* All OK, first request the size and then retrieve the hash */ + file = CreateFileA(temp, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + hashsize = 0; + pCryptCATAdminCalcHashFromFileHandle(file, &hashsize, NULL, 0); + hash = HeapAlloc(GetProcessHeap(), 0, hashsize); + SetLastError(0xdeadbeef); + ret = pCryptCATAdminCalcHashFromFileHandle(file, &hashsize, hash, 0); + ok(ret, "Expected success\n"); + todo_wine + { + ok(GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %d\n", GetLastError()); + ok(!memcmp(hash, expectedhash, sizeof(expectedhash)), "Hashes didn't match\n"); + } + CloseHandle(file); + + HeapFree(GetProcessHeap(), 0, hash); + DeleteFileA(temp); +} + START_TEST(crypt) { + int myARGC; + char** myARGV; + if(!InitFunctionPtrs()) return; + myARGC = winetest_get_mainargs(&myARGV); + strcpy(selfname, myARGV[0]); + + GetCurrentDirectoryA(MAX_PATH, CURR_DIR); + test_context(); + test_calchash(); FreeLibrary(hWintrust); } -- 2.11.4.GIT