X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblutil%2Fentropy.c;h=b1ef0bacf7a53457f53eee496f46f7ecea082243;hb=58d4afec44520e7419dc5d4178ba6b6a239d2a12;hp=13e9d9dd25c64f0ab9f829fae3a5458c2d56be84;hpb=5b856458a259f83b9dd3182eb3a924b82cac4906;p=openldap
diff --git a/libraries/liblutil/entropy.c b/libraries/liblutil/entropy.c
index 13e9d9dd25..b1ef0bacf7 100644
--- a/libraries/liblutil/entropy.c
+++ b/libraries/liblutil/entropy.c
@@ -1,17 +1,30 @@
+/* entropy.c -- routines for providing pseudo-random data */
/* $OpenLDAP$ */
-/*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* This work is part of OpenLDAP Software .
+ *
+ * Copyright 1999-2007 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
+ * .
+ */
+/* 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"
#include
#include
+#include
-#ifdef HAVE_WINCRYPT_H
-#include
-#endif
#ifdef HAVE_PROCESS_H
#include
#endif
@@ -33,26 +46,32 @@
* This routinue should be extended to support additional sources
* of entropy.
*/
-int lutil_entropy( char *buf, ber_len_t nbytes )
+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
{
@@ -95,7 +114,7 @@ int lutil_entropy( char *buf, ber_len_t nbytes )
struct rdata_s {
int counter;
- char *buf;
+ unsigned char *buf;
struct rdata_s *stack;
pid_t pid;
@@ -118,7 +137,7 @@ int lutil_entropy( 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
@@ -133,10 +152,10 @@ int lutil_entropy( 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 );