Owen Rudge : imagehlp/tests: Add tests for adding/ removing multiple certificates.

Alexandre Julliard julliard at winehq.org
Mon Dec 7 10:26:11 CST 2009


Module: wine
Branch: master
Commit: b27701276517394ea94d8e2c26cc348c746aa090
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b27701276517394ea94d8e2c26cc348c746aa090

Author: Owen Rudge <orudge at codeweavers.com>
Date:   Fri Dec  4 10:11:58 2009 -0600

imagehlp/tests: Add tests for adding/removing multiple certificates.

---

 dlls/imagehlp/tests/integrity.c |   68 +++++++++++++++++++++++++++++++--------
 1 files changed, 54 insertions(+), 14 deletions(-)

diff --git a/dlls/imagehlp/tests/integrity.c b/dlls/imagehlp/tests/integrity.c
index 718ca3e..df77dab 100644
--- a/dlls/imagehlp/tests/integrity.c
+++ b/dlls/imagehlp/tests/integrity.c
@@ -31,6 +31,7 @@ static HMODULE hImageHlp;
 static char test_dll_path[MAX_PATH];
 
 static BOOL (WINAPI *pImageAddCertificate)(HANDLE, LPWIN_CERTIFICATE, PDWORD);
+static BOOL (WINAPI *pImageEnumerateCertificates)(HANDLE, WORD, PDWORD, PDWORD, DWORD);
 static BOOL (WINAPI *pImageGetCertificateData)(HANDLE, DWORD, LPWIN_CERTIFICATE, PDWORD);
 static BOOL (WINAPI *pImageGetCertificateHeader)(HANDLE, DWORD, LPWIN_CERTIFICATE);
 static BOOL (WINAPI *pImageRemoveCertificate)(HANDLE, DWORD);
@@ -87,6 +88,8 @@ static char test_cert_data[] =
 ,0x46,0xCA,0xEB,0xEA,0x67,0x89,0x49,0x7C,0x43,0xA2,0x52,0xD9,0x41,0xCC,0x65
 ,0xED,0x2D,0xA1,0x00,0x31,0x00};
 
+static char test_cert_data_2[] = {0xDE,0xAD,0xBE,0xEF,0x01,0x02,0x03};
+
 static BOOL copy_dll_file(void)
 {
     char sys_dir[MAX_PATH+15];
@@ -116,7 +119,17 @@ static BOOL copy_dll_file(void)
     return TRUE;
 }
 
-static void test_add_certificate(void)
+static DWORD get_file_size(void)
+{
+    WIN32_FILE_ATTRIBUTE_DATA info;
+
+    if (GetFileAttributesEx(test_dll_path, GetFileExInfoStandard, &info))
+        return 0;
+
+    return info.nFileSizeLow;
+}
+
+static void test_add_certificate(char *cert_data, int len)
 {
     HANDLE hFile;
     LPWIN_CERTIFICATE cert;
@@ -131,7 +144,7 @@ static void test_add_certificate(void)
         return;
     }
 
-    cert_len = sizeof(WIN_CERTIFICATE) + sizeof(test_cert_data);
+    cert_len = sizeof(WIN_CERTIFICATE) + len;
     cert = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cert_len);
 
     if (!cert)
@@ -144,7 +157,7 @@ static void test_add_certificate(void)
     cert->dwLength = cert_len;
     cert->wRevision = WIN_CERT_REVISION_1_0;
     cert->wCertificateType = WIN_CERT_TYPE_PKCS_SIGNED_DATA;
-    CopyMemory(cert->bCertificate, test_cert_data, sizeof(test_cert_data));
+    CopyMemory(cert->bCertificate, cert_data, len);
 
     ok(pImageAddCertificate(hFile, cert, &index), "Unable to add certificate to image, error %x\n", GetLastError());
 
@@ -152,7 +165,7 @@ static void test_add_certificate(void)
     CloseHandle(hFile);
 }
 
-static void test_get_certificate(void)
+static void test_get_certificate(char *cert_data, int index)
 {
     HANDLE hFile;
     LPWIN_CERTIFICATE cert;
@@ -167,7 +180,7 @@ static void test_get_certificate(void)
         return;
     }
 
-    ret = pImageGetCertificateData(hFile, 0, NULL, &cert_len);
+    ret = pImageGetCertificateData(hFile, index, NULL, &cert_len);
     err = GetLastError();
 
     ok ((ret == FALSE) && (err == ERROR_INSUFFICIENT_BUFFER), "ImageGetCertificateData gave unexpected result; ret=%d / err=%x\n", ret, err);
