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 );