]> git.sur5r.net Git - openldap/blobdiff - libraries/liblutil/entropy.c
Fix ldaps / TLS processing...
[openldap] / libraries / liblutil / entropy.c
index 23e5cb4a0c7bb2fbafff0d6fdac0894ca38830db..6b7c6c9552f50c036185ed62607fd551672a0f60 100644 (file)
 /*
  * lutil_entropy() provides nbytes of entropy in buf.
  * Quality offerred is suitable for one-time uses, such as "once" keys.
+ * Values may not be suitable for multi-time uses.
  *
  * Note:  Callers are encouraged to provide additional bytes of
  * of entropy in the buf argument.  This information is used in
  * fallback mode to improve the quality of bytes returned.
+ *
+ * This routinue should be extended to support additional sources
+ * of entropy.
  */
-int lutil_entropy( char *buf, int nbytes )
+int lutil_entropy( char *buf, ber_len_t nbytes )
 {
-       if( nbytes < 0 ) return -1;
        if( nbytes == 0 ) return 0;
 
 #ifdef URANDOM_DEVICE
@@ -74,13 +77,20 @@ int lutil_entropy( char *buf, int nbytes )
 #else
        {
                /* based upon Phil Karn's "practical randomness" idea
-                * but implementation 100% OpenLDAP.  So don't blame Phil. */
-               /* worse case is this is a MD5 hash of a counter, if
-                *      MD5 is a strong cryptographic hash, this should
-                *      be fairly resistant to attack
+                * but implementation 100% OpenLDAP.  So don't blame Phil.
+                *
+                * Worse case is that this is a MD5 hash of a counter, if
+                * MD5 is a strong cryptographic hash, this should be fairly
+                * resistant to attack
+                */
+
+               /*
+                * the caller may need to provide external synchronization OR
+                * provide entropy (in buf) to ensure quality results as
+                * access to this counter may not be atomic.
                 */
-               static sig_atomic_t counter = 0;
-               int n;
+               static int counter = 0;
+               ber_len_t n;
 
                struct rdata_s {
                        int counter;
@@ -91,11 +101,12 @@ int lutil_entropy( char *buf, int nbytes )
                        pid_t   pid;
 
 #ifdef HAVE_GETTIMEOFDAY
-                       struct timeval *tv;
+                       struct timeval tv;
 #else
                        time_t  time;
 #endif
-                       unsigned long   junk;
+
+                       unsigned long   junk;   /* purposely not initialized */
                } rdata;
 
                /* make sure rdata differs for each process */
@@ -109,9 +120,9 @@ int lutil_entropy( char *buf, int nbytes )
                        struct lutil_MD5Context ctx;
                        char digest[16];
 
-                       /* hopefully has good resolution */
+                       /* poor resolution */
 #ifdef HAVE_GETTIMEOFDAY
-                       (void) gettimeofday( &rdata.tv, sizeof( rdata.tv ) );
+                       (void) gettimeofday( &rdata.tv, NULL );
 #else
                        (void) time( &rdata.time );
 #endif
@@ -124,7 +135,7 @@ int lutil_entropy( char *buf, int nbytes )
                        lutil_MD5Init( &ctx );
                        lutil_MD5Update( &ctx, (char *) &rdata, sizeof( rdata ) );
 
-                       /* use caller to provided information */
+                       /* allow caller to provided additional entropy */
                        lutil_MD5Update( &ctx, (char *) &buf, nbytes );
 
                        lutil_MD5Final( digest, &ctx );