Browse Source

provide an libc internal interface to get random bytes, to be used by malloc

to get random data without calling getpid(), ok millert@ deraadt@
OPENBSD_4_1
otto 18 years ago
parent
commit
5fef7e5c00
1 changed files with 12 additions and 3 deletions
  1. +12
    -3
      src/lib/libc/crypt/arc4random.c

+ 12
- 3
src/lib/libc/crypt/arc4random.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random.c,v 1.15 2005/11/30 07:51:02 otto Exp $ */
/* $OpenBSD: arc4random.c,v 1.16 2007/02/12 19:58:47 otto Exp $ */
/* /*
* Copyright (c) 1996, David Mazieres <dm@uun.org> * Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -110,7 +110,7 @@ arc4_stir(struct arc4_stream *as)
*/ */
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
(void)arc4_getbyte(as); (void)arc4_getbyte(as);
arc4_count = 400000;
arc4_count = 1600000;
} }
static inline u_int8_t static inline u_int8_t
@ -127,6 +127,14 @@ arc4_getbyte(struct arc4_stream *as)
return (as->s[(si + sj) & 0xff]); return (as->s[(si + sj) & 0xff]);
} }
u_int8_t
__arc4_getbyte(void)
{
if (--arc4_count == 0 || !rs_initialized)
arc4random_stir();
return arc4_getbyte(&rs);
}
static inline u_int32_t static inline u_int32_t
arc4_getword(struct arc4_stream *as) arc4_getword(struct arc4_stream *as)
{ {
@ -159,7 +167,8 @@ arc4random_addrandom(u_char *dat, int datlen)
u_int32_t u_int32_t
arc4random(void) arc4random(void)
{ {
if (--arc4_count == 0 || !rs_initialized || arc4_stir_pid != getpid())
arc4_count -= 4;
if (arc4_count <= 0 || !rs_initialized || arc4_stir_pid != getpid())
arc4random_stir(); arc4random_stir();
return arc4_getword(&rs); return arc4_getword(&rs);
} }


Loading…
Cancel
Save