init_os_ctx.c: On UNIX, seed PRNG with data from /dev/[u]random if available
authorKen Raeburn <raeburn@mit.edu>
Sat, 3 Mar 2001 22:02:00 +0000 (22:02 +0000)
committerKen Raeburn <raeburn@mit.edu>
Sat, 3 Mar 2001 22:02:00 +0000 (22:02 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@13050 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/krb5/os/ChangeLog
src/lib/krb5/os/init_os_ctx.c

index 92b42a6b2e5c07ead6811da5a7007db5c3f38ed8..9fcc89b7398fb8d884cf2484a84ebf331d4f60ec 100644 (file)
@@ -1,3 +1,10 @@
+2001-03-03  Ken Raeburn  <raeburn@mit.edu>
+
+       * init_os_ctx.c: If not Mac or Windows, define USE_RANDOM_DEVICE
+       and include sys/ioctl.h.
+       (krb5_os_init_context) [USE_RANDOM_DEVICE]: Read some bytes from
+       /dev/urandom or /dev/random and use them to re-seed the PRNG.
+
 2001-02-05  Tom Yu  <tlyu@mit.edu>
 
        * prompter.c (krb5_prompter_posix): Fix up terminal modes if we're
index 4168dfe4638b28e399e078cf62f5bd2712405c4c..f72d643f108f86f3cbd124e4155002ef11aae949 100644 (file)
 #include <PreferencesLib.h>
 #endif /* macintosh */
 
+#if !defined(macintosh) && !defined(_MSDOS) && !defined(_WIN32)
+#define USE_RANDOM_DEVICE
+#include <sys/ioctl.h> /* for FIONBIO */
+#endif
+
 #if defined(_MSDOS) || defined(_WIN32)
 
 static krb5_error_code
@@ -443,6 +448,42 @@ krb5_os_init_context(ctx)
        os_ctx->default_ccname = 0;
        os_ctx->default_ccprincipal = 0;
 
+#ifdef USE_RANDOM_DEVICE
+       /* If the OS provides us with random or even pseudorandom
+          data, use it.  It'll be far better than what we've got
+          above, but not all systems provide it (yet).
+
+          Typical setup seems to be /dev/urandom is pseudo-random, as
+          good as the system can provide, but never blocking;
+          /dev/random is supposedly truly random (the metrics are
+          sometimes suspect), and may block.  */
+       {
+               char rndbytes[128];
+               krb5_data seed;
+               int tmp;
+
+               tmp = open ("/dev/urandom", O_RDONLY);
+               if (tmp == -1) {
+                       int dontblock = 1;
+                       tmp = open ("/dev/random", O_RDONLY);
+                       (void) ioctl (tmp, FIONBIO, (char *) &dontblock);
+               }
+               if (tmp != -1) {
+                       /* If this doesn't work, should we continue or
+                          report an error that'll cause all Kerberos
+                          programs to fail?  */
+                       (void) read (tmp, &rndbytes, sizeof (rndbytes));
+                       close (tmp);
+               }
+               /* Okay.  Take whatever we've got, and seed the
+                  PRNG.  */
+               seed.length = sizeof(rndbytes);
+               seed.data = (char *) &rndbytes;
+               if ((retval = krb5_c_random_seed(ctx, &seed)))
+                       return retval;
+       }
+#endif
+
        krb5_cc_set_default_name(ctx, NULL);
 
        retval = os_init_paths(ctx);