Juan Lang : wintrust: Implement WinVerifyTrust.
Module: wine Branch: master Commit: 40f33d656819085d585943a2f38b9ad2a50f9132 URL: http://source.winehq.org/git/wine.git/?a=commit;h=40f33d656819085d585943a2f3... Author: Juan Lang <juan.lang(a)gmail.com> Date: Wed Sep 12 09:01:19 2007 -0700 wintrust: 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 "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( PCCERT_CONTEXT cert ) 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( PCCERT_CONTEXT cert ) */ 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; } /***********************************************************************
participants (1)
-
Alexandre Julliard