windows-nt/Source/XPSP1/NT/ds/win32/ntcrypto/test/testsuit/logging.c
2020-09-26 16:20:57 +08:00

1871 lines
39 KiB
C

/*
Logging.c
4/23/00 dangriff created
This is the output/logging code used by the CSP Test Suite. Expect that this
set of wrappers will be modified as the Test Suite evolves.
*/
#include <windows.h>
#include <stdio.h>
#include <stdarg.h>
#include "cspstruc.h"
#include "logging.h"
#include "csptestsuite.h"
//
// Logging state variables
//
static BOOL g_fTestSuiteError = FALSE;
static BOOL g_fCSPClassError = FALSE;
static BOOL g_fTestLevelError = FALSE;
static BOOL g_fAPIError = FALSE;
static BOOL g_fCurrentAPIUnexpected = FALSE;
static DWORD g_dwCurrentCSPClass = 0;
static DWORD g_dwCurrentTestLevel = 0;
static API_NAME g_CurrentAPI;
static DWORD g_dwCurrentAPISubset = 0; // TEST_CASES_POSITIVE or TEST_CASES_NEGATIVE
// Test case set counter
static DWORD g_dwTestCaseIDMajor = 0;
//
// User-specified settings
//
//static LOG_VERBOSE g_Verbose = Terse;
static LPWSTR g_pwszProvName = NULL;
static DWORD g_dwExternalProvType = 0;
static LPWSTR g_pwszInteropProvName = NULL;
static DWORD g_dwInteropProvType = 0;
//
// Function: LogInfo
//
void LogInfo(IN LPWSTR pwszInfo)
{
ezLogMsg(LOG_INFO, NULL, NULL, __LINE__, L"%s", pwszInfo);
}
//
// Function: LogUserOption
//
void LogUserOption(IN LPWSTR pwszOption)
{
ezLogMsg(LOG_USER_OPTION, NULL, NULL, __LINE__, L"%s", pwszOption);
}
//
// Function: LogCreatingUserProtectedKey
//
void LogCreatingUserProtectedKey(void)
{
LogTestCaseSeparator(TRUE);
ezLogMsg(
LOG_USER_PROTECTED_KEY,
NULL,
NULL,
__LINE__,
L"Creating user protected key. You should see UI.");
}
//
// Function: FlagToString
//
BOOL FlagToString(
IN DWORD dwFlag,
IN FLAGTOSTRING_ITEM rgFlagToString [],
IN DWORD cFlagToString,
OUT WCHAR rgwsz [],
IN FLAG_TYPE FlagType)
{
BOOL fFound = FALSE;
unsigned iString = 0;
for (iString = 0; iString < cFlagToString; iString++)
{
if ( ((ExactMatch == FlagType) &&
(dwFlag == rgFlagToString[iString].dwKey)) ||
((Maskable == FlagType) &&
(dwFlag & rgFlagToString[iString].dwKey)))
{
if (fFound)
{
//
// One or more flags have already been found,
// so print a "|" to delimit multiple strings.
//
wsprintf(
rgwsz += wcslen(rgwsz),
L" | %s",
rgFlagToString[iString].pwszString);
}
else
{
fFound = TRUE;
wcscpy(
rgwsz,
rgFlagToString[iString].pwszString);
}
if (ExactMatch == FlagType)
{
break;
}
}
}
return fFound;
}
//
// Function: AcquireContextFlagToString
//
BOOL AcquireContextFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM AcquireContextFlagStrings [] = {
{ CRYPT_VERIFYCONTEXT, L"CRYPT_VERIFYCONTEXT" },
{ CRYPT_NEWKEYSET, L"CRYPT_NEWKEYSET" },
{ CRYPT_MACHINE_KEYSET, L"CRYPT_MACHINE_KEYSET" },
{ CRYPT_DELETEKEYSET, L"CRYPT_DELETEKEYSET" },
{ CRYPT_SILENT, L"CRYPT_SILENT" }
};
return FlagToString(
dwFlag,
AcquireContextFlagStrings,
FLAGTOSTRING_SIZE(AcquireContextFlagStrings),
rgwsz,
Maskable);
}
//
// Function: GetProvParamToString
//
BOOL GetProvParamToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM GetProvParamStrings [] = {
{ PP_CONTAINER, L"PP_CONTAINER" },
{ PP_ENUMALGS, L"PP_ENUMALGS" },
{ PP_ENUMALGS_EX, L"PP_ENUMALGS_EX" },
{ PP_ENUMCONTAINERS, L"PP_ENUMCONTAINERS" },
{ PP_IMPTYPE, L"PP_IMPTYPE" },
{ PP_NAME, L"PP_NAME" },
{ PP_VERSION, L"PP_VERSION" },
{ PP_SIG_KEYSIZE_INC, L"PP_SIG_KEYSIZE_INC" },
{ PP_KEYX_KEYSIZE_INC, L"PP_KEYX_KEYSIZE_INC" },
{ PP_KEYSET_SEC_DESCR, L"PP_KEYSET_SEC_DESCR" },
{ PP_UNIQUE_CONTAINER, L"PP_UNIQUE_CONTAINER" },
{ PP_PROVTYPE, L"PP_PROVTYPE" },
{ PP_USE_HARDWARE_RNG, L"PP_USE_HARDWARE_RNG" },
{ PP_KEYSPEC, L"PP_KEYSPEC" }
};
return FlagToString(
dwFlag,
GetProvParamStrings,
FLAGTOSTRING_SIZE(GetProvParamStrings),
rgwsz,
ExactMatch);
}
//
// Function: SetProvParamToString
//
BOOL SetProvParamToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM SetProvParamStrings [] = {
{ PP_CLIENT_HWND, L"PP_CLIENT_HWND" },
{ PP_KEYSET_SEC_DESCR, L"PP_KEYSET_SEC_DESCR" },
{ PP_USE_HARDWARE_RNG, L"PP_USE_HARDWARE_RNG" }
};
return FlagToString(
dwFlag,
SetProvParamStrings,
FLAGTOSTRING_SIZE(SetProvParamStrings),
rgwsz,
ExactMatch);
}
//
// Function: AlgidToString
//
BOOL AlgidToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM AlgidStrings [] = {
{ AT_SIGNATURE, L"AT_SIGNATURE" },
{ AT_KEYEXCHANGE, L"AT_KEYEXCHANGE" },
{ CALG_MD2, L"CALG_MD2" },
{ CALG_MD4, L"CALG_MD4" },
{ CALG_MD5, L"CALG_MD5" },
{ CALG_SHA, L"CALG_SHA" },
{ CALG_SHA1, L"CALG_SHA1" },
{ CALG_MAC, L"CALG_MAC" },
{ CALG_RSA_SIGN, L"CALG_RSA_SIGN" },
{ CALG_DSS_SIGN, L"CALG_DSS_SIGN" },
{ CALG_RSA_KEYX, L"CALG_RSA_KEYX" },
{ CALG_DES, L"CALG_DES" },
{ CALG_3DES_112, L"CALG_3DES_112" },
{ CALG_3DES, L"CALG_3DES" },
{ CALG_DESX, L"CALG_DESX" },
{ CALG_RC2, L"CALG_RC2" },
{ CALG_RC4, L"CALG_RC4" },
{ CALG_SEAL, L"CALG_SEAL" },
{ CALG_DH_SF, L"CALG_DH_SF" },
{ CALG_DH_EPHEM, L"CALG_DH_EPHEM" },
{ CALG_AGREEDKEY_ANY, L"CALG_AGREEDKEY_ANY" },
{ CALG_KEA_KEYX, L"CALG_KEA_KEYX" },
{ CALG_HUGHES_MD5, L"CALG_HUGHES_MD5" },
{ CALG_SKIPJACK, L"CALG_SKIPJACK" },
{ CALG_TEK, L"CALG_TEK" },
{ CALG_CYLINK_MEK, L"CALG_CYLINK_MEK" },
{ CALG_SSL3_SHAMD5, L"CALG_SSL3_SHAMD5" },
{ CALG_SSL3_MASTER, L"CALG_SSL3_MASTER" },
{ CALG_SCHANNEL_MASTER_HASH, L"CALG_SCHANNEL_MASTER_HASH" },
{ CALG_SCHANNEL_MAC_KEY, L"CALG_SCHANNEL_MAC_KEY" },
{ CALG_SCHANNEL_ENC_KEY, L"CALG_SCHANNEL_ENC_KEY" },
{ CALG_PCT1_MASTER, L"CALG_PCT1_MASTER" },
{ CALG_SSL2_MASTER, L"CALG_SSL2_MASTER" },
{ CALG_TLS1_MASTER, L"CALG_TLS1_MASTER" },
{ CALG_RC5, L"CALG_RC5" },
{ CALG_HMAC, L"CALG_HMAC" },
{ CALG_TLS1PRF, L"CALG_TLS1PRF" },
{ CALG_HASH_REPLACE_OWF, L"CALG_HASH_REPLACE_OWF" }
};
return FlagToString(
dwFlag,
AlgidStrings,
FLAGTOSTRING_SIZE(AlgidStrings),
rgwsz,
ExactMatch);
}
//
// Function: DeriveKeyFlagToString
//
BOOL DeriveKeyFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM DeriveKeyFlagStrings [] = {
{ CRYPT_CREATE_SALT, L"CRYPT_CREATE_SALT" },
{ CRYPT_EXPORTABLE, L"CRYPT_EXPORTABLE" },
{ CRYPT_NO_SALT, L"CRYPT_NO_SALT" },
{ CRYPT_UPDATE_KEY, L"CRYPT_UPDATE_KEY" }
};
return FlagToString(
dwFlag,
DeriveKeyFlagStrings,
FLAGTOSTRING_SIZE(DeriveKeyFlagStrings),
rgwsz,
Maskable);
}
//
// Function: EncryptFlagToString
//
BOOL EncryptFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM EncryptFlagStrings [] = {
{ CRYPT_OAEP, L"CRYPT_OAEP" }
};
return FlagToString(
dwFlag,
EncryptFlagStrings,
FLAGTOSTRING_SIZE(EncryptFlagStrings),
rgwsz,
Maskable);
}
//
// Function: ExportKeyBlobTypeToString
//
BOOL ExportKeyBlobTypeToString (
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM ExportKeyBlobTypeStrings [] = {
{ OPAQUEKEYBLOB, L"OPAQUEKEYBLOB" },
{ PRIVATEKEYBLOB, L"PRIVATEKEYBLOB" },
{ PUBLICKEYBLOB, L"PUBLICKEYBLOB" },
{ SIMPLEBLOB, L"SIMPLEBLOB" },
{ SYMMETRICWRAPKEYBLOB, L"SYMMETRICWRAPKEYBLOB" }
};
return FlagToString(
dwFlag,
ExportKeyBlobTypeStrings,
FLAGTOSTRING_SIZE(ExportKeyBlobTypeStrings),
rgwsz,
ExactMatch);
}
//
// Function: ExportKeyFlagToString
//
BOOL ExportKeyFlagToString (
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM ExportKeyFlagStrings [] = {
{ CRYPT_DESTROYKEY, L"CRYPT_DESTROYKEY" },
{ CRYPT_SSL2_FALLBACK, L"CRYPT_SSL2_FALLBACK" },
{ CRYPT_OAEP, L"CRYPT_OAEP" }
};
return FlagToString(
dwFlag,
ExportKeyFlagStrings,
FLAGTOSTRING_SIZE(ExportKeyFlagStrings),
rgwsz,
Maskable);
}
//
// Function: GenKeyFlagToString
//
BOOL GenKeyFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM GenKeyFlagStrings [] = {
{ CRYPT_CREATE_SALT, L"CRYPT_CREATE_SALT" },
{ CRYPT_EXPORTABLE, L"CRYPT_EXPORTABLE" },
{ CRYPT_NO_SALT, L"CRYPT_NO_SALT" },
{ CRYPT_PREGEN, L"CRYPT_PREGEN" },
{ CRYPT_USER_PROTECTED, L"CRYPT_USER_PROTECTED" }
};
return FlagToString(
dwFlag,
GenKeyFlagStrings,
FLAGTOSTRING_SIZE(GenKeyFlagStrings),
rgwsz,
Maskable);
}
//
// Function: HashParamToString
//
BOOL HashParamToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM HashParamStrings [] = {
{ HP_ALGID, L"HP_ALGID" },
{ HP_HASHSIZE, L"HP_HASHSIZE" },
{ HP_HASHVAL, L"HP_HASHVAL" },
{ HP_HMAC_INFO, L"HP_HMAC_INFO" }
};
return FlagToString(
dwFlag,
HashParamStrings,
FLAGTOSTRING_SIZE(HashParamStrings),
rgwsz,
ExactMatch);
}
//
// Function: KeyParamToString
//
BOOL KeyParamToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM KeyParamStrings [] = {
{ KP_ALGID, L"KP_ALGID" },
{ KP_BLOCKLEN, L"KP_BLOCKLEN" },
{ KP_KEYLEN, L"KP_KEYLEN" },
{ KP_SALT, L"KP_SALT" },
{ KP_SALT_EX, L"KP_SALT_EX" },
{ KP_PERMISSIONS, L"KP_PERMISSIONS" },
{ KP_P, L"KP_P" },
{ KP_Q, L"KP_Q" },
{ KP_G, L"KP_G" },
{ KP_X, L"KP_X" },
{ KP_EFFECTIVE_KEYLEN, L"KP_EFFECTIVE_KEYLEN" },
{ KP_IV, L"KP_IV" },
{ KP_PADDING, L"KP_PADDING" },
{ KP_MODE, L"KP_MODE" },
{ KP_MODE_BITS, L"KP_MODE_BITS" },
{ KP_PUB_PARAMS, L"KP_PUB_PARAMS" }
};
return FlagToString(
dwFlag,
KeyParamStrings,
FLAGTOSTRING_SIZE(KeyParamStrings),
rgwsz,
ExactMatch);
}
//
// Function: KeyParamModeToString
//
BOOL KeyParamModeToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM KeyParamModeStrings[] = {
{ CRYPT_MODE_CBC, L"CRYPT_MODE_CBC" },
{ CRYPT_MODE_CFB, L"CRYPT_MODE_CFB" },
{ CRYPT_MODE_ECB, L"CRYPT_MODE_ECB" },
{ CRYPT_MODE_OFB, L"CRYPT_MODE_OFB" }
};
return FlagToString(
dwFlag,
KeyParamModeStrings,
FLAGTOSTRING_SIZE(KeyParamModeStrings),
rgwsz,
ExactMatch);
}
//
// Function: KeyParamPermissionToString
//
BOOL KeyParamPermissionToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM KeyParamPermissionStrings[] = {
{ CRYPT_DECRYPT, L"CRYPT_DECRYPT" },
{ CRYPT_ENCRYPT, L"CRYPT_ENCRYPT" },
{ CRYPT_EXPORT, L"CRYPT_EXPORT" },
{ CRYPT_MAC, L"CRYPT_MAC" },
{ CRYPT_READ, L"CRYPT_READ" },
{ CRYPT_WRITE, L"CRYPT_WRITE" }
};
return FlagToString(
dwFlag,
KeyParamPermissionStrings,
FLAGTOSTRING_SIZE(KeyParamPermissionStrings),
rgwsz,
Maskable);
}
//
// Function: ProvParamEnumFlagToString
//
BOOL ProvParamEnumFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM ProvParamEnumFlagStrings[] = {
{ CRYPT_FIRST, L"CRYPT_FIRST" },
{ CRYPT_MACHINE_KEYSET, L"CRYPT_MACHINE_KEYSET" }
};
return FlagToString(
dwFlag,
ProvParamEnumFlagStrings,
FLAGTOSTRING_SIZE(ProvParamEnumFlagStrings),
rgwsz,
Maskable);
}
//
// Function: ProvParamSecDescrFlagToString
//
BOOL ProvParamSecDescrFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM ProvParamSecDescrFlagStrings[] = {
{ OWNER_SECURITY_INFORMATION, L"OWNER_SECURITY_INFORMATION" },
{ GROUP_SECURITY_INFORMATION, L"GROUP_SECURITY_INFORMATION" },
{ DACL_SECURITY_INFORMATION, L"DACL_SECURITY_INFORMATION" },
{ SACL_SECURITY_INFORMATION, L"SACL_SECURITY_INFORMATION" }
};
return FlagToString(
dwFlag,
ProvParamSecDescrFlagStrings,
FLAGTOSTRING_SIZE(ProvParamSecDescrFlagStrings),
rgwsz,
Maskable);
}
//
// Function: ProvParamImpTypeToString
//
BOOL ProvParamImpTypeToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM ProvParamImpTypeStrings[] = {
{ CRYPT_IMPL_HARDWARE, L"CRYPT_IMPL_HARDWARE" },
{ CRYPT_IMPL_SOFTWARE, L"CRYPT_IMPL_SOFTWARE" },
{ CRYPT_IMPL_MIXED, L"CRYPT_IMPL_MIXED" },
{ CRYPT_IMPL_UNKNOWN, L"CRYPT_IMPL_UNKNOWN" }
};
return FlagToString(
dwFlag,
ProvParamImpTypeStrings,
FLAGTOSTRING_SIZE(ProvParamImpTypeStrings),
rgwsz,
ExactMatch);
}
//
// Function: HashDataFlagToString
//
BOOL HashDataFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM HashDataFlagStrings[] = {
{ CRYPT_USERDATA, L"CRYPT_USERDATA" }
};
return FlagToString(
dwFlag,
HashDataFlagStrings,
FLAGTOSTRING_SIZE(HashDataFlagStrings),
rgwsz,
Maskable);
}
//
// Function: HashSessionKeyFlagToString
//
BOOL HashSessionKeyFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM HashSessionKeyFlagStrings[] = {
{ CRYPT_LITTLE_ENDIAN, L"CRYPT_LITTLE_ENDIAN" }
};
return FlagToString(
dwFlag,
HashSessionKeyFlagStrings,
FLAGTOSTRING_SIZE(HashSessionKeyFlagStrings),
rgwsz,
Maskable);
}
//
// Function: ImportKeyFlagToString
//
BOOL ImportKeyFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM ImportKeyFlagStrings[] = {
{ CRYPT_EXPORTABLE, L"CRYPT_EXPORTABLE" },
{ CRYPT_OAEP, L"CRYPT_OAEP" },
{ CRYPT_NO_SALT, L"CRYPT_NO_SALT" }
};
return FlagToString(
dwFlag,
ImportKeyFlagStrings,
FLAGTOSTRING_SIZE(ImportKeyFlagStrings),
rgwsz,
Maskable);
}
//
// Function: SignHashFlagToString
//
BOOL SignHashFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM SignHashFlagStrings[] = {
{ CRYPT_NOHASHOID, L"CRYPT_NOHASHOID" }
};
return FlagToString(
dwFlag,
SignHashFlagStrings,
FLAGTOSTRING_SIZE(SignHashFlagStrings),
rgwsz,
Maskable);
}
//
// Function: TestCaseTypeToString
//
BOOL TestCaseTypeToString(
IN DWORD dwTestCaseType,
OUT WCHAR rgwsz [])
{
FLAGTOSTRING_ITEM TestCaseTypeStrings[] = {
{ TEST_CASES_POSITIVE, L"Positive test cases. API's should return TRUE" },
{ TEST_CASES_NEGATIVE, L"Negative test cases. API's should return FALSE" },
{ TEST_CASES_SCENARIO, L"Scenario test cases. Tests using multiple API's" },
{ TEST_CASES_INTEROP, L"Interoperability test cases. Tests using multiple API's and two CSP's" }
};
return FlagToString(
dwTestCaseType,
TestCaseTypeStrings,
FLAGTOSTRING_SIZE(TestCaseTypeStrings),
rgwsz,
ExactMatch);
};
//
// Function:
//
BOOL ApiNameToString(
API_NAME ApiName,
OUT WCHAR rgwsz[])
{
FLAGTOSTRING_ITEM ApiNameStrings [] = {
{ API_CRYPTACQUIRECONTEXT, L"CryptAcquireContext" },
{ API_CRYPTCREATEHASH, L"CryptCreateHash" },
{ API_CRYPTDECRYPT, L"CryptDecrypt" },
{ API_CRYPTDERIVEKEY, L"CryptDeriveKey" },
{ API_CRYPTDESTROYHASH, L"CryptDestroyHash" },
{ API_CRYPTDESTROYKEY, L"CryptDestroyKey" },
{ API_CRYPTENCRYPT, L"CryptEncrypt" },
{ API_CRYPTEXPORTKEY, L"CryptExportKey" },
{ API_CRYPTGENKEY, L"CryptGenKey" },
{ API_CRYPTGENRANDOM, L"CryptGenRandom" },
{ API_CRYPTGETHASHPARAM, L"CryptGetHashParam" },
{ API_CRYPTGETKEYPARAM, L"CryptGetKeyParam" },
{ API_CRYPTGETPROVPARAM, L"CryptGetProvParam" },
{ API_CRYPTGETUSERKEY, L"CryptGetUserKey" },
{ API_CRYPTHASHDATA, L"CryptHashData" },
{ API_CRYPTHASHSESSIONKEY, L"CryptHashSessionKey" },
{ API_CRYPTIMPORTKEY, L"CryptImportKey" },
{ API_CRYPTRELEASECONTEXT, L"CryptReleaseContext" },
{ API_CRYPTSETHASHPARAM, L"CryptSetHashParam" },
{ API_CRYPTSETKEYPARAM, L"CryptSetKeyParam" },
{ API_CRYPTSETPROVPARAM, L"CryptSetProvParam" },
{ API_CRYPTSIGNHASH, L"CryptSignHash" },
{ API_CRYPTVERIFYSIGNATURE, L"CryptVerifySignature" },
{ API_CRYPTDUPLICATEHASH, L"CryptDuplicateHash" },
{ API_CRYPTDUPLICATEKEY, L"CryptDuplicateKey" },
//
// Advapi32 entry point
//
{ API_CRYPTCONTEXTADDREF, L"CryptContextAddRef" },
//
// Non-Crypto API functions
//
{ API_MEMORY, L"Memory allocation" },
{ API_DATACOMPARE, L"Data comparision (see previous API)" },
{ API_GETDESKTOPWINDOW, L"GetDesktopWindow" }
};
return FlagToString(
ApiName,
ApiNameStrings,
FLAGTOSTRING_SIZE(ApiNameStrings),
rgwsz,
ExactMatch);
}
//
// Function: LogCleanupParamInfo
//
void LogCleanupParamInfo(
IN OUT PAPI_PARAM_INFO pParamInfo,
IN DWORD cParamInfo)
{
unsigned iParam;
for (iParam = 0; iParam < cParamInfo; iParam++)
{
if (pParamInfo[iParam].pbSaved)
free(pParamInfo[iParam].pbSaved);
}
}
//
// Function: LogInitParamInfo
//
BOOL LogInitParamInfo(
IN OUT PAPI_PARAM_INFO pParamInfo,
IN DWORD cParamInfo,
IN PTESTCASE ptc)
{
unsigned iParam;
for (iParam = 0; iParam < cParamInfo; iParam++)
{
if (pParamInfo[iParam].fPrintBytes)
{
if ( NULL != pParamInfo[iParam].pbParam &&
((PBYTE) TEST_INVALID_POINTER) != pParamInfo[iParam].pbParam &&
NULL != pParamInfo[iParam].pcbBytes &&
((PDWORD) TEST_INVALID_POINTER) != pParamInfo[iParam].pcbBytes)
{
// Save bytes to a second buffer
if (! TestAlloc(
&pParamInfo[iParam].pbSaved,
*pParamInfo[iParam].pcbBytes,
ptc))
{
return FALSE;
}
memcpy(
pParamInfo[iParam].pbSaved,
pParamInfo[iParam].pbParam,
*pParamInfo[iParam].pcbBytes);
}
}
}
return TRUE;
}
//
// Function: LogParamInfo
//
void LogParamInfo(
PAPI_PARAM_INFO pParamInfo,
DWORD cParamInfo,
BOOL fLogToConsole)
{
DWORD dwLogApiParameter = LOG_API_PARAMETER;
WCHAR rgwsz [ BUFFER_LENGTH ];
unsigned iParam;
if (fLogToConsole)
{
// Feedback has been to not display parameters with the console
// output. To change this, uncomment the next line.
//dwLogApiParameter = LOG_API_PARAMETER_CONSOLE;
}
memset(rgwsz, 0, sizeof(rgwsz));
for (iParam = 0; iParam < cParamInfo; iParam++)
{
switch( pParamInfo[iParam].Type )
{
case Handle:
{
ezLogMsg(
dwLogApiParameter,
NULL,
NULL,
__LINE__,
L" %s: 0x%x",
pParamInfo[iParam].pwszName,
pParamInfo[iParam].pulParam);
break;
}
case Pointer:
{
ezLogMsg(
dwLogApiParameter,
NULL,
NULL,
__LINE__,
L" %s: 0x%x",
pParamInfo[iParam].pwszName,
pParamInfo[iParam].pbParam);
if ( pParamInfo[iParam].fPrintBytes &&
pParamInfo[iParam].pbSaved)
{
wsprintf(rgwsz, L"INPUT value", pParamInfo[iParam].pwszName);
PrintBytes(
rgwsz,
pParamInfo[iParam].pbSaved,
*pParamInfo[iParam].pcbBytes);
*rgwsz = L'\0';
}
if ( pParamInfo[iParam].fPrintBytes &&
NULL != pParamInfo[iParam].pbParam &&
(PBYTE) TEST_INVALID_POINTER != pParamInfo[iParam].pbParam &&
NULL != pParamInfo[iParam].pcbBytes &&
(PDWORD) TEST_INVALID_POINTER != pParamInfo[iParam].pcbBytes)
{
wsprintf(rgwsz, L"OUTPUT value", pParamInfo[iParam].pwszName);
PrintBytes(
rgwsz,
pParamInfo[iParam].pbParam,
*(pParamInfo[iParam].pcbBytes));
*rgwsz = L'\0';
}
break;
}
case Dword:
{
//
// If a pfnFlagToString function has been specified,
// attempt to translate the flag(s).
//
if (pParamInfo[iParam].pfnFlagToString)
{
pParamInfo[iParam].pfnFlagToString(
pParamInfo[iParam].dwParam,
rgwsz);
ezLogMsg(
dwLogApiParameter,
NULL,
NULL,
__LINE__,
L" %s: 0x%x (%s)",
pParamInfo[iParam].pwszName,
pParamInfo[iParam].dwParam,
rgwsz);
rgwsz[0] = L'\0';
}
else
{
ezLogMsg(
dwLogApiParameter,
NULL,
NULL,
__LINE__,
L" %s: 0x%x",
pParamInfo[iParam].pwszName,
pParamInfo[iParam].dwParam);
}
break;
}
case String:
{
ezLogMsg(
dwLogApiParameter,
NULL,
NULL,
__LINE__,
L" %s: %s",
pParamInfo[iParam].pwszName,
pParamInfo[iParam].pwszParam);
break;
}
case Boolean:
{
ezLogMsg(
dwLogApiParameter,
NULL,
NULL,
__LINE__,
L" %s: %s",
pParamInfo[iParam].pwszName,
pParamInfo[iParam].fParam ? STRING_TRUE : STRING_FALSE);
break;
}
}
}
}
//
// Function: IncrementErrorLevel
//
DWORD IncrementErrorLevel(DWORD dwErrorLevel)
{
int iLevel;
for (
iLevel = 0;
iLevel < (sizeof(g_rgErrorLevels) / sizeof(DWORD) - 1);
iLevel++)
{
if (dwErrorLevel == g_rgErrorLevels[iLevel])
{
return g_rgErrorLevels[iLevel + 1];
}
}
return g_rgErrorLevels[iLevel];
}
//
// Function: LogInit
//
BOOL LogInit(
IN PLOGINIT_INFO pLogInitInfo)
{
EZLOG_OPENLOG_DATA EzLogOpenData;
g_pwszProvName = pLogInitInfo->pwszCSPName;
g_dwExternalProvType = pLogInitInfo->dwCSPExternalType;
g_pwszInteropProvName = pLogInitInfo->pwszInteropCSPName;
g_dwInteropProvType = pLogInitInfo->dwInteropCSPExternalType;
//
// Initialize EZLOG
//
memset(&EzLogOpenData, 0, sizeof(EzLogOpenData));
EzLogOpenData.Version = EZLOG_OPENLOG_DATA_VERSION;
EzLogOpenData.Flags = EZLOG_OUTPUT_STDOUT | EZLOG_USE_INDENTATION |
EZLOG_REPORT_BLOCKCLOSE | EZLOG_USE_ONLY_MY_LEVELS | EZLOG_LEVELS_ARE_MASKABLE;
EzLogOpenData.LogFileName = LOGFILE;
//
// Don't output the block summary table
//
EzLogOpenData.cReportBlockThresh = EZLOG_REPORT_NO_BLOCKS;
EzLogOpenData.cLevels = sizeof(g_EzLogLevels) / sizeof(EZLOG_LEVEL_INIT_DATA);
EzLogOpenData.pLevels = g_EzLogLevels;
if (! ezOpenLogEx(&EzLogOpenData))
{
return FALSE;
}
return TRUE;
}
//
// Function: LogClose
// Purpose: Close and cleanup logging
//
BOOL LogClose(void)
{
//
// Check for a Test Suite-level error
//
if (g_fTestSuiteError)
{
ezLogMsg(
CSP_ERROR_TEST_SUITE,
NULL,
NULL,
__LINE__,
L"CSP Test Suite is ending prematurely");
}
return ezCloseLog(0);
}
//
// Function: LogBeginCSPClass
// Purpose: Log the beginning of a new class, or major group, of tests.
//
BOOL LogBeginCSPClass(DWORD dwClass)
{
LPWSTR pwsz = NULL;
switch (dwClass)
{
case CLASS_INVALID:
{
pwsz = L"CLASS_INVALID";
break;
}
case CLASS_SIG_ONLY:
{
pwsz = L"CLASS_SIG_ONLY";
break;
}
case CLASS_SIG_KEYX:
{
pwsz = L"CLASS_SIG_KEYX";
break;
}
case CLASS_FULL:
{
pwsz = L"CLASS_FULL";
break;
}
}
//
// If there has been a Test Suite-level error, don't allow
// a new CSP Class set of tests to begin.
//
if (g_fTestSuiteError)
{
return FALSE;
}
else
{
g_dwCurrentCSPClass = dwClass;
return ezStartBlock(
NULL,
NULL,
EZBLOCK_OUTCOME_INDEPENDENT /*EZBLOCK_TRACK_SUBBLOCKS*/,
CSP_PASS,
L"CSP %s", pwsz);
}
}
//
// Function: LogEndCSPClass
// Purpose: Log the completion of the current class of tests.
//
BOOL LogEndCSPClass(DWORD dwClass)
{
if (g_dwCurrentCSPClass != dwClass)
{
return FALSE;
}
//
// Clear CSP Class-level error flag
//
if (g_fCSPClassError)
{
ezLogMsg(
CSP_ERROR_CSP_CLASS,
NULL,
NULL,
__LINE__,
L"CSP Class is ending prematurely");
g_fCSPClassError = FALSE;
}
return ezFinishBlock(0);
}
//
// Function: LogBeginTestLevel
// Purpose: Log the beginning of a new level, or minor group, of tests.
//
BOOL LogBeginTestLevel(DWORD dwLevel)
{
LPWSTR pwsz = NULL;
switch (dwLevel)
{
case TEST_LEVEL_CSP:
{
pwsz = L"TEST_LEVEL_CSP";
break;
}
case TEST_LEVEL_PROV:
{
pwsz = L"TEST_LEVEL_PROV";
break;
}
case TEST_LEVEL_HASH:
{
pwsz = L"TEST_LEVEL_HASH";
break;
}
case TEST_LEVEL_KEY:
{
pwsz = L"TEST_LEVEL_KEY";
break;
}
case TEST_LEVEL_CONTAINER:
{
pwsz = L"TEST_LEVEL_CONTAINER";
break;
}
}
//
// If there has been a CSP Class-level error, don't start
// a new test level until the error has been cleared.
//
if (g_fCSPClassError)
{
return FALSE;
}
else
{
g_dwCurrentTestLevel = dwLevel;
return ezStartBlock(
NULL,
NULL,
EZBLOCK_OUTCOME_INDEPENDENT /*EZBLOCK_TRACK_SUBBLOCKS*/,
CSP_PASS,
L"%s", pwsz);
}
}
//
// Function: LogEndTestLevel
// Purpose: Log the completion of the current test level.
//
BOOL LogEndTestLevel(DWORD dwLevel)
{
if (g_dwCurrentTestLevel != dwLevel)
{
return FALSE;
}
//
// Clear Test Level error flag
//
if (g_fTestLevelError)
{
ezLogMsg(
CSP_ERROR_TEST_LEVEL,
NULL,
NULL,
__LINE__,
L"Test Level is ending prematurely");
g_fTestLevelError = FALSE;
}
return ezFinishBlock(0);
}
//
// Function: LogBeginAPI
// Purpose: Log the beginning of a set of API test cases
//
BOOL LogBeginAPI(API_NAME ApiName, DWORD dwAPISubset)
{
WCHAR rgwsz[BUFFER_SIZE];
//
// If there has been a Test Level error, don't start a new
// API set until the error has been cleared.
//
if (g_fTestLevelError)
{
return FALSE;
}
else
{
g_dwTestCaseIDMajor++;
g_CurrentAPI = ApiName;
g_dwCurrentAPISubset = dwAPISubset;
ApiNameToString(ApiName, rgwsz);
wcscpy(rgwsz + wcslen(rgwsz), L", ");
TestCaseTypeToString(
dwAPISubset,
rgwsz + wcslen(rgwsz));
return ezStartBlock(
NULL,
NULL,
EZBLOCK_OUTCOME_INDEPENDENT /*EZBLOCK_TRACK_SUBBLOCKS*/,
CSP_PASS,
L"API %s",
rgwsz);
}
}
//
// Function: LogEndAPI
// Purpose: Log the completion of a set of API test cases
//
BOOL LogEndAPI(API_NAME ApiName, DWORD dwAPISubset)
{
if ( (g_CurrentAPI != ApiName) ||
(g_dwCurrentAPISubset != dwAPISubset))
{
return FALSE;
}
//
// Clear API-level error flag
//
g_fAPIError = FALSE;
return ezFinishBlock(0);
}
//
// Function: LogPass
// Purpose: Log a successful test case
//
BOOL LogPass(DWORD dwTestCaseID)
{
return ezLogMsg(
CSP_PASS,
NULL,
NULL,
__LINE__,
L"Test case %d.%d: PASS",
g_dwTestCaseIDMajor,
dwTestCaseID);
}
//
// Function: LogBeginScenarioTest
// Purpose: Log the beginning of a Scenario Test.
//
BOOL LogBeginScenarioTest(LPWSTR pwszDescription)
{
g_dwTestCaseIDMajor++;
return ezStartBlock(
NULL,
NULL,
EZBLOCK_OUTCOME_INDEPENDENT,
CSP_PASS,
L"Scenario test case - %s",
pwszDescription);
}
//
// Function: LogEndScenarioTest
// Purpose: Log the end of a Scenario Test
//
BOOL LogEndScenarioTest(void)
{
//
// Clear API-level error flag
//
g_fAPIError = FALSE;
return ezFinishBlock(0);
}
//
// Function: LogBeginInteropTest
// Purpose: Log the beginning of an Interoperability Test.
//
BOOL LogBeginInteropTest(LPWSTR pwszDescription)
{
g_dwTestCaseIDMajor++;
return ezStartBlock(
NULL,
NULL,
EZBLOCK_OUTCOME_INDEPENDENT,
CSP_PASS,
L"Interoperability test case - %s",
pwszDescription);
}
//
// Function: LogEndInteropTest
// Purpose: Log the end of an Interoperability Test
//
BOOL LogEndInteropTest(void)
{
//
// Clear API-level error flag
//
g_fAPIError = FALSE;
return ezFinishBlock(0);
}
//
// Function: DoError
// Purpose: Perform the operations for handling a test case error
//
BOOL DoError(DWORD dwTestCaseID, DWORD dwReportedErrorLevel)
{
LPWSTR pwszErrorLevel = NULL;
DWORD dwErrorLevel = dwReportedErrorLevel & (CSP_ERROR_CONTINUE | CSP_ERROR_API);
switch (dwErrorLevel)
{
case CSP_ERROR_CONTINUE:
pwszErrorLevel = L"ERROR_CONTINUE";
break;
case CSP_ERROR_API:
pwszErrorLevel = L"ERROR_API";
break;
}
//
// The dwErrorLevel is being masked to limit the scope of the
// error being reported at this point. If a test case fails,
// only ERROR_CONTINUE and ERROR_API (and ERROR_WARNING) errors
// will be reported. If a more severe error has been flagged,
// it will be reported when the appropriate Test Level or CSP Class
// block ends.
//
return ezLogMsg(
dwErrorLevel,
NULL,
NULL,
__LINE__,
L"Test case %d.%d: %s",
g_dwTestCaseIDMajor,
dwTestCaseID,
pwszErrorLevel);
}
//
// Function: DoWarning
// Purpose: Perform the operations for handling a test case warning
//
BOOL DoWarning(DWORD dwTestCaseID)
{
return ezLogMsg(
CSP_ERROR_WARNING,
NULL,
NULL,
__LINE__,
L"Test case %d.%d: WARNING",
g_dwTestCaseIDMajor,
dwTestCaseID);
}
//
// Function: LogTestCaseSeparator
//
BOOL LogTestCaseSeparator(BOOL fLogToConsole)
{
if (fLogToConsole)
{
return ezLogMsg(
LOG_SEPARATOR_CONSOLE,
NULL,
NULL,
__LINE__,
TEST_CASE_SEPARATOR);
}
else
{
return ezLogMsg(
LOG_SEPARATOR,
NULL,
NULL,
__LINE__,
TEST_CASE_SEPARATOR);
}
}
//
// Function: LogTestCase
//
BOOL LogTestCase(PLOGTESTCASEINFO pLogTestCaseInfo)
{
BOOL fReturn = TRUE;
DWORD dwActualErrorLevel = pLogTestCaseInfo->dwErrorLevel;
//LPWSTR pwszExpected = NULL;
//LPWSTR pwszActual = NULL;
LPWSTR pwsz = NULL;
BOOL fLogToConsole = FALSE;
DWORD dwLogApiName = LOG_API_NAME;
DWORD dwLogInfo = LOG_INFO;
WCHAR rgwsz[BUFFER_SIZE];
if (pLogTestCaseInfo->fPass)
{
LogTestCaseSeparator(FALSE);
LogPass(pLogTestCaseInfo->dwTestCaseID);
goto Return;
}
if (KNOWN_ERROR_UNKNOWN != pLogTestCaseInfo->KnownErrorID)
{
dwActualErrorLevel = GetKnownErrorValue(
pLogTestCaseInfo->KnownErrorID,
dwActualErrorLevel);
}
if (dwActualErrorLevel & CSP_ERROR_WARNING)
{
//
// Don't look for other error flags if a warning has been flagged,
// just handle the warning and return.
//
//fLogToConsole = TRUE;
LogTestCaseSeparator(fLogToConsole);
DoWarning(pLogTestCaseInfo->dwTestCaseID);
goto Return;
}
if (dwActualErrorLevel &
(CSP_ERROR_CONTINUE | CSP_ERROR_API |
CSP_ERROR_TEST_LEVEL | CSP_ERROR_CSP_CLASS |
CSP_ERROR_TEST_SUITE))
{
fLogToConsole = TRUE;
LogTestCaseSeparator(fLogToConsole);
DoError(pLogTestCaseInfo->dwTestCaseID, dwActualErrorLevel);
}
if (dwActualErrorLevel & CSP_ERROR_API)
{
g_fAPIError = TRUE;
fReturn = FALSE;
}
if (dwActualErrorLevel & CSP_ERROR_TEST_LEVEL)
{
g_fTestLevelError = TRUE;
}
if (dwActualErrorLevel & CSP_ERROR_CSP_CLASS)
{
g_fCSPClassError = TRUE;
}
if (dwActualErrorLevel & CSP_ERROR_TEST_SUITE)
{
g_fTestSuiteError = TRUE;
}
Return:
if (fLogToConsole)
{
dwLogApiName = LOG_API_NAME_CONSOLE;
dwLogInfo = LOG_INFO_CONSOLE;
}
ApiNameToString(pLogTestCaseInfo->ApiName, rgwsz);
ezLogMsg(
dwLogApiName,
NULL,
NULL,
__LINE__,
L"%s", rgwsz);
ezLogMsg(
dwLogInfo,
NULL,
NULL,
__LINE__,
L"Returned: %s",
pLogTestCaseInfo->fReturnVal ? STRING_TRUE : STRING_FALSE);
if (! pLogTestCaseInfo->fPass)
{
switch (pLogTestCaseInfo->dwErrorType)
{
case ERROR_API_SUCCEEDED:
pwsz = L"API succeeded unexpectedly";
break;
case ERROR_API_FAILED:
pwsz = L"API failed unexpectedly";
break;
case ERROR_WRONG_ERROR_CODE:
pwsz = L"API returned an incorrect error code";
break;
case ERROR_WIN32_FAILURE:
pwsz = L"A WIN32 (non-CSP) API failed";
break;
case ERROR_WRONG_SIZE:
pwsz = L"The API returned an incorrect data size";
break;
case ERROR_BAD_DATA:
pwsz = L"The API returned bad data";
break;
case ERROR_LIST_TOO_SHORT:
pwsz = L"The list of algorithms is too short";
break;
case ERROR_REQUIRED_ALG:
pwsz = L"A required algorithm is missing";
break;
}
ezLogMsg(
dwLogInfo,
NULL,
NULL,
__LINE__,
L"Error type: %s", pwsz);
//
// Display details about the known error status here,
// after the Error/Warning has been processed above.
//
ezLogMsg(
dwLogInfo,
NULL,
NULL,
__LINE__,
L"Known error: %s",
(KNOWN_ERROR_UNKNOWN == pLogTestCaseInfo->KnownErrorID) ? L"No" : L"Yes");
if (ERROR_WRONG_ERROR_CODE == pLogTestCaseInfo->dwErrorType)
{
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK,
NULL,
pLogTestCaseInfo->dwExpectedErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
rgwsz,
BUFFER_SIZE,
NULL);
ezLogMsg(
dwLogInfo,
NULL,
NULL,
__LINE__,
L"Expected error code: 0x%x (%s)",
pLogTestCaseInfo->dwExpectedErrorCode,
rgwsz);
*rgwsz = L'\0';
}
if ( FALSE == pLogTestCaseInfo->fReturnVal ||
ERROR_API_FAILED == pLogTestCaseInfo->dwErrorType ||
ERROR_WRONG_ERROR_CODE == pLogTestCaseInfo->dwErrorType ||
ERROR_WIN32_FAILURE == pLogTestCaseInfo->dwErrorType)
{
// Don't get the error string if the error code is 0
*rgwsz = L'\0';
if (0 != pLogTestCaseInfo->dwWinError)
{
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK,
NULL,
pLogTestCaseInfo->dwWinError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
rgwsz,
BUFFER_SIZE,
NULL);
}
ezLogMsg(
dwLogInfo,
NULL,
NULL,
__LINE__,
L"Actual error code: 0x%x (%s)",
pLogTestCaseInfo->dwWinError,
rgwsz);
*rgwsz = L'\0';
}
//
// Log details about this failure
//
if (NULL != pLogTestCaseInfo->pwszErrorHelp)
{
ezLogMsg(
dwLogInfo,
NULL,
NULL,
__LINE__,
L"Test case description: %s",
pLogTestCaseInfo->pwszErrorHelp);
}
}
LogParamInfo(
pLogTestCaseInfo->pParamInfo,
pLogTestCaseInfo->cParamInfo,
fLogToConsole);
return fReturn;
}
//
// Function: LogGetInteropProvType
//
DWORD LogGetInteropProvType(void)
{
return g_dwInteropProvType;
}
//
// Function: LogGetInteropProvName
//
LPWSTR LogGetInteropProvName(void)
{
return g_pwszInteropProvName;
}
//
// Function: LogGetProvType
// Purpose: Return the provider type for which the CSP under
// test is registered (in the system registry).
//
DWORD LogGetProvType(void)
{
return g_dwExternalProvType;
}
//
// Function: LogGetProvName
// Purpose: Return the provider name for which the CSP under
// test is registered (in the system registry).
//
LPWSTR LogGetProvName(void)
{
return g_pwszProvName;
}
//
// Function: LogApiFailure
//
BOOL LogApiFailure(
IN API_NAME ApiName,
IN DWORD dwErrorType,
IN OUT PTESTCASE ptc)
{
LOGTESTCASEINFO LogTestCaseInfo;
InitLogTestCaseInfo(ptc, &LogTestCaseInfo);
LogTestCaseInfo.ApiName = ApiName;
LogTestCaseInfo.dwErrorType = dwErrorType;
LogTestCaseInfo.fPass = FALSE;
return LogTestCase(&LogTestCaseInfo);
}
//
// Function: CheckAndLogStatus
//
BOOL CheckAndLogStatus(
IN API_NAME ApiName,
IN BOOL fCallSucceeded,
IN OUT PTESTCASE ptc,
IN PAPI_PARAM_INFO pParamInfo,
IN DWORD cParamInfo)
{
DWORD dwWinError = 0;
//DWORD dwTestCaseID = 0;
LOGTESTCASEINFO LogTestCaseInfo;
InitLogTestCaseInfo(ptc, &LogTestCaseInfo);
LogTestCaseInfo.fReturnVal = fCallSucceeded;
if (! fCallSucceeded)
{
dwWinError = GetLastError();
if (ptc->fExpectSuccess)
{
//
// Test was expected to succeed, but it failed
//
LogTestCaseInfo.dwErrorType = ERROR_API_FAILED;
LogTestCaseInfo.dwWinError = dwWinError;
}
else
{
if (dwWinError != ptc->dwErrorCode)
{
//
// Test failed as expected, but returned the wrong
// error code.
//
LogTestCaseInfo.dwWinError = dwWinError;
LogTestCaseInfo.dwErrorType = ERROR_WRONG_ERROR_CODE;
}
//
// Otherwise, the test failed as expected, and it
// returned the correct error code.
//
else
{
LogTestCaseInfo.fPass = TRUE;
}
}
}
else
{
if (! ptc->fExpectSuccess)
{
//
// The test was expected to fail, but it succeeded.
//
LogTestCaseInfo.dwErrorType = ERROR_API_SUCCEEDED;
}
//
// Otherwise, the test succeeded as expected.
//
else
{
LogTestCaseInfo.fPass = TRUE;
}
}
//
// Now dwErrorType will be non-zero in any of three cases:
// 1) The API should have succeeded, but failed
// 2) The API should have failed, but succeeded
// 3) The API failed as expected, but returned the wrong error code
//
if (0 != LogTestCaseInfo.dwErrorType)
{
LogTestCaseInfo.dwErrorLevel = ptc->dwErrorLevel;
LogTestCaseInfo.dwExpectedErrorCode = ptc->dwErrorCode;
//
// The Microsoft RSA CSP's in Win2K do not return
// ERROR_INVALID_HANDLE for most, if not all, of the test cases
// involving that error code in this test suite. Therefore,
// intercept those error here, and flag them as known for that
// platform.
//
if ( (ERROR_WRONG_ERROR_CODE == LogTestCaseInfo.dwErrorType) &&
(ERROR_INVALID_HANDLE == LogTestCaseInfo.dwExpectedErrorCode))
{
LogTestCaseInfo.KnownErrorID = KNOWN_ERRORINVALIDHANDLE;
}
//
// The Microsoft RSA CSP's in Win2K do not return
// NTE_BAD_KEY for the negative test cases involving that
// error code. Intercept those errors here and flag them as
// known for that platform.
//
if ( (ERROR_WRONG_ERROR_CODE == LogTestCaseInfo.dwErrorType) &&
(NTE_BAD_KEY == LogTestCaseInfo.dwExpectedErrorCode))
{
LogTestCaseInfo.KnownErrorID = KNOWN_NTEBADKEY;
}
//
// The Microsoft RSA CSP's in Win2K do not return NTE_BAD_HASH
// for the negative test cases involving that error code. Intercept
// those errors here and flag them as known for that platform.
//
if ( (ERROR_WRONG_ERROR_CODE == LogTestCaseInfo.dwErrorType) &&
(NTE_BAD_HASH == LogTestCaseInfo.dwExpectedErrorCode))
{
LogTestCaseInfo.KnownErrorID = KNOWN_NTEBADHASH;
}
}
// Finally, increment the current test case ID
++ptc->dwTestCaseID;
LogTestCaseInfo.dwTestCaseID = ptc->dwTestCaseID;
LogTestCaseInfo.pParamInfo = pParamInfo;
LogTestCaseInfo.cParamInfo = cParamInfo;
LogTestCaseInfo.ApiName = ApiName;
return LogTestCase(&LogTestCaseInfo);
}
//
// Function: InitFailInfo
//
void InitLogTestCaseInfo(
IN PTESTCASE ptc,
OUT PLOGTESTCASEINFO pLogTestCaseInfo)
{
memset(pLogTestCaseInfo, 0, sizeof(LOGTESTCASEINFO));
pLogTestCaseInfo->dwErrorLevel = ptc->dwErrorLevel;
pLogTestCaseInfo->dwExpectedErrorCode = ptc->dwErrorCode;
pLogTestCaseInfo->dwTestCaseID = ptc->dwTestCaseID;
pLogTestCaseInfo->KnownErrorID = ptc->KnownErrorID;
pLogTestCaseInfo->pwszErrorHelp = ptc->pwszErrorHelp;
}
//
// Function: LogBadParam
//
BOOL LogBadParam(
API_NAME ApiName,
LPWSTR pwszErrorHelp,
PTESTCASE ptc)
{
LOGTESTCASEINFO LogTestCaseInfo;
++ptc->dwTestCaseID;
InitLogTestCaseInfo(ptc, &LogTestCaseInfo);
LogTestCaseInfo.ApiName = ApiName;
LogTestCaseInfo.dwErrorType = ERROR_BAD_DATA;
LogTestCaseInfo.pwszErrorHelp = pwszErrorHelp;
LogTestCaseInfo.fPass = FALSE;
return LogTestCase(&LogTestCaseInfo);
}
//
// Function: LogProvEnumalgsEx
//
void LogProvEnumalgsEx(PROV_ENUMALGS_EX *pData)
{
LPWSTR pwszAlgType = NULL;
LPWSTR pwszName = MkWStr(pData->szName);
LPWSTR pwszLongName = MkWStr(pData->szLongName);
// Determine the algorithm type.
switch(GET_ALG_CLASS(pData->aiAlgid))
{
case ALG_CLASS_DATA_ENCRYPT: pwszAlgType = L"Encrypt ";
break;
case ALG_CLASS_HASH: pwszAlgType = L"Hash ";
break;
case ALG_CLASS_KEY_EXCHANGE: pwszAlgType = L"Exchange ";
break;
case ALG_CLASS_SIGNATURE: pwszAlgType = L"Signature";
break;
default: pwszAlgType = L"Unknown ";
}
// Print information about the algorithm.
ezLogMsg(
LOG_INFO,
NULL,
NULL,
__LINE__,
L"Algid:%8.8xh, Bits:%-4d, %-4d - %-4d, Type:%s",
pData->aiAlgid,
pData->dwDefaultLen,
pData->dwMinLen,
pData->dwMaxLen,
pwszAlgType);
ezLogMsg(
LOG_INFO,
NULL,
NULL,
__LINE__,
L" Name: %s LongName: %s Protocols: 0x%x",
pwszName,
pwszLongName,
pData->dwProtocols);
free(pwszName);
free(pwszLongName);
}
//
// Function: LogProvEnumalgs
// Purpose: Log the contents of a PROV_ENUMALGS struct
//
void LogProvEnumalgs(PROV_ENUMALGS *pData)
{
LPWSTR pwszAlgType = NULL;
LPWSTR pwszName = MkWStr(pData->szName);
// Determine the algorithm type.
switch(GET_ALG_CLASS(pData->aiAlgid))
{
case ALG_CLASS_DATA_ENCRYPT: pwszAlgType = L"Encrypt ";
break;
case ALG_CLASS_HASH: pwszAlgType = L"Hash ";
break;
case ALG_CLASS_KEY_EXCHANGE: pwszAlgType = L"Exchange ";
break;
case ALG_CLASS_SIGNATURE: pwszAlgType = L"Signature";
break;
default: pwszAlgType = L"Unknown ";
}
// Print information about the algorithm.
ezLogMsg(
LOG_INFO,
NULL,
NULL,
__LINE__,
L"Algid:%8.8xh, Bits:%-4d, Type:%s, NameLen:%-2d, Name:%s",
pData->aiAlgid,
pData->dwBitLen,
pwszAlgType,
pData->dwNameLen,
pwszName);
free(pwszName);
}