Juan Lang : crypt32: Implement CertFindCTLInStore.

Alexandre Julliard julliard at winehq.org
Tue Sep 2 08:32:52 CDT 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Aug 29 07:57:19 2008 -0700

crypt32: Implement CertFindCTLInStore.

---

 dlls/crypt32/crypt32.spec |    2 +-
 dlls/crypt32/ctl.c        |  126 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 127 insertions(+), 1 deletions(-)

diff --git a/dlls/crypt32/crypt32.spec b/dlls/crypt32/crypt32.spec
index a5af07d..8476345 100644
--- a/dlls/crypt32/crypt32.spec
+++ b/dlls/crypt32/crypt32.spec
@@ -38,7 +38,7 @@
 @ stdcall CertEnumSystemStore(long ptr ptr ptr)
 @ stdcall CertFindAttribute(str long ptr)
 @ stdcall CertFindCRLInStore(long long long long ptr ptr)
-@ stub CertFindCTLInStore
+@ stdcall CertFindCTLInStore(long long long long ptr ptr)
 @ stdcall CertFindCertificateInStore(long long long long ptr ptr)
 @ stdcall CertFindCertificateInCRL(ptr ptr long ptr ptr)
 @ stdcall CertFindExtension(str long ptr)
diff --git a/dlls/crypt32/ctl.c b/dlls/crypt32/ctl.c
index 864f56d..12ee19d 100644
--- a/dlls/crypt32/ctl.c
+++ b/dlls/crypt32/ctl.c
@@ -68,6 +68,132 @@ PCCTL_CONTEXT WINAPI CertEnumCTLsInStore(HCERTSTORE hCertStore,
     return ret;
 }
 
+typedef BOOL (*CtlCompareFunc)(PCCTL_CONTEXT pCtlContext, DWORD dwType,
+ DWORD dwFlags, const void *pvPara);
+
+static BOOL compare_ctl_any(PCCTL_CONTEXT pCtlContext, DWORD dwType,
+ DWORD dwFlags, const void *pvPara)
+{
+    return TRUE;
+}
+
+static BOOL compare_ctl_by_md5_hash(PCCTL_CONTEXT pCtlContext, DWORD dwType,
+ DWORD dwFlags, const void *pvPara)
+{
+    BOOL ret;
+    BYTE hash[16];
+    DWORD size = sizeof(hash);
+
+    ret = CertGetCTLContextProperty(pCtlContext, CERT_MD5_HASH_PROP_ID, hash,
+     &size);
+    if (ret)
+    {
+        const CRYPT_HASH_BLOB *pHash = (const CRYPT_HASH_BLOB *)pvPara;
+
+        if (size == pHash->cbData)
+            ret = !memcmp(pHash->pbData, hash, size);
+        else
+            ret = FALSE;
+    }
+    return ret;
+}
+
+static BOOL compare_ctl_by_sha1_hash(PCCTL_CONTEXT pCtlContext, DWORD dwType,
+ DWORD dwFlags, const void *pvPara)
+{
+    BOOL ret;
+    BYTE hash[20];
+    DWORD size = sizeof(hash);
+
+    ret = CertGetCTLContextProperty(pCtlContext, CERT_SHA1_HASH_PROP_ID, hash,
+     &size);
+    if (ret)
+    {
+        const CRYPT_HASH_BLOB *pHash = (const CRYPT_HASH_BLOB *)pvPara;
+
+        if (size == pHash->cbData)
+            ret = !memcmp(pHash->pbData, hash, size);
+        else
+            ret = FALSE;
+    }
+    return ret;
+}
+
+static BOOL compare_ctl_existing(PCCTL_CONTEXT pCtlContext, DWORD dwType,
+ DWORD dwFlags, const void *pvPara)
+{
+    BOOL ret;
+
+    if (pvPara)
+    {
+        PCCTL_CONTEXT ctl = (PCCTL_CONTEXT)pvPara;
+
+        if (pCtlContext->cbCtlContext == ctl->cbCtlContext)
+        {
+            if (ctl->cbCtlContext)
+                ret = !memcmp(pCtlContext->pbCtlContext, ctl->pbCtlContext,
+                 ctl->cbCtlContext);
+            else
+                ret = TRUE;
+        }
+        else
+            ret = FALSE;
+    }
+    else
+        ret = FALSE;
+    return ret;
+}
+
+PCCTL_CONTEXT WINAPI CertFindCTLInStore(HCERTSTORE hCertStore,
+ DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType,
+ const void *pvFindPara, PCCTL_CONTEXT pPrevCtlContext)
+{
+    PCCTL_CONTEXT ret;
+    CtlCompareFunc compare;
+
+    TRACE("(%p, %d, %d, %d, %p, %p)\n", hCertStore, dwCertEncodingType,
+	 dwFindFlags, dwFindType, pvFindPara, pPrevCtlContext);
+
+    switch (dwFindType)
+    {
+    case CTL_FIND_ANY:
+        compare = compare_ctl_any;
+        break;
+    case CTL_FIND_SHA1_HASH:
+        compare = compare_ctl_by_sha1_hash;
+        break;
+    case CTL_FIND_MD5_HASH:
+        compare = compare_ctl_by_md5_hash;
+        break;
+    case CTL_FIND_EXISTING:
+        compare = compare_ctl_existing;
+        break;
+    default:
+        FIXME("find type %08x unimplemented\n", dwFindType);
+        compare = NULL;
+    }
+
+    if (compare)
+    {
+        BOOL matches = FALSE;
+
+        ret = pPrevCtlContext;
+        do {
+            ret = CertEnumCTLsInStore(hCertStore, ret);
+            if (ret)
+                matches = compare(ret, dwFindType, dwFindFlags, pvFindPara);
+        } while (ret != NULL && !matches);
+        if (!ret)
+            SetLastError(CRYPT_E_NOT_FOUND);
+    }
+    else
+    {
+        SetLastError(CRYPT_E_NOT_FOUND);
+        ret = NULL;
+    }
+    return ret;
+}
+
 BOOL WINAPI CertDeleteCTLFromStore(PCCTL_CONTEXT pCtlContext)
 {
     BOOL ret;




More information about the wine-cvs mailing list