summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2007-05-30 21:37:17 +0000
committerDaniel Stenberg <daniel@haxx.se>2007-05-30 21:37:17 +0000
commit49fdeb1de4f01665a3835ab3b3f5b777e6d68ec1 (patch)
tree62fb5b4b9673199c58f7aa67b50cd14217737b99
parent7a77f24d26f755421b91a0ea3852b6348d637861 (diff)
downloadc-ares-49fdeb1de4f01665a3835ab3b3f5b777e6d68ec1.tar.gz
c-ares-49fdeb1de4f01665a3835ab3b3f5b777e6d68ec1.tar.bz2
c-ares-49fdeb1de4f01665a3835ab3b3f5b777e6d68ec1.zip
first take at detecting a random device and seeding the random key using data
from it in randomize_key()
-rw-r--r--ares_init.c16
-rw-r--r--configure.ac16
2 files changed, 30 insertions, 2 deletions
diff --git a/ares_init.c b/ares_init.c
index e86d80c..efde967 100644
--- a/ares_init.c
+++ b/ares_init.c
@@ -1276,6 +1276,7 @@ static void natural_mask(struct apattern *pat)
static void randomize_key(unsigned char* key,int key_data_len)
{
int randomized = 0;
+ int counter=0;
#ifdef WIN32
HMODULE lib=LoadLibrary("ADVAPI32.DLL");
if (lib) {
@@ -1286,11 +1287,22 @@ static void randomize_key(unsigned char* key,int key_data_len)
FreeLibrary(lib);
}
+#else /* !WIN32 */
+#ifdef RANDOM_FILE
+ char buffer[256];
+ FILE *f = fopen(RANDOM_FILE, "rb");
+ if(f) {
+ size_t i;
+ size_t rc = fread(buffer, key_data_len, 1, f);
+ for(i=0; i<rc && counter < key_data_len; i++)
+ key[counter++]=buffer[i];
+ fclose(f);
+ }
#endif
+#endif /* WIN32 */
if ( !randomized ) {
- int counter;
- for (counter=0;counter<key_data_len;counter++)
+ for (;counter<key_data_len;counter++)
key[counter]=rand() % 256;
}
}
diff --git a/configure.ac b/configure.ac
index 4eb62d1..5749442 100644
--- a/configure.ac
+++ b/configure.ac
@@ -785,4 +785,20 @@ AC_C_BIGENDIAN(
[AC_MSG_WARN([couldn't figure out endianess, assuming little endian!])]
)
+dnl Check for user-specified random device
+AC_ARG_WITH(random,
+AC_HELP_STRING([--with-random=FILE],
+ [read randomness from FILE (default=/dev/urandom)]),
+ [ RANDOM_FILE="$withval" ],
+ [
+ dnl Check for random device
+ AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
+ ]
+)
+if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then
+ AC_SUBST(RANDOM_FILE)
+ AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE",
+ [a suitable file/device to read random data from])
+fi
+
AC_OUTPUT(Makefile)