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