#ifndef __LOGGING__H__ #define __LOGGING__H__ #include #include #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