secur32/tests: Dynamically load various APIs and don't link with crypt32.dll to make the test run on Windows 95.
Francois Gouget
fgouget at free.fr
Tue Dec 18 03:00:10 CST 2007
---
dlls/secur32/tests/Makefile.in | 2 +-
dlls/secur32/tests/schannel.c | 90 ++++++++++++++++++++++++++++------------
2 files changed, 64 insertions(+), 28 deletions(-)
diff --git a/dlls/secur32/tests/Makefile.in b/dlls/secur32/tests/Makefile.in
index 45cfeab..0053d73 100644
--- a/dlls/secur32/tests/Makefile.in
+++ b/dlls/secur32/tests/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = secur32.dll
-IMPORTS = crypt32 advapi32 kernel32
+IMPORTS = advapi32 kernel32
CTESTS = \
main.c \
diff --git a/dlls/secur32/tests/schannel.c b/dlls/secur32/tests/schannel.c
index 785ad26..3d3eb7f 100644
--- a/dlls/secur32/tests/schannel.c
+++ b/dlls/secur32/tests/schannel.c
@@ -27,12 +27,18 @@
#include "wine/test.h"
-static HMODULE secdll;
+static HMODULE secdll, crypt32dll;
static SECURITY_STATUS (SEC_ENTRY * pAcquireCredentialsHandleA)(SEC_CHAR*, SEC_CHAR*,
ULONG, PLUID, PVOID, SEC_GET_KEY_FN, PVOID, PCredHandle, PTimeStamp);
+static PCCERT_CONTEXT (WINAPI *pCertCreateCertificateContext)(DWORD,const BYTE*,DWORD);
+static BOOL (WINAPI *pCertFreeCertificateContext)(PCCERT_CONTEXT);
+static BOOL (WINAPI *pCertSetCertificateContextProperty)(PCCERT_CONTEXT,DWORD,DWORD,const void*);
static SECURITY_STATUS (SEC_ENTRY * pFreeCredentialsHandle)(PCredHandle);
static BOOL (WINAPI * pCryptAcquireContextW)(HCRYPTPROV*, LPCWSTR, LPCWSTR, DWORD, DWORD);
+static BOOL (WINAPI *pCryptDestroyKey)(HCRYPTKEY);
+static BOOL (WINAPI *pCryptImportKey)(HCRYPTPROV,CONST BYTE*,DWORD,HCRYPTKEY,DWORD,HCRYPTKEY*);
+static BOOL (WINAPI *pCryptReleaseContext)(HCRYPTPROV,ULONG_PTR);
static const BYTE bigCert[] = { 0x30, 0x7a, 0x02, 0x01, 0x01, 0x30, 0x02, 0x06,
0x00, 0x30, 0x15, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
@@ -100,17 +106,29 @@ static const BYTE selfSignedCert[] = {
static void InitFunctionPtrs(void)
{
HMODULE advapi32dll = GetModuleHandleA("advapi32.dll");
+ HMODULE crypt32dll = LoadLibraryA("crypt32.dll");
secdll = LoadLibraryA("secur32.dll");
if(!secdll)
secdll = LoadLibraryA("security.dll");
+
+#define GET_PROC(h, func) p ## func = (void*)GetProcAddress(h, #func)
+
if(secdll)
{
- pAcquireCredentialsHandleA = (PVOID)GetProcAddress(secdll, "AcquireCredentialsHandleA");
- pFreeCredentialsHandle = (PVOID)GetProcAddress(secdll, "FreeCredentialsHandle");
+ GET_PROC(secdll, AcquireCredentialsHandleA);
+ GET_PROC(secdll, FreeCredentialsHandle);
}
- pCryptAcquireContextW = (void *)GetProcAddress(advapi32dll, "CryptAcquireContextW");
+ GET_PROC(advapi32dll, CryptAcquireContextW);
+ GET_PROC(advapi32dll, CryptDestroyKey);
+ GET_PROC(advapi32dll, CryptImportKey);
+ GET_PROC(advapi32dll, CryptReleaseContext);
+
+ GET_PROC(crypt32dll, CertFreeCertificateContext);
+ GET_PROC(crypt32dll, CertSetCertificateContextProperty);
+
+#undef GET_PROC
}
static void testAcquireSecurityContext(void)
@@ -127,6 +145,13 @@ static void testAcquireSecurityContext(void)
HCRYPTKEY key;
CRYPT_KEY_PROV_INFO keyProvInfo;
+ if (!pAcquireCredentialsHandleA || !pCertCreateCertificateContext ||
+ !pFreeCredentialsHandle || !pCryptAcquireContextW)
+ {
+ skip("Needed functions are not available\n");
+ return;
+ }
+
lstrcpyW(ms_def_prov_w, MS_DEF_PROV_W);
keyProvInfo.pwszContainerName = cspNameW;
@@ -137,9 +162,9 @@ static void testAcquireSecurityContext(void)
keyProvInfo.rgProvParam = NULL;
keyProvInfo.dwKeySpec = AT_SIGNATURE;
- certs[0] = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert,
+ certs[0] = pCertCreateCertificateContext(X509_ASN_ENCODING, bigCert,
sizeof(bigCert));
- certs[1] = CertCreateCertificateContext(X509_ASN_ENCODING, selfSignedCert,
+ certs[1] = pCertCreateCertificateContext(X509_ASN_ENCODING, selfSignedCert,
sizeof(selfSignedCert));
pCryptAcquireContextW(&csp, cspNameW, MS_DEF_PROV_W, PROV_RSA_FULL,
@@ -247,23 +272,30 @@ static void testAcquireSecurityContext(void)
st);
/* Good cert, with CRYPT_KEY_PROV_INFO set before it's had a key loaded. */
- ret = CertSetCertificateContextProperty(certs[1],
- CERT_KEY_PROV_INFO_PROP_ID, 0, &keyProvInfo);
- schanCred.dwVersion = SCH_CRED_V3;
- st = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_OUTBOUND,
- NULL, &schanCred, NULL, NULL, &cred, NULL);
- ok(st == SEC_E_UNKNOWN_CREDENTIALS,
- "Expected SEC_E_UNKNOWN_CREDENTIALS, got %08x\n", st);
- st = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_INBOUND,
- NULL, &schanCred, NULL, NULL, &cred, NULL);
- ok(st == SEC_E_UNKNOWN_CREDENTIALS,
- "Expected SEC_E_UNKNOWN_CREDENTIALS, got %08x\n", st);
+ if (pCertSetCertificateContextProperty)
+ {
+ ret = pCertSetCertificateContextProperty(certs[1],
+ CERT_KEY_PROV_INFO_PROP_ID, 0, &keyProvInfo);
+ schanCred.dwVersion = SCH_CRED_V3;
+ st = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_OUTBOUND,
+ NULL, &schanCred, NULL, NULL, &cred, NULL);
+ ok(st == SEC_E_UNKNOWN_CREDENTIALS,
+ "Expected SEC_E_UNKNOWN_CREDENTIALS, got %08x\n", st);
+ st = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_INBOUND,
+ NULL, &schanCred, NULL, NULL, &cred, NULL);
+ ok(st == SEC_E_UNKNOWN_CREDENTIALS,
+ "Expected SEC_E_UNKNOWN_CREDENTIALS, got %08x\n", st);
+ }
ret = pCryptAcquireContextW(&csp, cspNameW, MS_DEF_PROV_W, PROV_RSA_FULL,
CRYPT_NEWKEYSET);
ok(ret, "CryptAcquireContextW failed: %08x\n", GetLastError());
- ret = CryptImportKey(csp, privKey, sizeof(privKey), 0, 0, &key);
- ok(ret, "CryptImportKey failed: %08x\n", GetLastError());
+ ret = 0;
+ if (pCryptImportKey)
+ {
+ ret = pCryptImportKey(csp, privKey, sizeof(privKey), 0, 0, &key);
+ ok(ret, "CryptImportKey failed: %08x\n", GetLastError());
+ }
if (ret)
{
PCCERT_CONTEXT tmp;
@@ -338,26 +370,30 @@ static void testAcquireSecurityContext(void)
"Expected SEC_E_UNKNOWN_CREDENTIALS, got %08x\n", st);
/* FIXME: what about two valid certs? */
- CryptDestroyKey(key);
+ if (pCryptDestroyKey)
+ pCryptDestroyKey(key);
}
- CryptReleaseContext(csp, 0);
+ if (pCryptReleaseContext)
+ pCryptReleaseContext(csp, 0);
pCryptAcquireContextW(&csp, cspNameW, MS_DEF_PROV_W, PROV_RSA_FULL,
CRYPT_DELETEKEYSET);
- CertFreeCertificateContext(certs[0]);
- CertFreeCertificateContext(certs[1]);
+ if (pCertFreeCertificateContext)
+ {
+ pCertFreeCertificateContext(certs[0]);
+ pCertFreeCertificateContext(certs[1]);
+ }
}
START_TEST(schannel)
{
InitFunctionPtrs();
- if (pAcquireCredentialsHandleA && pFreeCredentialsHandle && pCryptAcquireContextW)
- testAcquireSecurityContext();
- else
- skip("Needed functions are not available\n");
+ testAcquireSecurityContext();
if(secdll)
FreeLibrary(secdll);
+ if(crypt32dll)
+ FreeLibrary(crypt32dll);
}
--
1.5.3.4
More information about the wine-patches
mailing list