* libmisc/salt.c: Add prototype for l64a(), gensalt(),

SHA_salt_size(), and SHA_salt_rounds().
* libmisc/salt.c: l64a() and gensalt() are static.
* libmisc/salt.c: The `meth' parameter of crypt_make_salt() is a
  const. (ditto for the method variable).
* libmisc/salt.c: SHA_salt_rounds returns a const string.
* libmisc/salt.c: Avoid warnings with cast of random() to double.
* libmisc/salt.c: Replace rand() by random().
This commit is contained in:
nekral-guest 2008-01-06 14:50:26 +00:00
parent 8a1abbe80b
commit e663f6c0b4
2 changed files with 35 additions and 9 deletions

View File

@ -1,3 +1,14 @@
2008-01-06 Nicolas François <nicolas.francois@centraliens.net>
* libmisc/salt.c: Add prototype for l64a(), gensalt(),
SHA_salt_size(), and SHA_salt_rounds().
* libmisc/salt.c: l64a() and gensalt() are static.
* libmisc/salt.c: The `meth' parameter of crypt_make_salt() is a
const. (ditto for the method variable).
* libmisc/salt.c: SHA_salt_rounds returns a const string.
* libmisc/salt.c: Avoid warnings with cast of random() to double.
* libmisc/salt.c: Replace rand() by random().
2008-01-06 Nicolas François <nicolas.francois@centraliens.net> 2008-01-06 Nicolas François <nicolas.francois@centraliens.net>
* lib/Makefile.am: Do not link libshadow.la with the intl, crypt, * lib/Makefile.am: Do not link libshadow.la with the intl, crypt,

View File

@ -18,8 +18,18 @@
#include "defines.h" #include "defines.h"
#include "getdef.h" #include "getdef.h"
/* local function prototypes */
#ifndef HAVE_L64A #ifndef HAVE_L64A
char *l64a(long value) char *l64a(long value);
#endif
static char *gensalt (unsigned int salt_size);
#ifdef USE_SHA_CRYPT
static unsigned int SHA_salt_size (void);
static const char *SHA_salt_rounds (int *prefered_rounds);
#endif
#ifndef HAVE_L64A
static char *l64a(long value)
{ {
static char buf[8]; static char buf[8];
char *s = buf; char *s = buf;
@ -66,8 +76,9 @@ char *l64a(long value)
*/ */
static unsigned int SHA_salt_size (void) static unsigned int SHA_salt_size (void)
{ {
srandom ((unsigned int)time (NULL)); double rand_rounds = 9 * random ();
return 8 + (double)random () * 9 / RAND_MAX; rand_rounds /= RAND_MAX;
return 8 + rand_rounds;
} }
/* ! Arguments evaluated twice ! */ /* ! Arguments evaluated twice ! */
@ -84,7 +95,7 @@ static unsigned int SHA_salt_size (void)
/* /*
* Return a salt prefix specifying the rounds number for the SHA crypt methods. * Return a salt prefix specifying the rounds number for the SHA crypt methods.
*/ */
static char *SHA_salt_rounds (int *prefered_rounds) static const char *SHA_salt_rounds (int *prefered_rounds)
{ {
static char rounds_prefix[18]; static char rounds_prefix[18];
long rounds; long rounds;
@ -92,6 +103,7 @@ static char *SHA_salt_rounds (int *prefered_rounds)
if (NULL == prefered_rounds) { if (NULL == prefered_rounds) {
long min_rounds = getdef_long ("SHA_CRYPT_MIN_ROUNDS", -1); long min_rounds = getdef_long ("SHA_CRYPT_MIN_ROUNDS", -1);
long max_rounds = getdef_long ("SHA_CRYPT_MAX_ROUNDS", -1); long max_rounds = getdef_long ("SHA_CRYPT_MAX_ROUNDS", -1);
double rand_rounds;
if (-1 == min_rounds && -1 == max_rounds) if (-1 == min_rounds && -1 == max_rounds)
return ""; return "";
@ -106,8 +118,9 @@ static char *SHA_salt_rounds (int *prefered_rounds)
max_rounds = min_rounds; max_rounds = min_rounds;
srand (time (NULL)); srand (time (NULL));
rounds = min_rounds + rand_rounds = (max_rounds-min_rounds+1) * random ();
(double)rand () * (max_rounds-min_rounds+1)/RAND_MAX; rand_rounds /= RAND_MAX;
rounds = min_rounds + rand_rounds;
} else if (0 == *prefered_rounds) } else if (0 == *prefered_rounds)
return ""; return "";
else else
@ -138,7 +151,8 @@ static char *SHA_salt_rounds (int *prefered_rounds)
#define MAX_SALT_SIZE 16 #define MAX_SALT_SIZE 16
#define MIN_SALT_SIZE 8 #define MIN_SALT_SIZE 8
char *gensalt (unsigned int salt_size) { static char *gensalt (unsigned int salt_size)
{
static char salt[32]; static char salt[32];
salt[0] = '\0'; salt[0] = '\0';
@ -170,7 +184,7 @@ char *gensalt (unsigned int salt_size) {
* * For the SHA256 and SHA512 method, this specifies the number of rounds * * For the SHA256 and SHA512 method, this specifies the number of rounds
* (if not NULL). * (if not NULL).
*/ */
char *crypt_make_salt (char *meth, void *arg) char *crypt_make_salt (const char *meth, void *arg)
{ {
/* Max result size for the SHA methods: /* Max result size for the SHA methods:
* +3 $5$ * +3 $5$
@ -180,7 +194,7 @@ char *crypt_make_salt (char *meth, void *arg)
*/ */
static char result[40]; static char result[40];
size_t salt_len = 8; size_t salt_len = 8;
char *method; const char *method;
result[0] = '\0'; result[0] = '\0';
@ -220,3 +234,4 @@ char *crypt_make_salt (char *meth, void *arg)
return result; return result;
} }