#ifndef __STRESTST__H__ #define __STRESTST__H__ #include #include #define APP_NAME "cspstres" #define KEY_CONTAINER_NAME "CspStressKey" #define ERROR_CAPTION "ERROR : cspstres " #define STRESS_DEFAULT_THREAD_COUNT 8 #define MAX_THREADS MAXIMUM_WAIT_OBJECTS #define PLAIN_BUFFER_SIZE 30000 #define HASH_DATA_SIZE 14999 #define SIGN_DATA_SIZE 999 #define PROV_PARAM_BUFFER_SIZE 256 #define RSA_AES_CSP "rsaaes.dll" #define ENUMERATE_REGISTERED_CSP -1 #define GENERIC_FAIL(X) { \ sprintf(szErrorMsg, "%s error 0x%x\n", #X, GetLastError()); \ MessageBox(NULL, szErrorMsg, ERROR_CAPTION, MB_OK | MB_ICONERROR); \ goto ErrorReturn ; \ } #define ALLOC_FAIL(X) { \ sprintf(szErrorMsg, "%s alloc error 0x%x\n", #X, GetLastError()); \ MessageBox(NULL, szErrorMsg, ERROR_CAPTION, MB_OK | MB_ICONERROR); \ goto ErrorReturn; \ } #define DW_INUSE 0 #define DW_HASH_ALGID 1 #define DW_END_CERT_INDEX 2 // // Struct: ALGNODE // Purpose: A linked list of CSP algorithms // typedef struct _ALGNODE { struct _ALGNODE *pNext; PROV_ENUMALGS_EX EnumalgsEx; } ALGNODE, *PALGNODE; // // Struct: THREAD_DATA // Purpose: This is the data passed to the entry point // shared by each of the worker/test threads. // typedef struct _THREAD_DATA { DWORD rgdwThreadStatus[MAX_THREADS]; DWORD dwThreadCount; DWORD dwProgramMins; PALGNODE pAlgList; CHAR rgszProvName[MAX_PATH]; DWORD dwProvType; BOOL fEphemeralKeys; BOOL fUserProtectedKeys; HCRYPTPROV hProv; HCRYPTPROV hVerifyCtx; HCRYPTKEY hExchangeKey; HCRYPTKEY hSignatureKey; HANDLE hEndTestEvent; CRITICAL_SECTION CSThreadData; DWORD dwThreadID; // Not thread safe DWORD dwTestsToRun; } THREAD_DATA, *PTHREAD_DATA; // ************ // Stress Tests // ************ #define RUN_THREAD_SIGNATURE_TEST 0x00000001 #define RUN_STRESS_TEST_ALL_ENCRYPTION_ALGS 0x00000002 #define RUN_THREAD_HASHING_TEST 0x00000004 #define RUN_THREAD_ACQUIRE_CONTEXT_TEST 0x00000008 #define RUN_ALL_TESTS 0xffffffff // // Function: StressGetDefaultThreadCount // Purpose: Return the default number of worker/test threads to be // created by a stress test. This will be equal to the number // of processors on the host system, unless there's only one, in // which case the value returned will be STRESS_DEFAULT_THREAD_COUNT. // DWORD StressGetDefaultThreadCount(void); // ***************** // Memory management // ***************** // // Function: MyAlloc // Purpose: Wrapper for calling thread-safe HeapAlloc // with default params. // LPVOID MyAlloc(SIZE_T); // // Function: MyFree // Purpose: Wrapper for calling thread-safe HeapFree // with default params. // BOOL MyFree(LPVOID); // // Function: PrintBytes // void PrintBytes(LPSTR pszHdr, BYTE *pb, DWORD cbSize); // *************** // Encryption Test // *************** // // Struct: ENCRYPTION_TEST_DATA // Purpose: Parameters for the StressEncryptionTest function. // typedef struct _ENCRYPTION_TEST_DATA { ALG_ID aiEncryptionKey; ALG_ID aiHash; ALG_ID aiHashKey; } ENCRYPTION_TEST_DATA, *PENCRYPTION_TEST_DATA; // **************** // Regression Tests // **************** typedef DWORD (*PREGRESSION_TEST)(PTHREAD_DATA); typedef struct _REGRESS_TEST_TABLE_ENTRY { PREGRESSION_TEST pfTest; DWORD dwExclude; LPSTR pszDescription; } REGRESS_TEST_TABLE_ENTRY, *PREGRESS_TEST_TABLE_ENTRY; DWORD KeyArchiveRegression(PTHREAD_DATA pThreadData); DWORD PlaintextBlobRegression(PTHREAD_DATA pThreadData); DWORD LoadAesCspRegression(PTHREAD_DATA pThreadData); DWORD DesImportRegression(PTHREAD_DATA pThreadData); DWORD KnownBlockCipherKeyRegression(PTHREAD_DATA pThreadData); DWORD PinCacheRegression(PTHREAD_DATA pThreadData); DWORD DesGetKeyParamRegression(PTHREAD_DATA pThreadData); DWORD MacEncryptRegression(IN PTHREAD_DATA pThreadData); DWORD HmacRegression(PTHREAD_DATA pThreadData); DWORD UnalignedImportExportRegression(PTHREAD_DATA pThreadData); static const REGRESS_TEST_TABLE_ENTRY g_rgRegressTests [] = { { KeyArchiveRegression, 0, "KeyArchiveRegression for CRYPT_ARCHIVABLE flag" }, { PlaintextBlobRegression, 0, "PlaintextBlobRegression for PLAINTEXTKEYBLOB blob type" }, { LoadAesCspRegression, 0, "LoadAesCspRegression for DllInitialize" }, { DesImportRegression, 0, "DesImportRegression for parity and non-parity key sizes" }, { KnownBlockCipherKeyRegression, 0, "KnownBlockCipherKeyRegression for CSP compatibility"}, { PinCacheRegression, 0, "PinCacheRegression for smart-card pin caching lib"}, { DesGetKeyParamRegression, 0, "DesGetKeyParamRegression for des KP_KEYLEN and KP_EFFECTIVE_KEYLEN" }, { MacEncryptRegression, 0, "MacEncryptRegression for simultaneous encrypt/decrypt and MAC" }, { HmacRegression, 0, "HmacRegression for CRYPT_IPSEC_HMAC_KEY processing" }, { UnalignedImportExportRegression, 0, "UnalignedImportExportRegression for key blob alignment" } }; static const unsigned g_cRegressTests = sizeof(g_rgRegressTests) / sizeof(REGRESS_TEST_TABLE_ENTRY); #endif