Juan Lang : crypt32: Implement CertFindCertificateInStore for CERT_FIND_SIGNATURE_HASH.

Alexandre Julliard julliard at winehq.org
Tue Aug 19 08:46:25 CDT 2008


Module: wine
Branch: master
Commit: a1e14feeac8a5bbcda8ea9ecfd35252ba1a91cbb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a1e14feeac8a5bbcda8ea9ecfd35252ba1a91cbb

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Aug  8 10:44:46 2008 -0700

crypt32: Implement CertFindCertificateInStore for CERT_FIND_SIGNATURE_HASH.

---

 dlls/crypt32/cert.c |   29 +++++++++++++++++++++++++++++
 1 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index 4d5d5e4..d9ab229 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -1143,6 +1143,32 @@ static BOOL compare_existing_cert(PCCERT_CONTEXT pCertContext, DWORD dwType,
      pCertContext->pCertInfo, toCompare->pCertInfo);
 }
 
+static BOOL compare_cert_by_signature_hash(PCCERT_CONTEXT pCertContext, DWORD dwType,
+ DWORD dwFlags, const void *pvPara)
+{
+    const CRYPT_HASH_BLOB *hash = (const CRYPT_HASH_BLOB *)pvPara;
+    DWORD size = 0;
+    BOOL ret;
+
+    ret = CertGetCertificateContextProperty(pCertContext,
+     CERT_SIGNATURE_HASH_PROP_ID, NULL, &size);
+    if (ret && size == hash->cbData)
+    {
+        LPBYTE buf = CryptMemAlloc(size);
+
+        if (buf)
+        {
+            CertGetCertificateContextProperty(pCertContext,
+             CERT_SIGNATURE_HASH_PROP_ID, buf, &size);
+            ret = !memcmp(buf, hash->pbData, size);
+            CryptMemFree(buf);
+        }
+    }
+    else
+        ret = FALSE;
+    return ret;
+}
+
 PCCERT_CONTEXT WINAPI CertFindCertificateInStore(HCERTSTORE hCertStore,
  DWORD dwCertEncodingType, DWORD dwFlags, DWORD dwType, const void *pvPara,
  PCCERT_CONTEXT pPrevCertContext)
@@ -1179,6 +1205,9 @@ PCCERT_CONTEXT WINAPI CertFindCertificateInStore(HCERTSTORE hCertStore,
     case CERT_COMPARE_EXISTING:
         compare = compare_existing_cert;
         break;
+    case CERT_COMPARE_SIGNATURE_HASH:
+        compare = compare_cert_by_signature_hash;
+        break;
     default:
         FIXME("find type %08x unimplemented\n", dwType);
         compare = NULL;




More information about the wine-cvs mailing list