Browse Source

Add srandomdev() from FreeBSD for use by sendmail and others.

OPENBSD_2_7
millert 25 years ago
parent
commit
258337bfb7
3 changed files with 71 additions and 4 deletions
  1. +2
    -1
      src/include/stdlib.h
  2. +23
    -2
      src/lib/libc/stdlib/random.3
  3. +46
    -1
      src/lib/libc/stdlib/random.c

+ 2
- 1
src/include/stdlib.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: stdlib.h,v 1.11 1999/11/27 13:20:25 espie Exp $ */
/* $OpenBSD: stdlib.h,v 1.12 2000/04/03 23:23:48 millert Exp $ */
/* $NetBSD: stdlib.h,v 1.25 1995/12/27 21:19:08 jtc Exp $ */ /* $NetBSD: stdlib.h,v 1.25 1995/12/27 21:19:08 jtc Exp $ */
/*- /*-
@ -179,6 +179,7 @@ long random __P((void));
char *realpath __P((const char *, char *)); char *realpath __P((const char *, char *));
char *setstate __P((const char *)); char *setstate __P((const char *));
void srandom __P((unsigned int)); void srandom __P((unsigned int));
void srandomdev __P((void));
int putenv __P((const char *)); int putenv __P((const char *));
int setenv __P((const char *, const char *, int)); int setenv __P((const char *, const char *, int));


+ 23
- 2
src/lib/libc/stdlib/random.3 View File

@ -29,7 +29,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" SUCH DAMAGE.
.\" .\"
.\" $OpenBSD: random.3,v 1.10 2000/01/19 05:25:43 pjanzen Exp $
.\" $OpenBSD: random.3,v 1.11 2000/04/03 23:23:48 millert Exp $
.\" .\"
.Dd April 19, 1991 .Dd April 19, 1991
.Dt RANDOM 3 .Dt RANDOM 3
@ -37,6 +37,7 @@
.Sh NAME .Sh NAME
.Nm random , .Nm random ,
.Nm srandom , .Nm srandom ,
.Nm srandomdev ,
.Nm initstate , .Nm initstate ,
.Nm setstate .Nm setstate
.Nd better random number generator; routines for changing generators .Nd better random number generator; routines for changing generators
@ -46,6 +47,8 @@
.Fn random void .Fn random void
.Ft void .Ft void
.Fn srandom "unsigned int seed" .Fn srandom "unsigned int seed"
.Ft void
.Fn srandomdev void
.Ft char * .Ft char *
.Fn initstate "unsigned int seed" "char *state" "size_t n" .Fn initstate "unsigned int seed" "char *state" "size_t n"
.Ft char * .Ft char *
@ -92,6 +95,19 @@ with
as the seed. as the seed.
.Pp .Pp
The The
.Fn srandomdev
routine initialize a state array using the
.Xr arandom 4
random number device which returns good random numbers,
suitable for cryptographic use.
Note that this particular seeding procedure can generate
states which are impossible to reproduce by calling
.Fn srandom
with any value, since the succeeding terms in the
state buffer are no longer derived from the LC algorithm applied to
a fixed seed.
.Pp
The
.Fn initstate .Fn initstate
routine allows a state array, passed in as an argument, to be initialized routine allows a state array, passed in as an argument, to be initialized
for future use. The size of the state array (in bytes) is used by for future use. The size of the state array (in bytes) is used by
@ -153,7 +169,8 @@ messages are printed on the standard error output.
.Sh SEE ALSO .Sh SEE ALSO
.Xr arc4random 3 , .Xr arc4random 3 ,
.Xr drand48 3 , .Xr drand48 3 ,
.Xr rand 3
.Xr rand 3 ,
.Xr random 4 ,
.Sh STANDARDS .Sh STANDARDS
The The
.Fn random , .Fn random ,
@ -163,6 +180,10 @@ and
.Fn setstate .Fn setstate
functions conform to functions conform to
.St -xpg4.2 . .St -xpg4.2 .
.Pp
The
.Fn srandomdev
function is an extension.
.Sh HISTORY .Sh HISTORY
These These
functions appeared in functions appeared in


+ 46
- 1
src/lib/libc/stdlib/random.c View File

@ -32,11 +32,15 @@
*/ */
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
static char *rcsid = "$OpenBSD: random.c,v 1.6 1998/02/07 02:16:25 millert Exp $";
static char *rcsid = "$OpenBSD: random.c,v 1.7 2000/04/03 23:23:48 millert Exp $";
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/time.h>
#include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
/* /*
* random.c: * random.c:
@ -219,6 +223,47 @@ srandom(x)
} }
} }
/*
* srandomdev:
*
* Many programs choose the seed value in a totally predictable manner.
* This often causes problems. We seed the generator using the much more
* secure arandom(4) interface. Note that this particular seeding
* procedure can generate states which are impossible to reproduce by
* calling srandom() with any value, since the succeeding terms in the
* state buffer are no longer derived from the LC algorithm applied to
* a fixed seed.
*/
void
srandomdev()
{
int fd;
size_t len;
if (rand_type == TYPE_0)
len = sizeof(state[0]);
else
len = rand_deg * sizeof(state[0]);
if ((fd = open("/dev/arandom", O_RDONLY, 0)) != -1 &&
read(fd, (void *) state, len) == (ssize_t) len) {
close(fd);
} else {
struct timeval tv;
u_int junk;
/* XXX - this could be better */
gettimeofday(&tv, NULL);
srandom(getpid() ^ tv.tv_sec ^ tv.tv_usec ^ junk);
return;
}
if (rand_type != TYPE_0) {
fptr = &state[rand_sep];
rptr = &state[0];
}
}
/* /*
* initstate: * initstate:
* *


Loading…
Cancel
Save