diff --git a/dll.cpp b/dll.cpp index 9efaec78..24edf140 100644 --- a/dll.cpp +++ b/dll.cpp @@ -23,22 +23,6 @@ NAMESPACE_BEGIN(CryptoPP) template<> const byte PKCS_DigestDecoration::decoration[] = {0x30,0x21,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x04,0x14}; template<> const unsigned int PKCS_DigestDecoration::length = sizeof(PKCS_DigestDecoration::decoration); -static const byte s_moduleMac[CryptoPP::HMAC::DIGESTSIZE] = "reserved for mac"; -#ifdef CRYPTOPP_WIN32_AVAILABLE -static HMODULE s_hModule = NULL; -#endif - -void DoDllPowerUpSelfTest() -{ -#ifdef CRYPTOPP_WIN32_AVAILABLE - char moduleFileName[MAX_PATH]; - GetModuleFileNameA(s_hModule, moduleFileName, sizeof(moduleFileName)); - CryptoPP::DoPowerUpSelfTest(moduleFileName, s_moduleMac); -#else - throw NotImplemented("DoDllPowerUpSelfTest() only available on Windows"); -#endif -} - NAMESPACE_END #endif @@ -127,16 +111,4 @@ void CRYPTOPP_CDECL operator delete (void * p) s_pDelete(p); } -BOOL APIENTRY DllMain(HANDLE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved) -{ - if (ul_reason_for_call == DLL_PROCESS_ATTACH) - { - s_hModule = (HMODULE)hModule; - DoDllPowerUpSelfTest(); - } - return TRUE; -} - #endif // #ifdef CRYPTOPP_EXPORTS diff --git a/dll.h b/dll.h index 4bf44ee5..0a175503 100644 --- a/dll.h +++ b/dll.h @@ -61,8 +61,6 @@ typedef void (CRYPTOPP_CDECL * PGetNewAndDelete)(PNew &, PDelete &); typedef new_handler (CRYPTOPP_CDECL * PSetNewHandler)(new_handler); typedef void (CRYPTOPP_CDECL * PSetNewAndDelete)(PNew, PDelete, PSetNewHandler); -CRYPTOPP_DLL void DoDllPowerUpSelfTest(); - NAMESPACE_END #endif diff --git a/fips140.h b/fips140.h index 8d255cf7..d792c308 100644 --- a/fips140.h +++ b/fips140.h @@ -26,6 +26,9 @@ enum PowerUpSelfTestStatus {POWER_UP_SELF_TEST_NOT_DONE, POWER_UP_SELF_TEST_FAIL //! perform the power-up self test, and set the self test status CRYPTOPP_DLL void DoPowerUpSelfTest(const char *moduleFilename, const byte *expectedModuleMac); +//! perform the power-up self test using the filename of this DLL and the embedded module MAC +CRYPTOPP_DLL void DoDllPowerUpSelfTest(); + //! set the power-up self test status to POWER_UP_SELF_TEST_FAILED CRYPTOPP_DLL void SimulatePowerUpSelfTestFailure(); diff --git a/fipstest.cpp b/fipstest.cpp index ae277ebf..f4fb694b 100644 --- a/fipstest.cpp +++ b/fipstest.cpp @@ -474,6 +474,44 @@ done: return; } +#ifdef CRYPTOPP_WIN32_AVAILABLE + +static const byte s_moduleMac[CryptoPP::HMAC::DIGESTSIZE] = "reserved for mac"; +static HMODULE s_hModule = NULL; + +void DoDllPowerUpSelfTest() +{ + char moduleFileName[MAX_PATH]; + GetModuleFileNameA(s_hModule, moduleFileName, sizeof(moduleFileName)); + CryptoPP::DoPowerUpSelfTest(moduleFileName, s_moduleMac); +} + +#else + +void DoDllPowerUpSelfTest() +{ + throw NotImplemented("DoDllPowerUpSelfTest() only available on Windows"); +} + +#endif // #ifdef CRYPTOPP_WIN32_AVAILABLE + NAMESPACE_END -#endif +#ifdef CRYPTOPP_WIN32_AVAILABLE + +// DllMain needs to be in the global namespace +BOOL APIENTRY DllMain(HANDLE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved) +{ + if (ul_reason_for_call == DLL_PROCESS_ATTACH) + { + CryptoPP::s_hModule = (HMODULE)hModule; + CryptoPP::DoDllPowerUpSelfTest(); + } + return TRUE; +} + +#endif // #ifdef CRYPTOPP_WIN32_AVAILABLE + +#endif // #ifndef CRYPTOPP_IMPORTS