Juan Lang : crypt32: Test CertCreateCertificateContext, and fix an error code in a failure case.
Alexandre Julliard
julliard at winehq.org
Thu Sep 22 13:39:49 CDT 2011
Module: wine
Branch: master
Commit: 546bfa2c1ce82f80613cce7870d306faf2de653a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=546bfa2c1ce82f80613cce7870d306faf2de653a
Author: Juan Lang <juan.lang at gmail.com>
Date: Thu Sep 22 05:20:50 2011 -0700
crypt32: Test CertCreateCertificateContext, and fix an error code in a failure case.
---
dlls/crypt32/cert.c | 6 +++++
dlls/crypt32/tests/cert.c | 46 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+), 0 deletions(-)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index 75b0e12..0117f27 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -141,6 +141,12 @@ PCCERT_CONTEXT WINAPI CertCreateCertificateContext(DWORD dwCertEncodingType,
TRACE("(%08x, %p, %d)\n", dwCertEncodingType, pbCertEncoded,
cbCertEncoded);
+ if ((dwCertEncodingType & CERT_ENCODING_TYPE_MASK) != X509_ASN_ENCODING)
+ {
+ SetLastError(E_INVALIDARG);
+ return NULL;
+ }
+
ret = CryptDecodeObjectEx(dwCertEncodingType, X509_CERT_TO_BE_SIGNED,
pbCertEncoded, cbCertEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL,
&certInfo, &size);
diff --git a/dlls/crypt32/tests/cert.c b/dlls/crypt32/tests/cert.c
index e338740..9e7104a 100644
--- a/dlls/crypt32/tests/cert.c
+++ b/dlls/crypt32/tests/cert.c
@@ -634,6 +634,51 @@ static void testCertProperties(void)
CertFreeCertificateContext(context);
}
+static void testCreateCert(void)
+{
+ PCCERT_CONTEXT cert, enumCert;
+ DWORD count, size;
+ BOOL ret;
+
+ SetLastError(0xdeadbeef);
+ cert = CertCreateCertificateContext(0, NULL, 0);
+ ok(!cert && GetLastError() == E_INVALIDARG,
+ "expected E_INVALIDARG, got %08x\n", GetLastError());
+ SetLastError(0xdeadbeef);
+ cert = CertCreateCertificateContext(0, selfSignedCert,
+ sizeof(selfSignedCert));
+ ok(!cert && GetLastError() == E_INVALIDARG,
+ "expected E_INVALIDARG, got %08x\n", GetLastError());
+ SetLastError(0xdeadbeef);
+ cert = CertCreateCertificateContext(X509_ASN_ENCODING, NULL, 0);
+ ok(!cert &&
+ (GetLastError() == CRYPT_E_ASN1_EOD ||
+ broken(GetLastError() == OSS_MORE_INPUT /* NT4 */)),
+ "expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
+
+ cert = CertCreateCertificateContext(X509_ASN_ENCODING,
+ selfSignedCert, sizeof(selfSignedCert));
+ ok(cert != NULL, "creating cert failed: %08x\n", GetLastError());
+ /* Even in-memory certs are expected to have a store associated with them */
+ todo_wine
+ ok(cert->hCertStore != NULL, "expected created cert to have a store\n");
+ /* The cert doesn't have the archived property set (which would imply it
+ * doesn't show up in enumerations.)
+ */
+ size = 0;
+ ret = CertGetCertificateContextProperty(cert, CERT_ARCHIVED_PROP_ID,
+ NULL, &size);
+ ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND,
+ "expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError());
+ /* Strangely, enumerating the certs in the store finds none. */
+ enumCert = NULL;
+ count = 0;
+ while ((enumCert = CertEnumCertificatesInStore(cert->hCertStore, enumCert)))
+ count++;
+ ok(!count, "expected 0, got %d\n", count);
+ CertFreeCertificateContext(cert);
+}
+
static void testDupCert(void)
{
HCERTSTORE store;
@@ -3634,6 +3679,7 @@ START_TEST(cert)
testAddCert();
testCertProperties();
+ testCreateCert();
testDupCert();
testFindCert();
testGetSubjectCert();
More information about the wine-cvs
mailing list