Implement code to get random data from /dev/{random,urandom}. For
authorSam Hartman <hartmans@mit.edu>
Tue, 8 Jan 2002 14:38:44 +0000 (14:38 +0000)
committerSam Hartman <hartmans@mit.edu>
Tue, 8 Jan 2002 14:38:44 +0000 (14:38 +0000)
init_context use /dev/urandom; for database creation use /dev/random
if it exists.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@14087 dc483132-0cff-0310-8789-dd5450dbe970

src/kadmin/dbutil/ChangeLog
src/kadmin/dbutil/kdb5_create.c
src/lib/crypto/ChangeLog
src/lib/crypto/prng.c
src/lib/krb5/krb/ChangeLog
src/lib/krb5/krb/init_ctx.c

index af9b6c72370368bc064a5bad4d9f75014eb0ea6a..de2ba00d716ffe54b44f6192d518615c74ba45c0 100644 (file)
@@ -1,3 +1,7 @@
+2002-01-08  Sam Hartman  <hartmans@mit.edu>
+
+       * kdb5_create.c (kdb5_create): Load strong random data
+
 2001-10-26  Ezra Peisach  <epeisach@mit.edu>
 
        * dump.c (dump_db): Pass krb5_boolean instead of char * as
index 74210abc205f560bded777d3fa36f99ef49f3d81..2c05c2744e65366e076f36789fc59f245d41998b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * kadmin/dbutil/kdb5_create.c
  *
- * Copyright 1990,1991,2001 by the Massachusetts Institute of Technology.
+ * Copyright 1990,1991,2001, 2002 by the Massachusetts Institute of Technology.
  * All Rights Reserved.
  *
  * Export of this software from the United States of America may
@@ -197,6 +197,13 @@ void kdb5_create(argc, argv)
        exit_status++; return;
     }
 
+    printf ("Loading random data\n");
+    retval = krb5_c_random_os_entropy (util_context, 1, NULL);
+    if (retval) {
+      com_err (argv[0], retval, "Loading random data");
+      exit_status++; return;
+    }
+    
     /* assemble & parse the master key name */
 
     if ((retval = krb5_db_setup_mkey_name(util_context,
index e102e4833653b4177afd246c15d42def0b00cf3c..488b4cec39d3de726338f1ded5bf0362969d93db 100644 (file)
@@ -1,3 +1,7 @@
+2002-01-08  Sam Hartman  <hartmans@tir-na-nogth.mit.edu>
+
+       * prng.c (krb5_c_random_os_entropy):  Implement.
+
 2001-12-05  Ezra Peisach  <epeisach@mit.edu>
 
        * t_encrypt.c (main): Free memory when finished to test for memory
index f3a6838bd8c00f963d5e16e6c123efa6a2d86554..0f45e6b51f99b8400156cf292405fdddf72e3ae2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2001 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2001, 2002 by the Massachusetts Institute of Technology.
  * All rights reserved.
  *
  * 
@@ -114,3 +114,93 @@ void prng_cleanup (void)
   if (inited) krb5int_yarrow_final (&y_ctx);
        inited = 0;
 }
+
+
+/*
+ * Routines to get entropy from the OS.  For UNIX we try /dev/urandom
+ * and /dev/random.  Currently we don't do anything for pre-OSX Mac and
+ * Windows.
+ */
+#if defined(_WIN32) || (defined(TARGET_OS_MAC) && !defined(TARGET_API_MAC_OSX))
+
+krb5_error_code KRB5_CALLCONV
+krb5_c_random_os_entropy (
+                         krb5_context context, int strong, int *success)
+{
+  if (success)
+    *success  = 0;
+  return 0;
+}
+
+#else /*Windows and non-OSX Mac*/
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+/*
+ * Helper function to read entropy from  a random device.  Takes the
+ * name of a device, opens it, makes sure it is a device and if so,
+ * reads entropy.  Returns  a boolean indicating whether entropy was
+ * read.
+ */
+
+static int
+read_entropy_from_device (krb5_context context, const char *device)
+{
+  krb5_data data;
+  struct stat sb;
+  int fd;
+  unsigned char buf[YARROW_SLOW_THRESH/8];
+  int left;
+  fd = open (device, O_RDONLY);
+  if (fd == -1)
+    return 0;
+  if (fstat (fd, &sb) == -1)
+    return 0;
+  if (S_ISREG(sb.st_mode)) {
+    close(fd);
+    return 0;
+  }
+  for (left = sizeof (buf); left > 0;) {
+    size_t count;
+    count = read (fd, &buf, (unsigned) left);
+    if (count <= 0) {
+      close(fd);
+      return 0;
+    }
+    left -= count;
+  }
+  close (fd);
+  data.length = sizeof (buf);
+  data.data = ( char * ) buf;
+  if ( krb5_c_random_add_entropy (context, KRB5_C_RANDSOURCE_OSRAND, 
+                                 &data) != 0) {
+    return 0;
+  }
+  return 1;
+}
+    
+krb5_error_code KRB5_CALLCONV
+krb5_c_random_os_entropy (krb5_context context,
+                         int strong, int *success)
+{
+  int unused;
+  int *oursuccess = success?success:&unused;
+  *oursuccess = 0;
+  /* If we are getting strong data then try that first.  We aare
+     guaranteed to cause a reseed of some kind if strong is true and
+     we have both /dev/random and /dev/urandom.  We want the strong
+     data included in the reseed so we get it first.*/
+  if (strong) {
+    if (read_entropy_from_device (context, "/dev/random"))
+      *oursuccess = 1;
+  }
+  if (read_entropy_from_device (context, "/dev/urandom"))
+    *oursuccess = 1;
+  return 0;
+}
+
+#endif /*Windows or pre-OSX Mac*/
index 07ce4ed7e7157e1d12fbebe28b0936b25048025e..367c173ef0d3345a2dfc08eac886d24245f99b28 100644 (file)
@@ -1,3 +1,7 @@
+2002-01-08  Sam Hartman  <hartmans@mit.edu>
+
+       * init_ctx.c (init_common): Use /dev/urandom if present for random data
+
 2001-12-05  Ezra Peisach  <epeisach@mit.edu>
 
        * t_ser.c (main): Free context on failure exit route.
index 368c0935baf4e500f5f4e93a03bfe4f87c1d222d..79a1cb09e344a587a341e2f6bbaad3eca2ca2bdd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * lib/krb5/krb/init_ctx.c
  *
- * Copyright 1994,1999,2000 by the Massachusetts Institute of Technology.
+ * Copyright 1994,1999,2000, 2002  by the Massachusetts Institute of Technology.
  * All Rights Reserved.
  *
  * Export of this software from the United States of America may
@@ -150,6 +150,8 @@ init_common (context, secure)
                goto cleanup;
 
        /* initialize the prng (not well, but passable) */
+       if ((retval = krb5_c_random_os_entropy( ctx, 0, NULL)) !=0)
+         goto cleanup;
        if ((retval = krb5_crypto_us_timeofday(&seed_data.now, &seed_data.now_usec)))
                goto cleanup;
        seed_data.pid = getpid ();