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
|
* Auxiliary functions
|
||||||
*/
|
*/
|
||||||
SLUNKCRYPT_API size_t slunkcrypt_random_bytes(uint8_t* const buffer, const size_t length);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -22,29 +22,27 @@
|
|||||||
|
|
||||||
/* Compiler compatibility */
|
/* Compiler compatibility */
|
||||||
#if defined(__GNUC__) || defined(__clang__)
|
#if defined(__GNUC__) || defined(__clang__)
|
||||||
# define AT_EXIT(X) ((void)0)
|
# define HAVE_DESTRUCTOR 1
|
||||||
# define DESTRUCTOR __attribute__((destructor))
|
|
||||||
#else
|
#else
|
||||||
# define AT_EXIT(X) atexit((X))
|
# define HAVE_DESTRUCTOR 0
|
||||||
# define DESTRUCTOR
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// One-time init
|
// Call once support
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
# define ONCE_TYPE volatile LONG
|
# define CALL_ONCE win32_call_once
|
||||||
# define ONCE_INIT 0L
|
# define CALL_ONCE_TYPE volatile LONG
|
||||||
# define ONCE_FUNC win32_run_once
|
# define CALL_ONCE_INIT 0L
|
||||||
#else
|
#else
|
||||||
# define ONCE_TYPE pthread_once_t
|
# define CALL_ONCE pthread_once
|
||||||
# define ONCE_INIT PTHREAD_ONCE_INIT
|
# define CALL_ONCE_TYPE pthread_once_t
|
||||||
# define ONCE_FUNC pthread_once
|
# define CALL_ONCE_INIT PTHREAD_ONCE_INIT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#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;
|
LONG status;
|
||||||
while ((status = InterlockedCompareExchange(control, -1L, 0L)) != 0L)
|
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
|
#endif
|
||||||
|
|
||||||
/* Global state */
|
/* 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)
|
#if defined(_WIN32)
|
||||||
typedef BOOLEAN(WINAPI *rtl_genrandom_t)(void *buffer, ULONG buff_size);
|
typedef BOOLEAN(WINAPI *rtl_genrandom_t)(void *buffer, ULONG buff_size);
|
||||||
static HMODULE s_dll_advapi32 = NULL;
|
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;
|
static int s_random_fd = -1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Close down CSRNG */
|
/* De-initialize CSRNG */
|
||||||
static DESTRUCTOR void exit_random_source(void)
|
static void exit_random_source(void)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
s_rtl_genrandom = NULL;
|
s_rtl_genrandom = NULL;
|
||||||
@ -126,13 +124,15 @@ static void init_random_source(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
AT_EXIT(exit_random_source);
|
#if !HAVE_DESTRUCTOR
|
||||||
|
atexit(exit_random_source);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate random bytes */
|
/* Generate random bytes */
|
||||||
size_t slunkcrypt_random_bytes(uint8_t* const buffer, const size_t length)
|
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 defined(_WIN32)
|
||||||
if (s_rtl_genrandom)
|
if (s_rtl_genrandom)
|
||||||
{
|
{
|
||||||
@ -157,7 +157,12 @@ size_t slunkcrypt_random_bytes(uint8_t* const buffer, const size_t length)
|
|||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
#ifdef _WIN32
|
#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
|
#else
|
||||||
# if defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 25)
|
# if defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 25)
|
||||||
# define HAVE_EXPLICIT_BZERO 1
|
# define HAVE_EXPLICIT_BZERO 1
|
||||||
@ -168,20 +173,29 @@ size_t slunkcrypt_random_bytes(uint8_t* const buffer, const size_t length)
|
|||||||
# endif
|
# endif
|
||||||
#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)
|
#if HAVE_EXPLICIT_BZERO
|
||||||
SecureZeroMemory(ptr, length);
|
explicit_bzero(buffer, length);
|
||||||
#elif HAVE_EXPLICIT_BZERO
|
|
||||||
explicit_bzero(ptr, length);
|
|
||||||
#else
|
#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)
|
for (size_t i = 0U; i < length; ++i)
|
||||||
{
|
{
|
||||||
buffer[i] = 0U;
|
ptr[i] = 0U;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==========================================================================
|
||||||
|
// Destructor
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
#if HAVE_DESTRUCTOR
|
||||||
|
__attribute__((destructor)) void slunkcrypt_destructor()
|
||||||
|
{
|
||||||
|
exit_random_source();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user