Juan Lang : cryptui: Call WinVerifyTrust if the caller has not.

Alexandre Julliard julliard at winehq.org
Thu Dec 18 08:08:40 CST 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Mon Nov  3 17:32:57 2008 -0800

cryptui: Call WinVerifyTrust if the caller has not.

---

 dlls/cryptui/Makefile.in |    1 +
 dlls/cryptui/main.c      |   78 +++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 74 insertions(+), 5 deletions(-)

diff --git a/dlls/cryptui/Makefile.in b/dlls/cryptui/Makefile.in
index abb0b27..2093500 100644
--- a/dlls/cryptui/Makefile.in
+++ b/dlls/cryptui/Makefile.in
@@ -4,6 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = cryptui.dll
 IMPORTS   = crypt32 kernel32
+DELAYIMPORTS = wintrust
 IMPORTLIB = cryptui
 
 C_SRCS = \
diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index b476a73..c0b8ffd 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -26,6 +26,7 @@
 #include "winbase.h"
 #include "winnls.h"
 #include "winuser.h"
+#include "softpub.h"
 #include "cryptuiapi.h"
 #include "wine/debug.h"
 
@@ -101,12 +102,79 @@ error:
     return ret;
 }
 
-BOOL WINAPI CryptUIDlgViewCertificateW(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo,
-                                       BOOL *pfPropertiesChanged)
+/***********************************************************************
+ *		CryptUIDlgViewCertificateW (CRYPTUI.@)
+ */
+BOOL WINAPI CryptUIDlgViewCertificateW(
+ PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, BOOL *pfPropertiesChanged)
 {
-    FIXME("(%p, %p): stub\n", pCertViewInfo, pfPropertiesChanged);
-    if (pfPropertiesChanged) *pfPropertiesChanged = FALSE;
-    return TRUE;
+    static GUID generic_cert_verify = WINTRUST_ACTION_GENERIC_CERT_VERIFY;
+    CRYPTUI_VIEWCERTIFICATE_STRUCTW viewInfo;
+    WINTRUST_DATA wvt;
+    WINTRUST_CERT_INFO cert;
+    BOOL ret = FALSE;
+    CRYPT_PROVIDER_SGNR *signer;
+    CRYPT_PROVIDER_CERT *provCert = NULL;
+
+    TRACE("(%p, %p)\n", pCertViewInfo, pfPropertiesChanged);
+
+    if (pCertViewInfo->dwSize != sizeof(CRYPTUI_VIEWCERTIFICATE_STRUCTW))
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+    /* Make a local copy in case we have to call WinVerifyTrust ourselves */
+    memcpy(&viewInfo, pCertViewInfo, sizeof(viewInfo));
+    if (!viewInfo.u.hWVTStateData)
+    {
+        memset(&wvt, 0, sizeof(wvt));
+        wvt.cbStruct = sizeof(wvt);
+        wvt.dwUIChoice = WTD_UI_NONE;
+        if (viewInfo.dwFlags &
+         CRYPTUI_ENABLE_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT)
+            wvt.fdwRevocationChecks |= WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT;
+        if (viewInfo.dwFlags & CRYPTUI_ENABLE_REVOCATION_CHECK_END_CERT)
+            wvt.fdwRevocationChecks |= WTD_REVOCATION_CHECK_END_CERT;
+        if (viewInfo.dwFlags & CRYPTUI_ENABLE_REVOCATION_CHECK_CHAIN)
+            wvt.fdwRevocationChecks |= WTD_REVOCATION_CHECK_CHAIN;
+        wvt.dwUnionChoice = WTD_CHOICE_CERT;
+        memset(&cert, 0, sizeof(cert));
+        cert.cbStruct = sizeof(cert);
+        cert.psCertContext = (CERT_CONTEXT *)viewInfo.pCertContext;
+        cert.chStores = viewInfo.cStores;
+        cert.pahStores = viewInfo.rghStores;
+        wvt.u.pCert = &cert;
+        wvt.dwStateAction = WTD_STATEACTION_VERIFY;
+        WinVerifyTrust(NULL, &generic_cert_verify, &wvt);
+        viewInfo.u.pCryptProviderData =
+         WTHelperProvDataFromStateData(wvt.hWVTStateData);
+        signer = WTHelperGetProvSignerFromChain(
+         (CRYPT_PROVIDER_DATA *)viewInfo.u.pCryptProviderData, 0, FALSE, 0);
+        provCert = WTHelperGetProvCertFromChain(signer, 0);
+        ret = TRUE;
+    }
+    else
+    {
+        viewInfo.u.pCryptProviderData =
+         WTHelperProvDataFromStateData(viewInfo.u.hWVTStateData);
+        signer = WTHelperGetProvSignerFromChain(
+         (CRYPT_PROVIDER_DATA *)viewInfo.u.pCryptProviderData,
+         viewInfo.idxSigner, viewInfo.fCounterSigner,
+         viewInfo.idxCounterSigner);
+        provCert = WTHelperGetProvCertFromChain(signer, viewInfo.idxCert);
+        ret = TRUE;
+    }
+    if (ret)
+    {
+        FIXME("show cert dialog\n");
+        ret = FALSE;
+        if (!viewInfo.u.hWVTStateData)
+        {
+            wvt.dwStateAction = WTD_STATEACTION_CLOSE;
+            WinVerifyTrust(NULL, &generic_cert_verify, &wvt);
+        }
+    }
+    return ret;
 }
 
 static PCCERT_CONTEXT make_cert_from_file(LPCWSTR fileName)




More information about the wine-cvs mailing list