mkpasswd: use arc4random_buf where available

This commit is contained in:
Marco d'Itri 2014-12-14 23:47:33 +01:00
parent b207df0805
commit 4fa1cd69e4
2 changed files with 20 additions and 4 deletions

View File

@ -81,6 +81,15 @@
# define RANDOM_DEVICE "/dev/urandom" # define RANDOM_DEVICE "/dev/urandom"
#endif #endif
/* use arc4random_buf instead if it is available */
#if (defined __FreeBSD__ && __FreeBSD__ >= 9) || \
(defined __NetBSD__ && __NetBSD_Version__ >= 600000000) || \
(defined OpenBSD && OpenBSD >= 200805) || \
(defined __APPLE__ && defined __MACH__)
# define HAVE_ARC4RANDOM_BUF
# undef RANDOM_DEVICE
#endif
#ifdef ENABLE_NLS #ifdef ENABLE_NLS
# ifndef NLS_CAT_NAME # ifndef NLS_CAT_NAME
# define NLS_CAT_NAME "whois" # define NLS_CAT_NAME "whois"

View File

@ -383,20 +383,27 @@ void* get_random_bytes(const unsigned int count)
} }
#endif #endif
#ifdef RANDOM_DEVICE #if defined RANDOM_DEVICE || defined HAVE_ARC4RANDOM_BUF
void generate_salt(char *const buf, const unsigned int len) void generate_salt(char *const buf, const unsigned int len)
{ {
unsigned int i; unsigned int i;
unsigned char *entropy;
#if defined HAVE_ARC4RANDOM_BUF
void *entropy = NOFAIL(malloc(len));
arc4random_buf(entropy, len);
#else
entropy = get_random_bytes(len);
#endif
unsigned char *entropy = get_random_bytes(len * sizeof(unsigned char));
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
buf[i] = valid_salts[entropy[i] % (sizeof valid_salts - 1)]; buf[i] = valid_salts[entropy[i] % (sizeof valid_salts - 1)];
buf[i] = '\0'; buf[i] = '\0';
free(entropy); free(entropy);
} }
#else /* RANDOM_DEVICE */ #else /* RANDOM_DEVICE || HAVE_ARC4RANDOM_BUF */
void generate_salt(char *const buf, const unsigned int len) void generate_salt(char *const buf, const unsigned int len)
{ {
@ -424,7 +431,7 @@ void generate_salt(char *const buf, const unsigned int len)
buf[i] = '\0'; buf[i] = '\0';
} }
#endif /* RANDOM_DEVICE */ #endif /* RANDOM_DEVICE || HAVE_ARC4RANDOM_BUF */
void display_help(int error) void display_help(int error)
{ {