Index: src/base.h =================================================================== --- src/base.h (revision 2522) +++ src/base.h (working copy) @@ -649,6 +649,11 @@ time_t last_generated_debug_ts; time_t startup_ts; + /* Real entropy. Set in server.c if DEV_RANDOM is defined */ +#ifdef DEV_RANDOM + char entropy[8]; +#endif + buffer *ts_debug_str; buffer *ts_date_str; Index: src/http_auth.c =================================================================== --- src/http_auth.c (revision 2522) +++ src/http_auth.c (working copy) @@ -1226,8 +1226,14 @@ /* we assume sizeof(time_t) == 4 here, but if not it ain't a problem at all */ LI_ltostr(hh, srv->cur_ts); MD5_Update(&Md5Ctx, (unsigned char *)hh, strlen(hh)); + +#ifdef DEV_RANDOM + /* Add entropy */ + MD5_Update(&Md5Ctx, (unsigned char *)srv->entropy, sizeof(srv->entropy)); +#else LI_ltostr(hh, rand()); MD5_Update(&Md5Ctx, (unsigned char *)hh, strlen(hh)); +#endif MD5_Final(h, &Md5Ctx); Index: src/mod_usertrack.c =================================================================== --- src/mod_usertrack.c (revision 2522) +++ src/mod_usertrack.c (working copy) @@ -228,8 +228,13 @@ /* we assume sizeof(time_t) == 4 here, but if not it ain't a problem at all */ LI_ltostr(hh, srv->cur_ts); MD5_Update(&Md5Ctx, (unsigned char *)hh, strlen(hh)); +#ifdef DEV_RANDOM + /* Add entropy */ + MD5_Update(&Md5Ctx, (unsigned char *)srv->entropy, sizeof(srv->entropy)); +#else LI_ltostr(hh, rand()); MD5_Update(&Md5Ctx, (unsigned char *)hh, strlen(hh)); +#endif MD5_Final(h, &Md5Ctx); Index: src/server.c =================================================================== --- src/server.c (revision 2522) +++ src/server.c (working copy) @@ -223,6 +223,16 @@ srv->mtime_cache[i].mtime = (time_t)-1; srv->mtime_cache[i].str = buffer_init(); } +#ifdef DEV_RANDOM + /* Initialize entropy field in srv */ + { + FILE *f; + if(f = fopen(DEV_RANDOM, "rb")) { + fread(&srv->entropy, sizeof(srv->entropy), 1, f); + fclose(f); + } + } +#endif srv->cur_ts = time(NULL); srv->startup_ts = srv->cur_ts; Index: configure.ac =================================================================== --- configure.ac (revision 2522) +++ configure.ac (working copy) @@ -79,6 +79,26 @@ AC_FUNC_STRFTIME AC_CHECK_FUNCS([issetugid]) +dnl Checks for entropy source +AC_MSG_CHECKING(for entropy source) + +case $host_os in + *darwin*|*cygwin*|*aix*|*mingw* ) + AC_MSG_ERROR(Entropy source cannot be determined on this platform) + ;; + * ) + if test -r "/dev/random"; then + AC_DEFINE(DEV_RANDOM, ["/dev/random"], [Random source]) + AC_MSG_RESULT(/dev/random) + elif test -r "/dev/urandom"; then + AC_DEFINE(DEV_RANDOM, ["/dev/urandom"], [Random source]) + AC_MSG_RESULT(/dev/urandom) + else + AC_MSG_ERROR(Entropy source not found. Need /dev/random or /dev/urandom) + fi + ;; +esac + dnl Checks for database. MYSQL_INCLUDE="" MYSQL_LIBS=""