Juan Lang : wintrust: Test and implement pfnAddCert2Chain.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Aug 29 07:48:12 CDT 2007
Module: wine
Branch: master
Commit: 4f2fae1d991b08d2150709c3b16ef8fec50b7e2a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4f2fae1d991b08d2150709c3b16ef8fec50b7e2a
Author: Juan Lang <juan.lang at gmail.com>
Date: Tue Aug 28 16:09:10 2007 -0700
wintrust: 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( GUID* pgActionID,
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 b1ca23a..fa58477 100644
--- a/dlls/wintrust/tests/softpub.c
+++ b/dlls/wintrust/tests/softpub.c
@@ -130,6 +130,8 @@ static void test_utils(SAFE_PROVIDER_FUNCTIONS *funcs)
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_FUNCTIONS *funcs)
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_PROVIDER_DATA *data,
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__ */
More information about the wine-cvs
mailing list