Juan Lang : crypt32: Use CertFindCertificateInStore to simplify adding certificates.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 2 05:17:31 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 661d80708b5c57308c22684ba8372e33c991cd8e
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=661d80708b5c57308c22684ba8372e33c991cd8e

Author: Juan Lang <juan_lang at yahoo.com>
Date:   Wed Mar  1 08:38:32 2006 -0800

crypt32: Use CertFindCertificateInStore to simplify adding certificates.

---

 dlls/crypt32/store.c |   78 ++++++++++++++++++--------------------------------
 1 files changed, 28 insertions(+), 50 deletions(-)

diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c
index 840d168..47e595c 100644
--- a/dlls/crypt32/store.c
+++ b/dlls/crypt32/store.c
@@ -373,74 +373,50 @@ static BOOL CRYPT_MemAddCert(PWINECRYPT_
 {
     WINE_MEMSTORE *ms = (WINE_MEMSTORE *)store;
     BOOL add = FALSE, ret;
+    PCCERT_CONTEXT existing = NULL;
 
     TRACE("(%p, %p, %ld, %p)\n", store, cert, dwAddDisposition, ppStoreContext);
 
-    switch (dwAddDisposition)
-    {
-    case CERT_STORE_ADD_ALWAYS:
-        add = TRUE;
-        break;
-    case CERT_STORE_ADD_NEW:
+    if (dwAddDisposition != CERT_STORE_ADD_ALWAYS)
     {
-        BYTE hashToAdd[20], hash[20];
+        BYTE hashToAdd[20];
         DWORD size = sizeof(hashToAdd);
 
         ret = CRYPT_GetCertificateContextProperty(cert, CERT_HASH_PROP_ID,
          hashToAdd, &size);
         if (ret)
         {
-            PWINE_CERT_LIST_ENTRY cursor;
+            CRYPT_HASH_BLOB blob = { sizeof(hashToAdd), hashToAdd };
 
-            /* Add if no cert with the same hash is found. */
-            add = TRUE;
-            EnterCriticalSection(&ms->cs);
-            LIST_FOR_EACH_ENTRY(cursor, &ms->certs, WINE_CERT_LIST_ENTRY, entry)
-            {
-                size = sizeof(hash);
-                ret = CertGetCertificateContextProperty(&cursor->cert.cert,
-                 CERT_HASH_PROP_ID, hash, &size);
-                if (ret && !memcmp(hashToAdd, hash, size))
-                {
-                    TRACE("found matching certificate, not adding\n");
-                    SetLastError(CRYPT_E_EXISTS);
-                    add = FALSE;
-                    break;
-                }
-            }
-            LeaveCriticalSection(&ms->cs);
+            existing = CertFindCertificateInStore(store,
+             cert->cert.dwCertEncodingType, 0, CERT_FIND_SHA1_HASH, &blob,
+             NULL);
+        }
+    }
+    switch (dwAddDisposition)
+    {
+    case CERT_STORE_ADD_ALWAYS:
+        add = TRUE;
+        break;
+    case CERT_STORE_ADD_NEW:
+    {
+        if (existing)
+        {
+            TRACE("found matching certificate, not adding\n");
+            SetLastError(CRYPT_E_EXISTS);
+            add = FALSE;
         }
+        else
+            add = TRUE;
         break;
     }
     case CERT_STORE_ADD_REPLACE_EXISTING:
     {
-        BYTE hashToAdd[20], hash[20];
-        DWORD size = sizeof(hashToAdd);
-
         add = TRUE;
-        ret = CRYPT_GetCertificateContextProperty(cert, CERT_HASH_PROP_ID,
-         hashToAdd, &size);
-        if (ret)
+        if (existing)
         {
-            PWINE_CERT_LIST_ENTRY cursor, next;
-
-            /* Look for existing cert to delete */
-            EnterCriticalSection(&ms->cs);
-            LIST_FOR_EACH_ENTRY_SAFE(cursor, next, &ms->certs,
-             WINE_CERT_LIST_ENTRY, entry)
-            {
-                size = sizeof(hash);
-                ret = CertGetCertificateContextProperty(&cursor->cert.cert,
-                 CERT_HASH_PROP_ID, hash, &size);
-                if (ret && !memcmp(hashToAdd, hash, size))
-                {
-                    TRACE("found matching certificate, replacing\n");
-                    list_remove(&cursor->entry);
-                    CertFreeCertificateContext((PCCERT_CONTEXT)cursor);
-                    break;
-                }
-            }
-            LeaveCriticalSection(&ms->cs);
+            TRACE("found matching certificate, replacing\n");
+            CertDeleteCertificateFromStore(existing);
         }
         break;
     }
@@ -448,6 +424,8 @@ static BOOL CRYPT_MemAddCert(PWINECRYPT_
         FIXME("Unimplemented add disposition %ld\n", dwAddDisposition);
         add = FALSE;
     }
+    if (existing)
+        CertFreeCertificateContext(existing);
     if (add)
     {
         PWINE_CERT_LIST_ENTRY entry = CryptMemAlloc(




More information about the wine-cvs mailing list