Add a karc4rand() to libkern
authorAlex Hornung <ahornung@gmail.com>
Sat, 26 Sep 2009 23:25:45 +0000 (00:25 +0100)
committerAlex Hornung <ahornung@gmail.com>
Wed, 30 Sep 2009 06:39:28 +0000 (07:39 +0100)
* Takes a buffer and an arbitrary size to fill up with random stuff.

Partially-Obtained-From: FreeBSD

sys/libkern/arc4random.c
sys/sys/libkern.h

index fc99d91..8fda955 100644 (file)
@@ -136,3 +136,26 @@ karc4random(void)
 
        return ret;
 }
+
+void
+karc4rand(void *ptr, size_t len)
+{
+       uint8_t *p;
+       struct timeval tv_now;
+
+       p = ptr;
+
+       /* Initialize array if needed. */
+       if (!arc4_initialized)
+               arc4_init();
+
+       getmicrotime(&tv_now);
+       if ((++arc4_numruns > ARC4_MAXRUNS) ||
+           (tv_now.tv_sec > arc4_tv_nextreseed.tv_sec))
+       {
+               arc4_randomstir();
+       }
+
+       while (len--)
+               *p++ = arc4_randbyte();
+}
index 4cb8da1..0a81e96 100644 (file)
@@ -87,6 +87,7 @@ static __inline size_t szmin(size_t a, size_t b) { return (a < b ? a : b); }
 
 /* Prototypes for non-quad routines. */
 u_int32_t karc4random (void);
+void   karc4rand (void *, size_t);
 int     bcmp (const void *, const void *, size_t);
 void   *kbsearch (const void *, const void *, size_t,
                     size_t, int (*)(const void *, const void *));