wintrust(7/10): Test and implement pfnAddCert2Chain

Juan Lang juan.lang at gmail.com
Mon Aug 27 18:36:06 CDT 2007


--Juan
-------------- next part --------------
From e2a094adf1013446dde81a79d00e7ab597478d7a Mon Sep 17 00:00:00 2001
From: Juan Lang <juanlang at juan.corp.google.com>
Date: Mon, 27 Aug 2007 16:28:56 -0700
Subject: [PATCH] Test and implement pfnAddCert2Chain
---
 dlls/wintrust/register.c      |    2 +-
 dlls/wintrust/tests/softpub.c |   28 ++++++++++++++++++++++++++++
 dlls/wintrust/wintrust_main.c |   37 +++++++++++++++++++++++++++++++++++++
 dlls/wintrust/wintrust_priv.h |    2 ++
 4 files changed, 68 insertions(+), 1 deletions(-)

diff --git a/dlls/wintrust/register.c b/dlls/wintrust/register.c
index 9b97d9c..a3e18e0 100644
--- a/dlls/wintrust/register.c
+++ b/dlls/wintrust/register.c
@@ -838,7 +838,7 @@ BOOL WINAPI WintrustLoadFunctionPointers
     pPfns->pfnFree = WINTRUST_Free;
     pPfns->pfnAddStore2Chain = WINTRUST_AddStore;
     pPfns->pfnAddSgnr2Chain = WINTRUST_AddSgnr;
-    pPfns->pfnAddCert2Chain = NULL;
+    pPfns->pfnAddCert2Chain = WINTRUST_AddCert;
     pPfns->pfnAddPrivData2Chain = NULL;
     pPfns->psUIpfns = NULL;
     pPfns->pfnInitialize = (PFN_PROVIDER_INIT_CALL)WINTRUST_ReadProviderFromReg(GuidString, Initialization);
diff --git a/dlls/wintrust/tests/softpub.c b/dlls/wintrust/tests/softpub.c
index 8a8c409..c501edd 100644
--- a/dlls/wintrust/tests/softpub.c
+++ b/dlls/wintrust/tests/softpub.c
@@ -130,6 +130,8 @@ static void test_utils(SAFE_PROVIDER_FUN
     ok(data.pasSigners != NULL, "Expected pasSigners to be allocated\n");
     if (data.pasSigners)
     {
+        PCCERT_CONTEXT cert;
+
         ok(!memcmp(&data.pasSigners[0], &sgnr, sizeof(sgnr)),
          "Unexpected data in signer\n");
         /* Adds into the location specified by the index */
@@ -156,6 +158,32 @@ static void test_utils(SAFE_PROVIDER_FUN
         ret = funcs->pfnAddSgnr2Chain(&data, FALSE, 0, &sgnr);
         ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
          "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+
+        /* Crash
+        ret = funcs->pfnAddCert2Chain(NULL, 0, FALSE, 0, NULL);
+        ret = funcs->pfnAddCert2Chain(&data, 0, FALSE, 0, NULL);
+         */
+        cert = CertCreateCertificateContext(X509_ASN_ENCODING, v1CertWithPubKey,
+         sizeof(v1CertWithPubKey));
+        if (cert)
+        {
+            /* Notes on behavior that are hard to test:
+             * 1. If pasSigners is invalid, pfnAddCert2Chain crashes
+             * 2. An invalid signer index isn't checked.
+             */
+            ret = funcs->pfnAddCert2Chain(&data, 0, FALSE, 0, cert);
+            ok(ret, "pfnAddCert2Chain failed: %08x\n", GetLastError());
+            ok(data.pasSigners[0].csCertChain == 1, "Expected 1 cert, got %d\n",
+             data.pasSigners[0].csCertChain);
+            ok(data.pasSigners[0].pasCertChain != NULL,
+             "Expected pasCertChain to be allocated\n");
+            if (data.pasSigners[0].pasCertChain)
+                ok(data.pasSigners[0].pasCertChain[0].pCert == cert,
+                 "Unexpected cert\n");
+            CertFreeCertificateContext(cert);
+        }
+        else
+            skip("CertCreateCertificateContext failed: %08x\n", GetLastError());
     }
 }
 
diff --git a/dlls/wintrust/wintrust_main.c b/dlls/wintrust/wintrust_main.c
index 0f6dcd6..d6134b7 100644
--- a/dlls/wintrust/wintrust_main.c
+++ b/dlls/wintrust/wintrust_main.c
@@ -303,3 +303,40 @@ BOOL WINAPI WINTRUST_AddSgnr(CRYPT_PROVI
         SetLastError(ERROR_OUTOFMEMORY);
     return ret;
 }
+
+BOOL WINAPI WINTRUST_AddCert(CRYPT_PROVIDER_DATA *data, DWORD idxSigner,
+ BOOL fCounterSigner, DWORD idxCounterSigner, PCCERT_CONTEXT pCert2Add)
+{
+    BOOL ret = FALSE;
+
+    if (fCounterSigner)
+    {
+        FIXME("unimplemented for counter signers\n");
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+    if (data->pasSigners[idxSigner].csCertChain)
+        data->pasSigners[idxSigner].pasCertChain =
+         WINTRUST_ReAlloc(data->pasSigners[idxSigner].pasCertChain,
+         (data->pasSigners[idxSigner].csCertChain + 1) *
+         sizeof(CRYPT_PROVIDER_CERT));
+    else
+    {
+        data->pasSigners[idxSigner].pasCertChain =
+         WINTRUST_Alloc(sizeof(CRYPT_PROVIDER_CERT));
+        data->pasSigners[idxSigner].csCertChain = 0;
+    }
+    if (data->pasSigners[idxSigner].pasCertChain)
+    {
+        CRYPT_PROVIDER_CERT *cert = &data->pasSigners[idxSigner].pasCertChain[
+         data->pasSigners[idxSigner].csCertChain];
+
+        cert->cbStruct = sizeof(CRYPT_PROVIDER_CERT);
+        cert->pCert = CertDuplicateCertificateContext(pCert2Add);
+        data->pasSigners[idxSigner].csCertChain++;
+        ret = TRUE;
+    }
+    else
+        SetLastError(ERROR_OUTOFMEMORY);
+    return ret;
+}
diff --git a/dlls/wintrust/wintrust_priv.h b/dlls/wintrust/wintrust_priv.h
index 75b0438..4519bd9 100644
--- a/dlls/wintrust/wintrust_priv.h
+++ b/dlls/wintrust/wintrust_priv.h
@@ -24,5 +24,7 @@ void WINAPI WINTRUST_Free(void *p);
 BOOL WINAPI WINTRUST_AddStore(CRYPT_PROVIDER_DATA *data, HCERTSTORE store);
 BOOL WINAPI WINTRUST_AddSgnr(CRYPT_PROVIDER_DATA *data,
  BOOL fCounterSigner, DWORD idxSigner, CRYPT_PROVIDER_SGNR *sgnr);
+BOOL WINAPI WINTRUST_AddCert(CRYPT_PROVIDER_DATA *data, DWORD idxSigner,
+ BOOL fCounterSigner, DWORD idxCounterSigner, PCCERT_CONTEXT pCert2Add);
 
 #endif /* ndef __WINTRUST_PRIV_H__ */
-- 
1.4.1


More information about the wine-patches mailing list