@@ -181,17 +194,17 @@ static void test_get_certificate(void)
         return;
     }
 
-    ok(ret = pImageGetCertificateData(hFile, 0, cert, &cert_len), "Unable to retrieve certificate; err=%x\n", GetLastError());
-    ok(memcmp(cert->bCertificate, test_cert_data, cert_len - sizeof(WIN_CERTIFICATE)) == 0, "Certificate retrieved did not match original\n");
+    ok(ret = pImageGetCertificateData(hFile, index, cert, &cert_len), "Unable to retrieve certificate; err=%x\n", GetLastError());
+    ok(memcmp(cert->bCertificate, cert_data, cert_len - sizeof(WIN_CERTIFICATE)) == 0, "Certificate retrieved did not match original\n");
 
     HeapFree(GetProcessHeap(), 0, cert);
     CloseHandle(hFile);
 }
 
-static void test_remove_certificate(void)
+static void test_remove_certificate(int index)
 {
+    DWORD orig_count = 0, count = 0;
     HANDLE hFile;
-    WIN_CERTIFICATE cert;
 
     hFile = CreateFileA(test_dll_path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 
@@ -201,16 +214,21 @@ static void test_remove_certificate(void)
         return;
     }
 
-    ok (pImageRemoveCertificate(hFile, 0), "Unable to remove certificate from file; err=%x\n", GetLastError());
+    ok (pImageEnumerateCertificates(hFile, CERT_SECTION_TYPE_ANY, &orig_count, NULL, 0), "Unable to enumerate certificates in file; err=%x\n", GetLastError());
+
+    ok (pImageRemoveCertificate(hFile, index), "Unable to remove certificate from file; err=%x\n", GetLastError());
 
     /* Test to see if the certificate has actually been removed */
-    ok(pImageGetCertificateHeader(hFile, 0, &cert) == FALSE, "Certificate header retrieval succeeded when it should have failed\n");
+    pImageEnumerateCertificates(hFile, CERT_SECTION_TYPE_ANY, &count, NULL, 0);
+    ok (count == orig_count - 1, "Certificate count mismatch; orig=%d new=%d\n", orig_count, count);
 
     CloseHandle(hFile);
 }
 
 START_TEST(integrity)
 {
+    DWORD file_size, file_size_orig;
+
     hImageHlp = LoadLibraryA("imagehlp.dll");
 
     if (!hImageHlp)
@@ -225,14 +243,36 @@ START_TEST(integrity)
         return;
     }
 
+    file_size_orig = get_file_size();
+
     pImageAddCertificate = (void *) GetProcAddress(hImageHlp, "ImageAddCertificate");
+    pImageEnumerateCertificates = (void *) GetProcAddress(hImageHlp, "ImageEnumerateCertificates");
     pImageGetCertificateData = (void *) GetProcAddress(hImageHlp, "ImageGetCertificateData");
     pImageGetCertificateHeader = (void *) GetProcAddress(hImageHlp, "ImageGetCertificateHeader");
     pImageRemoveCertificate = (void *) GetProcAddress(hImageHlp, "ImageRemoveCertificate");
 
-    test_add_certificate();
-    test_get_certificate();
-    test_remove_certificate();
+    test_add_certificate(test_cert_data, sizeof(test_cert_data));
+    test_get_certificate(test_cert_data, 0);
+    test_remove_certificate(0);
+
+    file_size = get_file_size();
+    ok(file_size == file_size_orig, "File size different after add and remove (old: %d; new: %d)\n", file_size_orig, file_size);
+
+    /* Try adding multiple certificates */
+    test_add_certificate(test_cert_data, sizeof(test_cert_data));
+    test_add_certificate(test_cert_data_2, sizeof(test_cert_data_2));
+
+    test_get_certificate(test_cert_data, 0);
+    test_get_certificate(test_cert_data_2, 1);
+
+    /* Remove the first one and verify the second certificate is intact */
+    test_remove_certificate(0);
+    test_get_certificate(test_cert_data_2, 0);
+
+    test_remove_certificate(0);
+
+    file_size = get_file_size();
+    ok(file_size == file_size_orig, "File size different after add and remove (old: %d; new: %d)\n", file_size_orig, file_size);
 
     FreeLibrary(hImageHlp);
     DeleteFile(test_dll_path);




More information about the wine-cvs mailing list