Module: wine Branch: master Commit: 546bfa2c1ce82f80613cce7870d306faf2de653a URL: http://source.winehq.org/git/wine.git/?a=commit;h=546bfa2c1ce82f80613cce7870...
Author: Juan Lang juan.lang@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();