[CRYPT32_WINETEST] Sync crypt32 winetest to wine-10.0 (#8058)

- Sync crypt32 winetest to Wine 10.0.
- Guard tests we can't compile yet.
- Conditionally skip tests that crash on different Windows versions.
This commit is contained in:
Carl J. Bialorucki
2025-08-08 11:28:10 -06:00
committed by GitHub
parent 2cf3f14c50
commit 57092f4990
16 changed files with 7943 additions and 5655 deletions

View File

@@ -25,7 +25,13 @@ add_executable(crypt32_winetest
${SOURCE} ${SOURCE}
${PCH_SKIP_SOURCE}) ${PCH_SKIP_SOURCE})
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR
CMAKE_C_COMPILER_ID STREQUAL "Clang")
target_compile_options(crypt32_winetest PRIVATE -Wno-format)
endif()
set_module_type(crypt32_winetest win32cui) set_module_type(crypt32_winetest win32cui)
add_importlibs(crypt32_winetest crypt32 advapi32 user32 shlwapi shell32 msvcrt kernel32) add_importlibs(crypt32_winetest crypt32 advapi32 user32 shlwapi shell32 msvcrt kernel32)
add_pch(crypt32_winetest precomp.h "${PCH_SKIP_SOURCE}") add_pch(crypt32_winetest precomp.h "${PCH_SKIP_SOURCE}")
add_rostests_file(TARGET crypt32_winetest) add_rostests_file(TARGET crypt32_winetest)
target_compile_definitions(crypt32_winetest PRIVATE wcsicmp=_wcsicmp)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -77,18 +77,6 @@ static const BYTE signedCRL[] = { 0x30, 0x45, 0x30, 0x2c, 0x30, 0x02, 0x06,
0x30, 0x5a, 0x30, 0x02, 0x06, 0x00, 0x03, 0x11, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x30, 0x5a, 0x30, 0x02, 0x06, 0x00, 0x03, 0x11, 0x00, 0x0f, 0x0e, 0x0d, 0x0c,
0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 };
static BOOL (WINAPI *pCertFindCertificateInCRL)(PCCERT_CONTEXT,PCCRL_CONTEXT,DWORD,void*,PCRL_ENTRY*);
static PCCRL_CONTEXT (WINAPI *pCertFindCRLInStore)(HCERTSTORE,DWORD,DWORD,DWORD,const void*,PCCRL_CONTEXT);
static BOOL (WINAPI *pCertIsValidCRLForCertificate)(PCCERT_CONTEXT, PCCRL_CONTEXT, DWORD, void*);
static void init_function_pointers(void)
{
HMODULE hdll = GetModuleHandleA("crypt32.dll");
pCertFindCertificateInCRL = (void*)GetProcAddress(hdll, "CertFindCertificateInCRL");
pCertFindCRLInStore = (void*)GetProcAddress(hdll, "CertFindCRLInStore");
pCertIsValidCRLForCertificate = (void*)GetProcAddress(hdll, "CertIsValidCRLForCertificate");
}
static void testCreateCRL(void) static void testCreateCRL(void)
{ {
PCCRL_CONTEXT context; PCCRL_CONTEXT context;
@@ -96,11 +84,11 @@ static void testCreateCRL(void)
context = CertCreateCRLContext(0, NULL, 0); context = CertCreateCRLContext(0, NULL, 0);
ok(!context && GetLastError() == E_INVALIDARG, ok(!context && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
context = CertCreateCRLContext(X509_ASN_ENCODING, NULL, 0); context = CertCreateCRLContext(X509_ASN_ENCODING, NULL, 0);
GLE = GetLastError(); GLE = GetLastError();
ok(!context && (GLE == CRYPT_E_ASN1_EOD || GLE == OSS_MORE_INPUT), ok(!context && GLE == CRYPT_E_ASN1_EOD,
"Expected CRYPT_E_ASN1_EOD or OSS_MORE_INPUT, got %08x\n", GLE); "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GLE);
context = CertCreateCRLContext(X509_ASN_ENCODING, bigCert, sizeof(bigCert)); context = CertCreateCRLContext(X509_ASN_ENCODING, bigCert, sizeof(bigCert));
ok(!context, "Expected failure\n"); ok(!context, "Expected failure\n");
context = CertCreateCRLContext(X509_ASN_ENCODING, signedCRL, context = CertCreateCRLContext(X509_ASN_ENCODING, signedCRL,
@@ -108,11 +96,11 @@ static void testCreateCRL(void)
ok(!context, "Expected failure\n"); ok(!context, "Expected failure\n");
context = CertCreateCRLContext(X509_ASN_ENCODING, signedCRL, context = CertCreateCRLContext(X509_ASN_ENCODING, signedCRL,
sizeof(signedCRL)); sizeof(signedCRL));
ok(context != NULL, "CertCreateCRLContext failed: %08x\n", GetLastError()); ok(context != NULL, "CertCreateCRLContext failed: %08lx\n", GetLastError());
if (context) if (context)
CertFreeCRLContext(context); CertFreeCRLContext(context);
context = CertCreateCRLContext(X509_ASN_ENCODING, CRL, sizeof(CRL)); context = CertCreateCRLContext(X509_ASN_ENCODING, CRL, sizeof(CRL));
ok(context != NULL, "CertCreateCRLContext failed: %08x\n", GetLastError()); ok(context != NULL, "CertCreateCRLContext failed: %08lx\n", GetLastError());
if (context) if (context)
CertFreeCRLContext(context); CertFreeCRLContext(context);
} }
@@ -148,86 +136,80 @@ static void testAddCRL(void)
BOOL ret; BOOL ret;
DWORD GLE; DWORD GLE;
ok(store != NULL, "CertOpenStore failed: %08x\n", GetLastError()); ok(store != NULL, "CertOpenStore failed: %08lx\n", GetLastError());
if (!store) return; if (!store) return;
/* Bad CRL encoding type */ /* Bad CRL encoding type */
ret = CertAddEncodedCRLToStore(0, 0, NULL, 0, 0, NULL); ret = CertAddEncodedCRLToStore(0, 0, NULL, 0, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(store, 0, NULL, 0, 0, NULL); ret = CertAddEncodedCRLToStore(store, 0, NULL, 0, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(0, 0, signedCRL, sizeof(signedCRL), 0, NULL); ret = CertAddEncodedCRLToStore(0, 0, signedCRL, sizeof(signedCRL), 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(store, 0, signedCRL, sizeof(signedCRL), 0, ret = CertAddEncodedCRLToStore(store, 0, signedCRL, sizeof(signedCRL), 0,
NULL); NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(0, 0, signedCRL, sizeof(signedCRL), ret = CertAddEncodedCRLToStore(0, 0, signedCRL, sizeof(signedCRL),
CERT_STORE_ADD_ALWAYS, NULL); CERT_STORE_ADD_ALWAYS, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(store, 0, signedCRL, sizeof(signedCRL), ret = CertAddEncodedCRLToStore(store, 0, signedCRL, sizeof(signedCRL),
CERT_STORE_ADD_ALWAYS, NULL); CERT_STORE_ADD_ALWAYS, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
/* No CRL */ /* No CRL */
ret = CertAddEncodedCRLToStore(0, X509_ASN_ENCODING, NULL, 0, 0, NULL); ret = CertAddEncodedCRLToStore(0, X509_ASN_ENCODING, NULL, 0, 0, NULL);
GLE = GetLastError(); GLE = GetLastError();
ok(!ret && (GLE == CRYPT_E_ASN1_EOD || GLE == OSS_MORE_INPUT), ok(!ret && GLE == CRYPT_E_ASN1_EOD,
"Expected CRYPT_E_ASN1_EOD or OSS_MORE_INPUT, got %08x\n", GLE); "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GLE);
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, NULL, 0, 0, NULL); ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, NULL, 0, 0, NULL);
GLE = GetLastError(); GLE = GetLastError();
ok(!ret && (GLE == CRYPT_E_ASN1_EOD || GLE == OSS_MORE_INPUT), ok(!ret && GLE == CRYPT_E_ASN1_EOD,
"Expected CRYPT_E_ASN1_EOD or OSS_MORE_INPUT, got %08x\n", GLE); "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GLE);
/* Weird--bad add disposition leads to an access violation in Windows. ret = CertAddEncodedCRLToStore(0, X509_ASN_ENCODING, signedCRL,
* Both tests crash on some win9x boxes. sizeof(signedCRL), 0, NULL);
*/ ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION ||
if (0) GetLastError() == E_INVALIDARG /* Vista */),
{ "Expected STATUS_ACCESS_VIOLATION or E_INVALIDARG, got %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(0, X509_ASN_ENCODING, signedCRL, ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL,
sizeof(signedCRL), 0, NULL); sizeof(signedCRL), 0, NULL);
ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION || ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION ||
GetLastError() == E_INVALIDARG /* Vista */), GetLastError() == E_INVALIDARG /* Vista */),
"Expected STATUS_ACCESS_VIOLATION or E_INVALIDARG, got %08x\n", GetLastError()); "Expected STATUS_ACCESS_VIOLATION or E_INVALIDARG, got %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL,
sizeof(signedCRL), 0, NULL);
ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION ||
GetLastError() == E_INVALIDARG /* Vista */),
"Expected STATUS_ACCESS_VIOLATION or E_INVALIDARG, got %08x\n", GetLastError());
}
/* Weird--can add a CRL to the NULL store (does this have special meaning?) /* Weird--can add a CRL to the NULL store (does this have special meaning?)
*/ */
context = NULL; context = NULL;
ret = CertAddEncodedCRLToStore(0, X509_ASN_ENCODING, signedCRL, ret = CertAddEncodedCRLToStore(0, X509_ASN_ENCODING, signedCRL,
sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, &context); sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, &context);
ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCRLToStore failed: %08lx\n", GetLastError());
if (context) if (context)
CertFreeCRLContext(context); CertFreeCRLContext(context);
/* Normal cases: a "signed" CRL is okay.. */ /* Normal cases: a "signed" CRL is okay.. */
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL, ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL,
sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL); sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCRLToStore failed: %08lx\n", GetLastError());
/* and an unsigned one is too. */ /* and an unsigned one is too. */
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, CRL, sizeof(CRL), ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, CRL, sizeof(CRL),
CERT_STORE_ADD_ALWAYS, NULL); CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCRLToStore failed: %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, newerCRL, ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, newerCRL,
sizeof(newerCRL), CERT_STORE_ADD_NEW, NULL); sizeof(newerCRL), CERT_STORE_ADD_NEW, NULL);
ok(!ret && GetLastError() == CRYPT_E_EXISTS, ok(!ret && GetLastError() == CRYPT_E_EXISTS,
"Expected CRYPT_E_EXISTS, got %08x\n", GetLastError()); "Expected CRYPT_E_EXISTS, got %08lx\n", GetLastError());
/* This should replace (one of) the existing CRL(s). */ /* This should replace (one of) the existing CRL(s). */
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, newerCRL, ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, newerCRL,
sizeof(newerCRL), CERT_STORE_ADD_NEWER, NULL); sizeof(newerCRL), CERT_STORE_ADD_NEWER, NULL);
ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCRLToStore failed: %08lx\n", GetLastError());
CertCloseStore(store, 0); CertCloseStore(store, 0);
@@ -433,43 +415,37 @@ static void testFindCRL(void)
DWORD count, revoked_count; DWORD count, revoked_count;
BOOL ret; BOOL ret;
if (!pCertFindCRLInStore || !pCertFindCertificateInCRL)
{
win_skip("CertFindCRLInStore or CertFindCertificateInCRL not available\n");
return;
}
store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
CERT_STORE_CREATE_NEW_FLAG, NULL); CERT_STORE_CREATE_NEW_FLAG, NULL);
ok(store != NULL, "CertOpenStore failed: %08x\n", GetLastError()); ok(store != NULL, "CertOpenStore failed: %08lx\n", GetLastError());
if (!store) return; if (!store) return;
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL, ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL,
sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL); sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCRLToStore failed: %08lx\n", GetLastError());
/* Crashes /* Crashes
context = pCertFindCRLInStore(NULL, 0, 0, 0, NULL, NULL); context = CertFindCRLInStore(NULL, 0, 0, 0, NULL, NULL);
*/ */
/* Find any context */ /* Find any context */
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ANY, NULL, NULL); context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ANY, NULL, NULL);
ok(context != NULL, "Expected a context\n"); ok(context != NULL, "Expected a context\n");
if (context) if (context)
CertFreeCRLContext(context); CertFreeCRLContext(context);
/* Bogus flags are ignored */ /* Bogus flags are ignored */
context = pCertFindCRLInStore(store, 0, 1234, CRL_FIND_ANY, NULL, NULL); context = CertFindCRLInStore(store, 0, 1234, CRL_FIND_ANY, NULL, NULL);
ok(context != NULL, "Expected a context\n"); ok(context != NULL, "Expected a context\n");
if (context) if (context)
CertFreeCRLContext(context); CertFreeCRLContext(context);
/* CRL encoding type is ignored too */ /* CRL encoding type is ignored too */
context = pCertFindCRLInStore(store, 1234, 0, CRL_FIND_ANY, NULL, NULL); context = CertFindCRLInStore(store, 1234, 0, CRL_FIND_ANY, NULL, NULL);
ok(context != NULL, "Expected a context\n"); ok(context != NULL, "Expected a context\n");
if (context) if (context)
CertFreeCRLContext(context); CertFreeCRLContext(context);
/* This appears to match any cert */ /* This appears to match any cert */
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_BY, NULL, NULL); context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_BY, NULL, NULL);
ok(context != NULL, "Expected a context\n"); ok(context != NULL, "Expected a context\n");
if (context) if (context)
CertFreeCRLContext(context); CertFreeCRLContext(context);
@@ -477,28 +453,28 @@ static void testFindCRL(void)
/* Try to match an issuer that isn't in the store */ /* Try to match an issuer that isn't in the store */
cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert2, cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert2,
sizeof(bigCert2)); sizeof(bigCert2));
ok(cert != NULL, "CertCreateCertificateContext failed: %08x\n", ok(cert != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_BY, cert, NULL); context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_BY, cert, NULL);
ok(context == NULL, "Expected no matching context\n"); ok(context == NULL, "Expected no matching context\n");
CertFreeCertificateContext(cert); CertFreeCertificateContext(cert);
/* Match an issuer that is in the store */ /* Match an issuer that is in the store */
cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert,
sizeof(bigCert)); sizeof(bigCert));
ok(cert != NULL, "CertCreateCertificateContext failed: %08x\n", ok(cert != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_BY, cert, NULL); context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_BY, cert, NULL);
ok(context != NULL, "Expected a context\n"); ok(context != NULL, "Expected a context\n");
if (context) if (context)
CertFreeCRLContext(context); CertFreeCRLContext(context);
/* Try various find flags */ /* Try various find flags */
context = pCertFindCRLInStore(store, 0, CRL_FIND_ISSUED_BY_SIGNATURE_FLAG, context = CertFindCRLInStore(store, 0, CRL_FIND_ISSUED_BY_SIGNATURE_FLAG,
CRL_FIND_ISSUED_BY, cert, NULL); CRL_FIND_ISSUED_BY, cert, NULL);
ok(!context || broken(context != NULL /* Win9x */), "unexpected context\n"); ok(!context, "unexpected context\n");
/* The CRL doesn't have an AKI extension, so it matches any cert */ /* The CRL doesn't have an AKI extension, so it matches any cert */
context = pCertFindCRLInStore(store, 0, CRL_FIND_ISSUED_BY_AKI_FLAG, context = CertFindCRLInStore(store, 0, CRL_FIND_ISSUED_BY_AKI_FLAG,
CRL_FIND_ISSUED_BY, cert, NULL); CRL_FIND_ISSUED_BY, cert, NULL);
ok(context != NULL, "Expected a context\n"); ok(context != NULL, "Expected a context\n");
if (context) if (context)
@@ -507,22 +483,21 @@ static void testFindCRL(void)
if (0) if (0)
{ {
/* Crash or return NULL/STATUS_ACCESS_VIOLATION */ /* Crash or return NULL/STATUS_ACCESS_VIOLATION */
pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, NULL, CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, NULL,
NULL); NULL);
pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR,
&issuedForPara, NULL); &issuedForPara, NULL);
} }
/* Test whether the cert matches the CRL in the store */ /* Test whether the cert matches the CRL in the store */
issuedForPara.pSubjectCert = cert; issuedForPara.pSubjectCert = cert;
issuedForPara.pIssuerCert = cert; issuedForPara.pIssuerCert = cert;
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR,
&issuedForPara, NULL); &issuedForPara, NULL);
ok(context != NULL || broken(!context /* Win9x, NT4 */), ok(context != NULL, "Expected a context\n");
"Expected a context\n");
if (context) if (context)
{ {
ok(context->cbCrlEncoded == sizeof(signedCRL), ok(context->cbCrlEncoded == sizeof(signedCRL),
"unexpected CRL size %d\n", context->cbCrlEncoded); "unexpected CRL size %ld\n", context->cbCrlEncoded);
ok(!memcmp(context->pbCrlEncoded, signedCRL, context->cbCrlEncoded), ok(!memcmp(context->pbCrlEncoded, signedCRL, context->cbCrlEncoded),
"unexpected CRL data\n"); "unexpected CRL data\n");
CertFreeCRLContext(context); CertFreeCRLContext(context);
@@ -531,27 +506,27 @@ static void testFindCRL(void)
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING,
v1CRLWithIssuerAndEntry, sizeof(v1CRLWithIssuerAndEntry), v1CRLWithIssuerAndEntry, sizeof(v1CRLWithIssuerAndEntry),
CERT_STORE_ADD_ALWAYS, NULL); CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCRLToStore failed: %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING,
v2CRLWithIssuingDistPoint, sizeof(v2CRLWithIssuingDistPoint), v2CRLWithIssuingDistPoint, sizeof(v2CRLWithIssuingDistPoint),
CERT_STORE_ADD_ALWAYS, NULL); CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCRLToStore failed: %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING,
verisignCRL, sizeof(verisignCRL), CERT_STORE_ADD_ALWAYS, NULL); verisignCRL, sizeof(verisignCRL), CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCRLToStore failed: %08lx\n", GetLastError());
issuedForPara.pSubjectCert = cert; issuedForPara.pSubjectCert = cert;
issuedForPara.pIssuerCert = cert; issuedForPara.pIssuerCert = cert;
context = NULL; context = NULL;
count = revoked_count = 0; count = revoked_count = 0;
do { do {
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR,
&issuedForPara, context); &issuedForPara, context);
if (context) if (context)
{ {
PCRL_ENTRY entry; PCRL_ENTRY entry;
count++; count++;
if (pCertFindCertificateInCRL(cert, context, 0, NULL, &entry) && if (CertFindCertificateInCRL(cert, context, 0, NULL, &entry) &&
entry) entry)
revoked_count++; revoked_count++;
} }
@@ -560,40 +535,38 @@ static void testFindCRL(void)
* match cert's issuer, but verisignCRL does not, so the expected count * match cert's issuer, but verisignCRL does not, so the expected count
* is 0. * is 0.
*/ */
ok(count == 3 || broken(count == 0 /* NT4, Win9x */), ok(count == 3, "expected 3 matching CRLs, got %ld\n", count);
"expected 3 matching CRLs, got %d\n", count);
/* Only v1CRLWithIssuerAndEntry and v2CRLWithIssuingDistPoint contain /* Only v1CRLWithIssuerAndEntry and v2CRLWithIssuingDistPoint contain
* entries, so the count of CRL entries that match cert is 2. * entries, so the count of CRL entries that match cert is 2.
*/ */
ok(revoked_count == 2 || broken(revoked_count == 0 /* NT4, Win9x */), ok(revoked_count == 2, "expected 2 matching CRL entries, got %ld\n", revoked_count);
"expected 2 matching CRL entries, got %d\n", revoked_count);
CertFreeCertificateContext(cert); CertFreeCertificateContext(cert);
/* Try again with a cert that doesn't match any CRLs in the store */ /* Try again with a cert that doesn't match any CRLs in the store */
cert = CertCreateCertificateContext(X509_ASN_ENCODING, cert = CertCreateCertificateContext(X509_ASN_ENCODING,
bigCertWithDifferentIssuer, sizeof(bigCertWithDifferentIssuer)); bigCertWithDifferentIssuer, sizeof(bigCertWithDifferentIssuer));
ok(cert != NULL, "CertCreateCertificateContext failed: %08x\n", ok(cert != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
issuedForPara.pSubjectCert = cert; issuedForPara.pSubjectCert = cert;
issuedForPara.pIssuerCert = cert; issuedForPara.pIssuerCert = cert;
context = NULL; context = NULL;
count = revoked_count = 0; count = revoked_count = 0;
do { do {
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR,
&issuedForPara, context); &issuedForPara, context);
if (context) if (context)
{ {
PCRL_ENTRY entry; PCRL_ENTRY entry;
count++; count++;
if (pCertFindCertificateInCRL(cert, context, 0, NULL, &entry) && if (CertFindCertificateInCRL(cert, context, 0, NULL, &entry) &&
entry) entry)
revoked_count++; revoked_count++;
} }
} while (context); } while (context);
ok(count == 0, "expected 0 matching CRLs, got %d\n", count); ok(count == 0, "expected 0 matching CRLs, got %ld\n", count);
ok(revoked_count == 0, "expected 0 matching CRL entries, got %d\n", ok(revoked_count == 0, "expected 0 matching CRL entries, got %ld\n",
revoked_count); revoked_count);
CertFreeCertificateContext(cert); CertFreeCertificateContext(cert);
@@ -602,28 +575,27 @@ static void testFindCRL(void)
*/ */
cert = CertCreateCertificateContext(X509_ASN_ENCODING, cert = CertCreateCertificateContext(X509_ASN_ENCODING,
verisignCommercialSoftPubCA, sizeof(verisignCommercialSoftPubCA)); verisignCommercialSoftPubCA, sizeof(verisignCommercialSoftPubCA));
ok(cert != NULL, "CertCreateCertificateContext failed: %08x\n", ok(cert != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
issuedForPara.pIssuerCert = cert; issuedForPara.pIssuerCert = cert;
issuedForPara.pSubjectCert = cert; issuedForPara.pSubjectCert = cert;
context = NULL; context = NULL;
count = revoked_count = 0; count = revoked_count = 0;
do { do {
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR,
&issuedForPara, context); &issuedForPara, context);
if (context) if (context)
{ {
PCRL_ENTRY entry; PCRL_ENTRY entry;
count++; count++;
if (pCertFindCertificateInCRL(cert, context, 0, NULL, &entry) && if (CertFindCertificateInCRL(cert, context, 0, NULL, &entry) &&
entry) entry)
revoked_count++; revoked_count++;
} }
} while (context); } while (context);
ok(count == 1 || broken(count == 0 /* Win9x, NT4 */), ok(count == 1, "expected 1 matching CRLs, got %ld\n", count);
"expected 1 matching CRLs, got %d\n", count); ok(revoked_count == 0, "expected 0 matching CRL entries, got %ld\n",
ok(revoked_count == 0, "expected 0 matching CRL entries, got %d\n",
revoked_count); revoked_count);
CertFreeCertificateContext(cert); CertFreeCertificateContext(cert);
@@ -649,96 +621,93 @@ static void testFindCRL(void)
context = NULL; context = NULL;
count = revoked_count = 0; count = revoked_count = 0;
do { do {
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR,
&issuedForPara, context); &issuedForPara, context);
if (context) if (context)
{ {
PCRL_ENTRY entry; PCRL_ENTRY entry;
count++; count++;
if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) &&
entry) entry)
revoked_count++; revoked_count++;
} }
} while (context); } while (context);
ok(count == 1 || broken(count == 0 /* Win9x, NT4 */), ok(count == 1, "expected 1 matching CRLs, got %ld\n", count);
"expected 1 matching CRLs, got %d\n", count); ok(revoked_count == 1, "expected 1 matching CRL entries, got %ld\n", revoked_count);
ok(revoked_count == 1 || broken(revoked_count == 0 /* Win9x, NT4 */),
"expected 1 matching CRL entries, got %d\n", revoked_count);
/* Test CRL_FIND_ISSUED_BY flags */ /* Test CRL_FIND_ISSUED_BY flags */
count = revoked_count = 0; count = revoked_count = 0;
do { do {
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_BY, context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_BY,
endCert, context); endCert, context);
if (context) if (context)
{ {
PCRL_ENTRY entry; PCRL_ENTRY entry;
count++; count++;
if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) &&
entry) entry)
revoked_count++; revoked_count++;
} }
} while (context); } while (context);
ok(count == 0, "expected 0 matching CRLs, got %d\n", count); ok(count == 0, "expected 0 matching CRLs, got %ld\n", count);
ok(revoked_count == 0, "expected 0 matching CRL entries, got %d\n", ok(revoked_count == 0, "expected 0 matching CRL entries, got %ld\n",
revoked_count); revoked_count);
count = revoked_count = 0; count = revoked_count = 0;
do { do {
context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_BY, context = CertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_BY,
rootCert, context); rootCert, context);
if (context) if (context)
{ {
PCRL_ENTRY entry; PCRL_ENTRY entry;
count++; count++;
if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) &&
entry) entry)
revoked_count++; revoked_count++;
} }
} while (context); } while (context);
ok(count == 1, "expected 1 matching CRLs, got %d\n", count); ok(count == 1, "expected 1 matching CRLs, got %ld\n", count);
ok(revoked_count == 1, "expected 1 matching CRL entries, got %d\n", ok(revoked_count == 1, "expected 1 matching CRL entries, got %ld\n",
revoked_count); revoked_count);
count = revoked_count = 0; count = revoked_count = 0;
do { do {
context = pCertFindCRLInStore(store, 0, CRL_FIND_ISSUED_BY_AKI_FLAG, context = CertFindCRLInStore(store, 0, CRL_FIND_ISSUED_BY_AKI_FLAG,
CRL_FIND_ISSUED_BY, endCert, context); CRL_FIND_ISSUED_BY, endCert, context);
if (context) if (context)
{ {
PCRL_ENTRY entry; PCRL_ENTRY entry;
count++; count++;
if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) &&
entry) entry)
revoked_count++; revoked_count++;
} }
} while (context); } while (context);
ok(count == 0, "expected 0 matching CRLs, got %d\n", count); ok(count == 0, "expected 0 matching CRLs, got %ld\n", count);
ok(revoked_count == 0, "expected 0 matching CRL entries, got %d\n", ok(revoked_count == 0, "expected 0 matching CRL entries, got %ld\n",
revoked_count); revoked_count);
count = revoked_count = 0; count = revoked_count = 0;
do { do {
context = pCertFindCRLInStore(store, 0, CRL_FIND_ISSUED_BY_AKI_FLAG, context = CertFindCRLInStore(store, 0, CRL_FIND_ISSUED_BY_AKI_FLAG,
CRL_FIND_ISSUED_BY, rootCert, context); CRL_FIND_ISSUED_BY, rootCert, context);
if (context) if (context)
{ {
PCRL_ENTRY entry; PCRL_ENTRY entry;
count++; count++;
if (pCertFindCertificateInCRL(rootCert, context, 0, NULL, &entry) && if (CertFindCertificateInCRL(rootCert, context, 0, NULL, &entry) &&
entry) entry)
revoked_count++; revoked_count++;
} }
} while (context); } while (context);
ok(count == 0 || broken(count == 1 /* Win9x */), ok(count == 0, "expected 0 matching CRLs, got %ld\n", count);
"expected 0 matching CRLs, got %d\n", count); ok(revoked_count == 0, "expected 0 matching CRL entries, got %ld\n",
ok(revoked_count == 0, "expected 0 matching CRL entries, got %d\n",
revoked_count); revoked_count);
count = revoked_count = 0; count = revoked_count = 0;
do { do {
context = pCertFindCRLInStore(store, 0, context = CertFindCRLInStore(store, 0,
CRL_FIND_ISSUED_BY_SIGNATURE_FLAG, CRL_FIND_ISSUED_BY, endCert, CRL_FIND_ISSUED_BY_SIGNATURE_FLAG, CRL_FIND_ISSUED_BY, endCert,
context); context);
if (context) if (context)
@@ -746,17 +715,17 @@ static void testFindCRL(void)
PCRL_ENTRY entry; PCRL_ENTRY entry;
count++; count++;
if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) &&
entry) entry)
revoked_count++; revoked_count++;
} }
} while (context); } while (context);
ok(count == 0, "expected 0 matching CRLs, got %d\n", count); ok(count == 0, "expected 0 matching CRLs, got %ld\n", count);
ok(revoked_count == 0, "expected 0 matching CRL entries, got %d\n", ok(revoked_count == 0, "expected 0 matching CRL entries, got %ld\n",
revoked_count); revoked_count);
count = revoked_count = 0; count = revoked_count = 0;
do { do {
context = pCertFindCRLInStore(store, 0, context = CertFindCRLInStore(store, 0,
CRL_FIND_ISSUED_BY_SIGNATURE_FLAG, CRL_FIND_ISSUED_BY, rootCert, CRL_FIND_ISSUED_BY_SIGNATURE_FLAG, CRL_FIND_ISSUED_BY, rootCert,
context); context);
if (context) if (context)
@@ -764,13 +733,13 @@ static void testFindCRL(void)
PCRL_ENTRY entry; PCRL_ENTRY entry;
count++; count++;
if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) &&
entry) entry)
revoked_count++; revoked_count++;
} }
} while (context); } while (context);
ok(count == 1, "expected 1 matching CRLs, got %d\n", count); ok(count == 1, "expected 1 matching CRLs, got %ld\n", count);
ok(revoked_count == 1, "expected 1 matching CRL entries, got %d\n", ok(revoked_count == 1, "expected 1 matching CRL entries, got %ld\n",
revoked_count); revoked_count);
CertFreeCertificateContext(rootCert); CertFreeCertificateContext(rootCert);
CertFreeCertificateContext(endCert); CertFreeCertificateContext(endCert);
@@ -787,7 +756,7 @@ static void testGetCRLFromStore(void)
DWORD flags; DWORD flags;
BOOL ret; BOOL ret;
ok(store != NULL, "CertOpenStore failed: %08x\n", GetLastError()); ok(store != NULL, "CertOpenStore failed: %08lx\n", GetLastError());
if (!store) return; if (!store) return;
/* Crash /* Crash
@@ -799,17 +768,17 @@ static void testGetCRLFromStore(void)
flags = 0xffffffff; flags = 0xffffffff;
context = CertGetCRLFromStore(store, NULL, NULL, &flags); context = CertGetCRLFromStore(store, NULL, NULL, &flags);
ok(!context && GetLastError() == E_INVALIDARG, ok(!context && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
/* Test an empty store */ /* Test an empty store */
flags = 0; flags = 0;
context = CertGetCRLFromStore(store, NULL, NULL, &flags); context = CertGetCRLFromStore(store, NULL, NULL, &flags);
ok(context == NULL && GetLastError() == CRYPT_E_NOT_FOUND, ok(context == NULL && GetLastError() == CRYPT_E_NOT_FOUND,
"Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL, ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL,
sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL); sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCRLToStore failed: %08lx\n", GetLastError());
/* NULL matches any CRL */ /* NULL matches any CRL */
flags = 0; flags = 0;
@@ -820,17 +789,17 @@ static void testGetCRLFromStore(void)
/* This cert's issuer isn't in */ /* This cert's issuer isn't in */
cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert2, cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert2,
sizeof(bigCert2)); sizeof(bigCert2));
ok(cert != NULL, "CertCreateCertificateContext failed: %08x\n", ok(cert != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
context = CertGetCRLFromStore(store, cert, NULL, &flags); context = CertGetCRLFromStore(store, cert, NULL, &flags);
ok(context == NULL && GetLastError() == CRYPT_E_NOT_FOUND, ok(context == NULL && GetLastError() == CRYPT_E_NOT_FOUND,
"Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
CertFreeCertificateContext(cert); CertFreeCertificateContext(cert);
/* But this one is */ /* But this one is */
cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert,
sizeof(bigCert)); sizeof(bigCert));
ok(cert != NULL, "CertCreateCertificateContext failed: %08x\n", ok(cert != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
context = CertGetCRLFromStore(store, cert, NULL, &flags); context = CertGetCRLFromStore(store, cert, NULL, &flags);
ok(context != NULL, "Expected a context\n"); ok(context != NULL, "Expected a context\n");
@@ -851,10 +820,10 @@ static void checkCRLHash(const BYTE *data, DWORD dataLen, ALG_ID algID,
memset(hashProperty, 0, sizeof(hashProperty)); memset(hashProperty, 0, sizeof(hashProperty));
size = sizeof(hash); size = sizeof(hash);
ret = CryptHashCertificate(0, algID, 0, data, dataLen, hash, &size); ret = CryptHashCertificate(0, algID, 0, data, dataLen, hash, &size);
ok(ret, "CryptHashCertificate failed: %08x\n", GetLastError()); ok(ret, "CryptHashCertificate failed: %08lx\n", GetLastError());
ret = CertGetCRLContextProperty(context, propID, hashProperty, &size); ret = CertGetCRLContextProperty(context, propID, hashProperty, &size);
ok(ret, "CertGetCRLContextProperty failed: %08x\n", GetLastError()); ok(ret, "CertGetCRLContextProperty failed: %08lx\n", GetLastError());
ok(!memcmp(hash, hashProperty, size), "Unexpected hash for property %d\n", ok(!memcmp(hash, hashProperty, size), "Unexpected hash for property %ld\n",
propID); propID);
} }
@@ -863,7 +832,7 @@ static void testCRLProperties(void)
PCCRL_CONTEXT context = CertCreateCRLContext(X509_ASN_ENCODING, PCCRL_CONTEXT context = CertCreateCRLContext(X509_ASN_ENCODING,
CRL, sizeof(CRL)); CRL, sizeof(CRL));
ok(context != NULL, "CertCreateCRLContext failed: %08x\n", GetLastError()); ok(context != NULL, "CertCreateCRLContext failed: %08lx\n", GetLastError());
if (context) if (context)
{ {
DWORD propID, numProps, access, size; DWORD propID, numProps, access, size;
@@ -882,12 +851,12 @@ static void testCRLProperties(void)
if (propID) if (propID)
numProps++; numProps++;
} while (propID != 0); } while (propID != 0);
ok(numProps == 0, "Expected 0 properties, got %d\n", numProps); ok(numProps == 0, "Expected 0 properties, got %ld\n", numProps);
/* Tests with a NULL cert context. Prop ID 0 fails.. */ /* Tests with a NULL cert context. Prop ID 0 fails.. */
ret = CertSetCRLContextProperty(NULL, 0, 0, NULL); ret = CertSetCRLContextProperty(NULL, 0, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
/* while this just crashes. /* while this just crashes.
ret = CertSetCRLContextProperty(NULL, CERT_KEY_PROV_HANDLE_PROP_ID, 0, ret = CertSetCRLContextProperty(NULL, CERT_KEY_PROV_HANDLE_PROP_ID, 0,
NULL); NULL);
@@ -895,7 +864,7 @@ static void testCRLProperties(void)
ret = CertSetCRLContextProperty(context, 0, 0, NULL); ret = CertSetCRLContextProperty(context, 0, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
/* Can't set the cert property directly, this crashes. /* Can't set the cert property directly, this crashes.
ret = CertSetCRLContextProperty(context, CERT_CRL_PROP_ID, 0, CRL); ret = CertSetCRLContextProperty(context, CERT_CRL_PROP_ID, 0, CRL);
*/ */
@@ -912,14 +881,14 @@ static void testCRLProperties(void)
ret = CertGetCRLContextProperty(context, CERT_KEY_PROV_INFO_PROP_ID, ret = CertGetCRLContextProperty(context, CERT_KEY_PROV_INFO_PROP_ID,
NULL, &size); NULL, &size);
ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND, ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND,
"Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
/* And, an implicit property */ /* And, an implicit property */
ret = CertGetCRLContextProperty(context, CERT_ACCESS_STATE_PROP_ID, ret = CertGetCRLContextProperty(context, CERT_ACCESS_STATE_PROP_ID,
NULL, &size); NULL, &size);
ok(ret, "CertGetCRLContextProperty failed: %08x\n", GetLastError()); ok(ret, "CertGetCRLContextProperty failed: %08lx\n", GetLastError());
ret = CertGetCRLContextProperty(context, CERT_ACCESS_STATE_PROP_ID, ret = CertGetCRLContextProperty(context, CERT_ACCESS_STATE_PROP_ID,
&access, &size); &access, &size);
ok(ret, "CertGetCRLContextProperty failed: %08x\n", GetLastError()); ok(ret, "CertGetCRLContextProperty failed: %08lx\n", GetLastError());
ok(!(access & CERT_ACCESS_STATE_WRITE_PERSIST_FLAG), ok(!(access & CERT_ACCESS_STATE_WRITE_PERSIST_FLAG),
"Didn't expect a persisted crl\n"); "Didn't expect a persisted crl\n");
/* Trying to set this "read only" property crashes. /* Trying to set this "read only" property crashes.
@@ -932,16 +901,16 @@ static void testCRLProperties(void)
blob.pbData = hash; blob.pbData = hash;
blob.cbData = sizeof(hash); blob.cbData = sizeof(hash);
ret = CertSetCRLContextProperty(context, CERT_HASH_PROP_ID, 0, &blob); ret = CertSetCRLContextProperty(context, CERT_HASH_PROP_ID, 0, &blob);
ok(ret, "CertSetCRLContextProperty failed: %08x\n", ok(ret, "CertSetCRLContextProperty failed: %08lx\n",
GetLastError()); GetLastError());
size = sizeof(hashProperty); size = sizeof(hashProperty);
ret = CertGetCRLContextProperty(context, CERT_HASH_PROP_ID, ret = CertGetCRLContextProperty(context, CERT_HASH_PROP_ID,
hashProperty, &size); hashProperty, &size);
ok(ret, "CertSetCRLContextProperty failed: %08x\n", GetLastError()); ok(ret, "CertSetCRLContextProperty failed: %08lx\n", GetLastError());
ok(!memcmp(hashProperty, hash, sizeof(hash)), "Unexpected hash\n"); ok(!memcmp(hashProperty, hash, sizeof(hash)), "Unexpected hash\n");
/* Delete the (bogus) hash, and get the real one */ /* Delete the (bogus) hash, and get the real one */
ret = CertSetCRLContextProperty(context, CERT_HASH_PROP_ID, 0, NULL); ret = CertSetCRLContextProperty(context, CERT_HASH_PROP_ID, 0, NULL);
ok(ret, "CertSetCRLContextProperty failed: %08x\n", GetLastError()); ok(ret, "CertSetCRLContextProperty failed: %08lx\n", GetLastError());
checkCRLHash(CRL, sizeof(CRL), CALG_SHA1, context, CERT_HASH_PROP_ID); checkCRLHash(CRL, sizeof(CRL), CALG_SHA1, context, CERT_HASH_PROP_ID);
/* Now that the hash property is set, we should get one property when /* Now that the hash property is set, we should get one property when
@@ -954,7 +923,7 @@ static void testCRLProperties(void)
if (propID) if (propID)
numProps++; numProps++;
} while (propID != 0); } while (propID != 0);
ok(numProps == 1, "Expected 1 properties, got %d\n", numProps); ok(numProps == 1, "Expected 1 properties, got %ld\n", numProps);
/* Check a few other implicit properties */ /* Check a few other implicit properties */
checkCRLHash(CRL, sizeof(CRL), CALG_MD5, context, checkCRLHash(CRL, sizeof(CRL), CALG_MD5, context,
@@ -985,14 +954,12 @@ static void testIsValidCRLForCert(void)
PCCRL_CONTEXT crl; PCCRL_CONTEXT crl;
HCERTSTORE store; HCERTSTORE store;
if(!pCertIsValidCRLForCertificate) return;
crl = CertCreateCRLContext(X509_ASN_ENCODING, v1CRLWithIssuerAndEntry, crl = CertCreateCRLContext(X509_ASN_ENCODING, v1CRLWithIssuerAndEntry,
sizeof(v1CRLWithIssuerAndEntry)); sizeof(v1CRLWithIssuerAndEntry));
ok(crl != NULL, "CertCreateCRLContext failed: %08x\n", GetLastError()); ok(crl != NULL, "CertCreateCRLContext failed: %08lx\n", GetLastError());
cert1 = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, cert1 = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert,
sizeof(bigCert)); sizeof(bigCert));
ok(cert1 != NULL, "CertCreateCertificateContext failed: %08x\n", ok(cert1 != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
/* Crash /* Crash
@@ -1001,24 +968,24 @@ static void testIsValidCRLForCert(void)
*/ */
/* Curiously, any CRL is valid for the NULL certificate */ /* Curiously, any CRL is valid for the NULL certificate */
ret = pCertIsValidCRLForCertificate(NULL, crl, 0, NULL); ret = CertIsValidCRLForCertificate(NULL, crl, 0, NULL);
ok(ret, "CertIsValidCRLForCertificate failed: %08x\n", GetLastError()); ok(ret, "CertIsValidCRLForCertificate failed: %08lx\n", GetLastError());
/* Same issuer for both cert and CRL, this CRL is valid for that cert */ /* Same issuer for both cert and CRL, this CRL is valid for that cert */
ret = pCertIsValidCRLForCertificate(cert1, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert1, crl, 0, NULL);
ok(ret, "CertIsValidCRLForCertificate failed: %08x\n", GetLastError()); ok(ret, "CertIsValidCRLForCertificate failed: %08lx\n", GetLastError());
cert2 = CertCreateCertificateContext(X509_ASN_ENCODING, cert2 = CertCreateCertificateContext(X509_ASN_ENCODING,
bigCertWithDifferentIssuer, sizeof(bigCertWithDifferentIssuer)); bigCertWithDifferentIssuer, sizeof(bigCertWithDifferentIssuer));
ok(cert2 != NULL, "CertCreateCertificateContext failed: %08x\n", ok(cert2 != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
/* Yet more curious: different issuers for these, yet the CRL is valid for /* Yet more curious: different issuers for these, yet the CRL is valid for
* that cert. According to MSDN, the relevant bit to check is whether the * that cert. According to MSDN, the relevant bit to check is whether the
* CRL has a CRL_ISSUING_DIST_POINT extension. * CRL has a CRL_ISSUING_DIST_POINT extension.
*/ */
ret = pCertIsValidCRLForCertificate(cert2, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert2, crl, 0, NULL);
ok(ret, "CertIsValidCRLForCertificate failed: %08x\n", GetLastError()); ok(ret, "CertIsValidCRLForCertificate failed: %08lx\n", GetLastError());
CertFreeCRLContext(crl); CertFreeCRLContext(crl);
@@ -1027,38 +994,38 @@ static void testIsValidCRLForCert(void)
*/ */
crl = CertCreateCRLContext(X509_ASN_ENCODING, v2CRLWithIssuingDistPoint, crl = CertCreateCRLContext(X509_ASN_ENCODING, v2CRLWithIssuingDistPoint,
sizeof(v2CRLWithIssuingDistPoint)); sizeof(v2CRLWithIssuingDistPoint));
ok(crl != NULL, "CertCreateCRLContext failed: %08x\n", GetLastError()); ok(crl != NULL, "CertCreateCRLContext failed: %08lx\n", GetLastError());
ret = pCertIsValidCRLForCertificate(cert1, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert1, crl, 0, NULL);
ok(!ret && GetLastError() == CRYPT_E_NO_MATCH, ok(!ret && GetLastError() == CRYPT_E_NO_MATCH,
"expected CRYPT_E_NO_MATCH, got %08x\n", GetLastError()); "expected CRYPT_E_NO_MATCH, got %08lx\n", GetLastError());
ret = pCertIsValidCRLForCertificate(cert2, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert2, crl, 0, NULL);
ok(!ret && GetLastError() == CRYPT_E_NO_MATCH, ok(!ret && GetLastError() == CRYPT_E_NO_MATCH,
"expected CRYPT_E_NO_MATCH, got %08x\n", GetLastError()); "expected CRYPT_E_NO_MATCH, got %08lx\n", GetLastError());
/* With a CRL_ISSUING_DIST_POINT in the CRL, it matches the cert containing /* With a CRL_ISSUING_DIST_POINT in the CRL, it matches the cert containing
* a CRL_DIST_POINTS_INFO extension. * a CRL_DIST_POINTS_INFO extension.
*/ */
cert3 = CertCreateCertificateContext(X509_ASN_ENCODING, cert3 = CertCreateCertificateContext(X509_ASN_ENCODING,
bigCertWithCRLDistPoints, sizeof(bigCertWithCRLDistPoints)); bigCertWithCRLDistPoints, sizeof(bigCertWithCRLDistPoints));
ok(cert3 != NULL, "CertCreateCertificateContext failed: %08x\n", ok(cert3 != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
ret = pCertIsValidCRLForCertificate(cert3, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert3, crl, 0, NULL);
ok(ret, "CertIsValidCRLForCertificate failed: %08x\n", GetLastError()); ok(ret, "CertIsValidCRLForCertificate failed: %08lx\n", GetLastError());
CertFreeCRLContext(crl); CertFreeCRLContext(crl);
/* And again, with a real CRL, the CRL is valid for all three certs. */ /* And again, with a real CRL, the CRL is valid for all three certs. */
crl = CertCreateCRLContext(X509_ASN_ENCODING, verisignCRL, crl = CertCreateCRLContext(X509_ASN_ENCODING, verisignCRL,
sizeof(verisignCRL)); sizeof(verisignCRL));
ok(crl != NULL, "CertCreateCRLContext failed: %08x\n", GetLastError()); ok(crl != NULL, "CertCreateCRLContext failed: %08lx\n", GetLastError());
ret = pCertIsValidCRLForCertificate(cert1, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert1, crl, 0, NULL);
ok(ret, "CertIsValidCRLForCertificate failed: %08x\n", GetLastError()); ok(ret, "CertIsValidCRLForCertificate failed: %08lx\n", GetLastError());
ret = pCertIsValidCRLForCertificate(cert2, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert2, crl, 0, NULL);
ok(ret, "CertIsValidCRLForCertificate failed: %08x\n", GetLastError()); ok(ret, "CertIsValidCRLForCertificate failed: %08lx\n", GetLastError());
ret = pCertIsValidCRLForCertificate(cert3, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert3, crl, 0, NULL);
ok(ret, "CertIsValidCRLForCertificate failed: %08x\n", GetLastError()); ok(ret, "CertIsValidCRLForCertificate failed: %08lx\n", GetLastError());
CertFreeCRLContext(crl); CertFreeCRLContext(crl);
@@ -1067,18 +1034,18 @@ static void testIsValidCRLForCert(void)
*/ */
store = CertOpenStore(CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, 0, store = CertOpenStore(CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, 0,
CERT_STORE_CREATE_NEW_FLAG, NULL); CERT_STORE_CREATE_NEW_FLAG, NULL);
ok(store != NULL, "CertOpenStore failed: %08x\n", GetLastError()); ok(store != NULL, "CertOpenStore failed: %08lx\n", GetLastError());
ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, verisignCRL, ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, verisignCRL,
sizeof(verisignCRL), CERT_STORE_ADD_ALWAYS, &crl); sizeof(verisignCRL), CERT_STORE_ADD_ALWAYS, &crl);
ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCRLToStore failed: %08lx\n", GetLastError());
ret = pCertIsValidCRLForCertificate(cert1, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert1, crl, 0, NULL);
ok(ret, "CertIsValidCRLForCertificate failed: %08x\n", GetLastError()); ok(ret, "CertIsValidCRLForCertificate failed: %08lx\n", GetLastError());
ret = pCertIsValidCRLForCertificate(cert2, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert2, crl, 0, NULL);
ok(ret, "CertIsValidCRLForCertificate failed: %08x\n", GetLastError()); ok(ret, "CertIsValidCRLForCertificate failed: %08lx\n", GetLastError());
ret = pCertIsValidCRLForCertificate(cert3, crl, 0, NULL); ret = CertIsValidCRLForCertificate(cert3, crl, 0, NULL);
ok(ret, "CertIsValidCRLForCertificate failed: %08x\n", GetLastError()); ok(ret, "CertIsValidCRLForCertificate failed: %08lx\n", GetLastError());
CertFreeCRLContext(crl); CertFreeCRLContext(crl);
@@ -1103,46 +1070,40 @@ static void testFindCertInCRL(void)
PCCRL_CONTEXT crl; PCCRL_CONTEXT crl;
PCRL_ENTRY entry; PCRL_ENTRY entry;
if (!pCertFindCertificateInCRL)
{
win_skip("CertFindCertificateInCRL() is not available\n");
return;
}
cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert,
sizeof(bigCert)); sizeof(bigCert));
ok(cert != NULL, "CertCreateCertificateContext failed: %08x\n", ok(cert != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
/* Crash /* Crash
ret = pCertFindCertificateInCRL(NULL, NULL, 0, NULL, NULL); ret = CertFindCertificateInCRL(NULL, NULL, 0, NULL, NULL);
ret = pCertFindCertificateInCRL(NULL, crl, 0, NULL, NULL); ret = CertFindCertificateInCRL(NULL, crl, 0, NULL, NULL);
ret = pCertFindCertificateInCRL(cert, NULL, 0, NULL, NULL); ret = CertFindCertificateInCRL(cert, NULL, 0, NULL, NULL);
ret = pCertFindCertificateInCRL(cert, crl, 0, NULL, NULL); ret = CertFindCertificateInCRL(cert, crl, 0, NULL, NULL);
ret = pCertFindCertificateInCRL(NULL, NULL, 0, NULL, &entry); ret = CertFindCertificateInCRL(NULL, NULL, 0, NULL, &entry);
ret = pCertFindCertificateInCRL(NULL, crl, 0, NULL, &entry); ret = CertFindCertificateInCRL(NULL, crl, 0, NULL, &entry);
ret = pCertFindCertificateInCRL(cert, NULL, 0, NULL, &entry); ret = CertFindCertificateInCRL(cert, NULL, 0, NULL, &entry);
*/ */
crl = CertCreateCRLContext(X509_ASN_ENCODING, verisignCRL, crl = CertCreateCRLContext(X509_ASN_ENCODING, verisignCRL,
sizeof(verisignCRL)); sizeof(verisignCRL));
ret = pCertFindCertificateInCRL(cert, crl, 0, NULL, &entry); ret = CertFindCertificateInCRL(cert, crl, 0, NULL, &entry);
ok(ret, "CertFindCertificateInCRL failed: %08x\n", GetLastError()); ok(ret, "CertFindCertificateInCRL failed: %08lx\n", GetLastError());
ok(entry == NULL, "Expected not to find an entry in CRL\n"); ok(entry == NULL, "Expected not to find an entry in CRL\n");
CertFreeCRLContext(crl); CertFreeCRLContext(crl);
crl = CertCreateCRLContext(X509_ASN_ENCODING, v1CRLWithIssuerAndEntry, crl = CertCreateCRLContext(X509_ASN_ENCODING, v1CRLWithIssuerAndEntry,
sizeof(v1CRLWithIssuerAndEntry)); sizeof(v1CRLWithIssuerAndEntry));
ret = pCertFindCertificateInCRL(cert, crl, 0, NULL, &entry); ret = CertFindCertificateInCRL(cert, crl, 0, NULL, &entry);
ok(ret, "CertFindCertificateInCRL failed: %08x\n", GetLastError()); ok(ret, "CertFindCertificateInCRL failed: %08lx\n", GetLastError());
ok(entry != NULL, "Expected to find an entry in CRL\n"); ok(entry != NULL, "Expected to find an entry in CRL\n");
CertFreeCRLContext(crl); CertFreeCRLContext(crl);
/* Entry found even though CRL issuer doesn't match cert issuer */ /* Entry found even though CRL issuer doesn't match cert issuer */
crl = CertCreateCRLContext(X509_ASN_ENCODING, crlWithDifferentIssuer, crl = CertCreateCRLContext(X509_ASN_ENCODING, crlWithDifferentIssuer,
sizeof(crlWithDifferentIssuer)); sizeof(crlWithDifferentIssuer));
ret = pCertFindCertificateInCRL(cert, crl, 0, NULL, &entry); ret = CertFindCertificateInCRL(cert, crl, 0, NULL, &entry);
ok(ret, "CertFindCertificateInCRL failed: %08x\n", GetLastError()); ok(ret, "CertFindCertificateInCRL failed: %08lx\n", GetLastError());
ok(entry != NULL, "Expected to find an entry in CRL\n"); ok(entry != NULL, "Expected to find an entry in CRL\n");
CertFreeCRLContext(crl); CertFreeCRLContext(crl);
@@ -1156,18 +1117,18 @@ static void testVerifyCRLRevocation(void)
PCCRL_CONTEXT crl; PCCRL_CONTEXT crl;
ret = CertVerifyCRLRevocation(0, NULL, 0, NULL); ret = CertVerifyCRLRevocation(0, NULL, 0, NULL);
ok(ret, "CertVerifyCRLRevocation failed: %08x\n", GetLastError()); ok(ret, "CertVerifyCRLRevocation failed: %08lx\n", GetLastError());
ret = CertVerifyCRLRevocation(X509_ASN_ENCODING, NULL, 0, NULL); ret = CertVerifyCRLRevocation(X509_ASN_ENCODING, NULL, 0, NULL);
ok(ret, "CertVerifyCRLRevocation failed: %08x\n", GetLastError()); ok(ret, "CertVerifyCRLRevocation failed: %08lx\n", GetLastError());
cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert,
sizeof(bigCert)); sizeof(bigCert));
/* Check against no CRL */ /* Check against no CRL */
ret = CertVerifyCRLRevocation(0, cert->pCertInfo, 0, NULL); ret = CertVerifyCRLRevocation(0, cert->pCertInfo, 0, NULL);
ok(ret, "CertVerifyCRLRevocation failed: %08x\n", GetLastError()); ok(ret, "CertVerifyCRLRevocation failed: %08lx\n", GetLastError());
ret = CertVerifyCRLRevocation(X509_ASN_ENCODING, cert->pCertInfo, 0, NULL); ret = CertVerifyCRLRevocation(X509_ASN_ENCODING, cert->pCertInfo, 0, NULL);
ok(ret, "CertVerifyCRLRevocation failed: %08x\n", GetLastError()); ok(ret, "CertVerifyCRLRevocation failed: %08lx\n", GetLastError());
/* Check against CRL with entry for the cert */ /* Check against CRL with entry for the cert */
crl = CertCreateCRLContext(X509_ASN_ENCODING, v1CRLWithIssuerAndEntry, crl = CertCreateCRLContext(X509_ASN_ENCODING, v1CRLWithIssuerAndEntry,
@@ -1183,7 +1144,7 @@ static void testVerifyCRLRevocation(void)
/* Check against CRL with different issuer and entry for the cert */ /* Check against CRL with different issuer and entry for the cert */
crl = CertCreateCRLContext(X509_ASN_ENCODING, crlWithDifferentIssuer, crl = CertCreateCRLContext(X509_ASN_ENCODING, crlWithDifferentIssuer,
sizeof(crlWithDifferentIssuer)); sizeof(crlWithDifferentIssuer));
ok(crl != NULL, "CertCreateCRLContext failed: %08x\n", GetLastError()); ok(crl != NULL, "CertCreateCRLContext failed: %08lx\n", GetLastError());
ret = CertVerifyCRLRevocation(X509_ASN_ENCODING, cert->pCertInfo, 1, ret = CertVerifyCRLRevocation(X509_ASN_ENCODING, cert->pCertInfo, 1,
(PCRL_INFO *)&crl->pCrlInfo); (PCRL_INFO *)&crl->pCrlInfo);
ok(!ret, "CertVerifyCRLRevocation should have been revoked\n"); ok(!ret, "CertVerifyCRLRevocation should have been revoked\n");
@@ -1194,10 +1155,10 @@ static void testVerifyCRLRevocation(void)
sizeof(verisignCRL)); sizeof(verisignCRL));
ret = CertVerifyCRLRevocation(0, cert->pCertInfo, 1, ret = CertVerifyCRLRevocation(0, cert->pCertInfo, 1,
(PCRL_INFO *)&crl->pCrlInfo); (PCRL_INFO *)&crl->pCrlInfo);
ok(ret, "CertVerifyCRLRevocation failed: %08x\n", GetLastError()); ok(ret, "CertVerifyCRLRevocation failed: %08lx\n", GetLastError());
ret = CertVerifyCRLRevocation(X509_ASN_ENCODING, cert->pCertInfo, 1, ret = CertVerifyCRLRevocation(X509_ASN_ENCODING, cert->pCertInfo, 1,
(PCRL_INFO *)&crl->pCrlInfo); (PCRL_INFO *)&crl->pCrlInfo);
ok(ret, "CertVerifyCRLRevocation failed: %08x\n", GetLastError()); ok(ret, "CertVerifyCRLRevocation failed: %08lx\n", GetLastError());
CertFreeCRLContext(crl); CertFreeCRLContext(crl);
CertFreeCertificateContext(cert); CertFreeCertificateContext(cert);
@@ -1205,16 +1166,12 @@ static void testVerifyCRLRevocation(void)
START_TEST(crl) START_TEST(crl)
{ {
init_function_pointers();
testCreateCRL(); testCreateCRL();
testDupCRL(); testDupCRL();
testAddCRL(); testAddCRL();
testFindCRL(); testFindCRL();
testGetCRLFromStore(); testGetCRLFromStore();
testCRLProperties(); testCRLProperties();
testIsValidCRLForCert(); testIsValidCRLForCert();
testFindCertInCRL(); testFindCertInCRL();
testVerifyCRLRevocation(); testVerifyCRLRevocation();

View File

@@ -114,57 +114,44 @@ static void testCreateCTL(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ctl = CertCreateCTLContext(0, NULL, 0); ctl = CertCreateCTLContext(0, NULL, 0);
ok(!ctl && GetLastError() == E_INVALIDARG, ok(!ctl && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ctl = CertCreateCTLContext(X509_ASN_ENCODING, NULL, 0); ctl = CertCreateCTLContext(X509_ASN_ENCODING, NULL, 0);
ok(!ctl && ok(!ctl && GetLastError() == ERROR_INVALID_DATA,
(GetLastError() == ERROR_INVALID_DATA || "expected ERROR_INVALID_DATA, got %ld (0x%08lx)\n", GetLastError(),
GetLastError() == OSS_MORE_INPUT), /* win9x */
"expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(),
GetLastError()); GetLastError());
/* An empty CTL can't be created.. */ /* An empty CTL can't be created.. */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ctl = CertCreateCTLContext(X509_ASN_ENCODING, emptyCTL, sizeof(emptyCTL)); ctl = CertCreateCTLContext(X509_ASN_ENCODING, emptyCTL, sizeof(emptyCTL));
ok(!ctl && ok(!ctl && GetLastError() == ERROR_INVALID_DATA,
(GetLastError() == ERROR_INVALID_DATA || "expected ERROR_INVALID_DATA, got %ld (0x%08lx)\n", GetLastError(),
GetLastError() == OSS_DATA_ERROR), /* win9x */
"expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(),
GetLastError()); GetLastError());
/* Nor can any of these "signed" CTLs whose inner content OID isn't /* Nor can any of these "signed" CTLs whose inner content OID isn't
* szOID_CTL. * szOID_CTL.
*/ */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ctl = CertCreateCTLContext(X509_ASN_ENCODING, signedCTL, sizeof(signedCTL)); ctl = CertCreateCTLContext(X509_ASN_ENCODING, signedCTL, sizeof(signedCTL));
ok(!ctl && ok(!ctl && GetLastError() == ERROR_INVALID_DATA,
(GetLastError() == ERROR_INVALID_DATA || "expected ERROR_INVALID_DATA, got %ld (0x%08lx)\n",
GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE /* win9x */ || GetLastError(),
GetLastError() == ERROR_SUCCESS /* some win98 */),
"expected ERROR_INVALID_DATA, CRYPT_E_UNEXPECTED_MSG_TYPE, or ERROR_SUCCESS, got %d (0x%08x)\n", GetLastError(),
GetLastError()); GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ctl = CertCreateCTLContext(X509_ASN_ENCODING, ctlWithOneEntry, ctl = CertCreateCTLContext(X509_ASN_ENCODING, ctlWithOneEntry,
sizeof(ctlWithOneEntry)); sizeof(ctlWithOneEntry));
ok(!ctl && ok(!ctl && GetLastError() == ERROR_INVALID_DATA,
(GetLastError() == ERROR_INVALID_DATA || "expected ERROR_INVALID_DATA, got %ld (0x%08lx)\n", GetLastError(),
GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE /* win9x */ ||
GetLastError() == OSS_DATA_ERROR /* some win98 */ ||
GetLastError() == ERROR_SUCCESS /* some win98 */),
"expected ERROR_INVALID_DATA, CRYPT_E_UNEXPECTED_MSG_TYPE, OSS_DATA_ERROR, or ERROR_SUCCESS, got %d (0x%08x)\n", GetLastError(),
GetLastError()); GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ctl = CertCreateCTLContext(X509_ASN_ENCODING, ctl = CertCreateCTLContext(X509_ASN_ENCODING,
signedCTLWithSubjectAlgorithm, sizeof(signedCTLWithSubjectAlgorithm)); signedCTLWithSubjectAlgorithm, sizeof(signedCTLWithSubjectAlgorithm));
ok(!ctl && ok(!ctl && GetLastError() == ERROR_INVALID_DATA,
(GetLastError() == ERROR_INVALID_DATA || "expected ERROR_INVALID_DATA, got %ld (0x%08lx)\n", GetLastError(),
GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE /* win9x */ ||
GetLastError() == ERROR_SUCCESS /* some win98 */),
"expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(),
GetLastError()); GetLastError());
/* This signed CTL with the appropriate inner content type can be decoded. /* This signed CTL with the appropriate inner content type can be decoded.
*/ */
ctl = CertCreateCTLContext(X509_ASN_ENCODING, ctl = CertCreateCTLContext(X509_ASN_ENCODING,
signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent)); signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent));
ok(ctl != NULL, "CertCreateCTLContext failed: %08x\n", GetLastError()); ok(ctl != NULL, "CertCreateCTLContext failed: %08lx\n", GetLastError());
if (ctl) if (ctl)
{ {
/* Even though the CTL was decoded with X509_ASN_ENCODING, the /* Even though the CTL was decoded with X509_ASN_ENCODING, the
@@ -172,7 +159,7 @@ static void testCreateCTL(void)
*/ */
ok(ctl->dwMsgAndCertEncodingType == ok(ctl->dwMsgAndCertEncodingType ==
(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING), (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING),
"expected X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, got %08x\n", "expected X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, got %08lx\n",
ctl->dwMsgAndCertEncodingType); ctl->dwMsgAndCertEncodingType);
CertFreeCTLContext(ctl); CertFreeCTLContext(ctl);
} }
@@ -182,7 +169,7 @@ static void testCreateCTL(void)
ctl = CertCreateCTLContext(X509_ASN_ENCODING, ctl = CertCreateCTLContext(X509_ASN_ENCODING,
signedCTLWithCTLInnerContentAndBadSig, signedCTLWithCTLInnerContentAndBadSig,
sizeof(signedCTLWithCTLInnerContentAndBadSig)); sizeof(signedCTLWithCTLInnerContentAndBadSig));
ok(ctl != NULL, "CertCreateCTLContext failed: %08x\n", GetLastError()); ok(ctl != NULL, "CertCreateCTLContext failed: %08lx\n", GetLastError());
if (ctl) if (ctl)
CertFreeCTLContext(ctl); CertFreeCTLContext(ctl);
} }
@@ -221,12 +208,12 @@ static void checkHash(const BYTE *data, DWORD dataLen, ALG_ID algID,
memset(hashProperty, 0, sizeof(hashProperty)); memset(hashProperty, 0, sizeof(hashProperty));
size = sizeof(hash); size = sizeof(hash);
ret = CryptHashCertificate(0, algID, 0, data, dataLen, hash, &size); ret = CryptHashCertificate(0, algID, 0, data, dataLen, hash, &size);
ok(ret, "CryptHashCertificate failed: %08x\n", GetLastError()); ok(ret, "CryptHashCertificate failed: %08lx\n", GetLastError());
ret = CertGetCTLContextProperty(context, propID, hashProperty, &size); ret = CertGetCTLContextProperty(context, propID, hashProperty, &size);
ok(ret, "CertGetCTLContextProperty failed: %08x\n", GetLastError()); ok(ret, "CertGetCTLContextProperty failed: %08lx\n", GetLastError());
if (ret) if (ret)
ok(!memcmp(hash, hashProperty, size), ok(!memcmp(hash, hashProperty, size),
"Unexpected hash for property %d\n", propID); "Unexpected hash for property %ld\n", propID);
} }
static void testCTLProperties(void) static void testCTLProperties(void)
@@ -237,11 +224,6 @@ static void testCTLProperties(void)
ctl = CertCreateCTLContext(X509_ASN_ENCODING, ctl = CertCreateCTLContext(X509_ASN_ENCODING,
signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent)); signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent));
if (!ctl)
{
skip("CertCreateCTLContext failed: %08x\n", GetLastError());
return;
}
/* No properties as yet */ /* No properties as yet */
propID = 0; propID = 0;
@@ -251,17 +233,15 @@ static void testCTLProperties(void)
if (propID) if (propID)
numProps++; numProps++;
} while (propID != 0); } while (propID != 0);
ok(numProps == 0, "Expected 0 properties, got %d\n", numProps); ok(numProps == 0, "Expected 0 properties, got %ld\n", numProps);
/* An implicit property */ /* An implicit property */
ret = CertGetCTLContextProperty(ctl, CERT_ACCESS_STATE_PROP_ID, NULL, ret = CertGetCTLContextProperty(ctl, CERT_ACCESS_STATE_PROP_ID, NULL,
&size); &size);
ok(ret || broken(GetLastError() == CRYPT_E_NOT_FOUND /* some win98 */), ok(ret, "CertGetCTLContextProperty failed: %08lx\n", GetLastError());
"CertGetCTLContextProperty failed: %08x\n", GetLastError());
ret = CertGetCTLContextProperty(ctl, CERT_ACCESS_STATE_PROP_ID, &access, ret = CertGetCTLContextProperty(ctl, CERT_ACCESS_STATE_PROP_ID, &access,
&size); &size);
ok(ret || broken(GetLastError() == CRYPT_E_NOT_FOUND /* some win98 */), ok(ret, "CertGetCTLContextProperty failed: %08lx\n", GetLastError());
"CertGetCTLContextProperty failed: %08x\n", GetLastError());
if (ret) if (ret)
ok(!(access & CERT_ACCESS_STATE_WRITE_PERSIST_FLAG), ok(!(access & CERT_ACCESS_STATE_WRITE_PERSIST_FLAG),
"Didn't expect a persisted cert\n"); "Didn't expect a persisted cert\n");
@@ -279,7 +259,7 @@ static void testCTLProperties(void)
if (propID) if (propID)
numProps++; numProps++;
} while (propID != 0); } while (propID != 0);
ok(numProps == 1, "Expected 1 properties, got %d\n", numProps); ok(numProps == 1, "Expected 1 properties, got %ld\n", numProps);
checkHash(signedCTLWithCTLInnerContent, checkHash(signedCTLWithCTLInnerContent,
sizeof(signedCTLWithCTLInnerContent), CALG_MD5, ctl, sizeof(signedCTLWithCTLInnerContent), CALG_MD5, ctl,
@@ -360,12 +340,12 @@ static void testAddCTLToStore(void)
ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING,
signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent), signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent),
CERT_STORE_ADD_ALWAYS, NULL); CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCTLToStore failed: %08lx\n", GetLastError());
ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING,
signedCTLWithCTLInnerContentAndBadSig, signedCTLWithCTLInnerContentAndBadSig,
sizeof(signedCTLWithCTLInnerContentAndBadSig), CERT_STORE_ADD_ALWAYS, sizeof(signedCTLWithCTLInnerContentAndBadSig), CERT_STORE_ADD_ALWAYS,
NULL); NULL);
ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCTLToStore failed: %08lx\n", GetLastError());
/* Check that two exist */ /* Check that two exist */
numCTLs = 0; numCTLs = 0;
ctl = NULL; ctl = NULL;
@@ -374,7 +354,7 @@ static void testAddCTLToStore(void)
if (ctl) if (ctl)
numCTLs++; numCTLs++;
} while (ctl); } while (ctl);
ok(numCTLs == 2, "expected 2 CTLs, got %d\n", numCTLs); ok(numCTLs == 2, "expected 2 CTLs, got %ld\n", numCTLs);
CertCloseStore(store, 0); CertCloseStore(store, 0);
store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
@@ -383,15 +363,15 @@ static void testAddCTLToStore(void)
ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING,
signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent), signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent),
CERT_STORE_ADD_NEW, NULL); CERT_STORE_ADD_NEW, NULL);
ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCTLToStore failed: %08lx\n", GetLastError());
/* so adding the second CTL fails. */ /* so adding the second CTL fails. */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING,
signedCTLWithCTLInnerContentAndBadSig, signedCTLWithCTLInnerContentAndBadSig,
sizeof(signedCTLWithCTLInnerContentAndBadSig), CERT_STORE_ADD_NEW, sizeof(signedCTLWithCTLInnerContentAndBadSig), CERT_STORE_ADD_NEW,
NULL); NULL);
ok(!ret && (GetLastError() == CRYPT_E_EXISTS || GetLastError() == OSS_DATA_ERROR), ok(!ret && GetLastError() == CRYPT_E_EXISTS,
"expected CRYPT_E_EXISTS or OSS_DATA_ERROR, got %d %08x\n", ret, GetLastError()); "expected CRYPT_E_EXISTS, got %d %08lx\n", ret, GetLastError());
CertCloseStore(store, 0); CertCloseStore(store, 0);
store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
@@ -402,13 +382,12 @@ static void testAddCTLToStore(void)
ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING,
signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent), signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent),
CERT_STORE_ADD_NEW, NULL); CERT_STORE_ADD_NEW, NULL);
ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCTLToStore failed: %08lx\n", GetLastError());
expectedCTLs = 1; expectedCTLs = 1;
ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING,
signedCTLWithUsage, sizeof(signedCTLWithUsage), CERT_STORE_ADD_NEW, signedCTLWithUsage, sizeof(signedCTLWithUsage), CERT_STORE_ADD_NEW,
NULL); NULL);
ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* some win98 */), ok(ret, "CertAddEncodedCTLToStore failed: %08lx\n", GetLastError());
"CertAddEncodedCTLToStore failed: %08x\n", GetLastError());
if (ret) if (ret)
expectedCTLs++; expectedCTLs++;
/* Check that two exist */ /* Check that two exist */
@@ -419,7 +398,7 @@ static void testAddCTLToStore(void)
if (ctl) if (ctl)
numCTLs++; numCTLs++;
} while (ctl); } while (ctl);
ok(numCTLs == expectedCTLs, "expected %d CTLs, got %d\n", expectedCTLs, ok(numCTLs == expectedCTLs, "expected %ld CTLs, got %ld\n", expectedCTLs,
numCTLs); numCTLs);
CertCloseStore(store, 0); CertCloseStore(store, 0);
@@ -431,16 +410,11 @@ static void testAddCTLToStore(void)
ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING,
signedCTLWithListID1, sizeof(signedCTLWithListID1), CERT_STORE_ADD_NEW, signedCTLWithListID1, sizeof(signedCTLWithListID1), CERT_STORE_ADD_NEW,
NULL); NULL);
if (!ret) ok(ret, "CertAddEncodedCTLToStore failed: %08lx\n", GetLastError());
{
skip("adding a CTL with an empty usage not supported\n");
return;
}
ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError());
ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING,
signedCTLWithListID2, sizeof(signedCTLWithListID2), CERT_STORE_ADD_NEW, signedCTLWithListID2, sizeof(signedCTLWithListID2), CERT_STORE_ADD_NEW,
NULL); NULL);
ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); ok(ret, "CertAddEncodedCTLToStore failed: %08lx\n", GetLastError());
/* Check that two exist */ /* Check that two exist */
numCTLs = 0; numCTLs = 0;
ctl = NULL; ctl = NULL;
@@ -449,7 +423,7 @@ static void testAddCTLToStore(void)
if (ctl) if (ctl)
numCTLs++; numCTLs++;
} while (ctl); } while (ctl);
ok(numCTLs == 2, "expected 2 CTLs, got %d\n", numCTLs); ok(numCTLs == 2, "expected 2 CTLs, got %ld\n", numCTLs);
CertCloseStore(store, 0); CertCloseStore(store, 0);
} }

