crypt32: Use CertFindCertificateInStore to simplify adding certificates.
This commit is contained in:
parent
b84c9d41e4
commit
661d80708b
dlls/crypt32
|
@ -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(
|
||||||
|
|
Loading…
Reference in New Issue