Juan Lang : crypt32: Test and correct finding a subject certificate.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Aug 8 08:59:31 CDT 2007
Module: wine
Branch: master
Commit: bcbf5dcee337d83540c188a6572974ead74219cd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bcbf5dcee337d83540c188a6572974ead74219cd
Author: Juan Lang <juan.lang at gmail.com>
Date: Tue Aug 7 13:15:00 2007 -0700
crypt32: Test and correct finding a subject certificate.
---
dlls/crypt32/cert.c | 8 +++++++-
dlls/crypt32/tests/cert.c | 22 ++++++++++++++++++++++
2 files changed, 29 insertions(+), 1 deletions(-)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index 5e5bed8..ea1d261 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -906,9 +906,15 @@ static BOOL compare_cert_by_subject_cert(PCCERT_CONTEXT pCertContext,
DWORD dwType, DWORD dwFlags, const void *pvPara)
{
CERT_INFO *pCertInfo = (CERT_INFO *)pvPara;
+ BOOL ret;
- return CertCompareCertificateName(pCertContext->dwCertEncodingType,
+ ret = CertCompareCertificateName(pCertContext->dwCertEncodingType,
&pCertInfo->Issuer, &pCertContext->pCertInfo->Subject);
+ if (ret && pCertInfo->SerialNumber.cbData)
+ ret = CertCompareIntegerBlob(&pCertContext->pCertInfo->SerialNumber,
+ &pCertInfo->SerialNumber);
+ TRACE("returning %d\n", ret);
+ return ret;
}
static BOOL compare_cert_by_cert_id(PCCERT_CONTEXT pCertContext, DWORD dwType,
diff --git a/dlls/crypt32/tests/cert.c b/dlls/crypt32/tests/cert.c
index ab668ae..af58b5f 100644
--- a/dlls/crypt32/tests/cert.c
+++ b/dlls/crypt32/tests/cert.c
@@ -604,6 +604,7 @@ static void testFindCert(void)
BOOL ret;
CERT_INFO certInfo = { 0 };
CRYPT_HASH_BLOB blob;
+ BYTE otherSerialNumber[] = { 2 };
store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
CERT_STORE_CREATE_NEW_FLAG, NULL);
@@ -685,6 +686,27 @@ static void testFindCert(void)
CERT_FIND_SUBJECT_CERT, &certInfo.Subject, context);
ok(context == NULL, "Expected one cert only\n");
}
+ /* The above search matched even though no serial number is set. A
+ * non-matching serial number will not match.
+ */
+ certInfo.SerialNumber.pbData = otherSerialNumber;
+ certInfo.SerialNumber.cbData = sizeof(otherSerialNumber);
+ context = CertFindCertificateInStore(store, X509_ASN_ENCODING, 0,
+ CERT_FIND_SUBJECT_CERT, &certInfo, NULL);
+ ok(context == NULL, "Expected no match\n");
+ /* A matching serial number will match. */
+ certInfo.SerialNumber.pbData = serialNum;
+ certInfo.SerialNumber.cbData = sizeof(serialNum);
+ context = CertFindCertificateInStore(store, X509_ASN_ENCODING, 0,
+ CERT_FIND_SUBJECT_CERT, &certInfo, NULL);
+ ok(context != NULL, "CertFindCertificateInStore failed: %08x\n",
+ GetLastError());
+ if (context)
+ {
+ context = CertFindCertificateInStore(store, X509_ASN_ENCODING, 0,
+ CERT_FIND_SUBJECT_CERT, &certInfo.Subject, context);
+ ok(context == NULL, "Expected one cert only\n");
+ }
/* The nice thing about hashes, they're unique */
blob.pbData = bigCertHash;
More information about the wine-cvs
mailing list