File diff suppressed because it is too large Load Diff

View File

@@ -42,7 +42,7 @@ static void test_findAttribute(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindAttribute(NULL, 0, NULL); ret = CertFindAttribute(NULL, 0, NULL);
ok(ret == NULL, "Expected failure\n"); ok(ret == NULL, "Expected failure\n");
ok(GetLastError() == 0xdeadbeef, "Last error was set to %08x\n", ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
GetLastError()); GetLastError());
if (0) if (0)
{ {
@@ -54,25 +54,25 @@ static void test_findAttribute(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindAttribute(NULL, 1, &attr); ret = CertFindAttribute(NULL, 1, &attr);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d (%08x)\n", GetLastError(), "Expected ERROR_INVALID_PARAMETER, got %ld (%08lx)\n", GetLastError(),
GetLastError()); GetLastError());
} }
/* returns NULL, last error not set */ /* returns NULL, last error not set */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindAttribute("bogus", 1, &attr); ret = CertFindAttribute("bogus", 1, &attr);
ok(ret == NULL, "Expected failure\n"); ok(ret == NULL, "Expected failure\n");
ok(GetLastError() == 0xdeadbeef, "Last error was set to %08x\n", ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
GetLastError()); GetLastError());
/* returns NULL, last error not set */ /* returns NULL, last error not set */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindAttribute("1.2.4", 1, &attr); ret = CertFindAttribute("1.2.4", 1, &attr);
ok(ret == NULL, "Expected failure\n"); ok(ret == NULL, "Expected failure\n");
ok(GetLastError() == 0xdeadbeef, "Last error was set to %08x\n", ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
GetLastError()); GetLastError());
/* succeeds, last error not set */ /* succeeds, last error not set */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindAttribute("1.2.3", 1, &attr); ret = CertFindAttribute("1.2.3", 1, &attr);
ok(ret != NULL, "CertFindAttribute failed: %08x\n", GetLastError()); ok(ret != NULL, "CertFindAttribute failed: %08lx\n", GetLastError());
} }
static void test_findExtension(void) static void test_findExtension(void)
@@ -86,7 +86,7 @@ static void test_findExtension(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindExtension(NULL, 0, NULL); ret = CertFindExtension(NULL, 0, NULL);
ok(ret == NULL, "Expected failure\n"); ok(ret == NULL, "Expected failure\n");
ok(GetLastError() == 0xdeadbeef, "Last error was set to %08x\n", ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
GetLastError()); GetLastError());
if (0) if (0)
{ {
@@ -99,25 +99,25 @@ static void test_findExtension(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindExtension(NULL, 1, &ext); ret = CertFindExtension(NULL, 1, &ext);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d (%08x)\n", GetLastError(), "Expected ERROR_INVALID_PARAMETER, got %ld (%08lx)\n", GetLastError(),
GetLastError()); GetLastError());
} }
/* returns NULL, last error not set */ /* returns NULL, last error not set */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindExtension("bogus", 1, &ext); ret = CertFindExtension("bogus", 1, &ext);
ok(ret == NULL, "Expected failure\n"); ok(ret == NULL, "Expected failure\n");
ok(GetLastError() == 0xdeadbeef, "Last error was set to %08x\n", ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
GetLastError()); GetLastError());
/* returns NULL, last error not set */ /* returns NULL, last error not set */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindExtension("1.2.4", 1, &ext); ret = CertFindExtension("1.2.4", 1, &ext);
ok(ret == NULL, "Expected failure\n"); ok(ret == NULL, "Expected failure\n");
ok(GetLastError() == 0xdeadbeef, "Last error was set to %08x\n", ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
GetLastError()); GetLastError());
/* succeeds, last error not set */ /* succeeds, last error not set */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindExtension("1.2.3", 1, &ext); ret = CertFindExtension("1.2.3", 1, &ext);
ok(ret != NULL, "CertFindExtension failed: %08x\n", GetLastError()); ok(ret != NULL, "CertFindExtension failed: %08lx\n", GetLastError());
} }
static void test_findRDNAttr(void) static void test_findRDNAttr(void)
@@ -142,25 +142,25 @@ static void test_findRDNAttr(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindRDNAttr(NULL, &nameInfo); ret = CertFindRDNAttr(NULL, &nameInfo);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d (%08x)\n", GetLastError(), "Expected ERROR_INVALID_PARAMETER, got %ld (%08lx)\n", GetLastError(),
GetLastError()); GetLastError());
} }
/* returns NULL, last error not set */ /* returns NULL, last error not set */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindRDNAttr("bogus", &nameInfo); ret = CertFindRDNAttr("bogus", &nameInfo);
ok(ret == NULL, "Expected failure\n"); ok(ret == NULL, "Expected failure\n");
ok(GetLastError() == 0xdeadbeef, "Last error was set to %08x\n", ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
GetLastError()); GetLastError());
/* returns NULL, last error not set */ /* returns NULL, last error not set */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindRDNAttr("1.2.4", &nameInfo); ret = CertFindRDNAttr("1.2.4", &nameInfo);
ok(ret == NULL, "Expected failure\n"); ok(ret == NULL, "Expected failure\n");
ok(GetLastError() == 0xdeadbeef, "Last error was set to %08x\n", ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
GetLastError()); GetLastError());
/* succeeds, last error not set */ /* succeeds, last error not set */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertFindRDNAttr("1.2.3", &nameInfo); ret = CertFindRDNAttr("1.2.3", &nameInfo);
ok(ret != NULL, "CertFindRDNAttr failed: %08x\n", GetLastError()); ok(ret != NULL, "CertFindRDNAttr failed: %08lx\n", GetLastError());
} }
static void test_verifyTimeValidity(void) static void test_verifyTimeValidity(void)
@@ -178,16 +178,16 @@ static void test_verifyTimeValidity(void)
*/ */
/* Check with 0 NotBefore and NotAfter */ /* Check with 0 NotBefore and NotAfter */
ret = CertVerifyTimeValidity(&fileTime, &info); ret = CertVerifyTimeValidity(&fileTime, &info);
ok(ret == 1, "Expected 1, got %d\n", ret); ok(ret == 1, "Expected 1, got %ld\n", ret);
info.NotAfter = fileTime; info.NotAfter = fileTime;
/* Check with NotAfter equal to comparison time */ /* Check with NotAfter equal to comparison time */
ret = CertVerifyTimeValidity(&fileTime, &info); ret = CertVerifyTimeValidity(&fileTime, &info);
ok(ret == 0, "Expected 0, got %d\n", ret); ok(ret == 0, "Expected 0, got %ld\n", ret);
/* Check with NotBefore after comparison time */ /* Check with NotBefore after comparison time */
info.NotBefore = fileTime; info.NotBefore = fileTime;
info.NotBefore.dwLowDateTime += 5000; info.NotBefore.dwLowDateTime += 5000;
ret = CertVerifyTimeValidity(&fileTime, &info); ret = CertVerifyTimeValidity(&fileTime, &info);
ok(ret == -1, "Expected -1, got %d\n", ret); ok(ret == -1, "Expected -1, got %ld\n", ret);
} }
static void test_cryptAllocate(void) static void test_cryptAllocate(void)
@@ -195,12 +195,12 @@ static void test_cryptAllocate(void)
LPVOID buf; LPVOID buf;
buf = CryptMemAlloc(0); buf = CryptMemAlloc(0);
ok(buf != NULL, "CryptMemAlloc failed: %08x\n", GetLastError()); ok(buf != NULL, "CryptMemAlloc failed: %08lx\n", GetLastError());
CryptMemFree(buf); CryptMemFree(buf);
/* CryptMemRealloc(NULL, 0) fails pre-Vista */ /* CryptMemRealloc(NULL, 0) fails pre-Vista */
buf = CryptMemAlloc(0); buf = CryptMemAlloc(0);
buf = CryptMemRealloc(buf, 1); buf = CryptMemRealloc(buf, 1);
ok(buf != NULL, "CryptMemRealloc failed: %08x\n", GetLastError()); ok(buf != NULL, "CryptMemRealloc failed: %08lx\n", GetLastError());
CryptMemFree(buf); CryptMemFree(buf);
} }
@@ -223,7 +223,7 @@ static void test_cryptTls(void)
/* One normal pass */ /* One normal pass */
index = pI_CryptAllocTls(); index = pI_CryptAllocTls();
ok(index, "I_CryptAllocTls failed: %08x\n", GetLastError()); ok(index, "I_CryptAllocTls failed: %08lx\n", GetLastError());
if (index) if (index)
{ {
LPVOID ptr; LPVOID ptr;
@@ -231,22 +231,22 @@ static void test_cryptTls(void)
ptr = pI_CryptGetTls(index); ptr = pI_CryptGetTls(index);
ok(!ptr, "Expected NULL\n"); ok(!ptr, "Expected NULL\n");
ret = pI_CryptSetTls(index, (LPVOID)0xdeadbeef); ret = pI_CryptSetTls(index, (LPVOID)0xdeadbeef);
ok(ret, "I_CryptSetTls failed: %08x\n", GetLastError()); ok(ret, "I_CryptSetTls failed: %08lx\n", GetLastError());
ptr = pI_CryptGetTls(index); ptr = pI_CryptGetTls(index);
ok(ptr == (LPVOID)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", ptr); ok(ptr == (LPVOID)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", ptr);
/* This crashes /* This crashes
ret = pI_CryptFreeTls(index, 1); ret = pI_CryptFreeTls(index, 1);
*/ */
ret = pI_CryptFreeTls(index, 0); ret = pI_CryptFreeTls(index, 0);
ok(ret, "I_CryptFreeTls failed: %08x\n", GetLastError()); ok(ret, "I_CryptFreeTls failed: %08lx\n", GetLastError());
ret = pI_CryptFreeTls(index, 0); ret = pI_CryptFreeTls(index, 0);
ok(!ret, "I_CryptFreeTls succeeded\n"); ok(!ret, "I_CryptFreeTls succeeded\n");
ok(GetLastError() == E_INVALIDARG, ok(GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
} }
/* Similar pass, check I_CryptDetachTls */ /* Similar pass, check I_CryptDetachTls */
index = pI_CryptAllocTls(); index = pI_CryptAllocTls();
ok(index, "I_CryptAllocTls failed: %08x\n", GetLastError()); ok(index, "I_CryptAllocTls failed: %08lx\n", GetLastError());
if (index) if (index)
{ {
LPVOID ptr; LPVOID ptr;
@@ -254,7 +254,7 @@ static void test_cryptTls(void)
ptr = pI_CryptGetTls(index); ptr = pI_CryptGetTls(index);
ok(!ptr, "Expected NULL\n"); ok(!ptr, "Expected NULL\n");
ret = pI_CryptSetTls(index, (LPVOID)0xdeadbeef); ret = pI_CryptSetTls(index, (LPVOID)0xdeadbeef);
ok(ret, "I_CryptSetTls failed: %08x\n", GetLastError()); ok(ret, "I_CryptSetTls failed: %08lx\n", GetLastError());
ptr = pI_CryptGetTls(index); ptr = pI_CryptGetTls(index);
ok(ptr == (LPVOID)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", ptr); ok(ptr == (LPVOID)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", ptr);
ptr = pI_CryptDetachTls(index); ptr = pI_CryptDetachTls(index);
@@ -272,34 +272,26 @@ static void test_readTrustedPublisherDWORD(void)
pReadDWORD = (void *)GetProcAddress(hCrypt, "I_CryptReadTrustedPublisherDWORDValueFromRegistry"); pReadDWORD = (void *)GetProcAddress(hCrypt, "I_CryptReadTrustedPublisherDWORDValueFromRegistry");
if (pReadDWORD) if (pReadDWORD)
{ {
static const WCHAR safer[] = {
'S','o','f','t','w','a','r','e','\\',
'P','o','l','i','c','i','e','s','\\',
'M','i','c','r','o','s','o','f','t','\\','S','y','s','t','e','m',
'C','e','r','t','i','f','i','c','a','t','e','s','\\',
'T','r','u','s','t','e','d','P','u','b','l','i','s','h','e','r',
'\\','S','a','f','e','r',0 };
static const WCHAR authenticodeFlags[] = { 'A','u','t','h','e','n',
't','i','c','o','d','e','F','l','a','g','s',0 };
BOOL ret, exists = FALSE; BOOL ret, exists = FALSE;
DWORD size, readFlags = 0, returnedFlags; DWORD size, readFlags = 0, returnedFlags;
HKEY key; HKEY key;
LONG rc; LONG rc;
rc = RegOpenKeyW(HKEY_LOCAL_MACHINE, safer, &key); rc = RegOpenKeyW(HKEY_LOCAL_MACHINE,
L"Software\\Policies\\Microsoft\\SystemCertificates\\TrustedPublisher\\Safer", &key);
if (rc == ERROR_SUCCESS) if (rc == ERROR_SUCCESS)
{ {
size = sizeof(readFlags); size = sizeof(readFlags);
rc = RegQueryValueExW(key, authenticodeFlags, NULL, NULL, rc = RegQueryValueExW(key, L"AuthenticodeFlags", NULL, NULL,
(LPBYTE)&readFlags, &size); (LPBYTE)&readFlags, &size);
if (rc == ERROR_SUCCESS) if (rc == ERROR_SUCCESS)
exists = TRUE; exists = TRUE;
} }
returnedFlags = 0xdeadbeef; returnedFlags = 0xdeadbeef;
ret = pReadDWORD(authenticodeFlags, &returnedFlags); ret = pReadDWORD(L"AuthenticodeFlags", &returnedFlags);
ok(ret == exists, "Unexpected return value\n"); ok(ret == exists, "Unexpected return value\n");
ok(readFlags == returnedFlags, ok(readFlags == returnedFlags,
"Expected flags %08x, got %08x\n", readFlags, returnedFlags); "Expected flags %08lx, got %08lx\n", readFlags, returnedFlags);
} }
} }
@@ -337,28 +329,28 @@ static void test_getDefaultCryptProv(void)
prov = pI_CryptGetDefaultCryptProv(0xdeadbeef); prov = pI_CryptGetDefaultCryptProv(0xdeadbeef);
ok(prov == 0 && GetLastError() == E_INVALIDARG, ok(prov == 0 && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
prov = pI_CryptGetDefaultCryptProv(PROV_RSA_FULL); prov = pI_CryptGetDefaultCryptProv(PROV_RSA_FULL);
ok(prov == 0 && GetLastError() == E_INVALIDARG, ok(prov == 0 && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
prov = pI_CryptGetDefaultCryptProv(1); prov = pI_CryptGetDefaultCryptProv(1);
ok(prov == 0 && GetLastError() == E_INVALIDARG, ok(prov == 0 && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
prov = pI_CryptGetDefaultCryptProv(0); prov = pI_CryptGetDefaultCryptProv(0);
ok(prov != 0, "I_CryptGetDefaultCryptProv failed: %08x\n", GetLastError()); ok(prov != 0, "I_CryptGetDefaultCryptProv failed: %08lx\n", GetLastError());
CryptReleaseContext(prov, 0); CryptReleaseContext(prov, 0);
for (i = 0; i < ARRAY_SIZE(test_prov); i++) for (i = 0; i < ARRAY_SIZE(test_prov); i++)
{ {
if (winetest_debug > 1) if (winetest_debug > 1)
trace("%u: algid %#x (%s): class %u, type %u, sid %u\n", i, test_prov[i].algid, test_prov[i].name, trace("%lu: algid %#x (%s): class %u, type %u, sid %u\n", i, test_prov[i].algid, test_prov[i].name,
GET_ALG_CLASS(test_prov[i].algid) >> 13, GET_ALG_TYPE(test_prov[i].algid) >> 9, GET_ALG_SID(test_prov[i].algid)); GET_ALG_CLASS(test_prov[i].algid) >> 13, GET_ALG_TYPE(test_prov[i].algid) >> 9, GET_ALG_SID(test_prov[i].algid));
prov = pI_CryptGetDefaultCryptProv(test_prov[i].algid); prov = pI_CryptGetDefaultCryptProv(test_prov[i].algid);
if (!prov) if (!prov)
{ {
todo_wine_if(test_prov[i].algid == CALG_DSS_SIGN || test_prov[i].algid == CALG_NO_SIGN) todo_wine_if(test_prov[i].algid == CALG_DSS_SIGN || test_prov[i].algid == CALG_NO_SIGN)
ok(test_prov[i].optional, "%u: I_CryptGetDefaultCryptProv(%#x) failed\n", i, test_prov[i].algid); ok(test_prov[i].optional, "%lu: I_CryptGetDefaultCryptProv(%#x) failed\n", i, test_prov[i].algid);
continue; continue;
} }
@@ -367,9 +359,9 @@ todo_wine_if(test_prov[i].algid == CALG_DSS_SIGN || test_prov[i].algid == CALG_N
{ {
name = CryptMemAlloc(size); name = CryptMemAlloc(size);
ret = CryptGetProvParam(prov, PP_NAME, (BYTE *)name, &size, 0); ret = CryptGetProvParam(prov, PP_NAME, (BYTE *)name, &size, 0);
ok(ret, "%u: CryptGetProvParam failed %#x\n", i, GetLastError()); ok(ret, "%lu: CryptGetProvParam failed %#lx\n", i, GetLastError());
if (winetest_debug > 1) if (winetest_debug > 1)
trace("%u: algid %#x, name %s\n", i, test_prov[i].algid, name); trace("%lu: algid %#x, name %s\n", i, test_prov[i].algid, name);
CryptMemFree(name); CryptMemFree(name);
} }
@@ -393,119 +385,92 @@ static void test_CryptInstallOssGlobal(void)
} }
} }
static const BYTE encodedInt[] = { 0x02,0x01,0x01 };
static const WCHAR encodedIntStr[] = { '0','2',' ','0','1',' ','0','1',0 };
static const BYTE encodedBigInt[] = { 0x02,0x1f,0x01,0x02,0x03,0x04,0x05,0x06,
0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,
0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f };
static const WCHAR encodedBigIntStr[] = { '0','2',' ','1','f',' ','0','1',' ',
'0','2',' ','0','3',' ','0','4',' ','0','5',' ','0','6',' ','0','7',' ','0',
'8',' ','0','9',' ','0','a',' ','0','b',' ','0','c',' ','0','d',' ','0','e',
' ','0','f',' ','1','0',' ','1','1',' ','1','2',' ','1','3',' ','1','4',' ',
'1','5',' ','1','6',' ','1','7',' ','1','8',' ','1','9',' ','1','a',' ','1',
'b',' ','1','c',' ','1','d',' ','1','e',' ','1','f',0 };
static void test_format_object(void) static void test_format_object(void)
{ {
BOOL (WINAPI *pCryptFormatObject)(DWORD dwEncoding, DWORD dwFormatType, static const BYTE encodedInt[] = {0x02,0x01,0x01};
DWORD dwFormatStrType, void *pFormatStruct, LPCSTR lpszStructType, static const BYTE encodedBigInt[] = {0x02,0x1f,0x01,0x02,0x03,0x04,0x05,
const BYTE *pbEncoded, DWORD dwEncoded, void *pbFormat, 0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,
DWORD *pcbFormat); 0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f};
static const WCHAR encodedBigIntStr[] = L"02 1f 01 02 03 04 05 06 07 08 09 "
"0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f";
BOOL ret; BOOL ret;
DWORD size; DWORD size;
LPWSTR str; WCHAR str[100];
pCryptFormatObject = (void *)GetProcAddress(hCrypt, "CryptFormatObject");
if (!pCryptFormatObject)
{
skip("No CryptFormatObject\n");
return;
}
/* Crash */ /* Crash */
if (0) if (0)
{ {
pCryptFormatObject(0, 0, 0, NULL, NULL, NULL, 0, NULL, NULL); CryptFormatObject(0, 0, 0, NULL, NULL, NULL, 0, NULL, NULL);
} }
/* When called with any but the default encoding, it fails to find a /* When called with any but the default encoding, it fails to find a
* formatting function. * formatting function.
*/ */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptFormatObject(0, 0, 0, NULL, NULL, NULL, 0, NULL, &size); ret = CryptFormatObject(0, 0, 0, NULL, NULL, NULL, 0, NULL, &size);
ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, ok(!ret, "expected failure\n");
"expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); ok(GetLastError() == ERROR_FILE_NOT_FOUND, "wrong error %lu\n", GetLastError());
/* When called with the default encoding type for any undefined struct type /* When called with the default encoding type for any undefined struct type
* (including none), it succeeds: the default encoding is a hex string * (including none), it succeeds: the default encoding is a hex string
* encoding. * encoding.
*/ */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, NULL, 0, ret = CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, NULL, 0, NULL, &size);
NULL, &size); ok(ret, "CryptFormatObject failed: %ld\n", GetLastError());
ok(ret, "CryptFormatObject failed: %d\n", GetLastError()); ok(size == sizeof(WCHAR) || broken(!size) /* Win10 1709+ */, "wrong size %ld\n", size);
if (ret)
{ SetLastError(0xdeadbeef);
if (size == 0 && GetLastError() == ERROR_FILE_NOT_FOUND) size = 0;
{ ret = CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, NULL, 0, str, &size);
win_skip("CryptFormatObject has no default implementation\n"); ok(!ret, "expected failure\n");
return; ok(GetLastError() == ERROR_MORE_DATA, "wrong error %lu\n", GetLastError());
}
ok(size == sizeof(WCHAR), "unexpected size %d\n", size); size = sizeof(WCHAR);
str = HeapAlloc(GetProcessHeap(), 0, size); ret = CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, NULL, 0, str, &size);
SetLastError(0xdeadbeef); ok(ret, "CryptFormatObject failed, error %lu\n", GetLastError());
size = 0; ok(!str[0], "expected empty string\n");
ret = pCryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, NULL, 0,
str, &size); ret = CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, encodedInt,
ok(!ret && GetLastError() == ERROR_MORE_DATA, sizeof(encodedInt), NULL, &size);
"expected ERROR_MORE_DATA, got %d\n", GetLastError()); ok(ret, "CryptFormatObject failed, error %lu\n", GetLastError());
size = sizeof(WCHAR); ok(size >= sizeof(L"02 01 01"), "wrong size %lu\n", size);
ret = pCryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, NULL, 0,
str, &size); ret = CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, encodedInt,
ok(ret, "CryptFormatObject failed: %d\n", GetLastError()); sizeof(encodedInt), str, &size);
ok(!str[0], "expected empty string\n"); ok(ret, "CryptFormatObject failed, error %lu\n", GetLastError());
HeapFree(GetProcessHeap(), 0, str); ok(!wcscmp(str, L"02 01 01"), "wrong string %s\n", wine_dbgstr_w(str));
}
ret = pCryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, encodedInt, ret = CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, encodedBigInt,
sizeof(encodedInt), NULL, &size); sizeof(encodedBigInt), NULL, &size);
ok(ret, "CryptFormatObject failed: %d\n", GetLastError()); ok(ret, "CryptFormatObject failed, error %lu\n", GetLastError());
if (ret) ok(size >= sizeof(encodedBigIntStr), "wrong size %lu\n", size);
{
str = HeapAlloc(GetProcessHeap(), 0, size); ret = CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL,
ret = pCryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL, encodedBigInt, sizeof(encodedBigInt), str, &size);
encodedInt, sizeof(encodedInt), str, &size); ok(ret, "CryptFormatObject failed: %ld\n", GetLastError());
ok(ret, "CryptFormatObject failed: %d\n", GetLastError()); ok(!wcsicmp(str, encodedBigIntStr), "wrong string %s\n", wine_dbgstr_w(str));
ok(!lstrcmpW(str, encodedIntStr), "unexpected format string\n");
HeapFree(GetProcessHeap(), 0, str);
}
ret = pCryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL,
encodedBigInt, sizeof(encodedBigInt), NULL, &size);
ok(ret, "CryptFormatObject failed: %d\n", GetLastError());
if (ret)
{
str = HeapAlloc(GetProcessHeap(), 0, size);
ret = pCryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, NULL,
encodedBigInt, sizeof(encodedBigInt), str, &size);
ok(ret, "CryptFormatObject failed: %d\n", GetLastError());
ok(!lstrcmpiW(str, encodedBigIntStr), "unexpected format string\n");
HeapFree(GetProcessHeap(), 0, str);
}
/* When called with the default encoding type for any undefined struct /* When called with the default encoding type for any undefined struct
* type but CRYPT_FORMAT_STR_NO_HEX specified, it fails to find a * type but CRYPT_FORMAT_STR_NO_HEX specified, it fails to find a
* formatting function. * formatting function.
*/ */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptFormatObject(X509_ASN_ENCODING, 0, CRYPT_FORMAT_STR_NO_HEX, ret = CryptFormatObject(X509_ASN_ENCODING, 0, CRYPT_FORMAT_STR_NO_HEX,
NULL, NULL, NULL, 0, NULL, &size); NULL, NULL, NULL, 0, NULL, &size);
ok(!ret, "CryptFormatObject succeeded\n"); ok(!ret, "CryptFormatObject succeeded\n");
ok(GetLastError() == ERROR_FILE_NOT_FOUND || ok(GetLastError() == ERROR_FILE_NOT_FOUND
GetLastError() == 0xdeadbeef, /* Vista, W2K8 */ || GetLastError() == 0xdeadbeef, /* Vista, W2K8 */
"expected ERROR_FILE_NOT_FOUND or no change, got %d\n", GetLastError()); "wrong error %lu\n", GetLastError());
/* When called to format an AUTHORITY_KEY_ID2_INFO, it fails when no /* When called to format an AUTHORITY_KEY_ID2_INFO, it fails when no
* data are given. * data are given.
*/ */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, ret = CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL,
szOID_AUTHORITY_KEY_IDENTIFIER2, NULL, 0, NULL, &size); szOID_AUTHORITY_KEY_IDENTIFIER2, NULL, 0, NULL, &size);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret, "expected failure\n");
"expected E_INVALIDARG, got %d\n", GetLastError()); ok(GetLastError() == E_INVALIDARG, "wrong error %lu\n", GetLastError());
} }
START_TEST(main) START_TEST(main)

