wintrust(4/5): Implement WinVerifyTrust

Juan Lang juan.lang at gmail.com
Wed Sep 12 11:04:13 CDT 2007


--Juan
-------------- next part --------------
From 592db269aab2b5e272d0340e649bf52dec64fa2d Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Wed, 12 Sep 2007 09:01:19 -0700
Subject: [PATCH] Implement WinVerifyTrust
---
 dlls/wintrust/wintrust_main.c |  173 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 171 insertions(+), 2 deletions(-)

diff --git a/dlls/wintrust/wintrust_main.c b/dlls/wintrust/wintrust_main.c
index d6134b7..e4879b7 100644
--- a/dlls/wintrust/wintrust_main.c
+++ b/dlls/wintrust/wintrust_main.c
@@ -1,5 +1,6 @@
 /*
  * Copyright 2001 Rein Klazes
+ * Copyright 2007 Juan Lang
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -29,6 +30,7 @@ #include "wintrust.h"
 #include "softpub.h"
 #include "mscat.h"
 #include "objbase.h"
+#include "winuser.h"
 #include "wintrust_priv.h"
 #include "wine/debug.h"
 
@@ -64,6 +66,138 @@ BOOL WINAPI TrustIsCertificateSelfSigned
     return ret;
 }
 
+static LONG WINTRUST_DefaultVerify(HWND hwnd, GUID *actionID,
+ WINTRUST_DATA *data)
+{
+    DWORD err = ERROR_SUCCESS;
+    CRYPT_PROVIDER_DATA *provData;
+    BOOL ret;
+
+    TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(actionID), data);
+
+    provData = WINTRUST_Alloc(sizeof(CRYPT_PROVIDER_DATA));
+    if (!provData)
+        goto oom;
+    provData->cbStruct = sizeof(CRYPT_PROVIDER_DATA);
+
+    provData->padwTrustStepErrors =
+     WINTRUST_Alloc(TRUSTERROR_MAX_STEPS * sizeof(DWORD));
+    if (!provData->padwTrustStepErrors)
+        goto oom;
+    provData->cdwTrustStepErrors = TRUSTERROR_MAX_STEPS;
+
+    provData->pPDSip = WINTRUST_Alloc(sizeof(PROVDATA_SIP));
+    if (!provData->pPDSip)
+        goto oom;
+    provData->pPDSip->cbStruct = sizeof(PROVDATA_SIP);
+
+    provData->psPfns = WINTRUST_Alloc(sizeof(CRYPT_PROVIDER_FUNCTIONS));
+    if (!provData->psPfns)
+        goto oom;
+    provData->psPfns->cbStruct = sizeof(CRYPT_PROVIDER_FUNCTIONS);
+    ret = WintrustLoadFunctionPointers(actionID, provData->psPfns);
+    if (!ret)
+    {
+        err = GetLastError();
+        goto error;
+    }
+
+    data->hWVTStateData = (HANDLE)provData;
+    provData->pWintrustData = data;
+    if (hwnd == INVALID_HANDLE_VALUE)
+        provData->hWndParent = GetDesktopWindow();
+    else
+        provData->hWndParent = hwnd;
+    provData->pgActionID = actionID;
+    WintrustGetRegPolicyFlags(&provData->dwRegPolicySettings);
+
+    err = provData->psPfns->pfnInitialize(provData);
+    if (err)
+        goto done;
+    err = provData->psPfns->pfnObjectTrust(provData);
+    if (err)
+        goto done;
+    err = provData->psPfns->pfnSignatureTrust(provData);
+    if (err)
+        goto done;
+    err = provData->psPfns->pfnCertificateTrust(provData);
+    if (err)
+        goto done;
+    err = provData->psPfns->pfnFinalPolicy(provData);
+    goto done;
+
+oom:
+    err = ERROR_OUTOFMEMORY;
+error:
+    if (provData)
+    {
+        WINTRUST_Free(provData->padwTrustStepErrors);
+        WINTRUST_Free(provData->pPDSip);
+        WINTRUST_Free(provData->psPfns);
+        WINTRUST_Free(provData);
+    }
+done:
+    TRACE("returning %08x\n", err);
+    return err;
+}
+
+static LONG WINTRUST_DefaultClose(HWND hwnd, GUID *actionID,
+ WINTRUST_DATA *data)
+{
+    DWORD err = ERROR_SUCCESS;
+    CRYPT_PROVIDER_DATA *provData = (CRYPT_PROVIDER_DATA *)data->hWVTStateData;
+
+    TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(actionID), data);
+
+    if (provData)
+    {
+        err = provData->psPfns->pfnCleanupPolicy(provData);
+        WINTRUST_Free(provData->padwTrustStepErrors);
+        WINTRUST_Free(provData->pPDSip);
+        WINTRUST_Free(provData->psPfns);
+        WINTRUST_Free(provData);
+        data->hWVTStateData = NULL;
+    }
+    TRACE("returning %08x\n", err);
+    return err;
+}
+
+static LONG WINTRUST_DefaultVerifyAndClose(HWND hwnd, GUID *actionID,
+ WINTRUST_DATA *data)
+{
+    LONG err;
+
+    TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(actionID), data);
+
+    err = WINTRUST_DefaultVerify(hwnd, actionID, data);
+    WINTRUST_DefaultClose(hwnd, actionID, data);
+    TRACE("returning %08x\n", err);
+    return err;
+}
+
+static LONG WINTRUST_PublishedSoftware(HWND hwnd, GUID *actionID,
+ WINTRUST_DATA *data)
+{
+    WINTRUST_DATA wintrust_data = { sizeof(wintrust_data), 0 };
+    /* Undocumented: the published software action is passed a path,
+     * and pSIPClientData points to a WIN_TRUST_SUBJECT_FILE.
+     */
+    LPCWSTR path = (LPCWSTR)data->pFile;
+    LPWIN_TRUST_SUBJECT_FILE subjectFile =
+     (LPWIN_TRUST_SUBJECT_FILE)data->pSIPClientData;
+    WINTRUST_FILE_INFO fileInfo = { sizeof(fileInfo), 0 };
+
+    TRACE("subjectFile->hFile: %p\n", subjectFile->hFile);
+    TRACE("subjectFile->lpPath: %s\n", debugstr_w(subjectFile->lpPath));
+    fileInfo.pcwszFilePath = path;
+    fileInfo.hFile = subjectFile->hFile;
+    wintrust_data.pFile = &fileInfo;
+    wintrust_data.dwUnionChoice = WTD_CHOICE_FILE;
+    wintrust_data.dwUIChoice = WTD_UI_NONE;
+
+    return WINTRUST_DefaultVerifyAndClose(hwnd, actionID, &wintrust_data);
+}
+
 /***********************************************************************
  *		WinVerifyTrust (WINTRUST.@)
  *
@@ -84,8 +218,43 @@ BOOL WINAPI TrustIsCertificateSelfSigned
  */
 LONG WINAPI WinVerifyTrust( HWND hwnd, GUID *ActionID, LPVOID ActionData )
 {
-    FIXME("%p %s %p\n", hwnd, debugstr_guid(ActionID), ActionData);
-    return ERROR_SUCCESS;
+    static const GUID unknown = { 0xC689AAB8, 0x8E78, 0x11D0, { 0x8C,0x47,
+     0x00,0xC0,0x4F,0xC2,0x95,0xEE } };
+    static const GUID published_software = WIN_SPUB_ACTION_PUBLISHED_SOFTWARE;
+    static const GUID generic_verify_v2 = WINTRUST_ACTION_GENERIC_VERIFY_V2;
+    LONG err = ERROR_SUCCESS;
+    WINTRUST_DATA *actionData = (WINTRUST_DATA *)ActionData;
+
+    TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(ActionID), ActionData);
+
+    /* Support for known old-style callers: */
+    if (IsEqualGUID(ActionID, &published_software))
+        err = WINTRUST_PublishedSoftware(hwnd, ActionID, ActionData);
+    else
+    {
+        /* Check known actions to warn of possible problems */
+        if (!IsEqualGUID(ActionID, &unknown) &&
+         !IsEqualGUID(ActionID, &generic_verify_v2))
+            WARN("unknown action %s, default behavior may not be right\n",
+             debugstr_guid(ActionID));
+        switch (actionData->dwStateAction)
+        {
+        case WTD_STATEACTION_IGNORE:
+            err = WINTRUST_DefaultVerifyAndClose(hwnd, ActionID, ActionData);
+            break;
+        case WTD_STATEACTION_VERIFY:
+            err = WINTRUST_DefaultVerify(hwnd, ActionID, ActionData);
+            break;
+        case WTD_STATEACTION_CLOSE:
+            err = WINTRUST_DefaultClose(hwnd, ActionID, ActionData);
+            break;
+        default:
+            FIXME("unimplemented for %d\n", actionData->dwStateAction);
+        }
+    }
+
+    TRACE("returning %08x\n", err);
+    return err;
 }
 
 /***********************************************************************
-- 
1.4.1


More information about the wine-patches mailing list