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