View File

@@ -27,23 +27,6 @@
#include "wine/test.h" #include "wine/test.h"
static BOOL (WINAPI * pCryptAcquireContextA)
(HCRYPTPROV *, LPCSTR, LPCSTR, DWORD, DWORD);
static void init_function_pointers(void)
{
HMODULE hAdvapi32 = GetModuleHandleA("advapi32.dll");
#define GET_PROC(dll, func) \
p ## func = (void *)GetProcAddress(dll, #func); \
if(!p ## func) \
trace("GetProcAddress(%s) failed\n", #func);
GET_PROC(hAdvapi32, CryptAcquireContextA)
#undef GET_PROC
}
static const BYTE dataEmptyBareContent[] = { 0x04,0x00 }; static const BYTE dataEmptyBareContent[] = { 0x04,0x00 };
static const BYTE dataEmptyContent[] = { static const BYTE dataEmptyContent[] = {
0x30,0x0f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x02, 0x30,0x0f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x02,
@@ -70,40 +53,35 @@ static void test_msg_get_signer_count(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
count = CryptGetMessageSignerCount(0, NULL, 0); count = CryptGetMessageSignerCount(0, NULL, 0);
ok(count == -1, "Expected -1, got %d\n", count); ok(count == -1, "Expected -1, got %ld\n", count);
ok(GetLastError() == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", ok(GetLastError() == E_INVALIDARG, "Expected E_INVALIDARG, got %08lx\n",
GetLastError()); GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, NULL, 0); count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, NULL, 0);
ok(count == -1, "Expected -1, got %d\n", count); ok(count == -1, "Expected -1, got %ld\n", count);
ok(GetLastError() == CRYPT_E_ASN1_EOD || ok(GetLastError() == CRYPT_E_ASN1_EOD,
GetLastError() == OSS_BAD_ARG, /* win9x */ "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError());
"Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING,
dataEmptyBareContent, sizeof(dataEmptyBareContent)); dataEmptyBareContent, sizeof(dataEmptyBareContent));
ok(count == -1, "Expected -1, got %d\n", count); ok(count == -1, "Expected -1, got %ld\n", count);
ok(GetLastError() == CRYPT_E_ASN1_BADTAG || ok(GetLastError() == CRYPT_E_ASN1_BADTAG,
GetLastError() == OSS_PDU_MISMATCH, /* win9x */ "Expected CRYPT_E_ASN1_BADTAG, got %08lx\n", GetLastError());
"Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING,
dataEmptyContent, sizeof(dataEmptyContent)); dataEmptyContent, sizeof(dataEmptyContent));
ok(count == -1, "Expected -1, got %d\n", count); ok(count == -1, "Expected -1, got %ld\n", count);
ok(GetLastError() == CRYPT_E_INVALID_MSG_TYPE, ok(GetLastError() == CRYPT_E_INVALID_MSG_TYPE,
"Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError()); "Expected CRYPT_E_INVALID_MSG_TYPE, got %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING,
signedEmptyBareContent, sizeof(signedEmptyBareContent)); signedEmptyBareContent, sizeof(signedEmptyBareContent));
ok(count == -1, "Expected -1, got %d\n", count); ok(count == -1, "Expected -1, got %ld\n", count);
ok(GetLastError() == CRYPT_E_ASN1_BADTAG || ok(GetLastError() == CRYPT_E_ASN1_BADTAG,
GetLastError() == OSS_DATA_ERROR, /* win9x */ "Expected CRYPT_E_ASN1_BADTAG, got %08lx\n", GetLastError());
"Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError());
count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING,
signedEmptyContent, sizeof(signedEmptyContent)); signedEmptyContent, sizeof(signedEmptyContent));
ok(count == 1 || ok(count == 1, "Expected 1, got %ld\n", count);
broken(count == -1), /* win9x */
"Expected 1, got %d\n", count);
} }
static BYTE detachedHashContent[] = { static BYTE detachedHashContent[] = {
@@ -132,46 +110,42 @@ static void test_verify_detached_message_hash(void)
ret = CryptVerifyDetachedMessageHash(&para, NULL, 0, 0, NULL, NULL, NULL, ret = CryptVerifyDetachedMessageHash(&para, NULL, 0, 0, NULL, NULL, NULL,
NULL); NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
para.cbSize = sizeof(para); para.cbSize = sizeof(para);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageHash(&para, NULL, 0, 0, NULL, NULL, NULL, ret = CryptVerifyDetachedMessageHash(&para, NULL, 0, 0, NULL, NULL, NULL,
NULL); NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
para.dwMsgEncodingType = PKCS_7_ASN_ENCODING; para.dwMsgEncodingType = PKCS_7_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageHash(&para, NULL, 0, 0, NULL, NULL, NULL, ret = CryptVerifyDetachedMessageHash(&para, NULL, 0, 0, NULL, NULL, NULL,
NULL); NULL);
ok(!ret && ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD,
(GetLastError() == CRYPT_E_ASN1_EOD || "expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError());
GetLastError() == OSS_BAD_ARG), /* win9x */
"expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
para.dwMsgEncodingType = X509_ASN_ENCODING; para.dwMsgEncodingType = X509_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageHash(&para, NULL, 0, 0, NULL, NULL, NULL, ret = CryptVerifyDetachedMessageHash(&para, NULL, 0, 0, NULL, NULL, NULL,
NULL); NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
para.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING; para.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageHash(&para, NULL, 0, 0, NULL, NULL, NULL, ret = CryptVerifyDetachedMessageHash(&para, NULL, 0, 0, NULL, NULL, NULL,
NULL); NULL);
ok(!ret && ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD,
(GetLastError() == CRYPT_E_ASN1_EOD || "expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError());
GetLastError() == OSS_BAD_ARG), /* win9x */
"expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
/* Curiously, passing no data to hash succeeds.. */ /* Curiously, passing no data to hash succeeds.. */
ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent, ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent,
sizeof(detachedHashContent), 0, NULL, NULL, NULL, NULL); sizeof(detachedHashContent), 0, NULL, NULL, NULL, NULL);
todo_wine todo_wine
ok(ret, "CryptVerifyDetachedMessageHash failed: %08x\n", GetLastError()); ok(ret, "CryptVerifyDetachedMessageHash failed: %08lx\n", GetLastError());
/* as does passing the actual content of the message to hash.. */ /* as does passing the actual content of the message to hash.. */
size = sizeof(msgData); size = sizeof(msgData);
pMsgData = msgData; pMsgData = msgData;
ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent, ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent,
sizeof(detachedHashContent), 1, &pMsgData, &size, NULL, NULL); sizeof(detachedHashContent), 1, &pMsgData, &size, NULL, NULL);
ok(ret, "CryptVerifyDetachedMessageHash failed: %08x\n", GetLastError()); ok(ret, "CryptVerifyDetachedMessageHash failed: %08lx\n", GetLastError());
/* while passing data to hash that isn't the content of the message fails. /* while passing data to hash that isn't the content of the message fails.
*/ */
size = sizeof(detachedHashContent); size = sizeof(detachedHashContent);
@@ -180,7 +154,7 @@ static void test_verify_detached_message_hash(void)
ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent, ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent,
sizeof(detachedHashContent), 1, &pMsgData, &size, NULL, NULL); sizeof(detachedHashContent), 1, &pMsgData, &size, NULL, NULL);
ok(!ret && GetLastError() == CRYPT_E_HASH_VALUE, ok(!ret && GetLastError() == CRYPT_E_HASH_VALUE,
"expected CRYPT_E_HASH_VALUE, got %08x\n", GetLastError()); "expected CRYPT_E_HASH_VALUE, got %08lx\n", GetLastError());
/* Getting the size of the hash while passing no hash data causes the /* Getting the size of the hash while passing no hash data causes the
* hash to be checked (and fail.) * hash to be checked (and fail.)
*/ */
@@ -188,23 +162,23 @@ static void test_verify_detached_message_hash(void)
ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent, ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent,
sizeof(detachedHashContent), 0, NULL, NULL, NULL, &hashSize); sizeof(detachedHashContent), 0, NULL, NULL, NULL, &hashSize);
ok(!ret && GetLastError() == CRYPT_E_HASH_VALUE, ok(!ret && GetLastError() == CRYPT_E_HASH_VALUE,
"expected CRYPT_E_HASH_VALUE, got %08x\n", GetLastError()); "expected CRYPT_E_HASH_VALUE, got %08lx\n", GetLastError());
size = sizeof(msgData); size = sizeof(msgData);
pMsgData = msgData; pMsgData = msgData;
ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent, ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent,
sizeof(detachedHashContent), 1, &pMsgData, &size, NULL, &hashSize); sizeof(detachedHashContent), 1, &pMsgData, &size, NULL, &hashSize);
ok(ret, "CryptVerifyDetachedMessageHash failed: %08x\n", GetLastError()); ok(ret, "CryptVerifyDetachedMessageHash failed: %08lx\n", GetLastError());
ok(hashSize == sizeof(hash), "unexpected size %d\n", hashSize); ok(hashSize == sizeof(hash), "unexpected size %ld\n", hashSize);
hashSize = 1; hashSize = 1;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent, ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent,
sizeof(detachedHashContent), 1, &pMsgData, &size, hash, &hashSize); sizeof(detachedHashContent), 1, &pMsgData, &size, hash, &hashSize);
ok(!ret && GetLastError() == ERROR_MORE_DATA, ok(!ret && GetLastError() == ERROR_MORE_DATA,
"expected ERROR_MORE_DATA, got %08x\n", GetLastError()); "expected ERROR_MORE_DATA, got %08lx\n", GetLastError());
hashSize = sizeof(hash); hashSize = sizeof(hash);
ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent, ret = CryptVerifyDetachedMessageHash(&para, detachedHashContent,
sizeof(detachedHashContent), 1, &pMsgData, &size, hash, &hashSize); sizeof(detachedHashContent), 1, &pMsgData, &size, hash, &hashSize);
ok(ret, "CryptVerifyDetachedMessageHash failed: %08x\n", GetLastError()); ok(ret, "CryptVerifyDetachedMessageHash failed: %08lx\n", GetLastError());
} }
static BYTE hashContent[] = { static BYTE hashContent[] = {
@@ -228,31 +202,30 @@ static void test_verify_message_hash(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageHash(&para, NULL, 0, NULL, NULL, NULL, NULL); ret = CryptVerifyMessageHash(&para, NULL, 0, NULL, NULL, NULL, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
para.cbSize = sizeof(para); para.cbSize = sizeof(para);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageHash(&para, NULL, 0, NULL, NULL, NULL, NULL); ret = CryptVerifyMessageHash(&para, NULL, 0, NULL, NULL, NULL, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
para.dwMsgEncodingType = PKCS_7_ASN_ENCODING; para.dwMsgEncodingType = PKCS_7_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageHash(&para, NULL, 0, NULL, NULL, NULL, NULL); ret = CryptVerifyMessageHash(&para, NULL, 0, NULL, NULL, NULL, NULL);
ok(!ret, "Expected 0, got %d\n", ret); ok(!ret, "Expected 0, got %d\n", ret);
ok(GetLastError() == CRYPT_E_ASN1_EOD || ok(GetLastError() == CRYPT_E_ASN1_EOD,
GetLastError() == OSS_BAD_ARG, /* win98 */ "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError());
"Expected CRYPT_E_ASN1_EOD or OSS_BAD_ARG, got %08x\n", GetLastError());
/* Verifying the hash of a detached message succeeds? */ /* Verifying the hash of a detached message succeeds? */
ret = CryptVerifyMessageHash(&para, detachedHashContent, ret = CryptVerifyMessageHash(&para, detachedHashContent,
sizeof(detachedHashContent), NULL, NULL, NULL, NULL); sizeof(detachedHashContent), NULL, NULL, NULL, NULL);
todo_wine todo_wine
ok(ret, "CryptVerifyMessageHash failed: %08x\n", GetLastError()); ok(ret, "CryptVerifyMessageHash failed: %08lx\n", GetLastError());
/* As does verifying the hash of a regular message. */ /* As does verifying the hash of a regular message. */
ret = CryptVerifyMessageHash(&para, hashContent, sizeof(hashContent), ret = CryptVerifyMessageHash(&para, hashContent, sizeof(hashContent),
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
ok(ret, "CryptVerifyMessageHash failed: %08x\n", GetLastError()); ok(ret, "CryptVerifyMessageHash failed: %08lx\n", GetLastError());
ret = CryptVerifyMessageHash(&para, hashContent, sizeof(hashContent), ret = CryptVerifyMessageHash(&para, hashContent, sizeof(hashContent),
NULL, &size, NULL, NULL); NULL, &size, NULL, NULL);
ok(ret, "CryptVerifyMessageHash failed: %08x\n", GetLastError()); ok(ret, "CryptVerifyMessageHash failed: %08lx\n", GetLastError());
if (ret) if (ret)
buf = CryptMemAlloc(size); buf = CryptMemAlloc(size);
if (buf) if (buf)
@@ -261,11 +234,11 @@ static void test_verify_message_hash(void)
ret = CryptVerifyMessageHash(&para, hashContent, sizeof(hashContent), ret = CryptVerifyMessageHash(&para, hashContent, sizeof(hashContent),
buf, &size, NULL, NULL); buf, &size, NULL, NULL);
ok(!ret && GetLastError() == ERROR_MORE_DATA, ok(!ret && GetLastError() == ERROR_MORE_DATA,
"expected ERROR_MORE_DATA, got %08x\n", GetLastError()); "expected ERROR_MORE_DATA, got %08lx\n", GetLastError());
ret = CryptVerifyMessageHash(&para, hashContent, sizeof(hashContent), ret = CryptVerifyMessageHash(&para, hashContent, sizeof(hashContent),
buf, &size, NULL, NULL); buf, &size, NULL, NULL);
ok(ret, "CryptVerifyMessageHash failed: %08x\n", GetLastError()); ok(ret, "CryptVerifyMessageHash failed: %08lx\n", GetLastError());
ok(size == sizeof(msgData), "unexpected size %d\n", size); ok(size == sizeof(msgData), "unexpected size %ld\n", size);
ok(!memcmp(buf, msgData, size), "unexpected value\n"); ok(!memcmp(buf, msgData, size), "unexpected value\n");
CryptMemFree(buf); CryptMemFree(buf);
} }
@@ -355,32 +328,31 @@ static void test_verify_detached_message_signature(void)
ret = CryptVerifyDetachedMessageSignature(NULL, 0, NULL, 0, 0, NULL, ret = CryptVerifyDetachedMessageSignature(NULL, 0, NULL, 0, 0, NULL,
NULL, NULL); NULL, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageSignature(&para, 0, NULL, 0, 0, NULL, ret = CryptVerifyDetachedMessageSignature(&para, 0, NULL, 0, 0, NULL,
NULL, NULL); NULL, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
para.cbSize = sizeof(para); para.cbSize = sizeof(para);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageSignature(&para, 0, NULL, 0, 0, NULL, ret = CryptVerifyDetachedMessageSignature(&para, 0, NULL, 0, 0, NULL,
NULL, NULL); NULL, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
para.dwMsgAndCertEncodingType = X509_ASN_ENCODING; para.dwMsgAndCertEncodingType = X509_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageSignature(&para, 0, NULL, 0, 0, NULL, ret = CryptVerifyDetachedMessageSignature(&para, 0, NULL, 0, 0, NULL,
NULL, NULL); NULL, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
para.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING; para.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageSignature(&para, 0, NULL, 0, 0, NULL, ret = CryptVerifyDetachedMessageSignature(&para, 0, NULL, 0, 0, NULL,
NULL, NULL); NULL, NULL);
ok(!ret, "Expected 0, got %d\n", ret); ok(!ret, "Expected 0, got %d\n", ret);
ok(GetLastError() == CRYPT_E_ASN1_EOD || ok(GetLastError() == CRYPT_E_ASN1_EOD,
GetLastError() == OSS_BAD_ARG, /* win98 */ "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError());
"Expected CRYPT_E_ASN1_EOD or OSS_BAD_ARG, got %08x\n", GetLastError());
/* None of these messages contains a cert in the message itself, so the /* None of these messages contains a cert in the message itself, so the
* default callback isn't able to verify their signature. * default callback isn't able to verify their signature.
*/ */
@@ -389,39 +361,33 @@ static void test_verify_detached_message_signature(void)
sizeof(signedWithCertContent), 0, NULL, NULL, NULL); sizeof(signedWithCertContent), 0, NULL, NULL, NULL);
ok(!ret, "Expected 0, got %d\n", ret); ok(!ret, "Expected 0, got %d\n", ret);
todo_wine todo_wine
ok(GetLastError() == CRYPT_E_NOT_FOUND || ok(GetLastError() == CRYPT_E_NOT_FOUND,
GetLastError() == OSS_DATA_ERROR, /* win98 */ "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
"Expected CRYPT_E_NOT_FOUND or OSS_DATA_ERROR, got %08x\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageSignature(&para, 0, signedContent, ret = CryptVerifyDetachedMessageSignature(&para, 0, signedContent,
sizeof(signedContent), 0, NULL, NULL, NULL); sizeof(signedContent), 0, NULL, NULL, NULL);
ok(!ret, "Expected 0, got %d\n", ret); ok(!ret, "Expected 0, got %d\n", ret);
ok(GetLastError() == CRYPT_E_NOT_FOUND || ok(GetLastError() == CRYPT_E_NOT_FOUND,
GetLastError() == OSS_DATA_ERROR, /* win98 */ "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
"Expected CRYPT_E_NOT_FOUND or OSS_DATA_ERROR, got %08x\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyDetachedMessageSignature(&para, 0, detachedSignedContent, ret = CryptVerifyDetachedMessageSignature(&para, 0, detachedSignedContent,
sizeof(detachedSignedContent), 0, NULL, NULL, NULL); sizeof(detachedSignedContent), 0, NULL, NULL, NULL);
ok(!ret, "Expected 0, got %d\n", ret); ok(!ret, "Expected 0, got %d\n", ret);
ok(GetLastError() == CRYPT_E_NOT_FOUND || ok(GetLastError() == CRYPT_E_NOT_FOUND,
GetLastError() == OSS_DATA_ERROR, /* win98 */ "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
"Expected CRYPT_E_NOT_FOUND or OSS_DATA_ERROR, got %08x\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
pContent = msgData; pContent = msgData;
cbContent = sizeof(msgData); cbContent = sizeof(msgData);
ret = CryptVerifyDetachedMessageSignature(&para, 0, detachedSignedContent, ret = CryptVerifyDetachedMessageSignature(&para, 0, detachedSignedContent,
sizeof(detachedSignedContent), 1, &pContent, &cbContent, NULL); sizeof(detachedSignedContent), 1, &pContent, &cbContent, NULL);
ok(!ret, "Expected 0, got %d\n", ret); ok(!ret, "Expected 0, got %d\n", ret);
ok(GetLastError() == CRYPT_E_NOT_FOUND || ok(GetLastError() == CRYPT_E_NOT_FOUND,
GetLastError() == OSS_DATA_ERROR, /* win98 */ "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
"Expected CRYPT_E_NOT_FOUND or OSS_DATA_ERROR, got %08x\n", GetLastError());
/* Passing the correct callback results in success */ /* Passing the correct callback results in success */
para.pfnGetSignerCertificate = msg_get_signer_callback; para.pfnGetSignerCertificate = msg_get_signer_callback;
ret = CryptVerifyDetachedMessageSignature(&para, 0, detachedSignedContent, ret = CryptVerifyDetachedMessageSignature(&para, 0, detachedSignedContent,
sizeof(detachedSignedContent), 1, &pContent, &cbContent, NULL); sizeof(detachedSignedContent), 1, &pContent, &cbContent, NULL);
ok(ret || ok(ret, "CryptVerifyDetachedMessageSignature failed: %08lx\n",
broken(!ret), /* win98 */
"CryptVerifyDetachedMessageSignature failed: %08x\n",
GetLastError()); GetLastError());
/* Not passing the correct data to be signed results in the signature not /* Not passing the correct data to be signed results in the signature not
* matching. * matching.
@@ -430,9 +396,8 @@ static void test_verify_detached_message_signature(void)
ret = CryptVerifyDetachedMessageSignature(&para, 0, detachedSignedContent, ret = CryptVerifyDetachedMessageSignature(&para, 0, detachedSignedContent,
sizeof(detachedSignedContent), 0, NULL, NULL, NULL); sizeof(detachedSignedContent), 0, NULL, NULL, NULL);
ok(!ret, "Expected 0, got %d\n", ret); ok(!ret, "Expected 0, got %d\n", ret);
ok(GetLastError() == NTE_BAD_SIGNATURE || ok(GetLastError() == NTE_BAD_SIGNATURE,
GetLastError() == OSS_DATA_ERROR, /* win98 */ "Expected NTE_BAD_SIGNATURE, got %08lx\n", GetLastError());
"Expected NTE_BAD_SIGNATURE or OSS_DATA_ERROR, got %08x\n", GetLastError());
} }
static const BYTE signedWithCertEmptyContent[] = { static const BYTE signedWithCertEmptyContent[] = {
@@ -510,86 +475,74 @@ static void test_verify_message_signature(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageSignature(NULL, 0, NULL, 0, NULL, 0, NULL); ret = CryptVerifyMessageSignature(NULL, 0, NULL, 0, NULL, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
/* Is cbDecoded set when invalid parameters are passed? */ /* Is cbDecoded set when invalid parameters are passed? */
cbDecoded = 0xdeadbeef; cbDecoded = 0xdeadbeef;
ret = CryptVerifyMessageSignature(NULL, 0, NULL, 0, NULL, &cbDecoded, ret = CryptVerifyMessageSignature(NULL, 0, NULL, 0, NULL, &cbDecoded,
NULL); NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
ok(cbDecoded == 0, "expected 0, got %08x\n", cbDecoded); ok(cbDecoded == 0, "expected 0, got %08lx\n", cbDecoded);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, 0, NULL); ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
para.cbSize = sizeof(para); para.cbSize = sizeof(para);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, 0, NULL); ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
para.cbSize = 0; para.cbSize = 0;
para.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING; para.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, 0, NULL); ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
para.cbSize = sizeof(para); para.cbSize = sizeof(para);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, 0, NULL); ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, 0, NULL);
ok(!ret && ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD,
(GetLastError() == CRYPT_E_ASN1_EOD || "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError());
GetLastError() == OSS_BAD_ARG), /* win9x */
"Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
/* Check whether cert is set on error */ /* Check whether cert is set on error */
cert = (PCCERT_CONTEXT)0xdeadbeef; cert = (PCCERT_CONTEXT)0xdeadbeef;
ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, 0, &cert); ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, 0, &cert);
ok(!ret && (GetLastError() == CRYPT_E_ASN1_EOD || ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD,
GetLastError() == OSS_BAD_ARG /* NT40 */), "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError());
"Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
ok(cert == NULL, "Expected NULL cert\n"); ok(cert == NULL, "Expected NULL cert\n");
/* Check whether cbDecoded is set on error */ /* Check whether cbDecoded is set on error */
cbDecoded = 0xdeadbeef; cbDecoded = 0xdeadbeef;
ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, &cbDecoded, ret = CryptVerifyMessageSignature(&para, 0, NULL, 0, NULL, &cbDecoded,
NULL); NULL);
ok(!ret && (GetLastError() == CRYPT_E_ASN1_EOD || ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD,
GetLastError() == OSS_BAD_ARG /* NT40 */), "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError());
"Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
ok(!cbDecoded, "Expected 0\n"); ok(!cbDecoded, "Expected 0\n");
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageSignature(&para, 0, dataEmptyBareContent, ret = CryptVerifyMessageSignature(&para, 0, dataEmptyBareContent,
sizeof(dataEmptyBareContent), NULL, 0, NULL); sizeof(dataEmptyBareContent), NULL, 0, NULL);
ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG,
GetLastError() == OSS_PDU_MISMATCH /* NT40 */), "Expected CRYPT_E_ASN1_BADTAG, got %08lx\n", GetLastError());
"Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); ok(GetLastError() == CRYPT_E_ASN1_BADTAG,
ok(GetLastError() == CRYPT_E_ASN1_BADTAG || "Expected CRYPT_E_ASN1_BADTAG, got %08lx\n", GetLastError());
GetLastError() == OSS_PDU_MISMATCH, /* win9x */
"Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageSignature(&para, 0, dataEmptyContent, ret = CryptVerifyMessageSignature(&para, 0, dataEmptyContent,
sizeof(dataEmptyContent), NULL, 0, NULL); sizeof(dataEmptyContent), NULL, 0, NULL);
ok(!ret && GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE, ok(!ret && GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE,
"Expected CRYPT_E_UNEXPECTED_MSG_TYPE, got %08x\n", GetLastError()); "Expected CRYPT_E_UNEXPECTED_MSG_TYPE, got %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageSignature(&para, 0, signedEmptyBareContent, ret = CryptVerifyMessageSignature(&para, 0, signedEmptyBareContent,
sizeof(signedEmptyBareContent), NULL, 0, NULL); sizeof(signedEmptyBareContent), NULL, 0, NULL);
ok(!ret && ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG,
(GetLastError() == CRYPT_E_ASN1_BADTAG || "Expected CRYPT_E_ASN1_BADTAG, got %08lx\n", GetLastError());
GetLastError() == OSS_DATA_ERROR), /* win9x */
"Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageSignature(&para, 0, signedEmptyContent, ret = CryptVerifyMessageSignature(&para, 0, signedEmptyContent,
sizeof(signedEmptyContent), NULL, 0, NULL); sizeof(signedEmptyContent), NULL, 0, NULL);
ok(!ret && ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND,
(GetLastError() == CRYPT_E_NOT_FOUND || "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
GetLastError() == OSS_DATA_ERROR), /* win9x */
"Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptVerifyMessageSignature(&para, 0, signedContent, ret = CryptVerifyMessageSignature(&para, 0, signedContent,
sizeof(signedContent), NULL, 0, NULL); sizeof(signedContent), NULL, 0, NULL);
ok(!ret && ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND,
(GetLastError() == CRYPT_E_NOT_FOUND || "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
GetLastError() == OSS_DATA_ERROR), /* win9x */
"Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError());
/* FIXME: Windows fails with CRYPT_E_NOT_FOUND for these messages, but /* FIXME: Windows fails with CRYPT_E_NOT_FOUND for these messages, but
* their signer certs have invalid public keys that fail to decode. In * their signer certs have invalid public keys that fail to decode. In
* Wine therefore the failure is an ASN error. Need some messages with * Wine therefore the failure is an ASN error. Need some messages with
@@ -616,22 +569,22 @@ static void test_verify_message_signature(void)
ret = CryptVerifyMessageSignature(&para, 0, ret = CryptVerifyMessageSignature(&para, 0,
signedWithCertWithValidPubKeyContent, signedWithCertWithValidPubKeyContent,
sizeof(signedWithCertWithValidPubKeyContent), NULL, &cbDecoded, NULL); sizeof(signedWithCertWithValidPubKeyContent), NULL, &cbDecoded, NULL);
ok(ret, "CryptVerifyMessageSignature failed: %08x\n", GetLastError()); ok(ret, "CryptVerifyMessageSignature failed: %08lx\n", GetLastError());
ok(cbDecoded == sizeof(msgData), "expected 4, got %d\n", cbDecoded); ok(cbDecoded == sizeof(msgData), "expected 4, got %ld\n", cbDecoded);
cbDecoded = 0; cbDecoded = 0;
ret = CryptVerifyMessageSignature(&para, 0, ret = CryptVerifyMessageSignature(&para, 0,
signedWithCertWithValidPubKeyContent, signedWithCertWithValidPubKeyContent,
sizeof(signedWithCertWithValidPubKeyContent), NULL, &cbDecoded, NULL); sizeof(signedWithCertWithValidPubKeyContent), NULL, &cbDecoded, NULL);
/* Setting cbDecoded to 0 succeeds when a NULL buffer is provided */ /* Setting cbDecoded to 0 succeeds when a NULL buffer is provided */
ok(ret, "CryptVerifyMessageSignature failed: %08x\n", GetLastError()); ok(ret, "CryptVerifyMessageSignature failed: %08lx\n", GetLastError());
ok(cbDecoded == sizeof(msgData), "expected 4, got %d\n", cbDecoded); ok(cbDecoded == sizeof(msgData), "expected 4, got %ld\n", cbDecoded);
cbDecoded = 0; cbDecoded = 0;
ret = CryptVerifyMessageSignature(&para, 0, ret = CryptVerifyMessageSignature(&para, 0,
signedWithCertWithValidPubKeyContent, signedWithCertWithValidPubKeyContent,
sizeof(signedWithCertWithValidPubKeyContent), decoded, &cbDecoded, NULL); sizeof(signedWithCertWithValidPubKeyContent), decoded, &cbDecoded, NULL);
/* When a non-NULL buffer is provided, cbDecoded must not be too small */ /* When a non-NULL buffer is provided, cbDecoded must not be too small */
ok(!ret && GetLastError() == ERROR_MORE_DATA, ok(!ret && GetLastError() == ERROR_MORE_DATA,
"expected ERROR_MORE_DATA, got %d (%08x)\n", GetLastError(), "expected ERROR_MORE_DATA, got %ld (%08lx)\n", GetLastError(),
GetLastError()); GetLastError());
} }
@@ -670,38 +623,38 @@ static void test_hash_message(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, FALSE, 0, NULL, NULL, NULL, NULL, NULL, NULL); ret = CryptHashMessage(&para, FALSE, 0, NULL, NULL, NULL, NULL, NULL, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got 0x%08x\n", GetLastError()); "expected E_INVALIDARG, got 0x%08lx\n", GetLastError());
para.cbSize = sizeof(para); para.cbSize = sizeof(para);
/* Not quite sure what "success" means in this case, but it does succeed */ /* Not quite sure what "success" means in this case, but it does succeed */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, FALSE, 0, NULL, NULL, NULL, NULL, NULL, NULL); ret = CryptHashMessage(&para, FALSE, 0, NULL, NULL, NULL, NULL, NULL, NULL);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
/* With a bogus encoding type it "succeeds" */ /* With a bogus encoding type it "succeeds" */
para.dwMsgEncodingType = 0xdeadbeef; para.dwMsgEncodingType = 0xdeadbeef;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, FALSE, 0, NULL, NULL, NULL, NULL, NULL, NULL); ret = CryptHashMessage(&para, FALSE, 0, NULL, NULL, NULL, NULL, NULL, NULL);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
/* According to MSDN, the third parameter (cToBeHashed) must be 1 if the /* According to MSDN, the third parameter (cToBeHashed) must be 1 if the
* second parameter (fDetached) is FALSE, but again it "succeeds." * second parameter (fDetached) is FALSE, but again it "succeeds."
*/ */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, FALSE, 2, NULL, NULL, NULL, NULL, NULL, NULL); ret = CryptHashMessage(&para, FALSE, 2, NULL, NULL, NULL, NULL, NULL, NULL);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
/* Even passing parameters to hash results in "success." */ /* Even passing parameters to hash results in "success." */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, FALSE, 2, toHash, hashSize, NULL, NULL, NULL, ret = CryptHashMessage(&para, FALSE, 2, toHash, hashSize, NULL, NULL, NULL,
NULL); NULL);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
/* Try again with a valid encoding type */ /* Try again with a valid encoding type */
para.dwMsgEncodingType = PKCS_7_ASN_ENCODING; para.dwMsgEncodingType = PKCS_7_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, FALSE, 2, NULL, NULL, NULL, NULL, NULL, NULL); ret = CryptHashMessage(&para, FALSE, 2, NULL, NULL, NULL, NULL, NULL, NULL);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
/* And with valid data to hash */ /* And with valid data to hash */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, FALSE, 2, toHash, hashSize, NULL, NULL, NULL, ret = CryptHashMessage(&para, FALSE, 2, toHash, hashSize, NULL, NULL, NULL,
NULL); NULL);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
/* But requesting the size of the hashed blob and indicating there's data /* But requesting the size of the hashed blob and indicating there's data
* to hash results in a crash * to hash results in a crash
*/ */
@@ -719,7 +672,7 @@ static void test_hash_message(void)
ok(!ret && ok(!ret &&
(GetLastError() == CRYPT_E_UNKNOWN_ALGO || (GetLastError() == CRYPT_E_UNKNOWN_ALGO ||
GetLastError() == CRYPT_E_OID_FORMAT), /* Vista */ GetLastError() == CRYPT_E_OID_FORMAT), /* Vista */
"expected CRYPT_E_UNKNOWN_ALGO or CRYPT_E_OID_FORMAT, got 0x%08x (%d)\n", "expected CRYPT_E_UNKNOWN_ALGO or CRYPT_E_OID_FORMAT, got 0x%08lx (%ld)\n",
GetLastError(), GetLastError()); GetLastError(), GetLastError());
para.HashAlgorithm.pszObjId = oid_rsa_md5; para.HashAlgorithm.pszObjId = oid_rsa_md5;
/* With a valid hash algorithm, this succeeds, even though fDetached is /* With a valid hash algorithm, this succeeds, even though fDetached is
@@ -729,55 +682,55 @@ static void test_hash_message(void)
ret = CryptHashMessage(&para, FALSE, 2, toHash, hashSize, NULL, ret = CryptHashMessage(&para, FALSE, 2, toHash, hashSize, NULL,
&hashedBlobSize, NULL, NULL); &hashedBlobSize, NULL, NULL);
todo_wine todo_wine
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
if (ret) if (ret)
{ {
/* Actually attempting to get the hashed data fails, perhaps because /* Actually attempting to get the hashed data fails, perhaps because
* detached is FALSE. * detached is FALSE.
*/ */
hashedBlob = HeapAlloc(GetProcessHeap(), 0, hashedBlobSize); hashedBlob = malloc(hashedBlobSize);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, FALSE, 2, toHash, hashSize, hashedBlob, ret = CryptHashMessage(&para, FALSE, 2, toHash, hashSize, hashedBlob,
&hashedBlobSize, NULL, NULL); &hashedBlobSize, NULL, NULL);
ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR,
"expected CRYPT_E_MSG_ERROR, got 0x%08x (%d)\n", GetLastError(), "expected CRYPT_E_MSG_ERROR, got 0x%08lx (%ld)\n", GetLastError(),
GetLastError()); GetLastError());
HeapFree(GetProcessHeap(), 0, hashedBlob); free(hashedBlob);
} }
/* Repeating tests with fDetached = TRUE results in success */ /* Repeating tests with fDetached = TRUE results in success */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, TRUE, 2, toHash, hashSize, NULL, ret = CryptHashMessage(&para, TRUE, 2, toHash, hashSize, NULL,
&hashedBlobSize, NULL, NULL); &hashedBlobSize, NULL, NULL);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
if (ret) if (ret)
{ {
hashedBlob = HeapAlloc(GetProcessHeap(), 0, hashedBlobSize); hashedBlob = malloc(hashedBlobSize);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, TRUE, 2, toHash, hashSize, hashedBlob, ret = CryptHashMessage(&para, TRUE, 2, toHash, hashSize, hashedBlob,
&hashedBlobSize, NULL, NULL); &hashedBlobSize, NULL, NULL);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
ok(hashedBlobSize == sizeof(detachedHashBlob), ok(hashedBlobSize == sizeof(detachedHashBlob),
"unexpected size of detached blob %d\n", hashedBlobSize); "unexpected size of detached blob %ld\n", hashedBlobSize);
ok(!memcmp(hashedBlob, detachedHashBlob, hashedBlobSize), ok(!memcmp(hashedBlob, detachedHashBlob, hashedBlobSize),
"unexpected detached blob value\n"); "unexpected detached blob value\n");
HeapFree(GetProcessHeap(), 0, hashedBlob); free(hashedBlob);
} }
/* Hashing a single item with fDetached = FALSE also succeeds */ /* Hashing a single item with fDetached = FALSE also succeeds */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, FALSE, 1, toHash, hashSize, NULL, ret = CryptHashMessage(&para, FALSE, 1, toHash, hashSize, NULL,
&hashedBlobSize, NULL, NULL); &hashedBlobSize, NULL, NULL);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
if (ret) if (ret)
{ {
hashedBlob = HeapAlloc(GetProcessHeap(), 0, hashedBlobSize); hashedBlob = malloc(hashedBlobSize);
ret = CryptHashMessage(&para, FALSE, 1, toHash, hashSize, hashedBlob, ret = CryptHashMessage(&para, FALSE, 1, toHash, hashSize, hashedBlob,
&hashedBlobSize, NULL, NULL); &hashedBlobSize, NULL, NULL);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
ok(hashedBlobSize == sizeof(hashBlob), ok(hashedBlobSize == sizeof(hashBlob),
"unexpected size of detached blob %d\n", hashedBlobSize); "unexpected size of detached blob %ld\n", hashedBlobSize);
ok(!memcmp(hashedBlob, hashBlob, hashedBlobSize), ok(!memcmp(hashedBlob, hashBlob, hashedBlobSize),
"unexpected detached blob value\n"); "unexpected detached blob value\n");
HeapFree(GetProcessHeap(), 0, hashedBlob); free(hashedBlob);
} }
/* Check the computed hash value too. You don't need to get the encoded /* Check the computed hash value too. You don't need to get the encoded
* blob to get it. * blob to get it.
@@ -785,21 +738,21 @@ static void test_hash_message(void)
computedHashSize = 0xdeadbeef; computedHashSize = 0xdeadbeef;
ret = CryptHashMessage(&para, TRUE, 2, toHash, hashSize, NULL, ret = CryptHashMessage(&para, TRUE, 2, toHash, hashSize, NULL,
&hashedBlobSize, NULL, &computedHashSize); &hashedBlobSize, NULL, &computedHashSize);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
ok(computedHashSize == 16, "expected hash size of 16, got %d\n", ok(computedHashSize == 16, "expected hash size of 16, got %ld\n",
computedHashSize); computedHashSize);
if (ret) if (ret)
{ {
computedHash = HeapAlloc(GetProcessHeap(), 0, computedHashSize); computedHash = malloc(computedHashSize);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptHashMessage(&para, TRUE, 2, toHash, hashSize, NULL, ret = CryptHashMessage(&para, TRUE, 2, toHash, hashSize, NULL,
&hashedBlobSize, computedHash, &computedHashSize); &hashedBlobSize, computedHash, &computedHashSize);
ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError());
ok(computedHashSize == sizeof(hashVal), ok(computedHashSize == sizeof(hashVal),
"unexpected size of hash value %d\n", computedHashSize); "unexpected size of hash value %ld\n", computedHashSize);
ok(!memcmp(computedHash, hashVal, computedHashSize), ok(!memcmp(computedHash, hashVal, computedHashSize),
"unexpected value\n"); "unexpected value\n");
HeapFree(GetProcessHeap(), 0, computedHash); free(computedHash);
} }
} }
@@ -1013,7 +966,7 @@ static void test_sign_message(void)
ok(!ret && ok(!ret &&
(GetLastError() == E_INVALIDARG || (GetLastError() == E_INVALIDARG ||
GetLastError() == ERROR_ARITHMETIC_OVERFLOW), /* Win7 */ GetLastError() == ERROR_ARITHMETIC_OVERFLOW), /* Win7 */
"expected E_INVALIDARG or ERROR_ARITHMETIC_OVERFLOW, got %08x\n", "expected E_INVALIDARG or ERROR_ARITHMETIC_OVERFLOW, got %08lx\n",
GetLastError()); GetLastError());
para.cbSize = sizeof(para); para.cbSize = sizeof(para);
para.dwMsgEncodingType = X509_ASN_ENCODING; para.dwMsgEncodingType = X509_ASN_ENCODING;
@@ -1021,37 +974,30 @@ static void test_sign_message(void)
signedBlobSize = 255; signedBlobSize = 255;
ret = CryptSignMessage(&para, FALSE, 0, NULL, NULL, NULL, &signedBlobSize); ret = CryptSignMessage(&para, FALSE, 0, NULL, NULL, NULL, &signedBlobSize);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
ok(!signedBlobSize, "unexpected size %d\n", signedBlobSize); ok(!signedBlobSize, "unexpected size %ld\n", signedBlobSize);
para.dwMsgEncodingType = PKCS_7_ASN_ENCODING; para.dwMsgEncodingType = PKCS_7_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
signedBlobSize = 0; signedBlobSize = 0;
ret = CryptSignMessage(&para, FALSE, 0, NULL, NULL, NULL, &signedBlobSize); ret = CryptSignMessage(&para, FALSE, 0, NULL, NULL, NULL, &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
todo_wine todo_wine
ok(signedBlobSize, "bad size\n"); ok(signedBlobSize, "bad size\n");
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, ret = CryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT); CRYPT_VERIFYCONTEXT);
ok(ret, "CryptAcquireContextA failed: %08x\n", GetLastError()); ok(ret, "CryptAcquireContextA failed: %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptImportKey(hCryptProv, publicPrivateKeyPair, ret = CryptImportKey(hCryptProv, publicPrivateKeyPair,
sizeof(publicPrivateKeyPair), 0, 0, &hKey); sizeof(publicPrivateKeyPair), 0, 0, &hKey);
if (!ret && GetLastError() == NTE_PERM) /* Win9x */ ok(ret, "CryptImportKey failed: %08lx\n", GetLastError());
{
skip("Failed to import a key\n");
if (hCryptProv)
CryptReleaseContext(hCryptProv, 0);
return;
}
ok(ret, "CryptImportKey failed: %08x\n", GetLastError());
para.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING; para.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
para.pSigningCert = CertCreateCertificateContext(X509_ASN_ENCODING | para.pSigningCert = CertCreateCertificateContext(X509_ASN_ENCODING |
PKCS_7_ASN_ENCODING, cert1, sizeof(cert1)); PKCS_7_ASN_ENCODING, cert1, sizeof(cert1));
ok(para.pSigningCert != NULL, "CertCreateCertificateContext failed: %08x\n", ok(para.pSigningCert != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
para.HashAlgorithm.pszObjId = oid_rsa_md5; para.HashAlgorithm.pszObjId = oid_rsa_md5;
@@ -1062,21 +1008,21 @@ static void test_sign_message(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CertSetCertificateContextProperty(para.pSigningCert, ret = CertSetCertificateContextProperty(para.pSigningCert,
CERT_KEY_CONTEXT_PROP_ID, 0, &keyContext); CERT_KEY_CONTEXT_PROP_ID, 0, &keyContext);
ok(ret, "CertSetCertificateContextProperty failed: %08x\n", GetLastError()); ok(ret, "CertSetCertificateContextProperty failed: %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
signedBlobSize = 0; signedBlobSize = 0;
ret = CryptSignMessage(&para, TRUE, 0, NULL, NULL, NULL, &signedBlobSize); ret = CryptSignMessage(&para, TRUE, 0, NULL, NULL, NULL, &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
signedBlob = CryptMemAlloc(signedBlobSize); signedBlob = CryptMemAlloc(signedBlobSize);
if (signedBlob) if (signedBlob)
{ {
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSignMessage(&para, TRUE, 0, NULL, NULL, signedBlob, ret = CryptSignMessage(&para, TRUE, 0, NULL, NULL, signedBlob,
&signedBlobSize); &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
ok(signedBlobSize == sizeof(signedHashForEmptyMessage), ok(signedBlobSize == sizeof(signedHashForEmptyMessage),
"unexpected size %d\n", signedBlobSize); "unexpected size %ld\n", signedBlobSize);
ok(!memcmp(signedBlob, signedHashForEmptyMessage, signedBlobSize), ok(!memcmp(signedBlob, signedHashForEmptyMessage, signedBlobSize),
"unexpected value\n"); "unexpected value\n");
CryptMemFree(signedBlob); CryptMemFree(signedBlob);
@@ -1085,15 +1031,15 @@ static void test_sign_message(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
signedBlobSize = 0; signedBlobSize = 0;
ret = CryptSignMessage(&para, FALSE, 0, NULL, NULL, NULL, &signedBlobSize); ret = CryptSignMessage(&para, FALSE, 0, NULL, NULL, NULL, &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
signedBlob = CryptMemAlloc(signedBlobSize); signedBlob = CryptMemAlloc(signedBlobSize);
if (signedBlob) if (signedBlob)
{ {
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSignMessage(&para, FALSE, 0, NULL, NULL, signedBlob, ret = CryptSignMessage(&para, FALSE, 0, NULL, NULL, signedBlob,
&signedBlobSize); &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
ok(signedBlobSize == sizeof(signedEmptyMessage), "unexpected size %d\n", ok(signedBlobSize == sizeof(signedEmptyMessage), "unexpected size %ld\n",
signedBlobSize); signedBlobSize);
ok(!memcmp(signedBlob, signedEmptyMessage, signedBlobSize), ok(!memcmp(signedBlob, signedEmptyMessage, signedBlobSize),
"unexpected value\n"); "unexpected value\n");
@@ -1104,16 +1050,16 @@ static void test_sign_message(void)
signedBlobSize = 0; signedBlobSize = 0;
ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, NULL, ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, NULL,
&signedBlobSize); &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
signedBlob = CryptMemAlloc(signedBlobSize); signedBlob = CryptMemAlloc(signedBlobSize);
if (signedBlob) if (signedBlob)
{ {
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, signedBlob, ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, signedBlob,
&signedBlobSize); &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
ok(signedBlobSize == sizeof(signedHash), ok(signedBlobSize == sizeof(signedHash),
"unexpected size of signed blob %d\n", signedBlobSize); "unexpected size of signed blob %ld\n", signedBlobSize);
ok(!memcmp(signedBlob, signedHash, signedBlobSize), ok(!memcmp(signedBlob, signedHash, signedBlobSize),
"unexpected value\n"); "unexpected value\n");
CryptMemFree(signedBlob); CryptMemFree(signedBlob);
@@ -1126,16 +1072,16 @@ static void test_sign_message(void)
signedBlobSize = 0; signedBlobSize = 0;
ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, NULL, ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, NULL,
&signedBlobSize); &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
signedBlob = CryptMemAlloc(signedBlobSize); signedBlob = CryptMemAlloc(signedBlobSize);
if (signedBlob) if (signedBlob)
{ {
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, signedBlob, ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, signedBlob,
&signedBlobSize); &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
ok(signedBlobSize == sizeof(signedHashWithCert), ok(signedBlobSize == sizeof(signedHashWithCert),
"unexpected size of signed blob %d\n", signedBlobSize); "unexpected size of signed blob %ld\n", signedBlobSize);
ok(!memcmp(signedBlob, signedHashWithCert, signedBlobSize), ok(!memcmp(signedBlob, signedHashWithCert, signedBlobSize),
"unexpected value\n"); "unexpected value\n");
CryptMemFree(signedBlob); CryptMemFree(signedBlob);
@@ -1147,7 +1093,7 @@ static void test_sign_message(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
crlContext = CertCreateCRLContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, crlContext = CertCreateCRLContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
crl, sizeof(crl)); crl, sizeof(crl));
ok(crlContext != NULL, "CertCreateCRLContext failed: %08x\n", ok(crlContext != NULL, "CertCreateCRLContext failed: %08lx\n",
GetLastError()); GetLastError());
para.rgpMsgCrl = &crlContext; para.rgpMsgCrl = &crlContext;
@@ -1155,16 +1101,16 @@ static void test_sign_message(void)
signedBlobSize = 0; signedBlobSize = 0;
ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, NULL, ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, NULL,
&signedBlobSize); &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
signedBlob = CryptMemAlloc(signedBlobSize); signedBlob = CryptMemAlloc(signedBlobSize);
if (signedBlob) if (signedBlob)
{ {
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, signedBlob, ret = CryptSignMessage(&para, TRUE, 2, toSign, signSize, signedBlob,
&signedBlobSize); &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
ok(signedBlobSize == sizeof(signedHashWithCRL), ok(signedBlobSize == sizeof(signedHashWithCRL),
"unexpected size of signed blob %d\n", signedBlobSize); "unexpected size of signed blob %ld\n", signedBlobSize);
ok(!memcmp(signedBlob, signedHashWithCRL, signedBlobSize), ok(!memcmp(signedBlob, signedHashWithCRL, signedBlobSize),
"unexpected value\n"); "unexpected value\n");
CryptMemFree(signedBlob); CryptMemFree(signedBlob);
@@ -1178,16 +1124,16 @@ static void test_sign_message(void)
signedBlobSize = 0; signedBlobSize = 0;
ret = CryptSignMessage(&para, FALSE, 1, toSign, signSize, NULL, ret = CryptSignMessage(&para, FALSE, 1, toSign, signSize, NULL,
&signedBlobSize); &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
signedBlob = CryptMemAlloc(signedBlobSize); signedBlob = CryptMemAlloc(signedBlobSize);
if (signedBlob) if (signedBlob)
{ {
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSignMessage(&para, FALSE, 1, toSign, signSize, signedBlob, ret = CryptSignMessage(&para, FALSE, 1, toSign, signSize, signedBlob,
&signedBlobSize); &signedBlobSize);
ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); ok(ret, "CryptSignMessage failed: %08lx\n", GetLastError());
ok(signedBlobSize == sizeof(signedData), ok(signedBlobSize == sizeof(signedData),
"unexpected size of signed blob %d\n", signedBlobSize); "unexpected size of signed blob %ld\n", signedBlobSize);
ok(!memcmp(signedBlob, signedData, signedBlobSize), ok(!memcmp(signedBlob, signedData, signedBlobSize),
"unexpected value\n"); "unexpected value\n");
CryptMemFree(signedBlob); CryptMemFree(signedBlob);
@@ -1219,19 +1165,19 @@ static void test_encrypt_message(void)
DWORD encryptedBlobSize; DWORD encryptedBlobSize;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, ret = CryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT); CRYPT_VERIFYCONTEXT);
ok(ret, "CryptAcquireContextA failed: %08x\n", GetLastError()); ok(ret, "CryptAcquireContextA failed: %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
certs[0] = CertCreateCertificateContext(X509_ASN_ENCODING | certs[0] = CertCreateCertificateContext(X509_ASN_ENCODING |
PKCS_7_ASN_ENCODING, cert1, sizeof(cert1)); PKCS_7_ASN_ENCODING, cert1, sizeof(cert1));
ok(certs[0] != NULL, "CertCreateCertificateContext failed: %08x\n", ok(certs[0] != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
certs[1] = CertCreateCertificateContext(X509_ASN_ENCODING | certs[1] = CertCreateCertificateContext(X509_ASN_ENCODING |
PKCS_7_ASN_ENCODING, cert2, sizeof(cert2)); PKCS_7_ASN_ENCODING, cert2, sizeof(cert2));
ok(certs[1] != NULL, "CertCreateCertificateContext failed: %08x\n", ok(certs[1] != NULL, "CertCreateCertificateContext failed: %08lx\n",
GetLastError()); GetLastError());
memset(&para, 0, sizeof(para)); memset(&para, 0, sizeof(para));
@@ -1240,8 +1186,8 @@ static void test_encrypt_message(void)
ret = CryptEncryptMessage(&para, 0, NULL, NULL, 0, NULL, ret = CryptEncryptMessage(&para, 0, NULL, NULL, 0, NULL,
&encryptedBlobSize); &encryptedBlobSize);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
ok(!encryptedBlobSize, "unexpected size %d\n", encryptedBlobSize); ok(!encryptedBlobSize, "unexpected size %ld\n", encryptedBlobSize);
para.cbSize = sizeof(para); para.cbSize = sizeof(para);
para.dwMsgEncodingType = X509_ASN_ENCODING; para.dwMsgEncodingType = X509_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
@@ -1249,19 +1195,17 @@ static void test_encrypt_message(void)
ret = CryptEncryptMessage(&para, 0, NULL, NULL, 0, NULL, ret = CryptEncryptMessage(&para, 0, NULL, NULL, 0, NULL,
&encryptedBlobSize); &encryptedBlobSize);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
ok(!encryptedBlobSize, "unexpected size %d\n", encryptedBlobSize); ok(!encryptedBlobSize, "unexpected size %ld\n", encryptedBlobSize);
para.dwMsgEncodingType = PKCS_7_ASN_ENCODING; para.dwMsgEncodingType = PKCS_7_ASN_ENCODING;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
encryptedBlobSize = 255; encryptedBlobSize = 255;
ret = CryptEncryptMessage(&para, 0, NULL, NULL, 0, NULL, ret = CryptEncryptMessage(&para, 0, NULL, NULL, 0, NULL,
&encryptedBlobSize); &encryptedBlobSize);
ok(!ret && ok(!ret && GetLastError() == CRYPT_E_UNKNOWN_ALGO,
(GetLastError() == CRYPT_E_UNKNOWN_ALGO || "expected CRYPT_E_UNKNOWN_ALGO or E_INVALIDARG, got %08lx\n",
GetLastError() == E_INVALIDARG), /* Win9x */
"expected CRYPT_E_UNKNOWN_ALGO or E_INVALIDARG, got %08x\n",
GetLastError()); GetLastError());
ok(!encryptedBlobSize, "unexpected size %d\n", encryptedBlobSize); ok(!encryptedBlobSize, "unexpected size %ld\n", encryptedBlobSize);
para.hCryptProv = hCryptProv; para.hCryptProv = hCryptProv;
para.ContentEncryptionAlgorithm.pszObjId = oid_rsa_rc4; para.ContentEncryptionAlgorithm.pszObjId = oid_rsa_rc4;
@@ -1270,9 +1214,7 @@ static void test_encrypt_message(void)
encryptedBlobSize = 0; encryptedBlobSize = 0;
ret = CryptEncryptMessage(&para, 0, NULL, NULL, 0, NULL, ret = CryptEncryptMessage(&para, 0, NULL, NULL, 0, NULL,
&encryptedBlobSize); &encryptedBlobSize);
ok(ret || ok(ret, "CryptEncryptMessage failed: %08lx\n", GetLastError());
broken(!ret) /* Win9x */,
"CryptEncryptMessage failed: %08x\n", GetLastError());
if (ret) if (ret)
{ {
encryptedBlob = CryptMemAlloc(encryptedBlobSize); encryptedBlob = CryptMemAlloc(encryptedBlobSize);
@@ -1281,9 +1223,9 @@ static void test_encrypt_message(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptEncryptMessage(&para, 0, NULL, NULL, 0, encryptedBlob, ret = CryptEncryptMessage(&para, 0, NULL, NULL, 0, encryptedBlob,
&encryptedBlobSize); &encryptedBlobSize);
ok(ret, "CryptEncryptMessage failed: %08x\n", GetLastError()); ok(ret, "CryptEncryptMessage failed: %08lx\n", GetLastError());
ok(encryptedBlobSize == sizeof(encryptedMessage), ok(encryptedBlobSize == sizeof(encryptedMessage),
"unexpected size of encrypted blob %d\n", encryptedBlobSize); "unexpected size of encrypted blob %ld\n", encryptedBlobSize);
ok(!memcmp(encryptedBlob, encryptedMessage, encryptedBlobSize), ok(!memcmp(encryptedBlob, encryptedMessage, encryptedBlobSize),
"unexpected value\n"); "unexpected value\n");
CryptMemFree(encryptedBlob); CryptMemFree(encryptedBlob);
@@ -1294,7 +1236,7 @@ static void test_encrypt_message(void)
encryptedBlobSize = 0; encryptedBlobSize = 0;
ret = CryptEncryptMessage(&para, 2, certs, NULL, 0, NULL, ret = CryptEncryptMessage(&para, 2, certs, NULL, 0, NULL,
&encryptedBlobSize); &encryptedBlobSize);
ok(ret, "CryptEncryptMessage failed: %08x\n", GetLastError()); ok(ret, "CryptEncryptMessage failed: %08lx\n", GetLastError());
if (ret) if (ret)
{ {
encryptedBlob = CryptMemAlloc(encryptedBlobSize); encryptedBlob = CryptMemAlloc(encryptedBlobSize);
@@ -1303,7 +1245,7 @@ static void test_encrypt_message(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptEncryptMessage(&para, 2, certs, NULL, 0, encryptedBlob, ret = CryptEncryptMessage(&para, 2, certs, NULL, 0, encryptedBlob,
&encryptedBlobSize); &encryptedBlobSize);
ok(ret, "CryptEncryptMessage failed: %08x\n", GetLastError()); ok(ret, "CryptEncryptMessage failed: %08lx\n", GetLastError());
CryptMemFree(encryptedBlob); CryptMemFree(encryptedBlob);
} }
} }
@@ -1312,9 +1254,7 @@ static void test_encrypt_message(void)
encryptedBlobSize = 0; encryptedBlobSize = 0;
ret = CryptEncryptMessage(&para, 0, NULL, blob, sizeof(blob), NULL, ret = CryptEncryptMessage(&para, 0, NULL, blob, sizeof(blob), NULL,
&encryptedBlobSize); &encryptedBlobSize);
ok(ret || ok(ret, "CryptEncryptMessage failed: %08lx\n", GetLastError());
broken(!ret) /* Win9x */,
"CryptEncryptMessage failed: %08x\n", GetLastError());
if (ret) if (ret)
{ {
encryptedBlob = CryptMemAlloc(encryptedBlobSize); encryptedBlob = CryptMemAlloc(encryptedBlobSize);
@@ -1323,13 +1263,11 @@ static void test_encrypt_message(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptEncryptMessage(&para, 0, NULL, blob, sizeof(blob), ret = CryptEncryptMessage(&para, 0, NULL, blob, sizeof(blob),
encryptedBlob, &encryptedBlobSize); encryptedBlob, &encryptedBlobSize);
ok(ret || ok(ret, "CryptEncryptMessage failed: %08lx\n", GetLastError());
broken(!ret && GetLastError() == NTE_PERM), /* some NT4 */
"CryptEncryptMessage failed: %08x\n", GetLastError());
if (ret) if (ret)
{ {
ok(encryptedBlobSize == 55, ok(encryptedBlobSize == 55,
"unexpected size of encrypted blob %d\n", encryptedBlobSize); "unexpected size of encrypted blob %ld\n", encryptedBlobSize);
} }
CryptMemFree(encryptedBlob); CryptMemFree(encryptedBlob);
} }
@@ -1339,7 +1277,7 @@ static void test_encrypt_message(void)
encryptedBlobSize = 0; encryptedBlobSize = 0;
ret = CryptEncryptMessage(&para, 2, certs, blob, sizeof(blob), NULL, ret = CryptEncryptMessage(&para, 2, certs, blob, sizeof(blob), NULL,
&encryptedBlobSize); &encryptedBlobSize);
ok(ret, "CryptEncryptMessage failed: %08x\n", GetLastError()); ok(ret, "CryptEncryptMessage failed: %08lx\n", GetLastError());
if (ret) if (ret)
{ {
encryptedBlob = CryptMemAlloc(encryptedBlobSize); encryptedBlob = CryptMemAlloc(encryptedBlobSize);
@@ -1348,9 +1286,7 @@ static void test_encrypt_message(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptEncryptMessage(&para, 2, certs, blob, sizeof(blob), ret = CryptEncryptMessage(&para, 2, certs, blob, sizeof(blob),
encryptedBlob, &encryptedBlobSize); encryptedBlob, &encryptedBlobSize);
ok(ret || ok(ret, "CryptEncryptMessage failed: %08lx\n", GetLastError());
broken(!ret), /* some Win95 and some NT4 */
"CryptEncryptMessage failed: %08x\n", GetLastError());
CryptMemFree(encryptedBlob); CryptMemFree(encryptedBlob);
} }
} }
@@ -1365,8 +1301,6 @@ static void test_encrypt_message(void)
START_TEST(message) START_TEST(message)
{ {
init_function_pointers();
test_msg_get_signer_count(); test_msg_get_signer_count();
test_verify_detached_message_hash(); test_verify_detached_message_hash();
test_verify_message_hash(); test_verify_message_hash();

File diff suppressed because it is too large Load Diff

View File

@@ -26,9 +26,6 @@
#include "wine/test.h" #include "wine/test.h"
static BOOL (WINAPI * pCryptQueryObject)(DWORD, const void *, DWORD, DWORD,
DWORD, DWORD *, DWORD *, DWORD *, HCERTSTORE *, HCRYPTMSG *, const void **);
static BYTE bigCert[] = { static BYTE bigCert[] = {
0x30,0x7a,0x02,0x01,0x01,0x30,0x02,0x06,0x00,0x30,0x15,0x31, 0x30,0x7a,0x02,0x01,0x01,0x30,0x02,0x06,0x00,0x30,0x15,0x31,
0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75, 0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,
@@ -45,18 +42,10 @@ static char bigCertBase64[] =
"MHoCAQEwAgYAMBUxEzARBgNVBAMTCkp1YW4gTGFuZwAwIhgPMTYwMTAxMDEwMDAw\n" "MHoCAQEwAgYAMBUxEzARBgNVBAMTCkp1YW4gTGFuZwAwIhgPMTYwMTAxMDEwMDAw\n"
"MDBaGA8xNjAxMDEwMTAwMDAwMFowFTETMBEGA1UEAxMKSnVhbiBMYW5nADAHMAIG\n" "MDBaGA8xNjAxMDEwMTAwMDAwMFowFTETMBEGA1UEAxMKSnVhbiBMYW5nADAHMAIG\n"
"AAMBAKMWMBQwEgYDVR0TAQH/BAgwBgEB/wIBAQ==\n"; "AAMBAKMWMBQwEgYDVR0TAQH/BAgwBgEB/wIBAQ==\n";
static WCHAR bigCertBase64W[] = { static WCHAR bigCertBase64W[] =
'M','H','o','C','A','Q','E','w','A','g','Y','A','M','B','U','x','E','z','A', L"MHoCAQEwAgYAMBUxEzARBgNVBAMTCkp1YW4gTGFuZwAwIhgPMTYwMTAxMDEw,DAw\n"
'R','B','g','N','V','B','A','M','T','C','k','p','1','Y','W','4','g','T','G', "MDBaGA8xNjAxMDEwMTAwMDAwMFowFTETMBEGA1UEAxMKSnVhbiBMYW5nADAHMAIG\n"
'F','u','Z','w','A','w','I','h','g','P','M','T','Y','w','M','T','A','x','M', "AAMBAKMWMBQwEgYDVR0TAQH/BAgwBgEB/wIBAQ==\n";
'D','E','w',',','D','A','w','\n',
'M','D','B','a','G','A','8','x','N','j','A','x','M','D','E','w','M','T','A',
'w','M','D','A','w','M','F','o','w','F','T','E','T','M','B','E','G','A','1',
'U','E','A','x','M','K','S','n','V','h','b','i','B','M','Y','W','5','n','A',
'D','A','H','M','A','I','G','\n',
'A','A','M','B','A','K','M','W','M','B','Q','w','E','g','Y','D','V','R','0',
'T','A','Q','H','/','B','A','g','w','B','g','E','B','/','w','I','B','A','Q',
'=','=','\n',0 };
static BYTE signedWithCertWithValidPubKeyContent[] = { static BYTE signedWithCertWithValidPubKeyContent[] = {
0x30,0x82,0x01,0x89,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02, 0x30,0x82,0x01,0x89,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,
0xa0,0x82,0x01,0x7a,0x30,0x82,0x01,0x76,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c, 0xa0,0x82,0x01,0x7a,0x30,0x82,0x01,0x76,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,
@@ -95,88 +84,190 @@ static char signedWithCertWithValidPubKeyContentBase64[] =
"EzARBgNVBAMTCkp1YW4gTGFuZwACAQEwDAYIKoZIhvcNAgUFADAEBgAFAARAgaZw" "EzARBgNVBAMTCkp1YW4gTGFuZwACAQEwDAYIKoZIhvcNAgUFADAEBgAFAARAgaZw"
"s+9Z0WbRm8CatppebW9tDVmpqm7pLKAe7sJgvFm+P2MGjckRHSNkku8u/FcppK/g" "s+9Z0WbRm8CatppebW9tDVmpqm7pLKAe7sJgvFm+P2MGjckRHSNkku8u/FcppK/g"
"7pMZOVHkRLgLKPSoDQ=="; "7pMZOVHkRLgLKPSoDQ==";
static WCHAR signedWithCertWithValidPubKeyContentBase64W[] = { static WCHAR signedWithCertWithValidPubKeyContentBase64W[] =
'M','I','I','B','i','Q','Y','J','K','o','Z','I','h','v','c','N','A','Q','c','C', L"MIIBiQYJKoZIhvcNAQcCoIIBejCCAXYCAQExDjAMBggqhkiG9w0CBQUAMBMGCSqG"
'o','I','I','B','e','j','C','C','A','X','Y','C','A','Q','E','x','D','j','A','M', "SIb3DQEHAaAGBAQBAgMEoIHSMIHPAgEBMAIGADAVMRMwEQYDVQQDEwpKdWFuIExh"
'B','g','g','q','h','k','i','G','9','w','0','C','B','Q','U','A','M','B','M','G', "bmcAMCIYDzE2MDEwMTAxMDAwMDAwWhgPMTYwMTAxMDEwMDAwMDBaMBUxEzARBgNV"
'C','S','q','G','S','I','b','3','D','Q','E','H','A','a','A','G','B','A','Q','B', "BAMTCkp1YW4gTGFuZwAwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA4lQ6p4OxJxQ+"
'A','g','M','E','o','I','H','S','M','I','H','P','A','g','E','B','M','A','I','G', "Wbu0U+Yf513xIWithVPbax7rZZcDhmDe82w4deBMYbu8YhepzXk/IU6Wyw7cYZQw"
'A','D','A','V','M','R','M','w','E','Q','Y','D','V','Q','Q','D','E','w','p','K', "GBBr0BwQeQIDAQABoxYwFDASBgNVHRMBAf8ECDAGAQH/AgEBMXcwdQIBATAaMBUx"
'd','W','F','u','I','E','x','h','b','m','c','A','M','C','I','Y','D','z','E','2', "EzARBgNVBAMTCkp1YW4gTGFuZwACAQEwDAYIKoZIhvcNAgUFADAEBgAFAARAgaZw"
'M','D','E','w','M','T','A','x','M','D','A','w','M','D','A','w','W','h','g','P', "s+9Z0WbRm8CatppebW9tDVmpqm7pLKAe7sJgvFm+P2MGjckRHSNkku8u/FcppK/g"
'M','T','Y','w','M','T','A','x','M','D','E','w','M','D','A','w','M','D','B','a', "7pMZOVHkRLgLKPSoDQ==";
'M','B','U','x','E','z','A','R','B','g','N','V','B','A','M','T','C','k','p','1',
'Y','W','4','g','T','G','F','u','Z','w','A','w','X','D','A','N','B','g','k','q', /* Self-signed .exe, built with tcc, signed with signtool
'h','k','i','G','9','w','0','B','A','Q','E','F','A','A','N','L','A','D','B','I', * (and a certificate generated on a self-signed CA).
'A','k','E','A','4','l','Q','6','p','4','O','x','J','x','Q','+','W','b','u','0', *
'U','+','Y','f','5','1','3','x','I','W','i','t','h','V','P','b','a','x','7','r', * small.c:
'Z','Z','c','D','h','m','D','e','8','2','w','4','d','e','B','M','Y','b','u','8', * int _start()
'Y','h','e','p','z','X','k','/','I','U','6','W','y','w','7','c','Y','Z','Q','w', * {
'G','B','B','r','0','B','w','Q','e','Q','I','D','A','Q','A','B','o','x','Y','w', * return 0;
'F','D','A','S','B','g','N','V','H','R','M','B','A','f','8','E','C','D','A','G', * }
'A','Q','H','/','A','g','E','B','M','X','c','w','d','Q','I','B','A','T','A','a', *
'M','B','U','x','E','z','A','R','B','g','N','V','B','A','M','T','C','k','p','1', * tcc -nostdlib small.c
'Y','W','4','g','T','G','F','u','Z','w','A','C','A','Q','E','w','D','A','Y','I', * signtool sign /v /f codesign.pfx small.exe
'K','o','Z','I','h','v','c','N','A','g','U','F','A','D','A','E','B','g','A','F', */
'A','A','R','A','g','a','Z','w','s','+','9','Z','0','W','b','R','m','8','C','a', static const BYTE signed_pe_blob[] =
't','p','p','e','b','W','9','t','D','V','m','p','q','m','7','p','L','K','A','e', {
'7','s','J','g','v','F','m','+','P','2','M','G','j','c','k','R','H','S','N','k', 0x4D,0x5A,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
'k','u','8','u','/','F','c','p','p','K','/','g','7','p','M','Z','O','V','H','k', 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
'R','L','g','L','K','P','S','o','D','Q','=','=',0 }; 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0E,0x1F,0xBA,0x0E,0x00,0xB4,0x09,0xCD,
0x21,0xB8,0x01,0x4C,0xCD,0x21,0x54,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x63,0x61,0x6E,0x6E,0x6F,
0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x44,0x4F,0x53,0x20,0x6D,0x6F,0x64,0x65,0x2E,0x0D,0x0D,0x0A,
0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x45,0x00,0x00,0x4C,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xE0,0x00,0x0F,0x03,0x0B,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,
0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x00,0x00,
0xE7,0x0C,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x68,0x05,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x74,0x65,0x78,0x74,0x00,0x00,0x00,
0x18,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x81,0xEC,0x00,0x00,0x00,0x00,0x90,0xB8,0x00,0x00,0x00,0x00,0xE9,
0x00,0x00,0x00,0x00,0xC9,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x05,0x00,0x00,0x00,0x02,0x02,0x00,
/* Start of the signature overlay */
0x30,0x82,0x05,0x5A,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x02,0xA0,0x82,0x05,0x4B,0x30,0x82,0x05,0x47,0x02,
0x01,0x01,0x31,0x0B,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x30,0x4C,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,
0x82,0x37,0x02,0x01,0x04,0xA0,0x3E,0x30,0x3C,0x30,0x17,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0F,0x30,
0x09,0x03,0x01,0x00,0xA0,0x04,0xA2,0x02,0x80,0x00,0x30,0x21,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x04,
0x14,0xA0,0x95,0xDE,0xBD,0x1A,0xB7,0x86,0xAF,0x50,0x63,0xD8,0x8F,0x90,0xD5,0x49,0x96,0x4E,0x44,0xF0,0x71,0xA0,0x82,0x03,
0x1D,0x30,0x82,0x03,0x19,0x30,0x82,0x02,0x01,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x96,0x53,0x2C,0xC9,0x23,0x56,0x8A,0x87,
0x42,0x30,0x3E,0xD5,0x8D,0x72,0xD5,0x25,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,
0x17,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x03,0x13,0x0C,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74,
0x30,0x1E,0x17,0x0D,0x31,0x36,0x30,0x33,0x30,0x33,0x32,0x30,0x32,0x37,0x30,0x37,0x5A,0x17,0x0D,0x34,0x39,0x31,0x32,0x33,
0x31,0x32,0x33,0x30,0x30,0x30,0x30,0x5A,0x30,0x17,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x03,0x13,0x0C,0x43,0x6F,0x64,
0x65,0x53,0x69,0x67,0x6E,0x54,0x65,0x73,0x74,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,
0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xB2,0xC9,0x91,0x98,0x8C,0xDC,
0x80,0xBC,0x16,0xBF,0xC1,0x04,0x77,0x90,0xC0,0xFD,0x8C,0xBA,0x68,0x26,0xAC,0xB7,0x20,0x68,0x41,0xED,0xC3,0x9C,0x47,0x7C,
0x36,0xC2,0x7B,0xE1,0x5E,0xFD,0xA9,0x99,0xF4,0x29,0x36,0x86,0x93,0x40,0x55,0x53,0x65,0x79,0xBC,0x9F,0x8F,0x6E,0x2B,0x05,
0x84,0xE1,0xFD,0xD2,0xEF,0xEA,0x89,0x8C,0xEC,0xF9,0x55,0xF0,0x2C,0xE5,0xA7,0x29,0xF9,0x7E,0x50,0xDC,0x9C,0xA1,0x23,0xA5,
0xD9,0x78,0xA1,0xE7,0x7C,0xD7,0x04,0x4F,0x11,0xAC,0x9F,0x4A,0x47,0xA1,0x1E,0xD5,0x9E,0xE7,0x5B,0xB5,0x8C,0x9C,0x67,0x7A,
0xD0,0xF8,0x54,0xD1,0x64,0x7F,0x39,0x48,0xB6,0xCF,0x2F,0x26,0x7D,0x7B,0x13,0x2B,0xC2,0x8F,0xA6,0x3F,0x42,0x71,0x95,0x3E,
0x59,0x0F,0x12,0xFA,0xC2,0x70,0x89,0xB7,0xB6,0x10,0x49,0xE0,0x7D,0x4D,0xFC,0x80,0x61,0x53,0x50,0x72,0xFD,0x46,0x35,0x51,
0x36,0xE6,0x06,0xA9,0x4C,0x0D,0x82,0x15,0xF6,0x5D,0xDE,0xD4,0xDB,0xE7,0x82,0x10,0x40,0xA1,0x47,0x68,0x88,0x0C,0x0A,0x80,
0xD1,0xE5,0x9A,0x35,0x28,0x82,0x1F,0x0F,0x80,0x5A,0x6E,0x1D,0x22,0x22,0xB3,0xA7,0xA2,0x9E,0x82,0x2D,0xC0,0x7F,0x5A,0xD0,
0xBA,0xB2,0xCA,0x20,0xE2,0x97,0xE9,0x72,0x41,0xB7,0xD6,0x1A,0x93,0x23,0x97,0xF0,0xA9,0x61,0xD2,0x91,0xBD,0xB6,0x6B,0x95,
0x12,0x67,0x16,0xAC,0x0A,0xB7,0x55,0x02,0x0D,0xA5,0xAD,0x17,0x95,0x77,0xF9,0x96,0x03,0x41,0xD3,0xE1,0x61,0x68,0xBB,0x0A,
0xB5,0xC4,0xEE,0x70,0x40,0x08,0x05,0xC4,0xF1,0x5D,0x02,0x03,0x01,0x00,0x01,0xA3,0x61,0x30,0x5F,0x30,0x13,0x06,0x03,0x55,
0x1D,0x25,0x04,0x0C,0x30,0x0A,0x06,0x08,0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x03,0x30,0x48,0x06,0x03,0x55,0x1D,0x01,0x04,
0x41,0x30,0x3F,0x80,0x10,0x35,0x40,0x67,0x8F,0x7D,0x03,0x1B,0x76,0x52,0x62,0x2D,0xF5,0x21,0xF6,0x7C,0xBC,0xA1,0x19,0x30,
0x17,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x03,0x13,0x0C,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74,
0x82,0x10,0xA0,0x4B,0xEB,0xAC,0xFA,0x08,0xF2,0x8B,0x47,0xD2,0xB3,0x54,0x60,0x6C,0xE6,0x29,0x30,0x0D,0x06,0x09,0x2A,0x86,
0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x5F,0x8C,0x7F,0xDA,0x1D,0x21,0x7A,0x15,0xD8,0x20,
0x04,0x53,0x7F,0x44,0x6D,0x7B,0x57,0xBE,0x7F,0x86,0x77,0x58,0xC4,0xD4,0x80,0xC7,0x2E,0x64,0x9B,0x44,0xC5,0x2D,0x6D,0xDB,
0x35,0x5A,0xFE,0xA4,0xD8,0x66,0x9B,0xF7,0x6E,0xFC,0xEF,0x52,0x7B,0xC5,0x16,0xE6,0xA3,0x7D,0x59,0xB7,0x31,0x28,0xEB,0xB5,
0x45,0xC9,0xB1,0xD1,0x08,0x67,0xC6,0x37,0xE7,0xD7,0x2A,0xE6,0x1F,0xD9,0x6A,0xE5,0x04,0xDF,0x6A,0x9D,0x91,0xFA,0x41,0xBD,
0x2A,0x50,0xEA,0x99,0x24,0xA9,0x0F,0x2B,0x50,0x51,0x5F,0xD9,0x0B,0x89,0x1B,0xCB,0xDB,0x88,0xE8,0xEC,0x87,0xB0,0x16,0xCC,
0x43,0xEE,0x5A,0xBD,0x57,0xE2,0x46,0xA7,0x56,0x54,0x23,0x32,0x8A,0xFB,0x25,0x51,0x39,0x38,0xE6,0x87,0xF5,0x73,0x63,0xD0,
0x5B,0xC7,0x3F,0xFD,0x04,0x75,0x74,0x4C,0x3D,0xB5,0x31,0x22,0x7D,0xF1,0x8D,0xB4,0xE0,0xAA,0xE1,0xFF,0x8F,0xDD,0xB8,0x04,
0x6A,0x31,0xEE,0x30,0x2D,0x6E,0x74,0x0F,0x37,0x71,0x77,0x2B,0xB8,0x9E,0x62,0x47,0x00,0x9C,0xA5,0x82,0x2B,0x9F,0x24,0x67,
0x50,0x86,0x8B,0xC9,0x36,0x81,0xEB,0x44,0xC2,0xF1,0x91,0xA6,0x84,0x75,0x15,0x8F,0x22,0xDE,0xAC,0xB5,0x16,0xE3,0x96,0x74,
0x72,0x2F,0x15,0xD5,0xFB,0x01,0x22,0xC4,0x24,0xEE,0x3D,0xDF,0x9E,0xA9,0x0A,0x5B,0x16,0x21,0xE8,0x4A,0x8C,0x7E,0x3A,0x9C,
0x22,0xA0,0x49,0x60,0x97,0x1B,0x3E,0x2D,0x80,0x91,0xDB,0xF7,0x78,0x38,0x76,0x78,0x0C,0xE3,0xD4,0x27,0x77,0x69,0x96,0xE6,
0x41,0xC7,0x2E,0xE9,0x61,0xD6,0x31,0x82,0x01,0xC4,0x30,0x82,0x01,0xC0,0x02,0x01,0x01,0x30,0x2B,0x30,0x17,0x31,0x15,0x30,
0x13,0x06,0x03,0x55,0x04,0x03,0x13,0x0C,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74,0x02,0x10,0x96,0x53,
0x2C,0xC9,0x23,0x56,0x8A,0x87,0x42,0x30,0x3E,0xD5,0x8D,0x72,0xD5,0x25,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,
0x00,0xA0,0x70,0x30,0x10,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0C,0x31,0x02,0x30,0x00,0x30,0x19,0x06,
0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x03,0x31,0x0C,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04,
0x30,0x1C,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0B,0x31,0x0E,0x30,0x0C,0x06,0x0A,0x2B,0x06,0x01,0x04,
0x01,0x82,0x37,0x02,0x01,0x15,0x30,0x23,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x04,0x31,0x16,0x04,0x14,0x3D,
0x08,0xC8,0xA3,0xEE,0x05,0x1A,0x61,0xD9,0xFE,0x1A,0x63,0xC0,0x8A,0x6E,0x9D,0xF9,0xC3,0x13,0x98,0x30,0x0D,0x06,0x09,0x2A,
0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x04,0x82,0x01,0x00,0x90,0xF9,0xC0,0x7F,0x1D,0x70,0x8C,0x04,0x22,0x82,
0xB6,0x2D,0x48,0xBF,0x30,0x51,0x29,0xF8,0xE3,0x11,0x39,0xE0,0x64,0x23,0x72,0xE2,0x4C,0x09,0x9F,0x39,0xF2,0x6F,0xDD,0xB9,
0x5A,0x3D,0xEF,0xEB,0xBE,0xEC,0x3B,0xE6,0x58,0x4C,0xC9,0x4F,0xED,0xCB,0x6E,0x9D,0x67,0x8E,0x89,0x92,0x40,0x39,0xA2,0x5F,
0xF9,0xEF,0xD3,0xF5,0x24,0x27,0x8D,0xF7,0x3C,0x92,0x66,0x56,0xC8,0x2B,0xEA,0x04,0xA1,0x0E,0xDA,0x89,0x30,0xA7,0x01,0xD8,
0x0B,0xF8,0xFD,0x99,0xB6,0xC0,0x38,0xB0,0x21,0x50,0x3A,0x86,0x01,0xD0,0xF3,0x86,0x72,0xE3,0x5A,0xBB,0x2A,0x6E,0xBD,0xFB,
0x22,0xF9,0x42,0xD3,0x04,0xFE,0x8D,0xD8,0x79,0xD1,0xEE,0x61,0xC6,0x48,0x04,0x99,0x9A,0xA2,0x73,0xE5,0xFB,0x24,0x10,0xD5,
0x6B,0x71,0x80,0x0E,0x09,0xEA,0x85,0x9A,0xBD,0xBB,0xDE,0x99,0x5D,0xA3,0x18,0x4D,0xED,0x20,0x73,0x3E,0x32,0xEF,0x2C,0xAC,
0x5A,0x83,0x87,0x1F,0x7F,0x19,0x61,0x35,0x53,0xC1,0xAA,0x89,0x97,0xB3,0xDD,0x8D,0xA8,0x67,0x5B,0xC2,0xE2,0x09,0xB7,0xDD,
0x6A,0xCB,0xD5,0xBF,0xD6,0x08,0xE2,0x23,0x1A,0x41,0x9D,0xD5,0x6A,0x6B,0x8D,0x3C,0x29,0x1B,0xF1,0x3F,0x4E,0x4A,0x8F,0x29,
0x33,0xF9,0x1C,0x60,0xA0,0x92,0x7E,0x4F,0x35,0xB8,0xDD,0xEB,0xD1,0x68,0x1A,0x9D,0xA2,0xA6,0x97,0x1F,0x5F,0xC6,0x2C,0xFB,
0xCA,0xDF,0xF7,0x95,0x33,0x95,0xD4,0x79,0x5C,0x73,0x87,0x49,0x1F,0x8C,0x6E,0xCE,0x3E,0x6D,0x3D,0x2B,0x6B,0xD7,0x66,0xE9,
0x88,0x6F,0xF2,0x83,0xB9,0x9B,0x00,0x00
};
static void test_query_object(void) static void test_query_object(void)
{ {
WCHAR tmp_path[MAX_PATH];
BOOL ret; BOOL ret;
CRYPT_DATA_BLOB blob; CRYPT_DATA_BLOB blob;
DWORD content_type;
/* Test the usual invalid arguments */ /* Test the usual invalid arguments */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(0, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, ret = CryptQueryObject(0, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, NULL,
NULL); NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, NULL, 0, 0, 0, NULL, NULL, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, NULL, 0, 0, 0, NULL, NULL,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError()); "expected E_INVALIDARG, got %08lx\n", GetLastError());
/* Test with a simple cert */ /* Test with a simple cert */
blob.pbData = bigCert; blob.pbData = bigCert;
blob.cbData = sizeof(bigCert); blob.cbData = sizeof(bigCert);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
ok(ret, "CryptQueryObject failed: %08x\n", GetLastError()); ok(ret, "CryptQueryObject failed: %08lx\n", GetLastError());
/* The same cert, base64-encoded */ /* The same cert, base64-encoded */
blob.pbData = (BYTE *)bigCertBase64; blob.pbData = (BYTE *)bigCertBase64;
blob.cbData = sizeof(bigCertBase64); blob.cbData = sizeof(bigCertBase64);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
ok(ret, "CryptQueryObject failed: %08x\n", GetLastError()); ok(ret, "CryptQueryObject failed: %08lx\n", GetLastError());
/* The same base64-encoded cert, restricting the format types */ /* The same base64-encoded cert, restricting the format types */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, NULL, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, NULL,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
ok(!ret && GetLastError() == CRYPT_E_NO_MATCH, ok(!ret && GetLastError() == CRYPT_E_NO_MATCH,
"expected CRYPT_E_NO_MATCH, got %08x\n", GetLastError()); "expected CRYPT_E_NO_MATCH, got %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED, 0, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED, 0,
NULL, NULL, NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL, NULL, NULL);
ok(ret, "CryptQueryObject failed: %08x\n", GetLastError()); ok(ret, "CryptQueryObject failed: %08lx\n", GetLastError());
/* The same cert, base64-encoded but as a wide character string */ /* The same cert, base64-encoded but as a wide character string */
blob.pbData = (BYTE *)bigCertBase64W; blob.pbData = (BYTE *)bigCertBase64W;
blob.cbData = sizeof(bigCertBase64W); blob.cbData = sizeof(bigCertBase64W);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
ok(!ret && GetLastError() == CRYPT_E_NO_MATCH, ok(!ret && GetLastError() == CRYPT_E_NO_MATCH,
"expected CRYPT_E_NO_MATCH, got %08x\n", GetLastError()); "expected CRYPT_E_NO_MATCH, got %08lx\n", GetLastError());
/* For brevity, not tested here, but tested on Windows: same failure /* For brevity, not tested here, but tested on Windows: same failure
* (CRYPT_E_NO_MATCH) when the wide character base64-encoded cert * (CRYPT_E_NO_MATCH) when the wide character base64-encoded cert
* is written to a file and queried. * is written to a file and queried.
@@ -185,51 +276,61 @@ static void test_query_object(void)
blob.pbData = signedWithCertWithValidPubKeyContent; blob.pbData = signedWithCertWithValidPubKeyContent;
blob.cbData = sizeof(signedWithCertWithValidPubKeyContent); blob.cbData = sizeof(signedWithCertWithValidPubKeyContent);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
ok(ret, "CryptQueryObject failed: %08x\n", GetLastError()); ok(ret, "CryptQueryObject failed: %08lx\n", GetLastError());
blob.pbData = (BYTE *)signedWithCertWithValidPubKeyContentBase64; blob.pbData = (BYTE *)signedWithCertWithValidPubKeyContentBase64;
blob.cbData = sizeof(signedWithCertWithValidPubKeyContentBase64); blob.cbData = sizeof(signedWithCertWithValidPubKeyContentBase64);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
ok(ret, "CryptQueryObject failed: %08x\n", GetLastError()); ok(ret, "CryptQueryObject failed: %08lx\n", GetLastError());
/* A valid signed message, encoded as a wide character base64 string, can /* A valid signed message, encoded as a wide character base64 string, can
* be queried successfully. * be queried successfully.
*/ */
blob.pbData = (BYTE *)signedWithCertWithValidPubKeyContentBase64W; blob.pbData = (BYTE *)signedWithCertWithValidPubKeyContentBase64W;
blob.cbData = sizeof(signedWithCertWithValidPubKeyContentBase64W); blob.cbData = sizeof(signedWithCertWithValidPubKeyContentBase64W);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
ok(ret, "CryptQueryObject failed: %08x\n", GetLastError()); ok(ret, "CryptQueryObject failed: %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, NULL, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, NULL,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
ok(!ret && GetLastError() == CRYPT_E_NO_MATCH, ok(!ret && GetLastError() == CRYPT_E_NO_MATCH,
"expected CRYPT_E_NO_MATCH, got %08x\n", GetLastError()); "expected CRYPT_E_NO_MATCH, got %08lx\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED, 0, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED, 0,
NULL, NULL, NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL, NULL, NULL);
ok(ret, "CryptQueryObject failed: %08x\n", GetLastError()); ok(ret, "CryptQueryObject failed: %08lx\n", GetLastError());
GetEnvironmentVariableW( L"TMP", tmp_path, MAX_PATH );
SetEnvironmentVariableW(L"TMP", L"C:\\nonexistent");
blob.pbData = (BYTE *)signed_pe_blob;
blob.cbData = sizeof(signed_pe_blob);
ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, &content_type,
NULL, NULL, NULL, NULL);
ok(!ret, "CryptQueryObject succeeded\n");
ok(GetLastError() == CRYPT_E_NO_MATCH, "Unexpected error %lu.\n", GetLastError());
SetEnvironmentVariableW(L"TMP", tmp_path);
blob.pbData = (BYTE *)signed_pe_blob;
blob.cbData = sizeof(signed_pe_blob);
ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob,
CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, &content_type,
NULL, NULL, NULL, NULL);
ok(ret, "CryptQueryObject failed: %08lx\n", GetLastError());
ok(content_type == CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED,
"Got unexpected content_type %#lx.\n", content_type);
} }
START_TEST(object) START_TEST(object)
{ {
HMODULE mod = GetModuleHandleA("crypt32.dll");
pCryptQueryObject = (void *)GetProcAddress(mod, "CryptQueryObject");
if (!pCryptQueryObject)
{
win_skip("CryptQueryObject is not available\n");
return;
}
test_query_object(); test_query_object();
} }

View File

@@ -29,93 +29,86 @@
#include "wine/test.h" #include "wine/test.h"
static BOOL (WINAPI *pCryptEnumOIDInfo)(DWORD,DWORD,void*,PFN_CRYPT_ENUM_OID_INFO);
struct OIDToAlgID struct OIDToAlgID
{ {
LPCSTR oid; LPCSTR oid;
LPCSTR altOid;
DWORD algID; DWORD algID;
DWORD altAlgID; DWORD altAlgID;
}; };
static const struct OIDToAlgID oidToAlgID[] = { static const struct OIDToAlgID oidToAlgID[] = {
{ szOID_RSA_RSA, NULL, CALG_RSA_KEYX }, { szOID_RSA_RSA, CALG_RSA_KEYX },
{ szOID_RSA_MD2RSA, NULL, CALG_MD2 }, { szOID_RSA_MD2RSA, CALG_MD2 },
{ szOID_RSA_MD4RSA, NULL, CALG_MD4 }, { szOID_RSA_MD4RSA, CALG_MD4 },
{ szOID_RSA_MD5RSA, NULL, CALG_MD5 }, { szOID_RSA_MD5RSA, CALG_MD5 },
{ szOID_RSA_SHA1RSA, NULL, CALG_SHA }, { szOID_RSA_SHA1RSA, CALG_SHA },
{ szOID_RSA_DH, NULL, CALG_DH_SF }, { szOID_RSA_DH, CALG_DH_SF },
{ szOID_RSA_SMIMEalgESDH, NULL, CALG_DH_EPHEM }, { szOID_RSA_SMIMEalgESDH, CALG_DH_EPHEM },
{ szOID_RSA_SMIMEalgCMS3DESwrap, NULL, CALG_3DES }, { szOID_RSA_SMIMEalgCMS3DESwrap, CALG_3DES },
{ szOID_RSA_SMIMEalgCMSRC2wrap, NULL, CALG_RC2 }, { szOID_RSA_SMIMEalgCMSRC2wrap, CALG_RC2 },
{ szOID_RSA_MD2, NULL, CALG_MD2 }, { szOID_RSA_MD2, CALG_MD2 },
{ szOID_RSA_MD4, NULL, CALG_MD4 }, { szOID_RSA_MD4, CALG_MD4 },
{ szOID_RSA_MD5, NULL, CALG_MD5 }, { szOID_RSA_MD5, CALG_MD5 },
{ szOID_RSA_RC2CBC, NULL, CALG_RC2 }, { szOID_RSA_RC2CBC, CALG_RC2 },
{ szOID_RSA_RC4, NULL, CALG_RC4 }, { szOID_RSA_RC4, CALG_RC4 },
{ szOID_RSA_DES_EDE3_CBC, NULL, CALG_3DES }, { szOID_RSA_DES_EDE3_CBC, CALG_3DES },
{ szOID_ANSI_X942_DH, NULL, CALG_DH_SF }, { szOID_ANSI_X942_DH, CALG_DH_SF },
{ szOID_X957_DSA, NULL, CALG_DSS_SIGN }, { szOID_X957_DSA, CALG_DSS_SIGN },
{ szOID_X957_SHA1DSA, NULL, CALG_SHA }, { szOID_X957_SHA1DSA, CALG_SHA },
{ szOID_OIWSEC_md4RSA, NULL, CALG_MD4 }, { szOID_OIWSEC_md4RSA, CALG_MD4 },
{ szOID_OIWSEC_md5RSA, NULL, CALG_MD5 }, { szOID_OIWSEC_md5RSA, CALG_MD5 },
{ szOID_OIWSEC_md4RSA2, NULL, CALG_MD4 }, { szOID_OIWSEC_md4RSA2, CALG_MD4 },
{ szOID_OIWSEC_desCBC, NULL, CALG_DES }, { szOID_OIWSEC_desCBC, CALG_DES },
{ szOID_OIWSEC_dsa, NULL, CALG_DSS_SIGN }, { szOID_OIWSEC_dsa, CALG_DSS_SIGN },
{ szOID_OIWSEC_shaDSA, NULL, CALG_SHA }, { szOID_OIWSEC_shaDSA, CALG_SHA },
{ szOID_OIWSEC_shaRSA, NULL, CALG_SHA }, { szOID_OIWSEC_shaRSA, CALG_SHA },
{ szOID_OIWSEC_sha, NULL, CALG_SHA }, { szOID_OIWSEC_sha, CALG_SHA },
{ szOID_OIWSEC_rsaXchg, NULL, CALG_RSA_KEYX }, { szOID_OIWSEC_rsaXchg, CALG_RSA_KEYX },
{ szOID_OIWSEC_sha1, NULL, CALG_SHA }, { szOID_OIWSEC_sha1, CALG_SHA },
{ szOID_OIWSEC_dsaSHA1, NULL, CALG_SHA }, { szOID_OIWSEC_dsaSHA1, CALG_SHA },
{ szOID_OIWSEC_sha1RSASign, NULL, CALG_SHA }, { szOID_OIWSEC_sha1RSASign, CALG_SHA },
{ szOID_OIWDIR_md2RSA, NULL, CALG_MD2 }, { szOID_OIWDIR_md2RSA, CALG_MD2 },
{ szOID_INFOSEC_mosaicUpdatedSig, NULL, CALG_SHA }, { szOID_INFOSEC_mosaicUpdatedSig, CALG_SHA },
{ szOID_INFOSEC_mosaicKMandUpdSig, NULL, CALG_DSS_SIGN }, { szOID_INFOSEC_mosaicKMandUpdSig, CALG_DSS_SIGN },
{ szOID_NIST_sha256, NULL, CALG_SHA_256, -1 }, { szOID_NIST_sha256, CALG_SHA_256, -1 },
{ szOID_NIST_sha384, NULL, CALG_SHA_384, -1 }, { szOID_NIST_sha384, CALG_SHA_384, -1 },
{ szOID_NIST_sha512, NULL, CALG_SHA_512, -1 } { szOID_NIST_sha512, CALG_SHA_512, -1 },
{ szOID_ECC_PUBLIC_KEY, CALG_OID_INFO_PARAMETERS },
}; };
static const struct OIDToAlgID algIDToOID[] = { static const struct OIDToAlgID algIDToOID[] = {
{ szOID_RSA_RSA, NULL, CALG_RSA_KEYX }, { szOID_RSA_RSA, CALG_RSA_KEYX },
{ szOID_RSA_SMIMEalgESDH, NULL, CALG_DH_EPHEM }, { szOID_RSA_SMIMEalgESDH, CALG_DH_EPHEM },
{ szOID_RSA_MD2, NULL, CALG_MD2 }, { szOID_RSA_MD2, CALG_MD2 },
{ szOID_RSA_MD4, NULL, CALG_MD4 }, { szOID_RSA_MD4, CALG_MD4 },
{ szOID_RSA_MD5, NULL, CALG_MD5 }, { szOID_RSA_MD5, CALG_MD5 },
{ szOID_RSA_RC2CBC, NULL, CALG_RC2 }, { szOID_RSA_RC2CBC, CALG_RC2 },
{ szOID_RSA_RC4, NULL, CALG_RC4 }, { szOID_RSA_RC4, CALG_RC4 },
{ szOID_RSA_DES_EDE3_CBC, NULL, CALG_3DES }, { szOID_RSA_DES_EDE3_CBC, CALG_3DES },
{ szOID_ANSI_X942_DH, NULL, CALG_DH_SF }, { szOID_ANSI_X942_DH, CALG_DH_SF },
{ szOID_X957_DSA, szOID_OIWSEC_dsa /* some Win98 */, CALG_DSS_SIGN }, { szOID_X957_DSA, CALG_DSS_SIGN },
{ szOID_OIWSEC_desCBC, NULL, CALG_DES }, { szOID_OIWSEC_desCBC, CALG_DES },
{ szOID_OIWSEC_sha1, NULL, CALG_SHA }, { szOID_OIWSEC_sha1, CALG_SHA },
}; };
static const WCHAR bogusDll[] = { 'b','o','g','u','s','.','d','l','l',0 }; static void test_OIDToAlgID(void)
static const WCHAR bogus2Dll[] = { 'b','o','g','u','s','2','.','d','l','l',0 };
static void testOIDToAlgID(void)
{ {
int i; int i;
DWORD alg; DWORD alg;
/* Test with a bogus one */ /* Test with a bogus one */
alg = CertOIDToAlgId("1.2.3"); alg = CertOIDToAlgId("1.2.3");
ok(!alg, "Expected failure, got %d\n", alg); ok(!alg, "Expected failure, got %ld\n", alg);
for (i = 0; i < ARRAY_SIZE(oidToAlgID); i++) for (i = 0; i < ARRAY_SIZE(oidToAlgID); i++)
{ {
alg = CertOIDToAlgId(oidToAlgID[i].oid); alg = CertOIDToAlgId(oidToAlgID[i].oid);
ok(alg == oidToAlgID[i].algID || (oidToAlgID[i].altAlgID && alg == oidToAlgID[i].altAlgID), ok(alg == oidToAlgID[i].algID || (oidToAlgID[i].altAlgID && alg == oidToAlgID[i].altAlgID),
"Expected %d, got %d\n", oidToAlgID[i].algID, alg); "Expected %ld, got %ld\n", oidToAlgID[i].algID, alg);
} }
} }
static void testAlgIDToOID(void) static void test_AlgIDToOID(void)
{ {
int i; int i;
LPCSTR oid; LPCSTR oid;
@@ -124,32 +117,14 @@ static void testAlgIDToOID(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
oid = CertAlgIdToOID(ALG_CLASS_SIGNATURE | ALG_TYPE_ANY | 80); oid = CertAlgIdToOID(ALG_CLASS_SIGNATURE | ALG_TYPE_ANY | 80);
ok(!oid && GetLastError() == 0xdeadbeef, ok(!oid && GetLastError() == 0xdeadbeef,
"Didn't expect last error (%08x) to be set\n", GetLastError()); "Didn't expect last error (%08lx) to be set\n", GetLastError());
for (i = 0; i < ARRAY_SIZE(algIDToOID); i++) for (i = 0; i < ARRAY_SIZE(algIDToOID); i++)
{ {
oid = CertAlgIdToOID(algIDToOID[i].algID); oid = CertAlgIdToOID(algIDToOID[i].algID);
/* Allow failure, not every version of Windows supports every algo */ /* Allow failure, not every version of Windows supports every algo */
ok(oid != NULL || broken(!oid), "CertAlgIdToOID failed, expected %s\n", algIDToOID[i].oid); ok(oid != NULL, "CertAlgIdToOID failed, expected %s\n", algIDToOID[i].oid);
if (oid) if (oid)
{ ok(!strcmp(oid, algIDToOID[i].oid), "Expected %s, got %s\n", algIDToOID[i].oid, oid);
if (strcmp(oid, algIDToOID[i].oid))
{
if (algIDToOID[i].altOid)
ok(!strcmp(oid, algIDToOID[i].altOid),
"Expected %s or %s, got %s\n", algIDToOID[i].oid,
algIDToOID[i].altOid, oid);
else
{
/* No need to rerun the test, we already know it failed. */
ok(0, "Expected %s, got %s\n", algIDToOID[i].oid, oid);
}
}
else
{
/* No need to rerun the test, we already know it succeeded. */
ok(1, "Expected %s, got %s\n", algIDToOID[i].oid, oid);
}
}
} }
} }
@@ -166,7 +141,7 @@ static void test_oidFunctionSet(void)
/* The name doesn't mean much */ /* The name doesn't mean much */
set1 = CryptInitOIDFunctionSet("funky", 0); set1 = CryptInitOIDFunctionSet("funky", 0);
ok(set1 != 0, "CryptInitOIDFunctionSet failed: %08x\n", GetLastError()); ok(set1 != 0, "CryptInitOIDFunctionSet failed: %08lx\n", GetLastError());
if (set1) if (set1)
{ {
/* These crash /* These crash
@@ -175,26 +150,26 @@ static void test_oidFunctionSet(void)
*/ */
size = 0; size = 0;
ret = CryptGetDefaultOIDDllList(set1, 0, NULL, &size); ret = CryptGetDefaultOIDDllList(set1, 0, NULL, &size);
ok(ret, "CryptGetDefaultOIDDllList failed: %08x\n", GetLastError()); ok(ret, "CryptGetDefaultOIDDllList failed: %08lx\n", GetLastError());
if (ret) if (ret)
{ {
buf = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); buf = malloc(size * sizeof(WCHAR));
if (buf) if (buf)
{ {
ret = CryptGetDefaultOIDDllList(set1, 0, buf, &size); ret = CryptGetDefaultOIDDllList(set1, 0, buf, &size);
ok(ret, "CryptGetDefaultOIDDllList failed: %08x\n", ok(ret, "CryptGetDefaultOIDDllList failed: %08lx\n",
GetLastError()); GetLastError());
ok(!*buf, "Expected empty DLL list\n"); ok(!*buf, "Expected empty DLL list\n");
HeapFree(GetProcessHeap(), 0, buf); free(buf);
} }
} }
} }
/* MSDN says flags must be 0, but it's not checked */ /* MSDN says flags must be 0, but it's not checked */
set1 = CryptInitOIDFunctionSet("", 1); set1 = CryptInitOIDFunctionSet("", 1);
ok(set1 != 0, "CryptInitOIDFunctionSet failed: %08x\n", GetLastError()); ok(set1 != 0, "CryptInitOIDFunctionSet failed: %08lx\n", GetLastError());
set2 = CryptInitOIDFunctionSet("", 0); set2 = CryptInitOIDFunctionSet("", 0);
ok(set2 != 0, "CryptInitOIDFunctionSet failed: %08x\n", GetLastError()); ok(set2 != 0, "CryptInitOIDFunctionSet failed: %08lx\n", GetLastError());
/* There isn't a free function, so there must be only one set per name to /* There isn't a free function, so there must be only one set per name to
* limit leaks. (I guess the sets are freed when crypt32 is unloaded.) * limit leaks. (I guess the sets are freed when crypt32 is unloaded.)
*/ */
@@ -208,7 +183,7 @@ static void test_oidFunctionSet(void)
/* There's no installed function for a built-in encoding. */ /* There's no installed function for a built-in encoding. */
set1 = CryptInitOIDFunctionSet("CryptDllEncodeObject", 0); set1 = CryptInitOIDFunctionSet("CryptDllEncodeObject", 0);
ok(set1 != 0, "CryptInitOIDFunctionSet failed: %08x\n", GetLastError()); ok(set1 != 0, "CryptInitOIDFunctionSet failed: %08lx\n", GetLastError());
if (set1) if (set1)
{ {
void *funcAddr; void *funcAddr;
@@ -216,9 +191,8 @@ static void test_oidFunctionSet(void)
ret = CryptGetOIDFunctionAddress(set1, X509_ASN_ENCODING, X509_CERT, 0, ret = CryptGetOIDFunctionAddress(set1, X509_ASN_ENCODING, X509_CERT, 0,
&funcAddr, &hFuncAddr); &funcAddr, &hFuncAddr);
ok((!ret && GetLastError() == ERROR_FILE_NOT_FOUND) || ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
broken(ret) /* some Win98 */, "Expected ERROR_FILE_NOT_FOUND, got %08lx\n", GetLastError());
"Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError());
} }
} }
@@ -243,21 +217,21 @@ static void test_installOIDFunctionAddress(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptInstallOIDFunctionAddress(NULL, 0, "CryptDllEncodeObject", 0, ret = CryptInstallOIDFunctionAddress(NULL, 0, "CryptDllEncodeObject", 0,
NULL, 0); NULL, 0);
ok(ret && GetLastError() == 0xdeadbeef, "Expected success, got %08x\n", ok(ret && GetLastError() == 0xdeadbeef, "Expected success, got %08lx\n",
GetLastError()); GetLastError());
/* The function name doesn't much matter */ /* The function name doesn't much matter */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptInstallOIDFunctionAddress(NULL, 0, "OhSoFunky", 0, NULL, 0); ret = CryptInstallOIDFunctionAddress(NULL, 0, "OhSoFunky", 0, NULL, 0);
ok(ret && GetLastError() == 0xdeadbeef, "Expected success, got %08x\n", ok(ret && GetLastError() == 0xdeadbeef, "Expected success, got %08lx\n",
GetLastError()); GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
entry.pszOID = X509_CERT; entry.pszOID = X509_CERT;
ret = CryptInstallOIDFunctionAddress(NULL, 0, "OhSoFunky", 1, &entry, 0); ret = CryptInstallOIDFunctionAddress(NULL, 0, "OhSoFunky", 1, &entry, 0);
ok(ret && GetLastError() == 0xdeadbeef, "Expected success, got %08x\n", ok(ret && GetLastError() == 0xdeadbeef, "Expected success, got %08lx\n",
GetLastError()); GetLastError());
set = CryptInitOIDFunctionSet("OhSoFunky", 0); set = CryptInitOIDFunctionSet("OhSoFunky", 0);
ok(set != 0, "CryptInitOIDFunctionSet failed: %08x\n", GetLastError()); ok(set != 0, "CryptInitOIDFunctionSet failed: %08lx\n", GetLastError());
if (set) if (set)
{ {
funcY funcAddr = NULL; funcY funcAddr = NULL;
@@ -269,17 +243,15 @@ static void test_installOIDFunctionAddress(void)
*/ */
ret = CryptGetOIDFunctionAddress(set, X509_ASN_ENCODING, 0, 0, ret = CryptGetOIDFunctionAddress(set, X509_ASN_ENCODING, 0, 0,
(void **)&funcAddr, &hFuncAddr); (void **)&funcAddr, &hFuncAddr);
ok(!ret && (GetLastError() == ERROR_FILE_NOT_FOUND || ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
GetLastError() == E_INVALIDARG /* some Win98 */), "Expected ERROR_FILE_NOT_FOUND, got %ld\n", GetLastError());
"Expected ERROR_FILE_NOT_FOUND or E_INVALIDARG, got %d\n",
GetLastError());
ret = CryptGetOIDFunctionAddress(set, X509_ASN_ENCODING, X509_CERT, 0, ret = CryptGetOIDFunctionAddress(set, X509_ASN_ENCODING, X509_CERT, 0,
(void **)&funcAddr, &hFuncAddr); (void **)&funcAddr, &hFuncAddr);
ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); "Expected ERROR_FILE_NOT_FOUND, got %ld\n", GetLastError());
ret = CryptGetOIDFunctionAddress(set, 0, X509_CERT, 0, ret = CryptGetOIDFunctionAddress(set, 0, X509_CERT, 0,
(void **)&funcAddr, &hFuncAddr); (void **)&funcAddr, &hFuncAddr);
ok(ret, "CryptGetOIDFunctionAddress failed: %d\n", GetLastError()); ok(ret, "CryptGetOIDFunctionAddress failed: %ld\n", GetLastError());
if (funcAddr) if (funcAddr)
{ {
int y = funcAddr(0xabadc0da); int y = funcAddr(0xabadc0da);
@@ -298,55 +270,55 @@ static void test_registerOIDFunction(void)
* omitted. This may be a side effect of the registry code, I don't know. * omitted. This may be a side effect of the registry code, I don't know.
* I don't check it because I doubt anyone would depend on it. * I don't check it because I doubt anyone would depend on it.
ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, NULL, ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, NULL,
"1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); "1.2.3.4.5.6.7.8.9.10", L"bogus.dll", NULL);
*/ */
/* On windows XP, GetLastError is incorrectly being set with an HRESULT, /* On windows XP, GetLastError is incorrectly being set with an HRESULT,
* E_INVALIDARG * E_INVALIDARG
*/ */
ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "foo", NULL, bogusDll, ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "foo", NULL, L"bogus.dll",
NULL); NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG: %d\n", GetLastError()); "Expected E_INVALIDARG: %ld\n", GetLastError());
/* This has no effect, but "succeeds" on XP */ /* This has no effect, but "succeeds" on XP */
ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "foo", ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "foo",
"1.2.3.4.5.6.7.8.9.10", NULL, NULL); "1.2.3.4.5.6.7.8.9.10", NULL, NULL);
ok(ret, "Expected pseudo-success, got %d\n", GetLastError()); ok(ret, "Expected pseudo-success, got %ld\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "CryptDllEncodeObject", ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "CryptDllEncodeObject",
"1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); "1.2.3.4.5.6.7.8.9.10", L"bogus.dll", NULL);
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
{ {
skip("Need admin rights\n"); skip("Need admin rights\n");
return; return;
} }
ok(ret, "CryptRegisterOIDFunction failed: %d\n", GetLastError()); ok(ret, "CryptRegisterOIDFunction failed: %ld\n", GetLastError());
ret = CryptUnregisterOIDFunction(X509_ASN_ENCODING, "CryptDllEncodeObject", ret = CryptUnregisterOIDFunction(X509_ASN_ENCODING, "CryptDllEncodeObject",
"1.2.3.4.5.6.7.8.9.10"); "1.2.3.4.5.6.7.8.9.10");
ok(ret, "CryptUnregisterOIDFunction failed: %d\n", GetLastError()); ok(ret, "CryptUnregisterOIDFunction failed: %ld\n", GetLastError());
ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "bogus", ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "bogus",
"1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); "1.2.3.4.5.6.7.8.9.10", L"bogus.dll", NULL);
ok(ret, "CryptRegisterOIDFunction failed: %d\n", GetLastError()); ok(ret, "CryptRegisterOIDFunction failed: %ld\n", GetLastError());
ret = CryptUnregisterOIDFunction(X509_ASN_ENCODING, "bogus", ret = CryptUnregisterOIDFunction(X509_ASN_ENCODING, "bogus",
"1.2.3.4.5.6.7.8.9.10"); "1.2.3.4.5.6.7.8.9.10");
ok(ret, "CryptUnregisterOIDFunction failed: %d\n", GetLastError()); ok(ret, "CryptUnregisterOIDFunction failed: %ld\n", GetLastError());
/* Unwanted Cryptography\OID\EncodingType 1\bogus\ will still be there */ /* Unwanted Cryptography\OID\EncodingType 1\bogus\ will still be there */
ok(!RegDeleteKeyA(HKEY_LOCAL_MACHINE, ok(!RegDeleteKeyA(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Cryptography\\OID\\EncodingType 1\\bogus"), "SOFTWARE\\Microsoft\\Cryptography\\OID\\EncodingType 1\\bogus"),
"Could not delete bogus key\n"); "Could not delete bogus key\n");
/* Shouldn't have effect but registry keys are created */ /* Shouldn't have effect but registry keys are created */
ret = CryptRegisterOIDFunction(PKCS_7_ASN_ENCODING, "CryptDllEncodeObject", ret = CryptRegisterOIDFunction(PKCS_7_ASN_ENCODING, "CryptDllEncodeObject",
"1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); "1.2.3.4.5.6.7.8.9.10", L"bogus.dll", NULL);
ok(ret, "CryptRegisterOIDFunction failed: %d\n", GetLastError()); ok(ret, "CryptRegisterOIDFunction failed: %ld\n", GetLastError());
ret = CryptUnregisterOIDFunction(PKCS_7_ASN_ENCODING, "CryptDllEncodeObject", ret = CryptUnregisterOIDFunction(PKCS_7_ASN_ENCODING, "CryptDllEncodeObject",
"1.2.3.4.5.6.7.8.9.10"); "1.2.3.4.5.6.7.8.9.10");
ok(ret, "CryptUnregisterOIDFunction failed: %d\n", GetLastError()); ok(ret, "CryptUnregisterOIDFunction failed: %ld\n", GetLastError());
/* Check with bogus encoding type. Registry keys are still created */ /* Check with bogus encoding type. Registry keys are still created */
ret = CryptRegisterOIDFunction(0, "CryptDllEncodeObject", ret = CryptRegisterOIDFunction(0, "CryptDllEncodeObject",
"1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); "1.2.3.4.5.6.7.8.9.10", L"bogus.dll", NULL);
ok(ret, "CryptRegisterOIDFunction failed: %d\n", GetLastError()); ok(ret, "CryptRegisterOIDFunction failed: %ld\n", GetLastError());
ret = CryptUnregisterOIDFunction(0, "CryptDllEncodeObject", ret = CryptUnregisterOIDFunction(0, "CryptDllEncodeObject",
"1.2.3.4.5.6.7.8.9.10"); "1.2.3.4.5.6.7.8.9.10");
ok(ret, "CryptUnregisterOIDFunction failed: %d\n", GetLastError()); ok(ret, "CryptUnregisterOIDFunction failed: %ld\n", GetLastError());
/* Unwanted Cryptography\OID\EncodingType 0\CryptDllEncodeObject\ /* Unwanted Cryptography\OID\EncodingType 0\CryptDllEncodeObject\
* will still be there * will still be there
*/ */
@@ -357,11 +329,11 @@ static void test_registerOIDFunction(void)
* (for now) treated as a mask. Registry keys are created. * (for now) treated as a mask. Registry keys are created.
*/ */
ret = CryptRegisterOIDFunction(3, "CryptDllEncodeObject", ret = CryptRegisterOIDFunction(3, "CryptDllEncodeObject",
"1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); "1.2.3.4.5.6.7.8.9.10", L"bogus.dll", NULL);
ok(ret, "CryptRegisterOIDFunction failed: %d\n", GetLastError()); ok(ret, "CryptRegisterOIDFunction failed: %ld\n", GetLastError());
ret = CryptUnregisterOIDFunction(3, "CryptDllEncodeObject", ret = CryptUnregisterOIDFunction(3, "CryptDllEncodeObject",
"1.2.3.4.5.6.7.8.9.10"); "1.2.3.4.5.6.7.8.9.10");
ok(ret, "CryptUnregisterOIDFunction failed: %d\n", GetLastError()); ok(ret, "CryptUnregisterOIDFunction failed: %ld\n", GetLastError());
/* Unwanted Cryptography\OID\EncodingType 3\CryptDllEncodeObject /* Unwanted Cryptography\OID\EncodingType 3\CryptDllEncodeObject
* will still be there. * will still be there.
*/ */
@@ -385,84 +357,81 @@ static void test_registerDefaultOIDFunction(void)
ret = CryptRegisterDefaultOIDFunction(0, NULL, 0, NULL); ret = CryptRegisterDefaultOIDFunction(0, NULL, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG, ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %08x\n", GetLastError()); "Expected E_INVALIDARG, got %08lx\n", GetLastError());
/* This succeeds on WinXP, although the bogus entry is unusable. /* This succeeds on WinXP, although the bogus entry is unusable.
ret = CryptRegisterDefaultOIDFunction(0, NULL, 0, bogusDll); ret = CryptRegisterDefaultOIDFunction(0, NULL, 0, L"bogus.dll");
*/ */
/* Register one at index 0 */ /* Register one at index 0 */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptRegisterDefaultOIDFunction(0, "CertDllOpenStoreProv", 0, ret = CryptRegisterDefaultOIDFunction(0, "CertDllOpenStoreProv", 0,
bogusDll); L"bogus.dll");
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
{ {
skip("Need admin rights\n"); skip("Need admin rights\n");
return; return;
} }
ok(ret, "CryptRegisterDefaultOIDFunction failed: %08x\n", GetLastError()); ok(ret, "CryptRegisterDefaultOIDFunction failed: %08lx\n", GetLastError());
/* Reregistering should fail */ /* Reregistering should fail */
ret = CryptRegisterDefaultOIDFunction(0, "CertDllOpenStoreProv", 0, ret = CryptRegisterDefaultOIDFunction(0, "CertDllOpenStoreProv", 0,
bogusDll); L"bogus.dll");
ok(!ret && GetLastError() == ERROR_FILE_EXISTS, ok(!ret && GetLastError() == ERROR_FILE_EXISTS,
"Expected ERROR_FILE_EXISTS, got %08x\n", GetLastError()); "Expected ERROR_FILE_EXISTS, got %08lx\n", GetLastError());
/* Registering the same one at index 1 should also fail */ /* Registering the same one at index 1 should also fail */
ret = CryptRegisterDefaultOIDFunction(0, "CertDllOpenStoreProv", 1, ret = CryptRegisterDefaultOIDFunction(0, "CertDllOpenStoreProv", 1,
bogusDll); L"bogus.dll");
ok(!ret && GetLastError() == ERROR_FILE_EXISTS, ok(!ret && GetLastError() == ERROR_FILE_EXISTS,
"Expected ERROR_FILE_EXISTS, got %08x\n", GetLastError()); "Expected ERROR_FILE_EXISTS, got %08lx\n", GetLastError());
/* Registering a different one at index 1 succeeds */ /* Registering a different one at index 1 succeeds */
ret = CryptRegisterDefaultOIDFunction(0, "CertDllOpenStoreProv", 1, ret = CryptRegisterDefaultOIDFunction(0, "CertDllOpenStoreProv", 1,
bogus2Dll); L"bogus2.dll");
ok(ret, "CryptRegisterDefaultOIDFunction failed: %08x\n", GetLastError()); ok(ret, "CryptRegisterDefaultOIDFunction failed: %08lx\n", GetLastError());
sprintf(buf, fmt, 0, func); sprintf(buf, fmt, 0, func);
rc = RegOpenKeyA(HKEY_LOCAL_MACHINE, buf, &key); rc = RegOpenKeyA(HKEY_LOCAL_MACHINE, buf, &key);
ok(rc == 0, "Expected key to exist, RegOpenKeyA failed: %d\n", rc); ok(rc == 0, "Expected key to exist, RegOpenKeyA failed: %ld\n", rc);
if (rc == 0) if (rc == 0)
{ {
static const CHAR dllA[] = "Dll";
static const CHAR bogusDll_A[] = "bogus.dll";
static const CHAR bogus2Dll_A[] = "bogus2.dll";
CHAR dllBuf[MAX_PATH]; CHAR dllBuf[MAX_PATH];
DWORD type, size; DWORD type, size;
LPSTR ptr; LPSTR ptr;
size = ARRAY_SIZE(dllBuf); size = ARRAY_SIZE(dllBuf);
rc = RegQueryValueExA(key, dllA, NULL, &type, (LPBYTE)dllBuf, &size); rc = RegQueryValueExA(key, "Dll", NULL, &type, (LPBYTE)dllBuf, &size);
ok(rc == 0, ok(rc == 0,
"Expected Dll value to exist, RegQueryValueExA failed: %d\n", rc); "Expected Dll value to exist, RegQueryValueExA failed: %ld\n", rc);
ok(type == REG_MULTI_SZ, "Expected type REG_MULTI_SZ, got %d\n", type); ok(type == REG_MULTI_SZ, "Expected type REG_MULTI_SZ, got %ld\n", type);
/* bogusDll was registered first, so that should be first */ /* bogus.dll was registered first, so that should be first */
ptr = dllBuf; ptr = dllBuf;
ok(!lstrcmpiA(ptr, bogusDll_A), "Unexpected dll\n"); ok(!lstrcmpiA(ptr, "bogus.dll"), "Unexpected dll\n");
ptr += lstrlenA(ptr) + 1; ptr += lstrlenA(ptr) + 1;
ok(!lstrcmpiA(ptr, bogus2Dll_A), "Unexpected dll\n"); ok(!lstrcmpiA(ptr, "bogus2.dll"), "Unexpected dll\n");
RegCloseKey(key); RegCloseKey(key);
} }
/* Unregister both of them */ /* Unregister both of them */
ret = CryptUnregisterDefaultOIDFunction(0, "CertDllOpenStoreProv", ret = CryptUnregisterDefaultOIDFunction(0, "CertDllOpenStoreProv",
bogusDll); L"bogus.dll");
ok(ret, "CryptUnregisterDefaultOIDFunction failed: %08x\n", ok(ret, "CryptUnregisterDefaultOIDFunction failed: %08lx\n",
GetLastError()); GetLastError());
ret = CryptUnregisterDefaultOIDFunction(0, "CertDllOpenStoreProv", ret = CryptUnregisterDefaultOIDFunction(0, "CertDllOpenStoreProv",
bogus2Dll); L"bogus2.dll");
ok(ret, "CryptUnregisterDefaultOIDFunction failed: %08x\n", ok(ret, "CryptUnregisterDefaultOIDFunction failed: %08lx\n",
GetLastError()); GetLastError());
/* Now that they're both unregistered, unregistering should fail */ /* Now that they're both unregistered, unregistering should fail */
ret = CryptUnregisterDefaultOIDFunction(0, "CertDllOpenStoreProv", ret = CryptUnregisterDefaultOIDFunction(0, "CertDllOpenStoreProv",
bogusDll); L"bogus.dll");
ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); "Expected ERROR_FILE_NOT_FOUND, got %ld\n", GetLastError());
/* Repeat a few tests on the normal encoding type */ /* Repeat a few tests on the normal encoding type */
ret = CryptRegisterDefaultOIDFunction(X509_ASN_ENCODING, ret = CryptRegisterDefaultOIDFunction(X509_ASN_ENCODING,
"CertDllOpenStoreProv", 0, bogusDll); "CertDllOpenStoreProv", 0, L"bogus.dll");
ok(ret, "CryptRegisterDefaultOIDFunction failed\n"); ok(ret, "CryptRegisterDefaultOIDFunction failed\n");
ret = CryptUnregisterDefaultOIDFunction(X509_ASN_ENCODING, ret = CryptUnregisterDefaultOIDFunction(X509_ASN_ENCODING,
"CertDllOpenStoreProv", bogusDll); "CertDllOpenStoreProv", L"bogus.dll");
ok(ret, "CryptUnregisterDefaultOIDFunction failed\n"); ok(ret, "CryptUnregisterDefaultOIDFunction failed\n");
ret = CryptUnregisterDefaultOIDFunction(X509_ASN_ENCODING, ret = CryptUnregisterDefaultOIDFunction(X509_ASN_ENCODING,
"CertDllOpenStoreProv", bogusDll); "CertDllOpenStoreProv", L"bogus.dll");
ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError()); "Expected ERROR_FILE_NOT_FOUND, got %08lx\n", GetLastError());
} }
static void test_getDefaultOIDFunctionAddress(void) static void test_getDefaultOIDFunctionAddress(void)
@@ -480,34 +449,34 @@ static void test_getDefaultOIDFunctionAddress(void)
&hFuncAddr); &hFuncAddr);
*/ */
set = CryptInitOIDFunctionSet("CertDllOpenStoreProv", 0); set = CryptInitOIDFunctionSet("CertDllOpenStoreProv", 0);
ok(set != 0, "CryptInitOIDFunctionSet failed: %d\n", GetLastError()); ok(set != 0, "CryptInitOIDFunctionSet failed: %ld\n", GetLastError());
/* This crashes if hFuncAddr is not 0 to begin with */ /* This crashes if hFuncAddr is not 0 to begin with */
hFuncAddr = 0; hFuncAddr = 0;
ret = CryptGetDefaultOIDFunctionAddress(set, 0, NULL, 0, &funcAddr, ret = CryptGetDefaultOIDFunctionAddress(set, 0, NULL, 0, &funcAddr,
&hFuncAddr); &hFuncAddr);
ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); "Expected ERROR_FILE_NOT_FOUND, got %ld\n", GetLastError());
/* This fails with the normal encoding too, so built-in functions aren't /* This fails with the normal encoding too, so built-in functions aren't
* returned. * returned.
*/ */
ret = CryptGetDefaultOIDFunctionAddress(set, X509_ASN_ENCODING, NULL, 0, ret = CryptGetDefaultOIDFunctionAddress(set, X509_ASN_ENCODING, NULL, 0,
&funcAddr, &hFuncAddr); &funcAddr, &hFuncAddr);
ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); "Expected ERROR_FILE_NOT_FOUND, got %ld\n", GetLastError());
/* Even with a registered dll, this fails (since the dll doesn't exist) */ /* Even with a registered dll, this fails (since the dll doesn't exist) */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptRegisterDefaultOIDFunction(0, "CertDllOpenStoreProv", 0, ret = CryptRegisterDefaultOIDFunction(0, "CertDllOpenStoreProv", 0,
bogusDll); L"bogus.dll");
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
skip("Need admin rights\n"); skip("Need admin rights\n");
else else
ok(ret, "CryptRegisterDefaultOIDFunction failed: %08x\n", GetLastError()); ok(ret, "CryptRegisterDefaultOIDFunction failed: %08lx\n", GetLastError());
ret = CryptGetDefaultOIDFunctionAddress(set, 0, NULL, 0, &funcAddr, ret = CryptGetDefaultOIDFunctionAddress(set, 0, NULL, 0, &funcAddr,
&hFuncAddr); &hFuncAddr);
ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); "Expected ERROR_FILE_NOT_FOUND, got %ld\n", GetLastError());
CryptUnregisterDefaultOIDFunction(0, "CertDllOpenStoreProv", bogusDll); CryptUnregisterDefaultOIDFunction(0, "CertDllOpenStoreProv", L"bogus.dll");
} }
static BOOL WINAPI countOidInfo(PCCRYPT_OID_INFO pInfo, void *pvArg) static BOOL WINAPI countOidInfo(PCCRYPT_OID_INFO pInfo, void *pvArg)
@@ -526,29 +495,22 @@ static void test_enumOIDInfo(void)
BOOL ret; BOOL ret;
DWORD count = 0; DWORD count = 0;
if (!pCryptEnumOIDInfo)
{
win_skip("CryptEnumOIDInfo() is not available\n");
return;
}
/* This crashes /* This crashes
ret = pCryptEnumOIDInfo(7, 0, NULL, NULL); ret = CryptEnumOIDInfo(7, 0, NULL, NULL);
*/ */
/* Silly tests, check that more than one thing is enumerated */ /* Silly tests, check that more than one thing is enumerated */
ret = pCryptEnumOIDInfo(0, 0, &count, countOidInfo); ret = CryptEnumOIDInfo(0, 0, &count, countOidInfo);
ok(ret && count > 0, "Expected more than item enumerated\n"); ok(ret && count > 0, "Expected more than item enumerated\n");
ret = pCryptEnumOIDInfo(0, 0, NULL, noOidInfo); ret = CryptEnumOIDInfo(0, 0, NULL, noOidInfo);
ok(!ret, "Expected FALSE\n"); ok(!ret, "Expected FALSE\n");
} }
static void test_findOIDInfo(void) static void test_findOIDInfo(void)
{ {
static WCHAR sha256ECDSA[] = { 's','h','a','2','5','6','E','C','D','S','A',0 };
static WCHAR sha1[] = { 's','h','a','1',0 };
static CHAR oid_rsa_md5[] = szOID_RSA_MD5, oid_sha256[] = szOID_NIST_sha256; static CHAR oid_rsa_md5[] = szOID_RSA_MD5, oid_sha256[] = szOID_NIST_sha256;
static CHAR oid_ecdsa_sha256[] = szOID_ECDSA_SHA256; static CHAR oid_ecdsa_sha256[] = szOID_ECDSA_SHA256;
static CHAR oid_ecc_public_key[] = szOID_ECC_PUBLIC_KEY;
ALG_ID alg = CALG_SHA1; ALG_ID alg = CALG_SHA1;
ALG_ID algs[2] = { CALG_MD5, CALG_RSA_SIGN }; ALG_ID algs[2] = { CALG_MD5, CALG_RSA_SIGN };
const struct oid_info const struct oid_info
@@ -561,7 +523,7 @@ static void test_findOIDInfo(void)
} oid_test_info [] = } oid_test_info [] =
{ {
{ CRYPT_OID_INFO_OID_KEY, oid_rsa_md5, szOID_RSA_MD5, CALG_MD5 }, { CRYPT_OID_INFO_OID_KEY, oid_rsa_md5, szOID_RSA_MD5, CALG_MD5 },
{ CRYPT_OID_INFO_NAME_KEY, sha1, szOID_OIWSEC_sha1, CALG_SHA1 }, { CRYPT_OID_INFO_NAME_KEY, (void *)L"sha1", szOID_OIWSEC_sha1, CALG_SHA1 },
{ CRYPT_OID_INFO_ALGID_KEY, &alg, szOID_OIWSEC_sha1, CALG_SHA1 }, { CRYPT_OID_INFO_ALGID_KEY, &alg, szOID_OIWSEC_sha1, CALG_SHA1 },
{ CRYPT_OID_INFO_SIGN_KEY, algs, szOID_RSA_MD5RSA, CALG_MD5 }, { CRYPT_OID_INFO_SIGN_KEY, algs, szOID_RSA_MD5RSA, CALG_MD5 },
{ CRYPT_OID_INFO_OID_KEY, oid_sha256, szOID_NIST_sha256, CALG_SHA_256, -1 }, { CRYPT_OID_INFO_OID_KEY, oid_sha256, szOID_NIST_sha256, CALG_SHA_256, -1 },
@@ -581,8 +543,8 @@ static void test_findOIDInfo(void)
if (info) if (info)
{ {
ok(!strcmp(info->pszOID, test->oid), "Unexpected OID %s, expected %s\n", info->pszOID, test->oid); ok(!strcmp(info->pszOID, test->oid), "Unexpected OID %s, expected %s\n", info->pszOID, test->oid);
ok(U(*info).Algid == test->algid || broken(U(*info).Algid == test->broken_algid), ok(info->Algid == test->algid || broken(info->Algid == test->broken_algid),
"Unexpected Algid %d, expected %d\n", U(*info).Algid, test->algid); "Unexpected Algid %d, expected %d\n", info->Algid, test->algid);
} }
} }
@@ -591,20 +553,20 @@ static void test_findOIDInfo(void)
{ {
DWORD *data; DWORD *data;
ok(info->cbSize == sizeof(*info), "Unexpected structure size %d.\n", info->cbSize); ok(info->cbSize == sizeof(*info), "Unexpected structure size %ld.\n", info->cbSize);
ok(!strcmp(info->pszOID, oid_ecdsa_sha256), "Expected %s, got %s\n", oid_ecdsa_sha256, info->pszOID); ok(!strcmp(info->pszOID, oid_ecdsa_sha256), "Expected %s, got %s\n", oid_ecdsa_sha256, info->pszOID);
ok(!lstrcmpW(info->pwszName, sha256ECDSA), "Expected %s, got %s\n", ok(!lstrcmpW(info->pwszName, L"sha256ECDSA"), "Expected %s, got %s\n",
wine_dbgstr_w(sha256ECDSA), wine_dbgstr_w(info->pwszName)); wine_dbgstr_w(L"sha256ECDSA"), wine_dbgstr_w(info->pwszName));
ok(info->dwGroupId == CRYPT_SIGN_ALG_OID_GROUP_ID, ok(info->dwGroupId == CRYPT_SIGN_ALG_OID_GROUP_ID,
"Expected CRYPT_SIGN_ALG_OID_GROUP_ID, got %u\n", info->dwGroupId); "Expected CRYPT_SIGN_ALG_OID_GROUP_ID, got %lu\n", info->dwGroupId);
ok(U(*info).Algid == CALG_OID_INFO_CNG_ONLY, ok(info->Algid == CALG_OID_INFO_CNG_ONLY,
"Expected CALG_OID_INFO_CNG_ONLY, got %d\n", U(*info).Algid); "Expected CALG_OID_INFO_CNG_ONLY, got %d\n", info->Algid);
data = (DWORD *)info->ExtraInfo.pbData; data = (DWORD *)info->ExtraInfo.pbData;
ok(info->ExtraInfo.cbData == 8, "Expected 8, got %d\n", info->ExtraInfo.cbData); ok(info->ExtraInfo.cbData == 8, "Expected 8, got %ld\n", info->ExtraInfo.cbData);
ok(data[0] == CALG_OID_INFO_PARAMETERS, "Expected CALG_OID_INFO_PARAMETERS, got %x\n", data[0]); ok(data[0] == CALG_OID_INFO_PARAMETERS, "Expected CALG_OID_INFO_PARAMETERS, got %lx\n", data[0]);
ok(data[1] == CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG, ok(data[1] == CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG,
"Expected CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG, got %x\n", data[1]); "Expected CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG, got %lx\n", data[1]);
ok(!lstrcmpW(info->pwszCNGAlgid, BCRYPT_SHA256_ALGORITHM), "Expected %s, got %s\n", ok(!lstrcmpW(info->pwszCNGAlgid, BCRYPT_SHA256_ALGORITHM), "Expected %s, got %s\n",
wine_dbgstr_w(BCRYPT_SHA256_ALGORITHM), wine_dbgstr_w(info->pwszCNGAlgid)); wine_dbgstr_w(BCRYPT_SHA256_ALGORITHM), wine_dbgstr_w(info->pwszCNGAlgid));
@@ -613,11 +575,21 @@ static void test_findOIDInfo(void)
} }
else else
win_skip("Host does not support ECDSA_SHA256, skipping test\n"); win_skip("Host does not support ECDSA_SHA256, skipping test\n");
info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, oid_ecc_public_key, 0);
ok(!!info, "got error %#lx.\n", GetLastError());
ok(!strcmp(info->pszOID, oid_ecc_public_key), "got %s.\n", info->pszOID);
ok(!wcscmp(info->pwszName, L"ECC"), "got %s.\n", wine_dbgstr_w(info->pwszName));
ok(info->dwGroupId == CRYPT_PUBKEY_ALG_OID_GROUP_ID, "got %lu.\n", info->dwGroupId);
ok(info->Algid == CALG_OID_INFO_PARAMETERS, "got %d.\n", info->Algid);
ok(!info->ExtraInfo.cbData, "got %ld.\n", info->ExtraInfo.cbData);
ok(!wcscmp(info->pwszCNGAlgid, CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM), "got %s.\n", wine_dbgstr_w(info->pwszCNGAlgid));
ok(info->pwszCNGExtraAlgid && !wcscmp(info->pwszCNGExtraAlgid, L""), "got %s.\n",
wine_dbgstr_w(info->pwszCNGExtraAlgid));
} }
static void test_registerOIDInfo(void) static void test_registerOIDInfo(void)
{ {
static const WCHAR winetestW[] = { 'w','i','n','e','t','e','s','t',0 };
static char test_oid[] = "1.2.3.4.5.6.7.8.9.10"; static char test_oid[] = "1.2.3.4.5.6.7.8.9.10";
CRYPT_OID_INFO info1; CRYPT_OID_INFO info1;
const CRYPT_OID_INFO *info2; const CRYPT_OID_INFO *info2;
@@ -628,25 +600,26 @@ static void test_registerOIDInfo(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptUnregisterOIDInfo(NULL); ret = CryptUnregisterOIDInfo(NULL);
ok(!ret, "should fail\n"); ok(!ret, "should fail\n");
ok(GetLastError() == E_INVALIDARG, "got %#x\n", GetLastError()); ok(GetLastError() == E_INVALIDARG, "got %#lx\n", GetLastError());
memset(&info1, 0, sizeof(info1)); memset(&info1, 0, sizeof(info1));
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptUnregisterOIDInfo(&info1); ret = CryptUnregisterOIDInfo(&info1);
ok(!ret, "should fail\n"); ok(!ret, "should fail\n");
ok(GetLastError() == E_INVALIDARG, "got %#x\n", GetLastError()); ok(GetLastError() == E_INVALIDARG, "got %#lx\n", GetLastError());
info1.cbSize = sizeof(info1); info1.cbSize = sizeof(info1);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptUnregisterOIDInfo(&info1); ret = CryptUnregisterOIDInfo(&info1);
ok(!ret, "should fail\n"); ok(!ret, "should fail\n");
ok(GetLastError() == E_INVALIDARG, "got %#x\n", GetLastError()); ok(GetLastError() == E_INVALIDARG, "got %#lx\n", GetLastError());
info1.pszOID = test_oid; info1.pszOID = test_oid;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptUnregisterOIDInfo(&info1); ret = CryptUnregisterOIDInfo(&info1);
ok(!ret, "should fail\n"); ok(!ret, "should fail\n");
ok(GetLastError() == ERROR_FILE_NOT_FOUND, "got %u\n", GetLastError()); ok(GetLastError() == ERROR_FILE_NOT_FOUND ||
GetLastError() == ERROR_ACCESS_DENIED, "got %lu\n", GetLastError());
info2 = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, (void *)test_oid, 0); info2 = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, (void *)test_oid, 0);
ok(!info2, "should fail\n"); ok(!info2, "should fail\n");
@@ -656,15 +629,15 @@ static void test_registerOIDInfo(void)
* registry on Windows because dwGroupId == 0. * registry on Windows because dwGroupId == 0.
*/ */
ret = CryptRegisterOIDInfo(&info1, 0); ret = CryptRegisterOIDInfo(&info1, 0);
ok(ret, "got %u\n", GetLastError()); ok(ret, "got %lu\n", GetLastError());
ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptDllFindOIDInfo\\1.2.3.4.5.6.7.8.9.10!1", &key); ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptDllFindOIDInfo\\1.2.3.4.5.6.7.8.9.10!1", &key);
ok(ret == ERROR_FILE_NOT_FOUND, "got %u\n", ret); ok(ret == ERROR_FILE_NOT_FOUND, "got %lu\n", ret);
info2 = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, (void *)test_oid, 0); info2 = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, (void *)test_oid, 0);
ok(!info2, "should fail\n"); ok(!info2, "should fail\n");
info1.pwszName = winetestW; info1.pwszName = L"winetest";
info1.dwGroupId = CRYPT_HASH_ALG_OID_GROUP_ID; info1.dwGroupId = CRYPT_HASH_ALG_OID_GROUP_ID;
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptRegisterOIDInfo(&info1, CRYPT_INSTALL_OID_INFO_BEFORE_FLAG); ret = CryptRegisterOIDInfo(&info1, CRYPT_INSTALL_OID_INFO_BEFORE_FLAG);
@@ -673,7 +646,7 @@ static void test_registerOIDInfo(void)
skip("Need admin rights\n"); skip("Need admin rights\n");
return; return;
} }
ok(ret, "got %u\n", GetLastError()); ok(ret, "got %lu\n", GetLastError());
/* It looks like crypt32 reads the OID info from registry only on load, /* It looks like crypt32 reads the OID info from registry only on load,
* and CryptFindOIDInfo will find the registered OID on next run * and CryptFindOIDInfo will find the registered OID on next run
@@ -682,38 +655,38 @@ static void test_registerOIDInfo(void)
ok(!info2, "should fail\n"); ok(!info2, "should fail\n");
ret = RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptDllFindOIDInfo\\1.2.3.4.5.6.7.8.9.10!1", &key); ret = RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptDllFindOIDInfo\\1.2.3.4.5.6.7.8.9.10!1", &key);
ok(!ret, "got %u\n", ret); ok(!ret, "got %lu\n", ret);
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
size = sizeof(buf); size = sizeof(buf);
ret = RegQueryValueExA(key, "Name", NULL, &type, (BYTE *)buf, &size); ret = RegQueryValueExA(key, "Name", NULL, &type, (BYTE *)buf, &size);
ok(!ret, "got %u\n", ret); ok(!ret, "got %lu\n", ret);
ok(type == REG_SZ, "got %u\n", type); ok(type == REG_SZ, "got %lu\n", type);
ok(!strcmp(buf, "winetest"), "got %s\n", buf); ok(!strcmp(buf, "winetest"), "got %s\n", buf);
value = 0xdeadbeef; value = 0xdeadbeef;
size = sizeof(value); size = sizeof(value);
ret = RegQueryValueExA(key, "Flags", NULL, &type, (BYTE *)&value, &size); ret = RegQueryValueExA(key, "Flags", NULL, &type, (BYTE *)&value, &size);
ok(!ret, "got %u\n", ret); ok(!ret, "got %lu\n", ret);
ok(type == REG_DWORD, "got %u\n", type); ok(type == REG_DWORD, "got %lu\n", type);
ok(value == 1, "got %u\n", value); ok(value == 1, "got %lu\n", value);
RegCloseKey(key); RegCloseKey(key);
CryptUnregisterOIDInfo(&info1); CryptUnregisterOIDInfo(&info1);
ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptDllFindOIDInfo\\1.2.3.4.5.6.7.8.9.10!1", &key); ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptDllFindOIDInfo\\1.2.3.4.5.6.7.8.9.10!1", &key);
ok(ret == ERROR_FILE_NOT_FOUND, "got %u\n", ret); ok(ret == ERROR_FILE_NOT_FOUND, "got %lu\n", ret);
} }
START_TEST(oid) START_TEST(oid)
{ {
HMODULE hCrypt32 = GetModuleHandleA("crypt32.dll"); test_OIDToAlgID();
pCryptEnumOIDInfo = (void*)GetProcAddress(hCrypt32, "CryptEnumOIDInfo"); test_AlgIDToOID();
testOIDToAlgID();
testAlgIDToOID();
test_enumOIDInfo(); test_enumOIDInfo();
#ifdef __REACTOS__
if ((GetVersion() & 0xFF) > 5) // test_findOIDInfo() crashes on Server 2003
#endif
test_findOIDInfo(); test_findOIDInfo();
test_registerOIDInfo(); test_registerOIDInfo();
test_oidFunctionSet(); test_oidFunctionSet();

View File

@@ -27,13 +27,9 @@
#include "wine/test.h" #include "wine/test.h"
static BOOL (WINAPI *pCryptProtectData)(DATA_BLOB*,LPCWSTR,DATA_BLOB*,PVOID,CRYPTPROTECT_PROMPTSTRUCT*,DWORD,DATA_BLOB*);
static BOOL (WINAPI *pCryptUnprotectData)(DATA_BLOB*,LPWSTR*,DATA_BLOB*,PVOID,CRYPTPROTECT_PROMPTSTRUCT*,DWORD,DATA_BLOB*);
static char secret[] = "I am a super secret string that no one can see!"; static char secret[] = "I am a super secret string that no one can see!";
static char secret2[] = "I am a super secret string indescribable string"; static char secret2[] = "I am a super secret string indescribable string";
static char key[] = "Wibble wibble wibble"; static char key[] = "Wibble wibble wibble";
static const WCHAR desc[] = {'U','l','t','r','a',' ','s','e','c','r','e','t',' ','t','e','s','t',' ','m','e','s','s','a','g','e',0};
static BOOL protected = FALSE; /* if true, the unprotect tests can run */ static BOOL protected = FALSE; /* if true, the unprotect tests can run */
static DATA_BLOB cipher; static DATA_BLOB cipher;
static DATA_BLOB cipher_entropy; static DATA_BLOB cipher_entropy;
@@ -52,32 +48,28 @@ static void test_cryptprotectdata(void)
entropy.cbData=strlen(key)+1; entropy.cbData=strlen(key)+1;
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
protected = pCryptProtectData(NULL,desc,NULL,NULL,NULL,0,&cipher); protected = CryptProtectData(NULL, L"Ultra secret test message", NULL, NULL, NULL, 0, &cipher);
ok(!protected, "Encrypting without plain data source.\n"); ok(!protected, "Encrypting without plain data source.\n");
r = GetLastError(); r = GetLastError();
ok(r == ERROR_INVALID_PARAMETER, "Wrong (%u) GetLastError seen\n",r); ok(r == ERROR_INVALID_PARAMETER, "Wrong (%lu) GetLastError seen\n",r);
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
protected = pCryptProtectData(&plain,desc,NULL,NULL,NULL,0,NULL); protected = CryptProtectData(&plain, L"Ultra secret test message", NULL, NULL, NULL, 0, NULL);
ok(!protected, "Encrypting without cipher destination.\n"); ok(!protected, "Encrypting without cipher destination.\n");
r = GetLastError(); r = GetLastError();
ok(r == ERROR_INVALID_PARAMETER, "Wrong (%u) GetLastError seen\n",r); ok(r == ERROR_INVALID_PARAMETER, "Wrong (%lu) GetLastError seen\n",r);
cipher.pbData=NULL; cipher.pbData=NULL;
cipher.cbData=0; cipher.cbData=0;
/* without entropy */ /* without entropy */
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
protected = pCryptProtectData(&plain,desc,NULL,NULL,NULL,0,&cipher); protected = CryptProtectData(&plain, L"Ultra secret test message", NULL, NULL, NULL, 0, &cipher);
ok(protected || ok(protected, "Encrypting without entropy.\n");
broken(!protected), /* Win9x/NT4 */
"Encrypting without entropy.\n");
if (protected) if (protected)
{ {
r = GetLastError(); r = GetLastError();
ok(r == ERROR_SUCCESS || ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n",r);
r == ERROR_IO_PENDING, /* win2k */
"Expected ERROR_SUCCESS or ERROR_IO_PENDING, got %d\n",r);
} }
cipher_entropy.pbData=NULL; cipher_entropy.pbData=NULL;
@@ -85,10 +77,8 @@ static void test_cryptprotectdata(void)
/* with entropy */ /* with entropy */
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
protected = pCryptProtectData(&plain,desc,&entropy,NULL,NULL,0,&cipher_entropy); protected = CryptProtectData(&plain, L"Ultra secret test message", &entropy, NULL, NULL, 0, &cipher_entropy);
ok(protected || ok(protected, "Encrypting with entropy.\n");
broken(!protected), /* Win9x/NT4 */
"Encrypting with entropy.\n");
cipher_no_desc.pbData=NULL; cipher_no_desc.pbData=NULL;
cipher_no_desc.cbData=0; cipher_no_desc.cbData=0;
@@ -97,13 +87,8 @@ static void test_cryptprotectdata(void)
plain.pbData=(void*)secret2; plain.pbData=(void*)secret2;
plain.cbData=strlen(secret2)+1; plain.cbData=strlen(secret2)+1;
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
protected = pCryptProtectData(&plain,NULL,&entropy,NULL,NULL,0,&cipher_no_desc); protected = CryptProtectData(&plain,NULL,&entropy,NULL,NULL,0,&cipher_no_desc);
if (!protected) ok(protected, "Encrypting with entropy.\n");
{
/* fails in win2k */
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
}
} }
static void test_cryptunprotectdata(void) static void test_cryptunprotectdata(void)
@@ -117,36 +102,29 @@ static void test_cryptunprotectdata(void)
entropy.pbData=(void*)key; entropy.pbData=(void*)key;
entropy.cbData=strlen(key)+1; entropy.cbData=strlen(key)+1;
/* fails in win2k */
if (!protected)
{
skip("CryptProtectData failed to run\n");
return;
}
plain.pbData=NULL; plain.pbData=NULL;
plain.cbData=0; plain.cbData=0;
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
okay = pCryptUnprotectData(&cipher,NULL,NULL,NULL,NULL,0,NULL); okay = CryptUnprotectData(&cipher,NULL,NULL,NULL,NULL,0,NULL);
ok(!okay,"Decrypting without destination\n"); ok(!okay,"Decrypting without destination\n");
r = GetLastError(); r = GetLastError();
ok(r == ERROR_INVALID_PARAMETER, "Wrong (%u) GetLastError seen\n",r); ok(r == ERROR_INVALID_PARAMETER, "Wrong (%lu) GetLastError seen\n",r);
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
okay = pCryptUnprotectData(NULL,NULL,NULL,NULL,NULL,0,&plain); okay = CryptUnprotectData(NULL,NULL,NULL,NULL,NULL,0,&plain);
ok(!okay,"Decrypting without source\n"); ok(!okay,"Decrypting without source\n");
r = GetLastError(); r = GetLastError();
ok(r == ERROR_INVALID_PARAMETER, "Wrong (%u) GetLastError seen\n",r); ok(r == ERROR_INVALID_PARAMETER, "Wrong (%lu) GetLastError seen\n",r);
plain.pbData=NULL; plain.pbData=NULL;
plain.cbData=0; plain.cbData=0;
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
okay = pCryptUnprotectData(&cipher_entropy,NULL,NULL,NULL,NULL,0,&plain); okay = CryptUnprotectData(&cipher_entropy,NULL,NULL,NULL,NULL,0,&plain);
ok(!okay,"Decrypting without needed entropy\n"); ok(!okay,"Decrypting without needed entropy\n");
r = GetLastError(); r = GetLastError();
ok(r == ERROR_INVALID_DATA, "Wrong (%u) GetLastError seen\n", r); ok(r == ERROR_INVALID_DATA, "Wrong (%lu) GetLastError seen\n", r);
plain.pbData=NULL; plain.pbData=NULL;
plain.cbData=0; plain.cbData=0;
@@ -154,14 +132,14 @@ static void test_cryptunprotectdata(void)
/* without entropy */ /* without entropy */
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
okay = pCryptUnprotectData(&cipher,&data_desc,NULL,NULL,NULL,0,&plain); okay = CryptUnprotectData(&cipher,&data_desc,NULL,NULL,NULL,0,&plain);
ok(okay,"Decrypting without entropy\n"); ok(okay,"Decrypting without entropy\n");
ok(plain.pbData!=NULL,"Plain DATA_BLOB missing data\n"); ok(plain.pbData!=NULL,"Plain DATA_BLOB missing data\n");
ok(plain.cbData==strlen(secret)+1,"Plain DATA_BLOB wrong length\n"); ok(plain.cbData==strlen(secret)+1,"Plain DATA_BLOB wrong length\n");
ok(!strcmp((const char*)plain.pbData,secret),"Plain does not match secret\n"); ok(!strcmp((const char*)plain.pbData,secret),"Plain does not match secret\n");
ok(data_desc!=NULL,"Description not allocated\n"); ok(data_desc!=NULL,"Description not allocated\n");
ok(!lstrcmpW(data_desc,desc),"Description does not match\n"); ok(!lstrcmpW(data_desc, L"Ultra secret test message"),"Description does not match\n");
LocalFree(plain.pbData); LocalFree(plain.pbData);
LocalFree(data_desc); LocalFree(data_desc);
@@ -172,21 +150,21 @@ static void test_cryptunprotectdata(void)
/* with wrong entropy */ /* with wrong entropy */
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
okay = pCryptUnprotectData(&cipher_entropy,&data_desc,&cipher_entropy,NULL,NULL,0,&plain); okay = CryptUnprotectData(&cipher_entropy,&data_desc,&cipher_entropy,NULL,NULL,0,&plain);
ok(!okay,"Decrypting with wrong entropy\n"); ok(!okay,"Decrypting with wrong entropy\n");
r = GetLastError(); r = GetLastError();
ok(r == ERROR_INVALID_DATA, "Wrong (%u) GetLastError seen\n",r); ok(r == ERROR_INVALID_DATA, "Wrong (%lu) GetLastError seen\n",r);
/* with entropy */ /* with entropy */
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
okay = pCryptUnprotectData(&cipher_entropy,&data_desc,&entropy,NULL,NULL,0,&plain); okay = CryptUnprotectData(&cipher_entropy,&data_desc,&entropy,NULL,NULL,0,&plain);
ok(okay,"Decrypting with entropy\n"); ok(okay,"Decrypting with entropy\n");
ok(plain.pbData!=NULL,"Plain DATA_BLOB missing data\n"); ok(plain.pbData!=NULL,"Plain DATA_BLOB missing data\n");
ok(plain.cbData==strlen(secret)+1,"Plain DATA_BLOB wrong length\n"); ok(plain.cbData==strlen(secret)+1,"Plain DATA_BLOB wrong length\n");
ok(!strcmp((const char*)plain.pbData,secret),"Plain does not match secret\n"); ok(!strcmp((const char*)plain.pbData,secret),"Plain does not match secret\n");
ok(data_desc!=NULL,"Description not allocated\n"); ok(data_desc!=NULL,"Description not allocated\n");
ok(!lstrcmpW(data_desc,desc),"Description does not match\n"); ok(!lstrcmpW(data_desc, L"Ultra secret test message"),"Description does not match\n");
LocalFree(plain.pbData); LocalFree(plain.pbData);
LocalFree(data_desc); LocalFree(data_desc);
@@ -197,7 +175,7 @@ static void test_cryptunprotectdata(void)
/* with entropy but no description */ /* with entropy but no description */
SetLastError(0xDEADBEEF); SetLastError(0xDEADBEEF);
okay = pCryptUnprotectData(&cipher_no_desc,&data_desc,&entropy,NULL,NULL,0,&plain); okay = CryptUnprotectData(&cipher_no_desc,&data_desc,&entropy,NULL,NULL,0,&plain);
ok(okay,"Decrypting with entropy and no description\n"); ok(okay,"Decrypting with entropy and no description\n");
ok(plain.pbData!=NULL,"Plain DATA_BLOB missing data\n"); ok(plain.pbData!=NULL,"Plain DATA_BLOB missing data\n");
@@ -224,18 +202,12 @@ static void test_simpleroundtrip(const char *plaintext)
emptyW[0] = 0; emptyW[0] = 0;
input.pbData = (unsigned char *)plaintext; input.pbData = (unsigned char *)plaintext;
input.cbData = strlen(plaintext); input.cbData = strlen(plaintext);
res = pCryptProtectData(&input, emptyW, NULL, NULL, NULL, 0, &encrypted); res = CryptProtectData(&input, emptyW, NULL, NULL, NULL, 0, &encrypted);
ok(res != 0 || broken(!res), "can't protect\n"); ok(res != 0, "can't protect\n");
if (!res)
{
/* Fails on Win9x, NT4 */
win_skip("CryptProtectData failed\n");
return;
}
res = pCryptUnprotectData(&encrypted, NULL, NULL, NULL, NULL, 0, &output); res = CryptUnprotectData(&encrypted, NULL, NULL, NULL, NULL, 0, &output);
ok(res != 0, "can't unprotect; last error %u\n", GetLastError()); ok(res != 0, "can't unprotect; last error %lu\n", GetLastError());
ok(output.cbData == strlen(plaintext), "output wrong length %d for input '%s', wanted %d\n", output.cbData, plaintext, lstrlenA(plaintext)); ok(output.cbData == strlen(plaintext), "output wrong length %ld for input '%s', wanted %d\n", output.cbData, plaintext, lstrlenA(plaintext));
ok(!memcmp(plaintext, (char *)output.pbData, output.cbData), "output wrong contents for input '%s'\n", plaintext); ok(!memcmp(plaintext, (char *)output.pbData, output.cbData), "output wrong contents for input '%s'\n", plaintext);
LocalFree(output.pbData); LocalFree(output.pbData);
LocalFree(encrypted.pbData); LocalFree(encrypted.pbData);
@@ -243,16 +215,7 @@ static void test_simpleroundtrip(const char *plaintext)
START_TEST(protectdata) START_TEST(protectdata)
{ {
HMODULE hCrypt32 = GetModuleHandleA("crypt32.dll"); protected = FALSE;
pCryptProtectData = (void*)GetProcAddress(hCrypt32, "CryptProtectData");
pCryptUnprotectData = (void*)GetProcAddress(hCrypt32, "CryptUnprotectData");
if (!pCryptProtectData || !pCryptUnprotectData)
{
win_skip("Crypt(Un)ProtectData() is not available\n");
return;
}
protected=FALSE;
test_cryptprotectdata(); test_cryptprotectdata();
test_cryptunprotectdata(); test_cryptunprotectdata();
test_simpleroundtrip(""); test_simpleroundtrip("");

View File

@@ -41,15 +41,13 @@ static void test_AddRemoveProvider(void)
BOOL ret; BOOL ret;
SIP_ADD_NEWPROVIDER newprov; SIP_ADD_NEWPROVIDER newprov;
GUID actionid = { 0xdeadbe, 0xefde, 0xadbe, { 0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe }}; GUID actionid = { 0xdeadbe, 0xefde, 0xadbe, { 0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe }};
static WCHAR dummydll[] = {'d','e','a','d','b','e','e','f','.','d','l','l',0 };
static WCHAR dummyfunction[] = {'d','u','m','m','y','f','u','n','c','t','i','o','n',0 };
/* NULL check */ /* NULL check */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSIPRemoveProvider(NULL); ret = CryptSIPRemoveProvider(NULL);
ok (!ret, "Expected CryptSIPRemoveProvider to fail.\n"); ok (!ret, "Expected CryptSIPRemoveProvider to fail.\n");
ok (GetLastError() == ERROR_INVALID_PARAMETER, ok (GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d.\n", GetLastError()); "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError());
/* nonexistent provider should result in a registry error */ /* nonexistent provider should result in a registry error */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
@@ -59,17 +57,6 @@ static void test_AddRemoveProvider(void)
/* Apparently the needed rights are checked before the existence of the provider */ /* Apparently the needed rights are checked before the existence of the provider */
skip("Need admin rights\n"); skip("Need admin rights\n");
} }
else
{
/* On some Win98 systems, CryptSIPRemoveProvider always succeeds if
* the arguments are correct, whether or not the registry key is
* present, so don't test ret, just check the last error if it does
* return FALSE.
*/
if (!ret)
ok (GetLastError() == ERROR_FILE_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND, got %d.\n", GetLastError());
}
/* Everything OK, pwszIsFunctionName and pwszIsFunctionNameFmt2 are left NULL /* Everything OK, pwszIsFunctionName and pwszIsFunctionNameFmt2 are left NULL
* as allowed */ * as allowed */
@@ -77,12 +64,12 @@ static void test_AddRemoveProvider(void)
memset(&newprov, 0, sizeof(SIP_ADD_NEWPROVIDER)); memset(&newprov, 0, sizeof(SIP_ADD_NEWPROVIDER));
newprov.cbStruct = sizeof(SIP_ADD_NEWPROVIDER); newprov.cbStruct = sizeof(SIP_ADD_NEWPROVIDER);
newprov.pgSubject = &actionid; newprov.pgSubject = &actionid;
newprov.pwszDLLFileName = dummydll; newprov.pwszDLLFileName = (WCHAR *)L"deadbeef.dll";
newprov.pwszGetFuncName = dummyfunction; newprov.pwszGetFuncName = (WCHAR *)L"dummyfunction";
newprov.pwszPutFuncName = dummyfunction; newprov.pwszPutFuncName = (WCHAR *)L"dummyfunction";
newprov.pwszCreateFuncName = dummyfunction; newprov.pwszCreateFuncName = (WCHAR *)L"dummyfunction";
newprov.pwszVerifyFuncName = dummyfunction; newprov.pwszVerifyFuncName = (WCHAR *)L"dummyfunction";
newprov.pwszRemoveFuncName = dummyfunction; newprov.pwszRemoveFuncName = (WCHAR *)L"dummyfunction";
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSIPAddProvider(&newprov); ret = CryptSIPAddProvider(&newprov);
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
@@ -90,7 +77,7 @@ static void test_AddRemoveProvider(void)
skip("Need admin rights\n"); skip("Need admin rights\n");
return; return;
} }
ok ( ret, "CryptSIPAddProvider should have succeeded, last error %d\n", GetLastError()); ok ( ret, "CryptSIPAddProvider should have succeeded, last error %ld\n", GetLastError());
/* Dummy provider will be deleted, but the function still fails because /* Dummy provider will be deleted, but the function still fails because
* pwszIsFunctionName and pwszIsFunctionNameFmt2 are not present in the * pwszIsFunctionName and pwszIsFunctionNameFmt2 are not present in the
@@ -98,38 +85,32 @@ static void test_AddRemoveProvider(void)
*/ */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSIPRemoveProvider(&actionid); ret = CryptSIPRemoveProvider(&actionid);
/* On some Win98 systems, CryptSIPRemoveProvider always succeeds if ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
* the arguments are correct, whether or not the registry key is "Expected ERROR_FILE_NOT_FOUND, got %ld.\n", GetLastError());
* present, so don't test ret, just check the last error if it does
* return FALSE.
*/
if (!ret)
ok (GetLastError() == ERROR_FILE_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND, got %d.\n", GetLastError());
/* Everything OK */ /* Everything OK */
memset(&newprov, 0, sizeof(SIP_ADD_NEWPROVIDER)); memset(&newprov, 0, sizeof(SIP_ADD_NEWPROVIDER));
newprov.cbStruct = sizeof(SIP_ADD_NEWPROVIDER); newprov.cbStruct = sizeof(SIP_ADD_NEWPROVIDER);
newprov.pgSubject = &actionid; newprov.pgSubject = &actionid;
newprov.pwszDLLFileName = dummydll; newprov.pwszDLLFileName = (WCHAR *)L"deadbeef.dll";
newprov.pwszGetFuncName = dummyfunction; newprov.pwszGetFuncName = (WCHAR *)L"dummyfunction";
newprov.pwszPutFuncName = dummyfunction; newprov.pwszPutFuncName = (WCHAR *)L"dummyfunction";
newprov.pwszCreateFuncName = dummyfunction; newprov.pwszCreateFuncName = (WCHAR *)L"dummyfunction";
newprov.pwszVerifyFuncName = dummyfunction; newprov.pwszVerifyFuncName = (WCHAR *)L"dummyfunction";
newprov.pwszRemoveFuncName = dummyfunction; newprov.pwszRemoveFuncName = (WCHAR *)L"dummyfunction";
newprov.pwszIsFunctionNameFmt2 = dummyfunction; newprov.pwszIsFunctionNameFmt2 = (WCHAR *)L"dummyfunction";
newprov.pwszIsFunctionName = dummyfunction; newprov.pwszIsFunctionName = (WCHAR *)L"dummyfunction";
/* If GetCapFuncName set to NULL, then CryptSIPRemoveProvider fails on win 8 */ /* If GetCapFuncName set to NULL, then CryptSIPRemoveProvider fails on win 8 */
newprov.pwszGetCapFuncName = dummyfunction; newprov.pwszGetCapFuncName = (WCHAR *)L"dummyfunction";
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSIPAddProvider(&newprov); ret = CryptSIPAddProvider(&newprov);
ok ( ret, "CryptSIPAddProvider should have succeeded, last error %d\n", GetLastError()); ok ( ret, "CryptSIPAddProvider should have succeeded, last error %ld\n", GetLastError());
/* Dummy provider should be deleted */ /* Dummy provider should be deleted */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSIPRemoveProvider(&actionid); ret = CryptSIPRemoveProvider(&actionid);
ok ( ret, "CryptSIPRemoveProvider should have succeeded, last error %d\n", GetLastError()); ok ( ret, "CryptSIPRemoveProvider should have succeeded, last error %ld\n", GetLastError());
} }
static const BYTE cabFileData[] = { static const BYTE cabFileData[] = {
@@ -148,7 +129,6 @@ static void test_SIPRetrieveSubjectGUID(void)
static const CHAR windir[] = "windir"; static const CHAR windir[] = "windir";
static const CHAR regeditExe[] = "regedit.exe"; static const CHAR regeditExe[] = "regedit.exe";
static const GUID nullSubject = { 0x0, 0x0, 0x0, { 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 }}; static const GUID nullSubject = { 0x0, 0x0, 0x0, { 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 }};
static const WCHAR deadbeef[] = { 'c',':','\\','d','e','a','d','b','e','e','f','.','d','b','f',0 };
/* Couldn't find a name for this GUID, it's the one used for 95% of the files */ /* Couldn't find a name for this GUID, it's the one used for 95% of the files */
static const GUID unknownGUID = { 0xC689AAB8, 0x8E78, 0x11D0, { 0x8C,0x47,0x00,0xC0,0x4F,0xC2,0x95,0xEE }}; static const GUID unknownGUID = { 0xC689AAB8, 0x8E78, 0x11D0, { 0x8C,0x47,0x00,0xC0,0x4F,0xC2,0x95,0xEE }};
static const GUID cabGUID = { 0xc689aaba, 0x8e78, 0x11d0, {0x8c,0x47,0x00,0xc0,0x4f,0xc2,0x95,0xee }}; static const GUID cabGUID = { 0xc689aaba, 0x8e78, 0x11d0, {0x8c,0x47,0x00,0xc0,0x4f,0xc2,0x95,0xee }};
@@ -164,17 +144,17 @@ static void test_SIPRetrieveSubjectGUID(void)
ret = CryptSIPRetrieveSubjectGuid(NULL, NULL, NULL); ret = CryptSIPRetrieveSubjectGuid(NULL, NULL, NULL);
ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n"); ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n");
ok (GetLastError() == ERROR_INVALID_PARAMETER, ok (GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d.\n", GetLastError()); "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError());
/* Test with a nonexistent file (hopefully) */ /* Test with a nonexistent file (hopefully) */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
/* Set subject to something other than zeros */ /* Set subject to something other than zeros */
memset(&subject, 1, sizeof(GUID)); memset(&subject, 1, sizeof(GUID));
ret = CryptSIPRetrieveSubjectGuid(deadbeef, NULL, &subject); ret = CryptSIPRetrieveSubjectGuid(L"c:\\deadbeef.dbf", NULL, &subject);
ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n"); ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n");
ok (GetLastError() == ERROR_FILE_NOT_FOUND || ok (GetLastError() == ERROR_FILE_NOT_FOUND ||
GetLastError() == ERROR_PATH_NOT_FOUND, GetLastError() == ERROR_PATH_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND or ERROR_PATH_NOT_FOUND, got %d.\n", "Expected ERROR_FILE_NOT_FOUND or ERROR_PATH_NOT_FOUND, got %ld.\n",
GetLastError()); GetLastError());
ok(IsEqualGUID(&subject, &nullSubject), ok(IsEqualGUID(&subject, &nullSubject),
"Expected a NULL GUID for c:\\deadbeef.dbf, not %s\n", wine_dbgstr_guid(&subject)); "Expected a NULL GUID for c:\\deadbeef.dbf, not %s\n", wine_dbgstr_guid(&subject));
@@ -184,7 +164,7 @@ static void test_SIPRetrieveSubjectGUID(void)
* Use A-functions where possible as that should be available on all platforms * Use A-functions where possible as that should be available on all platforms
*/ */
ret = GetEnvironmentVariableA(windir, regeditPath, MAX_PATH); ret = GetEnvironmentVariableA(windir, regeditPath, MAX_PATH);
ok (ret > 0, "expected GEVA(windir) to succeed, last error %d\n", GetLastError()); ok (ret > 0, "expected GEVA(windir) to succeed, last error %ld\n", GetLastError());
strcat(regeditPath, "\\"); strcat(regeditPath, "\\");
strcat(regeditPath, regeditExe); strcat(regeditPath, regeditExe);
MultiByteToWideChar(CP_ACP, 0, regeditPath, strlen(regeditPath)+1, regeditPathW, MultiByteToWideChar(CP_ACP, 0, regeditPath, strlen(regeditPath)+1, regeditPathW,
@@ -226,11 +206,8 @@ static void test_SIPRetrieveSubjectGUID(void)
memset(&subject, 1, sizeof(GUID)); memset(&subject, 1, sizeof(GUID));
ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject); ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject);
ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n"); ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n");
ok ( GetLastError() == ERROR_FILE_INVALID || ok ( GetLastError() == ERROR_FILE_INVALID || GetLastError() == ERROR_INVALID_PARAMETER,
GetLastError() == ERROR_INVALID_PARAMETER /* Vista */ || "Expected ERROR_FILE_INVALID, ERROR_INVALID_PARAMETER, got 0x%08lx\n", GetLastError());
GetLastError() == ERROR_SUCCESS /* most Win98 */ ||
GetLastError() == TRUST_E_SUBJECT_FORM_UNKNOWN /* some Win98 */,
"Expected ERROR_FILE_INVALID, ERROR_INVALID_PARAMETER, ERROR_SUCCESS or TRUST_E_SUBJECT_FORM_UNKNOWN, got 0x%08x\n", GetLastError());
ok(IsEqualGUID(&subject, &nullSubject), ok(IsEqualGUID(&subject, &nullSubject),
"Expected a NULL GUID for empty file %s, not %s\n", tempfile, wine_dbgstr_guid(&subject)); "Expected a NULL GUID for empty file %s, not %s\n", tempfile, wine_dbgstr_guid(&subject));
@@ -243,10 +220,8 @@ static void test_SIPRetrieveSubjectGUID(void)
memset(&subject, 1, sizeof(GUID)); memset(&subject, 1, sizeof(GUID));
ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject); ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject);
ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n"); ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n");
ok ( GetLastError() == ERROR_INVALID_PARAMETER || ok ( GetLastError() == ERROR_INVALID_PARAMETER,
GetLastError() == ERROR_SUCCESS /* most Win98 */ || "Expected ERROR_INVALID_PARAMETER, got 0x%08lx\n", GetLastError());
GetLastError() == TRUST_E_SUBJECT_FORM_UNKNOWN /* some Win98 */,
"Expected ERROR_INVALID_PARAMETER, ERROR_SUCCESS or TRUST_E_SUBJECT_FORM_UNKNOWN, got 0x%08x\n", GetLastError());
ok(IsEqualGUID(&subject, &nullSubject), ok(IsEqualGUID(&subject, &nullSubject),
"Expected a NULL GUID for empty file %s, not %s\n", tempfile, wine_dbgstr_guid(&subject)); "Expected a NULL GUID for empty file %s, not %s\n", tempfile, wine_dbgstr_guid(&subject));
@@ -259,9 +234,8 @@ static void test_SIPRetrieveSubjectGUID(void)
memset(&subject, 1, sizeof(GUID)); memset(&subject, 1, sizeof(GUID));
ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject); ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject);
ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n"); ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n");
ok ( GetLastError() == TRUST_E_SUBJECT_FORM_UNKNOWN || ok ( GetLastError() == TRUST_E_SUBJECT_FORM_UNKNOWN,
GetLastError() == ERROR_SUCCESS /* Win98 */, "Expected TRUST_E_SUBJECT_FORM_UNKNOWN or ERROR_SUCCESS, got 0x%08lx\n", GetLastError());
"Expected TRUST_E_SUBJECT_FORM_UNKNOWN or ERROR_SUCCESS, got 0x%08x\n", GetLastError());
ok(IsEqualGUID(&subject, &nullSubject), ok(IsEqualGUID(&subject, &nullSubject),
"Expected a NULL GUID for empty file %s, not %s\n", tempfile, wine_dbgstr_guid(&subject)); "Expected a NULL GUID for empty file %s, not %s\n", tempfile, wine_dbgstr_guid(&subject));
@@ -271,14 +245,14 @@ static void test_SIPRetrieveSubjectGUID(void)
/* Create a file with just the .cab header 'MSCF' */ /* Create a file with just the .cab header 'MSCF' */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
file = CreateFileA(tempfile, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL); file = CreateFileA(tempfile, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);
ok(file != INVALID_HANDLE_VALUE, "failed with %u\n", GetLastError()); ok(file != INVALID_HANDLE_VALUE, "failed with %lu\n", GetLastError());
WriteFile(file, cabFileData, 4, &written, NULL); WriteFile(file, cabFileData, 4, &written, NULL);
CloseHandle(file); CloseHandle(file);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
memset(&subject, 1, sizeof(GUID)); memset(&subject, 1, sizeof(GUID));
ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject); ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject);
ok( ret, "CryptSIPRetrieveSubjectGuid failed: %d (0x%08x)\n", ok( ret, "CryptSIPRetrieveSubjectGuid failed: %ld (0x%08lx)\n",
GetLastError(), GetLastError() ); GetLastError(), GetLastError() );
ok(IsEqualGUID(&subject, &cabGUID), ok(IsEqualGUID(&subject, &cabGUID),
"Expected GUID %s for cabinet file, not %s\n", wine_dbgstr_guid(&cabGUID), wine_dbgstr_guid(&subject)); "Expected GUID %s for cabinet file, not %s\n", wine_dbgstr_guid(&cabGUID), wine_dbgstr_guid(&subject));
@@ -289,14 +263,14 @@ static void test_SIPRetrieveSubjectGUID(void)
/* Create a .cab file */ /* Create a .cab file */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
file = CreateFileA(tempfile, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL); file = CreateFileA(tempfile, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);
ok(file != INVALID_HANDLE_VALUE, "failed with %u\n", GetLastError()); ok(file != INVALID_HANDLE_VALUE, "failed with %lu\n", GetLastError());
WriteFile(file, cabFileData, sizeof(cabFileData), &written, NULL); WriteFile(file, cabFileData, sizeof(cabFileData), &written, NULL);
CloseHandle(file); CloseHandle(file);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
memset(&subject, 1, sizeof(GUID)); memset(&subject, 1, sizeof(GUID));
ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject); ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject);
ok( ret, "CryptSIPRetrieveSubjectGuid failed: %d (0x%08x)\n", ok( ret, "CryptSIPRetrieveSubjectGuid failed: %ld (0x%08lx)\n",
GetLastError(), GetLastError() ); GetLastError(), GetLastError() );
ok(IsEqualGUID(&subject, &cabGUID), ok(IsEqualGUID(&subject, &cabGUID),
"Expected GUID %s for cabinet file, not %s\n", wine_dbgstr_guid(&cabGUID), wine_dbgstr_guid(&subject)); "Expected GUID %s for cabinet file, not %s\n", wine_dbgstr_guid(&cabGUID), wine_dbgstr_guid(&subject));
@@ -322,14 +296,14 @@ static void test_SIPLoad(void)
ret = CryptSIPLoad(NULL, 0, NULL); ret = CryptSIPLoad(NULL, 0, NULL);
ok ( !ret, "Expected CryptSIPLoad to fail\n"); ok ( !ret, "Expected CryptSIPLoad to fail\n");
ok ( GetLastError() == ERROR_INVALID_PARAMETER, ok ( GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got 0x%08x\n", GetLastError()); "Expected ERROR_INVALID_PARAMETER, got 0x%08lx\n", GetLastError());
/* Only pSipDispatch NULL */ /* Only pSipDispatch NULL */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = CryptSIPLoad(&subject, 0, NULL); ret = CryptSIPLoad(&subject, 0, NULL);
ok ( !ret, "Expected CryptSIPLoad to fail\n"); ok ( !ret, "Expected CryptSIPLoad to fail\n");
ok ( GetLastError() == ERROR_INVALID_PARAMETER, ok ( GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got 0x%08x\n", GetLastError()); "Expected ERROR_INVALID_PARAMETER, got 0x%08lx\n", GetLastError());
/* No NULLs, but nonexistent pgSubject */ /* No NULLs, but nonexistent pgSubject */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
@@ -339,7 +313,7 @@ static void test_SIPLoad(void)
ret = CryptSIPLoad(&dummySubject, 0, &sdi); ret = CryptSIPLoad(&dummySubject, 0, &sdi);
ok ( !ret, "Expected CryptSIPLoad to fail\n"); ok ( !ret, "Expected CryptSIPLoad to fail\n");
ok ( GetLastError() == TRUST_E_SUBJECT_FORM_UNKNOWN, ok ( GetLastError() == TRUST_E_SUBJECT_FORM_UNKNOWN,
"Expected TRUST_E_SUBJECT_FORM_UNKNOWN, got 0x%08x\n", GetLastError()); "Expected TRUST_E_SUBJECT_FORM_UNKNOWN, got 0x%08lx\n", GetLastError());
ok( sdi.pfGet == (pCryptSIPGetSignedDataMsg)0xdeadbeef, "Expected no change to the function pointer\n"); ok( sdi.pfGet == (pCryptSIPGetSignedDataMsg)0xdeadbeef, "Expected no change to the function pointer\n");
hCrypt = GetModuleHandleA("crypt32.dll"); hCrypt = GetModuleHandleA("crypt32.dll");
@@ -430,7 +404,7 @@ static void test_SIPLoad(void)
ret = CryptSIPLoad(&unknown, 1, &sdi); ret = CryptSIPLoad(&unknown, 1, &sdi);
ok ( !ret, "Expected CryptSIPLoad to fail\n"); ok ( !ret, "Expected CryptSIPLoad to fail\n");
ok ( GetLastError() == ERROR_INVALID_PARAMETER, ok ( GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got 0x%08x\n", GetLastError()); "Expected ERROR_INVALID_PARAMETER, got 0x%08lx\n", GetLastError());
ok( sdi.pfGet == (pCryptSIPGetSignedDataMsg)0xdeadbeef, "Expected no change to the function pointer\n"); ok( sdi.pfGet == (pCryptSIPGetSignedDataMsg)0xdeadbeef, "Expected no change to the function pointer\n");
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff