wintrust: Implement WinVerifyTrust.
This commit is contained in:
parent
0463f99b73
commit
40f33d6568
|
@ -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;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
|
Loading…
Reference in New Issue