wintrust(4/5): Implement WinVerifyTrust
Juan Lang
juan.lang at gmail.com
Tue Sep 11 12:39:20 CDT 2007
--Juan
-------------- next part --------------
From 6684549440ec9f0c5a637997e83027928591bd8f Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Tue, 11 Sep 2007 10:24:56 -0700
Subject: [PATCH] Implement WinVerifyTrust
---
dlls/wintrust/wintrust_main.c | 172 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 170 insertions(+), 2 deletions(-)
diff --git a/dlls/wintrust/wintrust_main.c b/dlls/wintrust/wintrust_main.c
index d6134b7..1188ec7 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,137 @@ 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;
+
+ return WINTRUST_DefaultVerifyAndClose(hwnd, actionID, &wintrust_data);
+}
+
/***********************************************************************
* WinVerifyTrust (WINTRUST.@)
*
@@ -84,8 +217,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