diff --git a/libslunkcrypt/include/slunkcrypt.h b/libslunkcrypt/include/slunkcrypt.h index 30546f0..3eb4470 100644 --- a/libslunkcrypt/include/slunkcrypt.h +++ b/libslunkcrypt/include/slunkcrypt.h @@ -105,7 +105,7 @@ SLUNKCRYPT_API int slunkcrypt_decrypt_inplace(const slunkcrypt_t context, uint8_ * Auxiliary functions */ SLUNKCRYPT_API size_t slunkcrypt_random_bytes(uint8_t* const buffer, const size_t length); -SLUNKCRYPT_API void slunkcrypt_bzero(void* const ptr, const size_t length); +SLUNKCRYPT_API void slunkcrypt_bzero(void* const buffer, const size_t length); #ifdef __cplusplus } diff --git a/libslunkcrypt/src/junk.c b/libslunkcrypt/src/junk.c index 869028c..3f8658b 100644 --- a/libslunkcrypt/src/junk.c +++ b/libslunkcrypt/src/junk.c @@ -22,29 +22,27 @@ /* Compiler compatibility */ #if defined(__GNUC__) || defined(__clang__) -# define AT_EXIT(X) ((void)0) -# define DESTRUCTOR __attribute__((destructor)) +# define HAVE_DESTRUCTOR 1 #else -# define AT_EXIT(X) atexit((X)) -# define DESTRUCTOR +# define HAVE_DESTRUCTOR 0 #endif // ========================================================================== -// One-time init +// Call once support // ========================================================================== #ifdef _WIN32 -# define ONCE_TYPE volatile LONG -# define ONCE_INIT 0L -# define ONCE_FUNC win32_run_once +# define CALL_ONCE win32_call_once +# define CALL_ONCE_TYPE volatile LONG +# define CALL_ONCE_INIT 0L #else -# define ONCE_TYPE pthread_once_t -# define ONCE_INIT PTHREAD_ONCE_INIT -# define ONCE_FUNC pthread_once +# define CALL_ONCE pthread_once +# define CALL_ONCE_TYPE pthread_once_t +# define CALL_ONCE_INIT PTHREAD_ONCE_INIT #endif #ifdef _WIN32 -static void win32_run_once(ONCE_TYPE *const control, void (*init_routine)(void)) +static void win32_call_once(CALL_ONCE_TYPE *const control, void (*init_routine)(void)) { LONG status; while ((status = InterlockedCompareExchange(control, -1L, 0L)) != 0L) @@ -80,7 +78,7 @@ static void win32_run_once(ONCE_TYPE *const control, void (*init_routine)(void)) #endif /* Global state */ -static ONCE_TYPE s_random_is_initialized = ONCE_INIT; +static CALL_ONCE_TYPE s_random_is_initialized = CALL_ONCE_INIT; #if defined(_WIN32) typedef BOOLEAN(WINAPI *rtl_genrandom_t)(void *buffer, ULONG buff_size); static HMODULE s_dll_advapi32 = NULL; @@ -90,8 +88,8 @@ static const char *const DEV_RANDOM[] = { "/dev/urandom", "/dev/arandom", "/dev/ static int s_random_fd = -1; #endif -/* Close down CSRNG */ -static DESTRUCTOR void exit_random_source(void) +/* De-initialize CSRNG */ +static void exit_random_source(void) { #if defined(_WIN32) s_rtl_genrandom = NULL; @@ -126,13 +124,15 @@ static void init_random_source(void) } } #endif - AT_EXIT(exit_random_source); +#if !HAVE_DESTRUCTOR + atexit(exit_random_source); +#endif } /* Generate random bytes */ size_t slunkcrypt_random_bytes(uint8_t* const buffer, const size_t length) { - ONCE_FUNC(&s_random_is_initialized, init_random_source); + CALL_ONCE(&s_random_is_initialized, init_random_source); #if defined(_WIN32) if (s_rtl_genrandom) { @@ -157,7 +157,12 @@ size_t slunkcrypt_random_bytes(uint8_t* const buffer, const size_t length) // ========================================================================== #ifdef _WIN32 -# define HAVE_EXPLICIT_BZERO 0 +# ifdef SecureZeroMemory +# define HAVE_EXPLICIT_BZERO 1 +# define explicit_bzero SecureZeroMemory +# else +# define HAVE_EXPLICIT_BZERO 0 +# endif #else # if defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 25) # define HAVE_EXPLICIT_BZERO 1 @@ -168,20 +173,29 @@ size_t slunkcrypt_random_bytes(uint8_t* const buffer, const size_t length) # endif #endif -void slunkcrypt_bzero(void* const ptr, const size_t length) +void slunkcrypt_bzero(void* const buffer, const size_t length) { - if ((ptr) && (length > 0U)) + if ((buffer) && (length > 0U)) { -#if defined(_WIN32) && defined(SecureZeroMemory) - SecureZeroMemory(ptr, length); -#elif HAVE_EXPLICIT_BZERO - explicit_bzero(ptr, length); +#if HAVE_EXPLICIT_BZERO + explicit_bzero(buffer, length); #else - volatile uint8_t *buffer = (volatile uint8_t*)ptr; + volatile uint8_t* ptr = (volatile uint8_t*) buffer; for (size_t i = 0U; i < length; ++i) { - buffer[i] = 0U; + ptr[i] = 0U; } #endif } } + +// ========================================================================== +// Destructor +// ========================================================================== + +#if HAVE_DESTRUCTOR +__attribute__((destructor)) void slunkcrypt_destructor() +{ + exit_random_source(); +} +#endif