X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblutil%2Fentropy.c;h=74d3f3210ab8b875d5400428b230a376b47a061e;hb=c0f8e30d2290b22718f3cfd6800679dfb4c253a9;hp=14609130128b0436d23fd02f476a3facd3e37ff5;hpb=25522f1399c2d8332391744648ce5f7a3f942d54;p=openldap diff --git a/libraries/liblutil/entropy.c b/libraries/liblutil/entropy.c index 1460913012..74d3f3210a 100644 --- a/libraries/liblutil/entropy.c +++ b/libraries/liblutil/entropy.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -10,9 +10,6 @@ #include #include -#ifdef HAVE_WINCRYPT_H -#include -#endif #ifdef HAVE_PROCESS_H #include #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 {