first take at detecting a random device and seeding the random key using data
authorDaniel Stenberg <daniel@haxx.se>
Wed, 30 May 2007 21:37:17 +0000 (21:37 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 30 May 2007 21:37:17 +0000 (21:37 +0000)
from it in randomize_key()

ares_init.c
configure.ac

index e86d80c..efde967 100644 (file)
@@ -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;
   }
 }
index 4eb62d1..5749442 100644 (file)
@@ -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)