From 546bfa2c1ce82f80613cce7870d306faf2de653a Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Thu, 22 Sep 2011 05:20:50 -0700 Subject: [PATCH] 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(+) diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c index 75b0e12ad0..0117f279c6 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 e33874060c..9e7104ab37 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(); -- 2.32.0.93.g670b81a890