Module: wine Branch: refs/heads/master Commit: 661d80708b5c57308c22684ba8372e33c991cd8e URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=661d80708b5c57308c22684b...
Author: Juan Lang juan_lang@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(