Juan Lang : wintrust: Implement GenericChainFinalProv.

Alexandre Julliard julliard at winehq.org
Tue Oct 9 13:37:49 CDT 2007


Module: wine
Branch: master
Commit: 355193b70db5fac4d878ee294c3fdbcc4226be36
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=355193b70db5fac4d878ee294c3fdbcc4226be36

Author: Juan Lang <juan.lang at gmail.com>
Date:   Mon Oct  8 15:44:01 2007 -0700

wintrust: Implement GenericChainFinalProv.

---

 dlls/wintrust/softpub.c     |   95 +++++++++++++++++++++++++++++++++++++++++++
 dlls/wintrust/wintrust.spec |    2 +-
 2 files changed, 96 insertions(+), 1 deletions(-)

diff --git a/dlls/wintrust/softpub.c b/dlls/wintrust/softpub.c
index 5770244..d9651ad 100644
--- a/dlls/wintrust/softpub.c
+++ b/dlls/wintrust/softpub.c
@@ -761,6 +761,101 @@ HRESULT WINAPI SoftpubAuthenticode(CRYPT_PROVIDER_DATA *data)
     return ret ? S_OK : S_FALSE;
 }
 
+static HRESULT WINAPI WINTRUST_DefaultPolicy(CRYPT_PROVIDER_DATA *pProvData,
+ DWORD dwStepError, DWORD dwRegPolicySettings, DWORD cSigner,
+ PWTD_GENERIC_CHAIN_POLICY_SIGNER_INFO rgpSigner, void *pvPolicyArg)
+{
+    DWORD i;
+    CERT_CHAIN_POLICY_STATUS policyStatus = { sizeof(policyStatus), 0 };
+
+    for (i = 0; !policyStatus.dwError && i < cSigner; i++)
+    {
+        CERT_CHAIN_POLICY_PARA policyPara = { sizeof(policyPara), 0 };
+
+        if (dwRegPolicySettings & WTPF_IGNOREEXPIRATION)
+            policyPara.dwFlags |=
+             CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG |
+             CERT_CHAIN_POLICY_IGNORE_CTL_NOT_TIME_VALID_FLAG |
+             CERT_CHAIN_POLICY_IGNORE_NOT_TIME_NESTED_FLAG;
+        if (dwRegPolicySettings & WTPF_IGNOREREVOKATION)
+            policyPara.dwFlags |=
+             CERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG |
+             CERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAG |
+             CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG |
+             CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG;
+        CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_BASE,
+         rgpSigner[i].pChainContext, &policyPara, &policyStatus);
+    }
+    return policyStatus.dwError;
+}
+
+HRESULT WINAPI GenericChainFinalProv(CRYPT_PROVIDER_DATA *data)
+{
+    HRESULT err = NO_ERROR; /* not a typo, MS confused the types */
+    WTD_GENERIC_CHAIN_POLICY_DATA *policyData =
+     (WTD_GENERIC_CHAIN_POLICY_DATA *)data->pWintrustData->pPolicyCallbackData;
+
+    TRACE("(%p)\n", data);
+
+    if (data->pWintrustData->dwUIChoice != WTD_UI_NONE)
+        FIXME("unimplemented for UI choice %d\n",
+         data->pWintrustData->dwUIChoice);
+    if (!data->csSigners)
+        err = TRUST_E_NOSIGNATURE;
+    else
+    {
+        PFN_WTD_GENERIC_CHAIN_POLICY_CALLBACK policyCallback;
+        void *policyArg;
+        WTD_GENERIC_CHAIN_POLICY_SIGNER_INFO *signers = NULL;
+
+        if (policyData)
+        {
+            policyCallback = policyData->pfnPolicyCallback;
+            policyArg = policyData->pvPolicyArg;
+        }
+        else
+        {
+            policyCallback = WINTRUST_DefaultPolicy;
+            policyArg = NULL;
+        }
+        if (data->csSigners)
+        {
+            DWORD i;
+
+            signers = data->psPfns->pfnAlloc(
+             data->csSigners * sizeof(WTD_GENERIC_CHAIN_POLICY_SIGNER_INFO));
+            if (signers)
+            {
+                for (i = 0; i < data->csSigners; i++)
+                {
+                    signers[i].u.cbSize =
+                     sizeof(WTD_GENERIC_CHAIN_POLICY_SIGNER_INFO);
+                    signers[i].pChainContext =
+                     data->pasSigners[i].pChainContext;
+                    signers[i].dwSignerType = data->pasSigners[i].dwSignerType;
+                    signers[i].pMsgSignerInfo = data->pasSigners[i].psSigner;
+                    signers[i].dwError = data->pasSigners[i].dwError;
+                    if (data->pasSigners[i].csCounterSigners)
+                        FIXME("unimplemented for counter signers\n");
+                    signers[i].cCounterSigner = 0;
+                    signers[i].rgpCounterSigner = NULL;
+                }
+            }
+            else
+                err = ERROR_OUTOFMEMORY;
+        }
+        if (!err)
+            err = policyCallback(data, TRUSTERROR_STEP_FINAL_POLICYPROV,
+             data->dwRegPolicySettings, data->csSigners, signers, policyArg);
+        data->psPfns->pfnFree(signers);
+    }
+    if (err)
+        data->padwTrustStepErrors[TRUSTERROR_STEP_FINAL_POLICYPROV] = err;
+    TRACE("returning %d (%08x)\n", !err ? S_OK : S_FALSE,
+     data->padwTrustStepErrors[TRUSTERROR_STEP_FINAL_POLICYPROV]);
+    return err == NO_ERROR ? S_OK : S_FALSE;
+}
+
 HRESULT WINAPI SoftpubCleanup(CRYPT_PROVIDER_DATA *data)
 {
     DWORD i, j;
diff --git a/dlls/wintrust/wintrust.spec b/dlls/wintrust/wintrust.spec
index a5ee3d0..5629c3d 100644
--- a/dlls/wintrust/wintrust.spec
+++ b/dlls/wintrust/wintrust.spec
@@ -47,7 +47,7 @@
 @ stub DriverInitializePolicy
 @ stub FindCertsByIssuer
 @ stdcall GenericChainCertificateTrust(ptr)
-@ stub GenericChainFinalProv
+@ stdcall GenericChainFinalProv(ptr)
 @ stub HTTPSCertificateTrust
 @ stub HTTPSFinalProv
 @ stub IsCatalogFile




More information about the wine-cvs mailing list