windows-nt/Source/XPSP1/NT/ds/win32/ntcrypto/test/testsuit/logging.h

585 lines
12 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
#ifndef __LOGGING__H__
#define __LOGGING__H__
#include <windows.h>
#include <ezlog.h>
#include "cspstruc.h"
#define STRING_TRUE L"True"
#define STRING_FALSE L"False"
#define TEST_CASE_SEPARATOR L"----------------------------------------"
#define BUFFER_LENGTH 1024
//
// ------------
// Error Levels
// ------------
//
#define CSP_ERROR_NO_ERROR 0x00000000
#define CSP_PASS 0x00000001
#define CSP_ERROR_WARNING 0x00000002
#define CSP_ERROR_CONTINUE 0x00000004
#define CSP_ERROR_API 0x00000008
#define CSP_ERROR_TEST_LEVEL 0x00000010
#define CSP_ERROR_CSP_CLASS 0x00000020
#define CSP_ERROR_TEST_SUITE 0x00000040
#define LOG_API_NAME_CONSOLE 0x00000100
#define LOG_API_PARAMETER_CONSOLE 0x00000200
#define LOG_INFO_CONSOLE 0x00000400
#define LOG_SEPARATOR_CONSOLE 0x00000800
#define LOG_API_NAME 0x00010000
#define LOG_API_PARAMETER 0x00020000
#define LOG_INFO 0x00040000
#define LOG_USER_OPTION 0x00080000
#define LOG_SEPARATOR 0x00100000
#define LOG_USER_PROTECTED_KEY 0x00200000
//
// This array is needed so that error levels can be indexed in order
// of increasing severity.
//
static DWORD g_rgErrorLevels [] =
{
CSP_ERROR_WARNING, CSP_ERROR_CONTINUE,
CSP_ERROR_API, CSP_ERROR_TEST_LEVEL,
CSP_ERROR_CSP_CLASS, CSP_ERROR_TEST_SUITE
};
//
// -----------------
// Defines for EZLOG
// -----------------
//
#define LOGFILE L"csptestsuite.log"
//
// The EZLog output settings
//
static EZLOG_LEVEL_INIT_DATA g_EzLogLevels [] =
{
{ LOG_API_NAME_CONSOLE,
L"API",
0,
EZLOG_LFLAG_NONRESULTANT
},
{ LOG_API_PARAMETER_CONSOLE,
L"PARA",
0,
EZLOG_LFLAG_NONRESULTANT
},
{ LOG_INFO_CONSOLE,
L"INFO",
0,
EZLOG_LFLAG_NONRESULTANT
},
{ LOG_SEPARATOR_CONSOLE,
L"----",
0,
EZLOG_LFLAG_NONRESULTANT
},
{ LOG_API_NAME,
L"API",
0,
EZLOG_LFLAG_NONRESULTANT | EZLOG_LFLAG_NOT_CONSOLE
},
{ LOG_API_PARAMETER,
L"PARA",
0,
EZLOG_LFLAG_NONRESULTANT | EZLOG_LFLAG_NOT_CONSOLE
},
{ LOG_INFO,
L"INFO",
0,
EZLOG_LFLAG_NONRESULTANT | EZLOG_LFLAG_NOT_CONSOLE
},
{ LOG_USER_OPTION,
L"OPT",
0,
EZLOG_LFLAG_NONRESULTANT
},
{ LOG_SEPARATOR,
L"----",
0,
EZLOG_LFLAG_NONRESULTANT | EZLOG_LFLAG_NOT_CONSOLE
},
{ LOG_USER_PROTECTED_KEY,
L"KEY",
0,
EZLOG_LFLAG_NONRESULTANT
},
{ CSP_PASS,
L"PASS",
CSP_PASS,
EZLOG_LFLAG_ATTEMPTED | EZLOG_LFLAG_SUCCESSFUL | EZLOG_LFLAG_NOT_CONSOLE
},
{ CSP_ERROR_WARNING,
L"WARN",
CSP_ERROR_WARNING,
EZLOG_LFLAG_ATTEMPTED | EZLOG_LFLAG_SUCCESSFUL | EZLOG_LFLAG_NOT_CONSOLE
},
{ CSP_ERROR_CONTINUE,
L"ERR1",
CSP_ERROR_CONTINUE,
EZLOG_LFLAG_ATTEMPTED
},
{ CSP_ERROR_API,
L"ERR2",
CSP_ERROR_API,
EZLOG_LFLAG_ATTEMPTED
},
{ CSP_ERROR_TEST_LEVEL,
L"ERR3",
CSP_ERROR_TEST_LEVEL,
EZLOG_LFLAG_NONRESULTANT
},
{ CSP_ERROR_CSP_CLASS,
L"ERR4",
CSP_ERROR_CSP_CLASS,
EZLOG_LFLAG_NONRESULTANT
},
{ CSP_ERROR_TEST_SUITE,
L"ERR5",
CSP_ERROR_TEST_SUITE,
EZLOG_LFLAG_NONRESULTANT
},
{ 0, L"", 0, 0 }
};
//
// Function: IncrementErrorLevel
// Purpose: Increase the severity of the specified error level by
// one step.
//
DWORD IncrementErrorLevel(DWORD dwErrorLevel);
//
// Defines for error results
//
#define ERROR_API_SUCCEEDED 1
#define ERROR_API_FAILED 2
#define ERROR_WRONG_ERROR_CODE 3
#define ERROR_WIN32_FAILURE 4
#define ERROR_WRONG_SIZE 5
#define ERROR_BAD_DATA 6
#define ERROR_LIST_TOO_SHORT 7
#define ERROR_REQUIRED_ALG 8
//
// Defines for the types of test cases
//
#define TEST_CASES_POSITIVE 1
#define TEST_CASES_NEGATIVE 2
#define TEST_CASES_SCENARIO 3
#define TEST_CASES_INTEROP 4
//
// Enum for identifying API's
//
typedef enum _API_NAME
{
API_CRYPTACQUIRECONTEXT = 1,
API_CRYPTCREATEHASH,
API_CRYPTDECRYPT,
API_CRYPTDERIVEKEY,
API_CRYPTDESTROYHASH,
API_CRYPTDESTROYKEY,
API_CRYPTENCRYPT,
API_CRYPTEXPORTKEY,
API_CRYPTGENKEY,
API_CRYPTGENRANDOM,
API_CRYPTGETHASHPARAM,
API_CRYPTGETKEYPARAM,
API_CRYPTGETPROVPARAM,
API_CRYPTGETUSERKEY,
API_CRYPTHASHDATA,
API_CRYPTHASHSESSIONKEY,
API_CRYPTIMPORTKEY,
API_CRYPTRELEASECONTEXT,
API_CRYPTSETHASHPARAM,
API_CRYPTSETKEYPARAM,
API_CRYPTSETPROVPARAM,
API_CRYPTSIGNHASH,
API_CRYPTVERIFYSIGNATURE,
API_CRYPTDUPLICATEHASH,
API_CRYPTDUPLICATEKEY,
API_CRYPTCONTEXTADDREF,
API_MEMORY,
API_DATACOMPARE,
API_GETDESKTOPWINDOW
} API_NAME;
//
// ---------------------------
// Defines for logging strings
// ---------------------------
//
//
// Struct: FLAGTOSTRING_ITEM
// Purpose: Associate a key value with a string
//
typedef struct _FLAGTOSTRING_ITEM
{
DWORD dwKey;
LPWSTR pwszString;
} FLAGTOSTRING_ITEM, *PFLAGTOSTRING_ITEM;
#define FLAGTOSTRING_SIZE(item) (sizeof(item) / sizeof(FLAGTOSTRING_ITEM))
//
// Logging API
//
typedef enum _FLAG_TYPE
{
Maskable = 1,
ExactMatch
} FLAG_TYPE;
//
// Struct: API_PARAM_INFO
// Purpose: Store parameter data for logging each call to a CSP entry
// point.
//
typedef enum _PARAM_TYPE
{
Handle = 1,
Pointer,
Dword,
String,
Boolean
} PARAM_TYPE;
typedef BOOL (*PFN_FLAGTOSTRING)(DWORD, LPWSTR);
typedef struct _API_PARAM_INFO
{
LPWSTR pwszName;
PARAM_TYPE Type;
union Parameter
{
DWORD dwParam;
ULONG_PTR pulParam;
PBYTE pbParam;
LPWSTR pwszParam;
BOOL fParam;
};
PFN_FLAGTOSTRING pfnFlagToString;
BOOL fPrintBytes;
PDWORD pcbBytes;
PBYTE pbSaved;
} API_PARAM_INFO, *PAPI_PARAM_INFO;
#define APIPARAMINFO_SIZE(X) (sizeof(X) / sizeof(API_PARAM_INFO))
//
// Function: FlagToString
// Purpose: Lookup the one or more flag specified by dwFlag in
// rgFlagToString and print the strings to the supplied string
// buffer.
//
BOOL FlagToString(
IN DWORD dwFlag,
IN FLAGTOSTRING_ITEM rgFlagToString [],
IN DWORD cFlagToString,
OUT WCHAR rgwsz [],
IN FLAG_TYPE FlagType);
BOOL AcquireContextFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL GetProvParamToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL SetProvParamToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL AlgidToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL DeriveKeyFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL EncryptFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL ExportKeyBlobTypeToString (
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL ExportKeyFlagToString (
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL GenKeyFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL HashParamToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL KeyParamToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL KeyParamModeToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL KeyParamPermissionToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL ProvParamEnumFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL ProvParamSecDescrFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL ProvParamImpTypeToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL HashDataFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL HashSessionKeyFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL ImportKeyFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL SignHashFlagToString(
IN DWORD dwFlag,
OUT WCHAR rgwsz []);
BOOL TestCaseTypeToString(
IN DWORD dwTestCaseType,
OUT WCHAR rgwsz []);
BOOL ApiNameToString(
API_NAME ApiName,
OUT WCHAR rgwsz[]);
//
// Function: LogCleanupParamInfo
// Purpose: Free any memory allocated by LogInitParamInfo in the
// pParamInfo array.
//
void LogCleanupParamInfo(
IN OUT PAPI_PARAM_INFO pParamInfo,
IN DWORD cParamInfo);
//
// Function: LogInitParamInfo
// Purpose: Search the pParamInfo array for entries with the
// fPrintBytes flag set. For valid entries, the pbParam data member
// is copied to the pbSaved member.
//
BOOL LogInitParamInfo(
IN OUT PAPI_PARAM_INFO pParamInfo,
IN DWORD cParamInfo,
IN PTESTCASE ptc);
//
// Function: LogParamInfo
// Purpose: Parse an array of type API_PARAM_INFO and write its contents
// to the log file.
//
void LogParamInfo(
PAPI_PARAM_INFO pParamInfo,
DWORD cParamInfo,
BOOL fLogToConsole);
//
// Function: LogInfo
// Purpose: Write an informational message to the log.
//
void LogInfo(IN LPWSTR pwszInfo);
//
// Function: LogUserOption
// Purpose: Report a test suite option as it has been
// selected by the user (or defaulted) to the log.
//
void LogUserOption(IN LPWSTR pwszOption);
//
// Function: LogTestCaseSeparator
// Purpose: Write a blank, separator line to the logfile.
//
BOOL LogTestCaseSeparator(BOOL fLogToConsole);
//
// Function: LogCreatingUserProtectedKey
// Purpose: Write to the console (and log) that the next
// Crypto API call will be CryptGenKey CRYPT_USER_PROTECTED
// and that the operator should expected to see the user
// protected UI.
//
void LogCreatingUserProtectedKey(void);
//
// Function: LogProvEnumalgsEx
// Purpose: Log the contents of a PROV_ENUMALGS_EX struct
//
void LogProvEnumalgsEx(PROV_ENUMALGS_EX *pProvEnumalgsEx);
//
// Function: LogProvEnumalgs
// Purpose: Log the contents of a PROV_ENUMALGS struct
//
void LogProvEnumalgs(PROV_ENUMALGS *pProvEnumalgs);
//
// Struct: LOGINIT_INFO
// Purpose: This is data that is required by LogInit in order
// to initialize the Test Suite logging routines.
//
typedef struct _LOGINIT_INFO
{
//
// Data about the CSP under test
//
LPWSTR pwszCSPName;
DWORD dwCSPExternalType;
DWORD dwCSPInternalType;
DWORD dwCSPInternalClass;
//
// Data about the CSP to be used for
// interoperability testing, if applicable.
//
LPWSTR pwszInteropCSPName;
DWORD dwInteropCSPExternalType;
} LOGINIT_INFO, *PLOGINIT_INFO;
BOOL LogInit(
IN PLOGINIT_INFO pLogInitInfo);
BOOL LogClose(void);
BOOL LogBeginCSPClass(DWORD dwClass);
BOOL LogEndCSPClass(DWORD dwClass);
BOOL LogBeginTestLevel(DWORD dwLevel);
BOOL LogEndTestLevel(DWORD dwLevel);
BOOL LogBeginAPI(API_NAME ApiName, DWORD dwAPISubset);
BOOL LogEndAPI(API_NAME ApiName, DWORD dwAPISubset);
BOOL LogPass(DWORD dwTestCaseID);
BOOL LogBeginScenarioTest(LPWSTR pwszDescription);
BOOL LogEndScenarioTest(void);
BOOL LogBeginInteropTest(LPWSTR pwszDescription);
BOOL LogEndInteropTest(void);
//
// Struct: LOGTESTCASEINFO
// Purpose: Data required to write information about a test case to the
// log file.
//
typedef struct _LOGTESTCASEINFO
{
BOOL fPass;
API_NAME ApiName;
BOOL fReturnVal;
DWORD dwErrorType;
DWORD dwErrorLevel;
DWORD dwTestCaseID;
KNOWN_ERROR_ID KnownErrorID;
DWORD dwWinError;
DWORD dwExpectedErrorCode;
LPWSTR pwszErrorHelp;
PAPI_PARAM_INFO pParamInfo;
DWORD cParamInfo;
} LOGTESTCASEINFO, *PLOGTESTCASEINFO;
//
// Function: LogTestCase
// Purpose: Parse the pLogTestCaseInfo struct and perform the appropriate actions:
// - Log a Pass, Warning, or Error
// - Format the test case information and print it to the log.
//
BOOL LogTestCase(PLOGTESTCASEINFO pLogTestCaseInfo);
//
// Function: LogApiFailure
// Purpose: Create a LOGTESTCASEINFO struct based on the function
// parameters and call LogTestCase.
//
BOOL LogApiFailure(
IN API_NAME ApiName,
IN DWORD dwErrorType,
IN OUT PTESTCASE ptc);
DWORD LogGetInteropProvType(void);
LPWSTR LogGetInteropProvName(void);
DWORD LogGetProvType(void);
LPWSTR LogGetProvName(void);
//
// ----------------
// Logging wrappers
// ----------------
//
//
// Function: CheckAndLogStatus
// Purpose: Calls the appropriate logging routines based on the provided parameters.
//
BOOL CheckAndLogStatus(
IN API_NAME ApiName,
IN BOOL fCallSucceeded,
IN OUT PTESTCASE ptc,
IN PAPI_PARAM_INFO pParamInfo,
IN DWORD cParamInfo);
//
// Function: InitFailInfo
// Purpose: Populate the fields of the LOGTESTCASEINFO struct
// from the corresponding fields of the TESTCASE struct.
//
void InitLogTestCaseInfo(
IN PTESTCASE ptc,
OUT PLOGTESTCASEINFO pLogTestCaseInfo);
//
// Function: LogBadParam
// Purpose: Log the failure of a Key/Hash parameter test
// case.
//
BOOL LogBadParam(
API_NAME ApiName,
LPWSTR pwszErrorHelp,
PTESTCASE ptc);
#endif