]> git.sur5r.net Git - openldap/blobdiff - libraries/liblutil/entropy.c
Fix assignment of <char/int>* to unsigned <char/int>* and vice versa.
[openldap] / libraries / liblutil / entropy.c
index 46907b0af9015c001ab6d72b009039a89f6c0af9..505f3b5a70d384a1b61286cb2ae460563f6ace88 100644 (file)
@@ -1,6 +1,6 @@
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -10,9 +10,6 @@
 #include <ac/time.h>
 #include <ac/unistd.h>
 
-#ifdef HAVE_WINCRYPT_H
-#include <wincrypt.h>
-#endif
 #ifdef HAVE_PROCESS_H
 #include <process.h>
 #endif
@@ -39,21 +36,27 @@ 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
        {
@@ -96,7 +99,7 @@ int lutil_entropy( unsigned char *buf, ber_len_t nbytes )
                struct rdata_s {
                        int counter;
 
-                       char *buf;
+                       unsigned char *buf;
                        struct rdata_s *stack;
 
                        pid_t   pid;
@@ -119,7 +122,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
@@ -134,10 +137,10 @@ int lutil_entropy( unsigned char *buf, ber_len_t nbytes )
                        rdata.junk++;
 
                        lutil_MD5Init( &ctx );
-                       lutil_MD5Update( &ctx, (char *) &rdata, sizeof( rdata ) );
+                       lutil_MD5Update( &ctx, (unsigned char *) &rdata, sizeof( rdata ) );
 
                        /* allow caller to provided additional entropy */
-                       lutil_MD5Update( &ctx, (char *) &buf, nbytes );
+                       lutil_MD5Update( &ctx, buf, nbytes );
 
                        lutil_MD5Final( digest, &ctx );