Exemple #1
0
static BOOL CRYPTDLG_CopyChain(CRYPT_PROVIDER_DATA *data,
 PCCERT_CHAIN_CONTEXT chain)
{
    BOOL ret;
    CRYPT_PROVIDER_SGNR signer;
    PCERT_SIMPLE_CHAIN simpleChain = chain->rgpChain[0];
    DWORD i;

    memset(&signer, 0, sizeof(signer));
    signer.cbStruct = sizeof(signer);
    ret = data->psPfns->pfnAddSgnr2Chain(data, FALSE, 0, &signer);
    if (ret)
    {
        CRYPT_PROVIDER_SGNR *sgnr = WTHelperGetProvSignerFromChain(data, 0,
         FALSE, 0);

        if (sgnr)
        {
            sgnr->dwError = simpleChain->TrustStatus.dwErrorStatus;
            sgnr->pChainContext = CertDuplicateCertificateChain(chain);
        }
        else
            ret = FALSE;
        for (i = 0; ret && i < simpleChain->cElement; i++)
        {
            ret = data->psPfns->pfnAddCert2Chain(data, 0, FALSE, 0,
             simpleChain->rgpElement[i]->pCertContext);
            if (ret)
            {
                CRYPT_PROVIDER_CERT *cert;

                if ((cert = WTHelperGetProvCertFromChain(sgnr, i)))
                {
                    CERT_CHAIN_ELEMENT *element = simpleChain->rgpElement[i];

                    cert->dwConfidence = CRYPTDLG_TrustStatusToConfidence(
                     element->TrustStatus.dwErrorStatus);
                    cert->dwError = element->TrustStatus.dwErrorStatus;
                    cert->pChainElement = element;
                }
                else
                    ret = FALSE;
            }
        }
    }
    return ret;
}
BOOL
IsFilePublisherTrusted(
    LPCWSTR pwszFileName
)
{
    BOOL trusted = FALSE;
    DWORD lastError;
    GUID wvtProvGuid = WINTRUST_ACTION_GENERIC_VERIFY_V2;

    //
    // Initialize structure for WinVerifyTrust call
    //

    WINTRUST_DATA wtd = { 0 };
    WINTRUST_FILE_INFO wtfi = { 0 };

    wtd.cbStruct = sizeof(WINTRUST_DATA);
    wtd.pPolicyCallbackData = NULL;
    wtd.pSIPClientData = NULL;
    wtd.dwUIChoice = WTD_UI_NONE;
    wtd.fdwRevocationChecks = WTD_REVOKE_WHOLECHAIN;
    wtd.dwUnionChoice = WTD_CHOICE_FILE;
    wtd.pFile = &wtfi;
    wtd.dwStateAction = WTD_STATEACTION_VERIFY;
    wtd.hWVTStateData = NULL;
    wtd.pwszURLReference = NULL;
    wtd.dwProvFlags = WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT;

    wtfi.cbStruct = sizeof(WINTRUST_FILE_INFO);
    wtfi.pcwszFilePath = pwszFileName;
    wtfi.hFile = NULL;
    wtfi.pgKnownSubject = NULL;

    //
    // Check the file's Authenticode signature
    //

    if (S_OK != WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &wvtProvGuid, &wtd))
    {
        lastError = GetLastError();
        goto Cleanup;
    }

    //
    // Get provider data
    //

    CRYPT_PROVIDER_DATA* pProvData = WTHelperProvDataFromStateData(wtd.hWVTStateData);
    if (NULL == pProvData)
    {
        lastError = GetLastError();
        goto Cleanup;
    }

    //
    // Get the signer
    //

    CRYPT_PROVIDER_SGNR* pProvSigner = WTHelperGetProvSignerFromChain(pProvData, 0, FALSE, 0);
    if (NULL == pProvSigner)
    {
        lastError = GetLastError();
        goto Cleanup;
    }

    if (!IsTrustedRootKey(pProvSigner->pChainContext))
    {
        goto Cleanup;
    }

    if (!IsTrustedPublisherName(pProvSigner->pChainContext))
    {
        goto Cleanup;
    }

    //
    // If we made it this far, we can trust the file
    //

    trusted = TRUE;

Cleanup:
    //
    // Close the previously-opened state data handle
    //

    wtd.dwStateAction = WTD_STATEACTION_CLOSE;
    WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &wvtProvGuid, &wtd);

    return trusted;
}