crypt32: Use CertFindCertificateInStore to simplify adding certificates.

This commit is contained in:
Juan Lang 2006-03-01 08:38:32 -08:00 committed by Alexandre Julliard
parent b84c9d41e4
commit 661d80708b
1 changed files with 28 additions and 50 deletions
dlls/crypt32

View File

@ -373,9 +373,26 @@ static BOOL CRYPT_MemAddCert(PWINECRYPT_CERTSTORE store,
{ {
WINE_MEMSTORE *ms = (WINE_MEMSTORE *)store; WINE_MEMSTORE *ms = (WINE_MEMSTORE *)store;
BOOL add = FALSE, ret; BOOL add = FALSE, ret;
PCCERT_CONTEXT existing = NULL;
TRACE("(%p, %p, %ld, %p)\n", store, cert, dwAddDisposition, ppStoreContext); TRACE("(%p, %p, %ld, %p)\n", store, cert, dwAddDisposition, ppStoreContext);
if (dwAddDisposition != CERT_STORE_ADD_ALWAYS)
{
BYTE hashToAdd[20];
DWORD size = sizeof(hashToAdd);
ret = CRYPT_GetCertificateContextProperty(cert, CERT_HASH_PROP_ID,
hashToAdd, &size);
if (ret)
{
CRYPT_HASH_BLOB blob = { sizeof(hashToAdd), hashToAdd };
existing = CertFindCertificateInStore(store,
cert->cert.dwCertEncodingType, 0, CERT_FIND_SHA1_HASH, &blob,
NULL);
}
}
switch (dwAddDisposition) switch (dwAddDisposition)
{ {
case CERT_STORE_ADD_ALWAYS: case CERT_STORE_ADD_ALWAYS:
@ -383,64 +400,23 @@ static BOOL CRYPT_MemAddCert(PWINECRYPT_CERTSTORE store,
break; break;
case CERT_STORE_ADD_NEW: case CERT_STORE_ADD_NEW:
{ {
BYTE hashToAdd[20], hash[20]; if (existing)
DWORD size = sizeof(hashToAdd);
ret = CRYPT_GetCertificateContextProperty(cert, CERT_HASH_PROP_ID,
hashToAdd, &size);
if (ret)
{ {
PWINE_CERT_LIST_ENTRY cursor; TRACE("found matching certificate, not adding\n");
SetLastError(CRYPT_E_EXISTS);
/* Add if no cert with the same hash is found. */ add = FALSE;
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);
} }
else
add = TRUE;
break; break;
} }
case CERT_STORE_ADD_REPLACE_EXISTING: case CERT_STORE_ADD_REPLACE_EXISTING:
{ {
BYTE hashToAdd[20], hash[20];
DWORD size = sizeof(hashToAdd);
add = TRUE; add = TRUE;
ret = CRYPT_GetCertificateContextProperty(cert, CERT_HASH_PROP_ID, if (existing)
hashToAdd, &size);
if (ret)
{ {
PWINE_CERT_LIST_ENTRY cursor, next; TRACE("found matching certificate, replacing\n");
CertDeleteCertificateFromStore(existing);
/* 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);
} }
break; break;
} }
@ -448,6 +424,8 @@ static BOOL CRYPT_MemAddCert(PWINECRYPT_CERTSTORE store,
FIXME("Unimplemented add disposition %ld\n", dwAddDisposition); FIXME("Unimplemented add disposition %ld\n", dwAddDisposition);
add = FALSE; add = FALSE;
} }
if (existing)
CertFreeCertificateContext(existing);
if (add) if (add)
{ {
PWINE_CERT_LIST_ENTRY entry = CryptMemAlloc( PWINE_CERT_LIST_ENTRY entry = CryptMemAlloc(