Some code clean-up.
This commit is contained in:
parent
9c08cb9dd4
commit
6c26203c30
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user