Add fips self test DEP for solaris and hpux

Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/10640)
This commit is contained in:
Shane Lontis 2019-12-22 09:44:38 +10:00
parent 169e422edd
commit 390b18a7a2

View File

@ -50,6 +50,10 @@ DEFINE_RUN_ONCE_STATIC(do_fips_self_test_init)
return self_test_lock != NULL; return self_test_lock != NULL;
} }
#define DEP_DECLARE() \
void init(void); \
void cleanup(void);
/* /*
* This is the Default Entry Point (DEP) code. Every platform must have a DEP. * This is the Default Entry Point (DEP) code. Every platform must have a DEP.
* See FIPS 140-2 IG 9.10 * See FIPS 140-2 IG 9.10
@ -70,34 +74,55 @@ DEFINE_RUN_ONCE_STATIC(do_fips_self_test_init)
*/ */
# endif # endif
DEP_DECLARE()
# define DEP_INIT_ATTRIBUTE
# define DEP_FINI_ATTRIBUTE
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{ {
switch (fdwReason) { switch (fdwReason) {
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
FIPS_state = FIPS_STATE_SELFTEST; init();
break; break;
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
CRYPTO_THREAD_lock_free(self_test_lock); cleanup();
break; break;
default: default:
break; break;
} }
return TRUE; return TRUE;
} }
#elif defined(__GNUC__) #elif defined(__sun)
static __attribute__((constructor)) void init(void) DEP_DECLARE() /* must be declared before pragma */
# define DEP_INIT_ATTRIBUTE
# define DEP_FINI_ATTRIBUTE
# pragma init(init)
# pragma fini(cleanup)
#elif defined(__hpux)
DEP_DECLARE()
# define DEP_INIT_ATTRIBUTE
# define DEP_FINI_ATTRIBUTE
# pragma init "init"
# pragma fini "cleanup"
#elif defined(__GNUC__)
# define DEP_INIT_ATTRIBUTE static __attribute__((constructor))
# define DEP_FINI_ATTRIBUTE static __attribute__((destructor))
#endif
#if defined(DEP_INIT_ATTRIBUTE) && defined(DEP_FINI_ATTRIBUTE)
DEP_INIT_ATTRIBUTE void init(void)
{ {
FIPS_state = FIPS_STATE_SELFTEST; FIPS_state = FIPS_STATE_SELFTEST;
} }
DEP_FINI_ATTRIBUTE void cleanup(void)
static __attribute__((destructor)) void cleanup(void)
{ {
CRYPTO_THREAD_lock_free(self_test_lock); CRYPTO_THREAD_lock_free(self_test_lock);
} }
#endif #endif
/* /*