crypt32(3/17): Make a helper function to create initial candidate chain

Juan Lang juan.lang at gmail.com
Thu Sep 6 12:05:45 CDT 2007


--Juan
-------------- next part --------------
From 72f11c0940376a50947aeb2c0c8d04d07921ba0a Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Thu, 6 Sep 2007 09:57:29 -0700
Subject: [PATCH] Make a helper function to create initial candidate chain
---
 dlls/crypt32/chain.c |   64 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 40 insertions(+), 24 deletions(-)

diff --git a/dlls/crypt32/chain.c b/dlls/crypt32/chain.c
index 7efe0c7..9652d61 100644
--- a/dlls/crypt32/chain.c
+++ b/dlls/crypt32/chain.c
@@ -569,6 +569,42 @@ static BOOL CRYPT_BuildSimpleChain(HCERT
     return ret;
 }
 
+static BOOL CRYPT_BuildCandidateChainFromCert(HCERTCHAINENGINE hChainEngine,
+ PCCERT_CONTEXT pCertContext, LPFILETIME pTime, HCERTSTORE hAdditionalStore,
+ PCertificateChain *ppChain)
+{
+    PCERT_SIMPLE_CHAIN simpleChain = NULL;
+    BOOL ret;
+
+    /* FIXME: only simple chains are supported for now, as CTLs aren't
+     * supported yet.
+     */
+    if ((ret = CRYPT_BuildSimpleChain(hChainEngine, pCertContext, pTime,
+     hAdditionalStore, &simpleChain)))
+    {
+        PCertificateChain chain = CryptMemAlloc(sizeof(CertificateChain));
+
+        if (chain)
+        {
+            chain->ref = 1;
+            chain->context.cbSize = sizeof(CERT_CHAIN_CONTEXT);
+            memcpy(&chain->context.TrustStatus, &simpleChain->TrustStatus,
+             sizeof(CERT_TRUST_STATUS));
+            chain->context.cChain = 1;
+            chain->context.rgpChain = CryptMemAlloc(sizeof(PCERT_SIMPLE_CHAIN));
+            chain->context.rgpChain[0] = simpleChain;
+            chain->context.cLowerQualityChainContext = 0;
+            chain->context.rgpLowerQualityChainContext = NULL;
+            chain->context.fHasRevocationFreshnessTime = FALSE;
+            chain->context.dwRevocationFreshnessTime = 0;
+        }
+        else
+            ret = FALSE;
+        *ppChain = chain;
+    }
+    return ret;
+}
+
 typedef struct _CERT_CHAIN_PARA_NO_EXTRA_FIELDS {
     DWORD            cbSize;
     CERT_USAGE_MATCH RequestedUsage;
@@ -588,8 +624,8 @@ BOOL WINAPI CertGetCertificateChain(HCER
  PCERT_CHAIN_PARA pChainPara, DWORD dwFlags, LPVOID pvReserved,
  PCCERT_CHAIN_CONTEXT* ppChainContext)
 {
-    PCERT_SIMPLE_CHAIN simpleChain = NULL;
     BOOL ret;
+    PCertificateChain chain;
 
     TRACE("(%p, %p, %p, %p, %p, %08x, %p, %p)\n", hChainEngine, pCertContext,
      pTime, hAdditionalStore, pChainPara, dwFlags, pvReserved, ppChainContext);
@@ -605,30 +641,10 @@ BOOL WINAPI CertGetCertificateChain(HCER
         hChainEngine = CRYPT_GetDefaultChainEngine();
     /* FIXME: what about HCCE_LOCAL_MACHINE? */
     /* FIXME: pChainPara is for now ignored */
-    /* FIXME: only simple chains are supported for now, as CTLs aren't
-     * supported yet.
-     */
-    if ((ret = CRYPT_BuildSimpleChain(hChainEngine, pCertContext, pTime,
-     hAdditionalStore, &simpleChain)))
+    ret = CRYPT_BuildCandidateChainFromCert(hChainEngine, pCertContext, pTime,
+     hAdditionalStore, &chain);
+    if (ret)
     {
-        PCertificateChain chain = CryptMemAlloc(sizeof(CertificateChain));
-
-        if (chain)
-        {
-            chain->ref = 1;
-            chain->context.cbSize = sizeof(CERT_CHAIN_CONTEXT);
-            memcpy(&chain->context.TrustStatus, &simpleChain->TrustStatus,
-             sizeof(CERT_TRUST_STATUS));
-            chain->context.cChain = 1;
-            chain->context.rgpChain = CryptMemAlloc(sizeof(PCERT_SIMPLE_CHAIN));
-            chain->context.rgpChain[0] = simpleChain;
-            chain->context.cLowerQualityChainContext = 0;
-            chain->context.rgpLowerQualityChainContext = NULL;
-            chain->context.fHasRevocationFreshnessTime = FALSE;
-            chain->context.dwRevocationFreshnessTime = 0;
-        }
-        else
-            ret = FALSE;
         if (ppChainContext)
             *ppChainContext = (PCCERT_CHAIN_CONTEXT)chain;
         else
-- 
1.4.1


More information about the wine-patches mailing list