Added silc_rng_get_byte_fast function
authorPekka Riikonen <priikone@silcnet.org>
Tue, 19 Mar 2002 11:32:40 +0000 (11:32 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Tue, 19 Mar 2002 11:32:40 +0000 (11:32 +0000)
lib/silccrypt/silcrng.c
lib/silccrypt/silcrng.h

index 06340066165b94cb1dfd6371e88750a2b1d13ff0..5638181cc860e4f04e04c331ec2b943837d4499b 100644 (file)
@@ -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)
index 9a173ffb7cc8d7d3de327d46bcdbd6c9a22972ea..7dbdcbf6a692655716b955db638ccb8893e36823 100644 (file)
@@ -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