From 595427b2acb6044721844ae651f5bbd204643b12 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Tue, 19 Mar 2002 11:32:40 +0000 Subject: [PATCH] Added silc_rng_get_byte_fast function --- lib/silccrypt/silcrng.c | 45 +++++++++++++++++++++++------------------ lib/silccrypt/silcrng.h | 21 +++++++++++++++++++ 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/lib/silccrypt/silcrng.c b/lib/silccrypt/silcrng.c index 06340066..5638181c 100644 --- a/lib/silccrypt/silcrng.c +++ b/lib/silccrypt/silcrng.c @@ -466,6 +466,30 @@ SilcUInt8 silc_rng_get_byte(SilcRng rng) return rng->pool[silc_rng_get_position(rng)]; } +/* Return random byte as fast as possible. Reads from /dev/urandom if + available. If not then return from normal RNG (not so fast). */ + +SilcUInt8 silc_rng_get_byte_fast(SilcRng rng) +{ +#ifndef SILC_WIN32 + unsigned char buf[1]; + + if (rng->fd_devurandom == -1) { + rng->fd_devurandom = open("/dev/urandom", O_RDONLY); + if (rng < 0) + return silc_rng_get_byte(rng); + fcntl(rng->fd_devurandom, F_SETFL, O_NONBLOCK); + } + + if (read(rng->fd_devurandom, buf, sizeof(buf)) < 0) + return silc_rng_get_byte(rnf); + + return buf[0]; +#else + return silc_rng_get_byte(rng); +#endif +} + /* Returns 16 bit random number */ SilcUInt16 silc_rng_get_rn16(SilcRng rng) @@ -570,26 +594,7 @@ SilcUInt8 silc_rng_global_get_byte(void) SilcUInt8 silc_rng_global_get_byte_fast(void) { -#ifndef SILC_WIN32 - unsigned char buf[1]; - - if (!global_rng) - return 0; - - if (global_rng->fd_devurandom == -1) { - global_rng->fd_devurandom = open("/dev/urandom", O_RDONLY); - if (global_rng < 0) - return silc_rng_global_get_byte(); - fcntl(global_rng->fd_devurandom, F_SETFL, O_NONBLOCK); - } - - if (read(global_rng->fd_devurandom, buf, sizeof(buf)) < 0) - return silc_rng_global_get_byte(); - - return buf[0]; -#else - return silc_rng_global_get_byte(); -#endif + return global_rng ? silc_rng_get_byte_fast(global_rng) : 0; } SilcUInt16 silc_rng_global_get_rn16(void) diff --git a/lib/silccrypt/silcrng.h b/lib/silccrypt/silcrng.h index 9a173ffb..7dbdcbf6 100644 --- a/lib/silccrypt/silcrng.h +++ b/lib/silccrypt/silcrng.h @@ -118,6 +118,27 @@ void silc_rng_init(SilcRng rng); ***/ SilcUInt8 silc_rng_get_byte(SilcRng rng); +/****f* silccrypt/SilcRNGAPI/silc_rng_get_byte_fast + * + * SYNOPSIS + * + * SilcUInt8 silc_rng_get_byte_fast(SilcRng rng); + * + * DESCRIPTION + * + * Returns one 8-bit random byte from the random number generator as + * fast as possible. + * + * NOTES + * + * This will read the data from /dev/urandom if it is available in the + * operating system, since this may be faster than retrieving a byte + * from the SILC RNG. If /dev/urandom is not available this will take + * the byte from SILC RNG and is effectively same as silc_rng_get_byte. + * + ***/ +SilcUInt8 silc_rng_get_byte_fast(SilcRng rng); + /****f* silccrypt/SilcRNGAPI/silc_rng_get_rn16 * * SYNOPSIS -- 2.24.0