]> git.sur5r.net Git - openldap/blobdiff - libraries/liblutil/entropy.c
Merge remote branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_4
[openldap] / libraries / liblutil / entropy.c
index cd379c67246abdf878a57de454cef4123ba8aa20..ef21cb6e3c197bad136eeba2d59b2f6de4b7e378 100644 (file)
@@ -1,7 +1,22 @@
+/* entropy.c -- routines for providing pseudo-random data */
 /* $OpenLDAP$ */
-/*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1999-2012 The OpenLDAP Foundation.
+ * Portions Copyright 1999-2003 Kurt D. Zeilenga.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+/* This work was initially developed by Kurt D. Zeilenga for
+ * inclusion in OpenLDAP Software based, in part, on publically
+ * available works (as noted below).
  */
 
 #include "portable.h"
@@ -36,23 +51,29 @@ int lutil_entropy( unsigned char *buf, ber_len_t nbytes )
        if( nbytes == 0 ) return 0;
 
 #ifdef URANDOM_DEVICE
+#define URANDOM_NREADS 4
        /* Linux and *BSD offer a urandom device */
        {
-               int rc, fd;
+               int rc, fd, n=0;
 
                fd = open( URANDOM_DEVICE, O_RDONLY );
 
                if( fd < 0 ) return -1;
 
-               rc = read( fd, buf, nbytes );
-               close(fd);
+               do {
+                       rc = read( fd, buf, nbytes );
+                       if( rc <= 0 ) break;
 
-               /* should return nbytes */
-               if( rc != nbytes ) return -1;
+                       buf+=rc;
+                       nbytes-=rc;
 
-               return 0;
+                       if( ++n >= URANDOM_NREADS ) break;
+               } while( nbytes > 0 );
+
+               close(fd);
+               return nbytes > 0 ? -1 : 0;
        }
-#elif PROV_RSA_FULL
+#elif defined(PROV_RSA_FULL)
        {
                /* Not used since _WIN32_WINNT not set... */
                HCRYPTPROV hProv = 0;
@@ -116,7 +137,7 @@ int lutil_entropy( unsigned char *buf, ber_len_t nbytes )
 
                for( n = 0; n < nbytes; n += 16 ) {
                        struct lutil_MD5Context ctx;
-                       char digest[16];
+                       unsigned char digest[16];
 
                        /* poor resolution */
 #ifdef HAVE_GETTIMEOFDAY