[prev in list] [next in list] [prev in thread] [next in thread]
List: freewrt-commits
Subject: [FreeWRT-commits] r3909 - in trunk/freewrt: package/uclibc
From: tg () freewrt ! org
Date: 2009-11-29 18:43:31
Message-ID: 20091129184331.770401C006 () frozenfish ! freewrt ! org
[Download RAW message or body]
Author: tg
Date: 2009-11-29 19:43:30 +0100 (Sun, 29 Nov 2009)
New Revision: 3909
Modified:
trunk/freewrt/package/uclibc/Makefile.inc
trunk/freewrt/toolchain/uClibc/files/arc4random.c
trunk/freewrt/toolchain/uClibc/patches/patch-libc_stdlib_Makefile
Log:
sync arc4random.c from MirBSD and enable opportunistic pushb
(since almost everything on FreeWRT is run as root anyway)
gives us arc4random_pushb(3) for mksh, as well as
arc4random_buf(3) and arc4random_uniform(3) – see
http://www.mirbsd.org/man3/arc4random to RTFM
Modified: trunk/freewrt/package/uclibc/Makefile.inc
===================================================================
--- trunk/freewrt/package/uclibc/Makefile.inc 2009-11-28 21:17:29 UTC (rev 3908)
+++ trunk/freewrt/package/uclibc/Makefile.inc 2009-11-29 18:43:30 UTC (rev 3909)
@@ -6,5 +6,5 @@
PKG_NAME:= uClibc
PKG_VERSION:= 0.9.28
-PKG_RELEASE:= 2
+PKG_RELEASE:= 3
PKG_MD5SUM:= 1ada58d919a82561061e4741fb6abd29
Modified: trunk/freewrt/toolchain/uClibc/files/arc4random.c
===================================================================
--- trunk/freewrt/toolchain/uClibc/files/arc4random.c 2009-11-28 21:17:29 UTC (rev \
3908)
+++ trunk/freewrt/toolchain/uClibc/files/arc4random.c 2009-11-29 18:43:30 UTC (rev \
3909) @@ -1,5 +1,5 @@
static const char __vcsid[] = "@(#) MirOS contributed arc4random.c (old)"
- "\n @(#)rcsid_master: $MirOS: contrib/code/Snippets/arc4random.c,v 1.19 \
2009/09/27 10:45:56 tg Exp $" + "\n @(#)rcsid_master: $MirOS: \
contrib/code/Snippets/arc4random.c,v 1.24 2009/11/29 18:24:21 tg Exp $" ;
/*-
@@ -116,7 +116,7 @@
static const char __randomdev[] = _PATH_URANDOM;
static uint8_t arc4_getbyte(void);
-static void stir_finish(int);
+static void stir_finish(uint8_t);
static void arc4_atexit(void);
static char arc4_writeback(uint8_t *, size_t, char);
@@ -124,11 +124,23 @@
u_int32_t arc4random(void);
void arc4random_addrandom(u_char *, int);
void arc4random_stir(void);
-#ifdef USE_MS_CRYPTOAPI
+#if defined(USE_MS_CRYPTOAPI) || defined(OPPORTUNISTIC_ROOT_PUSHB)
uint32_t arc4random_pushb(const void *, size_t);
#endif
#endif
+#define NEED_UNIFORM_BUF_PROTO
+#if defined(__OpenBSD__) && defined(OpenBSD) && (OpenBSD > 200805)
+#undef NEED_UNIFORM_BUF_PROTO
+#elif defined(__MirBSD__) && defined(MirBSD) && (MirBSD > 0x0AA4)
+#undef NEED_UNIFORM_BUF_PROTO
+#endif
+
+#ifdef NEED_UNIFORM_BUF_PROTO
+u_int32_t arc4random_uniform(u_int32_t);
+void arc4random_buf(void *, size_t);
+#endif
+
static void
arc4_init(void)
{
@@ -141,22 +153,38 @@
}
static void
-arc4_addrandom(u_char *dat, int datlen)
+arc4_addrandom(const u_char *dat, size_t datlen)
{
- int n;
+ size_t n = 0;
uint8_t si;
arc4_ctx.i--;
- for (n = 0; n < 256; n++) {
+ while (n < 256) {
arc4_ctx.i++;
si = arc4_ctx.s[arc4_ctx.i];
- arc4_ctx.j = (uint8_t)(arc4_ctx.j + si + dat[n % datlen]);
+ arc4_ctx.j = (uint8_t)(arc4_ctx.j + si + dat[n++ % datlen]);
arc4_ctx.s[arc4_ctx.i] = arc4_ctx.s[arc4_ctx.j];
arc4_ctx.s[arc4_ctx.j] = si;
}
arc4_ctx.j = arc4_ctx.i;
}
+#if defined(USE_MS_CRYPTOAPI)
+#define RNDEV_BYTES 128
+#elif defined(__INTERIX)
+#define RNDEV_BYTES 4 /* slow /dev/urandom */
+#elif defined(__OpenBSD__)
+#define RNDEV_BYTES (256 - (sizeof(struct timeval) + sizeof(pid_t)))
+#elif defined(__CYGWIN__)
+#define RNDEV_BYTES 64 /* /dev/urandom probably CryptoAPI */
+#elif defined(__FreeBSD__)
+#define RNDEV_BYTES 16 /* Yarrow has few state */
+#elif defined(__GLIBC__)
+#define RNDEV_BYTES 16 /* requested by maintainers */
+#else
+#define RNDEV_BYTES 8 /* unknown OS? */
+#endif
+
static void
arc4_stir(void)
{
@@ -164,7 +192,7 @@
struct {
struct timeval tv;
pid_t pid;
- u_int rnd[(128 - (sizeof(struct timeval) + sizeof(pid_t))) / sizeof(u_int)];
+ u_int rnd[(RNDEV_BYTES + sizeof(u_int) - 1) / sizeof(u_int)];
} rdat;
size_t sz = 0;
@@ -232,7 +260,7 @@
}
static void
-stir_finish(int av)
+stir_finish(uint8_t av)
{
size_t n;
uint8_t tb[16];
@@ -245,18 +273,17 @@
* We discard 256 words. A long word is 4 bytes.
* We also discard a randomly fuzzed amount.
*/
- n = 256 * 4 + (arc4_getbyte() & 0x0FU);
- while (av) {
- n += (av & 0x0F);
- av >>= 4;
- }
+ n = 256 * 4 + (arc4_getbyte() & 0x0FU) + (av & 0xF0U);
+ av &= 0x0FU;
while (n--)
arc4_getbyte();
while (n < sizeof(tb))
tb[n++] = arc4_getbyte();
if (arc4_writeback(tb, sizeof(tb), 0))
arc4_getbyte();
- arc4_count = 400000;
+ while (av--)
+ arc4_getbyte();
+ arc4_count = 1600000;
}
static uint8_t
@@ -306,7 +333,8 @@
u_int32_t
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();
return arc4_getword();
}
@@ -453,17 +481,22 @@
#endif
}
-#if defined(USE_MS_CRYPTOAPI) || defined(arc4random_pushk)
+#if defined(USE_MS_CRYPTOAPI) || defined(arc4random_pushk) || \
+ defined(OPPORTUNISTIC_ROOT_PUSHB)
uint32_t
arc4random_pushb(const void *src, size_t len)
{
size_t rlen;
union {
uint8_t buf[256];
- struct timeval tv;
+ struct {
+ struct timeval tv;
+ const void *sp, *dp;
+ size_t sz;
+ uint32_t vu;
+ } s;
uint32_t xbuf;
} idat;
- const uint8_t *cbuf = (const uint8_t *)src;
uint32_t res = 1;
if (!rs_initialized) {
@@ -471,19 +504,29 @@
rs_initialized = 1;
}
- gettimeofday(&idat.tv, NULL);
- for (rlen = 0; rlen < len; ++rlen)
- idat.buf[rlen % sizeof(idat)] ^= cbuf[rlen];
- rlen = MIN(sizeof(idat), MAX(sizeof(struct timeval), len));
+ idat.s.sp = &idat;
+ idat.s.dp = src;
+ idat.s.sz = len;
+ idat.s.vu = arc4_getword();
+ gettimeofday(&idat.s.tv, NULL);
- if (arc4_writeback(&idat.buf[0], rlen, 1))
+ rlen = MAX(sizeof(idat.s), len);
+ while (rlen--)
+ idat.buf[rlen % sizeof(idat.buf)] ^=
+ ((const uint8_t *)src)[rlen % len];
+ rlen = MIN(sizeof(idat), MAX(sizeof(idat.s), len));
+
+ if (arc4_writeback((void *)&idat, rlen, 1))
res = 0;
- arc4_addrandom(&idat.buf[0], rlen);
+ arc4_addrandom((void *)&idat, rlen);
+ rlen = arc4_getbyte() & 1;
if (res)
res = idat.xbuf;
else
/* we got entropy from the kernel, so consider us stirred */
stir_finish(idat.buf[5]);
+ if (rlen)
+ (void)arc4_getbyte();
return (res ^ arc4_getword());
}
#endif
@@ -505,3 +548,72 @@
arc4_writeback((uint8_t *)&buf, sizeof(buf), 0);
}
+
+void
+arc4random_buf(void *_buf, size_t n)
+{
+ uint8_t *buf = (uint8_t *)_buf;
+
+ if (!rs_initialized || arc4_stir_pid != getpid())
+ arc4random_stir();
+ buf[0] = arc4_getbyte() % 3;
+ while (buf[0]--)
+ (void)arc4_getbyte();
+ while (n--) {
+ if (--arc4_count <= 0)
+ arc4_stir();
+ buf[n] = arc4_getbyte();
+ }
+}
+
+/*
+ * Calculate a uniformly distributed random number less than upper_bound
+ * avoiding "modulo bias".
+ *
+ * Uniformity is achieved by generating new random numbers until the one
+ * returned is outside the range [0, 2**32 % upper_bound). This
+ * guarantees the selected random number will be inside
+ * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound)
+ * after reduction modulo upper_bound.
+ */
+u_int32_t
+arc4random_uniform(u_int32_t upper_bound)
+{
+ u_int32_t r, min;
+
+ if (upper_bound < 2)
+ return (0);
+
+#if defined(ULONG_MAX) && (ULONG_MAX > 0xffffffffUL)
+ min = 0x100000000UL % upper_bound;
+#else
+ /* Calculate (2**32 % upper_bound) avoiding 64-bit math */
+ if (upper_bound > 0x80000000)
+ min = 1 + ~upper_bound; /* 2**32 - upper_bound */
+ else {
+ /* (2**32 - (x * 2)) % x == 2**32 % x when x <= 2**31 */
+ min = ((0xffffffff - (upper_bound * 2)) + 1) % upper_bound;
+ }
+#endif
+
+ /*
+ * This could theoretically loop forever but each retry has
+ * p > 0.5 (worst case, usually far better) of selecting a
+ * number inside the range we need, so it should rarely need
+ * to re-roll.
+ */
+ if (!rs_initialized || arc4_stir_pid != getpid())
+ arc4random_stir();
+ if (arc4_getbyte() & 1)
+ (void)arc4_getbyte();
+ for (;;) {
+ arc4_count -= 4;
+ if (arc4_count <= 0)
+ arc4random_stir();
+ r = arc4_getword();
+ if (r >= min)
+ break;
+ }
+
+ return (r % upper_bound);
+}
Modified: trunk/freewrt/toolchain/uClibc/patches/patch-libc_stdlib_Makefile
===================================================================
--- trunk/freewrt/toolchain/uClibc/patches/patch-libc_stdlib_Makefile 2009-11-28 \
21:17:29 UTC (rev 3908)
+++ trunk/freewrt/toolchain/uClibc/patches/patch-libc_stdlib_Makefile 2009-11-29 \
18:43:30 UTC (rev 3909) @@ -15,7 +15,7 @@
$(STRIPTOOL) -x -R .note -R .comment $*.o
+arc4random.o: arc4random.c
-+ $(CC) $(CFLAGS) -DHAVE_STDINT_H -c $< -o $@
++ $(CC) $(CFLAGS) -DHAVE_STDINT_H -DOPPORTUNISTIC_ROOT_PUSHB -c $< -o $@
+ $(STRIPTOOL) -x -R .note -R .comment $*.o
+
$(OBJ): Makefile
_______________________________________________
freewrt-commits mailing list
freewrt-commits@freewrt.org
https://www.freewrt.org/lists/listinfo/freewrt-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic