Module Name: src Committed By: tls Date: Mon Nov 28 08:05:07 UTC 2011
Modified Files: src/lib/librumpuser: rumpuser.c src/sys/dist/ipf/netinet: ip_compat.h ip_state.c src/sys/dist/pf/net: pf_ioctl.c pf_norm.c src/sys/lib/libkern: arc4random.c libkern.h src/sys/nfs: nfs_vnops.c src/sys/opencrypto: cryptosoft.c cryptosoft_xform.c src/sys/rump/include/rump: rumpuser.h src/sys/rump/librump/rumpkern: cprng_stub.c src/sys/sys: cprng.h param.h src/sys/ufs/ffs: ffs_alloc.c Log Message: Remove arc4random() and arc4randbytes() from the kernel API. Replace arc4random() hacks in rump with stubs that call the host arc4random() to get numbers that are hopefully actually random (arc4random() keyed with stack junk is not). This should fix some of the currently failing anita tests -- we should no longer generate duplicate "random" MAC addresses in the test environment. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/lib/librumpuser/rumpuser.c cvs rdiff -u -r1.29 -r1.30 src/sys/dist/ipf/netinet/ip_compat.h cvs rdiff -u -r1.36 -r1.37 src/sys/dist/ipf/netinet/ip_state.c cvs rdiff -u -r1.45 -r1.46 src/sys/dist/pf/net/pf_ioctl.c cvs rdiff -u -r1.25 -r1.26 src/sys/dist/pf/net/pf_norm.c cvs rdiff -u -r1.26 -r1.27 src/sys/lib/libkern/arc4random.c cvs rdiff -u -r1.103 -r1.104 src/sys/lib/libkern/libkern.h cvs rdiff -u -r1.292 -r1.293 src/sys/nfs/nfs_vnops.c cvs rdiff -u -r1.38 -r1.39 src/sys/opencrypto/cryptosoft.c cvs rdiff -u -r1.24 -r1.25 src/sys/opencrypto/cryptosoft_xform.c cvs rdiff -u -r1.70 -r1.71 src/sys/rump/include/rump/rumpuser.h cvs rdiff -u -r1.2 -r1.3 src/sys/rump/librump/rumpkern/cprng_stub.c cvs rdiff -u -r1.1 -r1.2 src/sys/sys/cprng.h cvs rdiff -u -r1.396 -r1.397 src/sys/sys/param.h cvs rdiff -u -r1.129 -r1.130 src/sys/ufs/ffs/ffs_alloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/librumpuser/rumpuser.c diff -u src/lib/librumpuser/rumpuser.c:1.15 src/lib/librumpuser/rumpuser.c:1.16 --- src/lib/librumpuser/rumpuser.c:1.15 Sun Feb 6 21:05:53 2011 +++ src/lib/librumpuser/rumpuser.c Mon Nov 28 08:05:05 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser.c,v 1.15 2011/02/06 21:05:53 pooka Exp $ */ +/* $NetBSD: rumpuser.c,v 1.16 2011/11/28 08:05:05 tls Exp $ */ /* * Copyright (c) 2007-2010 Antti Kantee. All Rights Reserved. @@ -27,7 +27,7 @@ #include <sys/cdefs.h> #if !defined(lint) -__RCSID("$NetBSD: rumpuser.c,v 1.15 2011/02/06 21:05:53 pooka Exp $"); +__RCSID("$NetBSD: rumpuser.c,v 1.16 2011/11/28 08:05:05 tls Exp $"); #endif /* !lint */ /* thank the maker for this */ @@ -640,3 +640,9 @@ rumpuser_getnhostcpu(void) return 1; #endif } + +uint32_t +rumpuser_arc4random(void) +{ + return arc4random(); +} Index: src/sys/dist/ipf/netinet/ip_compat.h diff -u src/sys/dist/ipf/netinet/ip_compat.h:1.29 src/sys/dist/ipf/netinet/ip_compat.h:1.30 --- src/sys/dist/ipf/netinet/ip_compat.h:1.29 Tue Jun 1 08:53:20 2010 +++ src/sys/dist/ipf/netinet/ip_compat.h Mon Nov 28 08:05:05 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_compat.h,v 1.29 2010/06/01 08:53:20 plunky Exp $ */ +/* $NetBSD: ip_compat.h,v 1.30 2011/11/28 08:05:05 tls Exp $ */ /* * Copyright (C) 1993-2001, 2003 by Darren Reed. @@ -216,7 +216,7 @@ typedef unsigned int u_32_t; # ifdef _KERNEL # define NEED_LOCAL_RAND 1 -# define ipf_random arc4random +# define ipf_random cprng_fast32 # define KRWLOCK_T krwlock_t # define KMUTEX_T kmutex_t @@ -582,7 +582,8 @@ typedef struct { # ifdef _KERNEL # define NEED_LOCAL_RAND 1 -# define ipf_random arc4random +#include <sys/cprng.h> +# define ipf_random cprng_fast32 # define ATOMIC_INC(x) { MUTEX_ENTER(&ipf_rw); \ (x)++; MUTEX_EXIT(&ipf_rw); } # define ATOMIC_DEC(x) { MUTEX_ENTER(&ipf_rw); \ @@ -806,7 +807,9 @@ typedef unsigned int u_32_t; # endif # endif +#ifndef _KERNEL # define ipf_random arc4random +#endif # if (__NetBSD_Version__ >= 499000000) # ifdef _KERNEL @@ -834,7 +837,8 @@ typedef unsigned int u_32_t; # endif # ifdef _KERNEL -# define ipf_random arc4random +# include <sys/cprng.h> +# define ipf_random cprng_fast32 # if (__NetBSD_Version__ >= 399001400) # define KMALLOCS(a, b, c) (a) = (b)malloc((c), _M_IPF, M_NOWAIT) # endif Index: src/sys/dist/ipf/netinet/ip_state.c diff -u src/sys/dist/ipf/netinet/ip_state.c:1.36 src/sys/dist/ipf/netinet/ip_state.c:1.37 --- src/sys/dist/ipf/netinet/ip_state.c:1.36 Sat Apr 17 21:00:44 2010 +++ src/sys/dist/ipf/netinet/ip_state.c Mon Nov 28 08:05:05 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_state.c,v 1.36 2010/04/17 21:00:44 darrenr Exp $ */ +/* $NetBSD: ip_state.c,v 1.37 2011/11/28 08:05:05 tls Exp $ */ /* * Copyright (C) 1995-2003 by Darren Reed. @@ -115,7 +115,7 @@ struct file; #if !defined(lint) #if defined(__NetBSD__) #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_state.c,v 1.36 2010/04/17 21:00:44 darrenr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_state.c,v 1.37 2011/11/28 08:05:05 tls Exp $"); #else static const char sccsid[] = "@(#)ip_state.c 1.8 6/5/96 (C) 1993-2000 Darren Reed"; static const char rcsid[] = "@(#)Id: ip_state.c,v 2.186.2.100 2010/01/31 16:22:55 darrenr Exp"; @@ -228,7 +228,7 @@ int fr_stateinit() * XXX - ips_seed[X] should be a random number of sorts. */ #if !defined(NEED_LOCAL_RAND) && defined(_KERNEL) - ips_seed[i] = arc4random(); + ips_seed[i] = cprng_fast32(); #else ips_seed[i] = ((u_long)ips_seed + i) * fr_statesize; ips_seed[i] += tv.tv_sec; Index: src/sys/dist/pf/net/pf_ioctl.c diff -u src/sys/dist/pf/net/pf_ioctl.c:1.45 src/sys/dist/pf/net/pf_ioctl.c:1.46 --- src/sys/dist/pf/net/pf_ioctl.c:1.45 Tue Aug 30 19:05:12 2011 +++ src/sys/dist/pf/net/pf_ioctl.c Mon Nov 28 08:05:05 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pf_ioctl.c,v 1.45 2011/08/30 19:05:12 jmcneill Exp $ */ +/* $NetBSD: pf_ioctl.c,v 1.46 2011/11/28 08:05:05 tls Exp $ */ /* $OpenBSD: pf_ioctl.c,v 1.182 2007/06/24 11:17:13 mcbride Exp $ */ /* @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pf_ioctl.c,v 1.45 2011/08/30 19:05:12 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pf_ioctl.c,v 1.46 2011/11/28 08:05:05 tls Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -66,6 +66,7 @@ __KERNEL_RCSID(0, "$NetBSD: pf_ioctl.c,v #include <sys/lwp.h> #include <sys/kauth.h> #include <sys/module.h> +#include <sys/cprng.h> #endif /* __NetBSD__ */ #include <net/if.h> @@ -300,7 +301,7 @@ pfattach(int num) pf_status.debug = PF_DEBUG_URGENT; /* XXX do our best to avoid a conflict */ - pf_status.hostid = arc4random(); + pf_status.hostid = cprng_fast32(); /* require process context to purge states, so perform in a thread */ #ifdef __NetBSD__ @@ -3176,7 +3177,7 @@ pfioctl(dev_t dev, u_long cmd, void *add u_int32_t *hid = (u_int32_t *)addr; if (*hid == 0) - pf_status.hostid = arc4random(); + pf_status.hostid = cprng_fast32(); else pf_status.hostid = *hid; break; Index: src/sys/dist/pf/net/pf_norm.c diff -u src/sys/dist/pf/net/pf_norm.c:1.25 src/sys/dist/pf/net/pf_norm.c:1.26 --- src/sys/dist/pf/net/pf_norm.c:1.25 Mon Aug 29 09:50:04 2011 +++ src/sys/dist/pf/net/pf_norm.c Mon Nov 28 08:05:05 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pf_norm.c,v 1.25 2011/08/29 09:50:04 jmcneill Exp $ */ +/* $NetBSD: pf_norm.c,v 1.26 2011/11/28 08:05:05 tls Exp $ */ /* $OpenBSD: pf_norm.c,v 1.109 2007/05/28 17:16:39 henning Exp $ */ /* @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pf_norm.c,v 1.25 2011/08/29 09:50:04 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pf_norm.c,v 1.26 2011/11/28 08:05:05 tls Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -47,6 +47,7 @@ __KERNEL_RCSID(0, "$NetBSD: pf_norm.c,v #ifdef __NetBSD__ #include <sys/rnd.h> +#include <sys/cprng.h> #else #include <dev/rndvar.h> #endif /* !__NetBSD__ */ @@ -1446,7 +1447,7 @@ pf_normalize_tcp_init(struct mbuf *m, in src->scrub->pfss_flags |= PFSS_TIMESTAMP; src->scrub->pfss_ts_mod = - htonl(arc4random()); + htonl(cprng_fast32()); /* note PFSS_PAWS not set yet */ memcpy(&tsval, &opt[2], Index: src/sys/lib/libkern/arc4random.c diff -u src/sys/lib/libkern/arc4random.c:1.26 src/sys/lib/libkern/arc4random.c:1.27 --- src/sys/lib/libkern/arc4random.c:1.26 Sun Nov 27 00:09:04 2011 +++ src/sys/lib/libkern/arc4random.c Mon Nov 28 08:05:05 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: arc4random.c,v 1.26 2011/11/27 00:09:04 tsutsui Exp $ */ +/* $NetBSD: arc4random.c,v 1.27 2011/11/28 08:05:05 tls Exp $ */ /*- * Copyright (c) 2002, 2011 The NetBSD Foundation, Inc. @@ -112,7 +112,8 @@ kmutex_t arc4_mtx; static inline u_int8_t arc4_randbyte(void); static inline void arc4randbytes_unlocked(void *, size_t); - +void _arc4randbytes(void *, size_t); +uint32_t _arc4random(void); static inline void arc4_swap(u_int8_t *a, u_int8_t *b) @@ -283,18 +284,6 @@ arc4_randbyte(void) return arc4_sbox[arc4_t]; } -u_int32_t -arc4random(void) -{ - u_int32_t ret; - u_int8_t *retc; - - retc = (u_int8_t *)&ret; - - arc4randbytes(retc, sizeof(u_int32_t)); - return ret; -} - static inline void arc4randbytes_unlocked(void *p, size_t len) { @@ -306,7 +295,7 @@ arc4randbytes_unlocked(void *p, size_t l } void -arc4randbytes(void *p, size_t len) +_arc4randbytes(void *p, size_t len) { /* Initialize array if needed. */ if (!arc4_initialized) { @@ -323,3 +312,15 @@ arc4randbytes(void *p, size_t len) arc4_randrekey(NULL); } } + +u_int32_t +_arc4random(void) +{ + u_int32_t ret; + u_int8_t *retc; + + retc = (u_int8_t *)&ret; + + _arc4randbytes(retc, sizeof(u_int32_t)); + return ret; +} Index: src/sys/lib/libkern/libkern.h diff -u src/sys/lib/libkern/libkern.h:1.103 src/sys/lib/libkern/libkern.h:1.104 --- src/sys/lib/libkern/libkern.h:1.103 Sat Oct 1 16:06:24 2011 +++ src/sys/lib/libkern/libkern.h Mon Nov 28 08:05:06 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: libkern.h,v 1.103 2011/10/01 16:06:24 chs Exp $ */ +/* $NetBSD: libkern.h,v 1.104 2011/11/28 08:05:06 tls Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -313,8 +313,6 @@ char *intoa(u_int32_t); void *memchr(const void *, int, size_t); void *memmove(void *, const void *, size_t); int pmatch(const char *, const char *, const char **); -u_int32_t arc4random(void); -void arc4randbytes(void *, size_t); #ifndef SMALL_RANDOM void srandom(unsigned long); char *initstate(unsigned long, char *, size_t); Index: src/sys/nfs/nfs_vnops.c diff -u src/sys/nfs/nfs_vnops.c:1.292 src/sys/nfs/nfs_vnops.c:1.293 --- src/sys/nfs/nfs_vnops.c:1.292 Tue Sep 27 01:05:08 2011 +++ src/sys/nfs/nfs_vnops.c Mon Nov 28 08:05:06 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_vnops.c,v 1.292 2011/09/27 01:05:08 christos Exp $ */ +/* $NetBSD: nfs_vnops.c,v 1.293 2011/11/28 08:05:06 tls Exp $ */ /* * Copyright (c) 1989, 1993 @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_vnops.c,v 1.292 2011/09/27 01:05:08 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_vnops.c,v 1.293 2011/11/28 08:05:06 tls Exp $"); #ifdef _KERNEL_OPT #include "opt_nfs.h" @@ -68,6 +68,7 @@ __KERNEL_RCSID(0, "$NetBSD: nfs_vnops.c, #include <sys/stat.h> #include <sys/unistd.h> #include <sys/kauth.h> +#include <sys/cprng.h> #include <uvm/uvm_extern.h> #include <uvm/uvm.h> @@ -1638,8 +1639,8 @@ again: if (excl_mode == NFSV3CREATE_EXCLUSIVE) { *tl = txdr_unsigned(NFSV3CREATE_EXCLUSIVE); nfsm_build(tl, u_int32_t *, NFSX_V3CREATEVERF); - *tl++ = arc4random(); - *tl = arc4random(); + *tl++ = cprng_fast32(); + *tl = cprng_fast32(); } else { *tl = txdr_unsigned(excl_mode); nfsm_v3attrbuild(vap, false); Index: src/sys/opencrypto/cryptosoft.c diff -u src/sys/opencrypto/cryptosoft.c:1.38 src/sys/opencrypto/cryptosoft.c:1.39 --- src/sys/opencrypto/cryptosoft.c:1.38 Tue Jun 7 15:57:51 2011 +++ src/sys/opencrypto/cryptosoft.c Mon Nov 28 08:05:06 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cryptosoft.c,v 1.38 2011/06/07 15:57:51 drochner Exp $ */ +/* $NetBSD: cryptosoft.c,v 1.39 2011/11/28 08:05:06 tls Exp $ */ /* $FreeBSD: src/sys/opencrypto/cryptosoft.c,v 1.2.2.1 2002/11/21 23:34:23 sam Exp $ */ /* $OpenBSD: cryptosoft.c,v 1.35 2002/04/26 08:43:50 deraadt Exp $ */ @@ -24,7 +24,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cryptosoft.c,v 1.38 2011/06/07 15:57:51 drochner Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cryptosoft.c,v 1.39 2011/11/28 08:05:06 tls Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -106,7 +106,7 @@ swcr_encdec(struct cryptodesc *crd, cons for (i = 0; i + sizeof (u_int32_t) <= EALG_MAX_BLOCK_LEN; i += sizeof (u_int32_t)) { - u_int32_t temp = arc4random(); + u_int32_t temp = cprng_fast32(); memcpy(iv + i, &temp, sizeof(u_int32_t)); } @@ -116,7 +116,7 @@ swcr_encdec(struct cryptodesc *crd, cons * what arc4random() returns ? */ if (EALG_MAX_BLOCK_LEN % sizeof (u_int32_t) != 0) { - u_int32_t temp = arc4random(); + u_int32_t temp = cprng_fast32(); bcopy (&temp, iv + i, EALG_MAX_BLOCK_LEN - i); @@ -628,7 +628,7 @@ swcr_combined(struct cryptop *crp, int o } else if (exf->reinit) exf->reinit(swe->sw_kschedule, 0, iv); else - arc4randbytes(iv, ivlen); + cprng_fast(iv, ivlen); /* Do we need to write the IV */ if (!(crde->crd_flags & CRD_F_IV_PRESENT)) Index: src/sys/opencrypto/cryptosoft_xform.c diff -u src/sys/opencrypto/cryptosoft_xform.c:1.24 src/sys/opencrypto/cryptosoft_xform.c:1.25 --- src/sys/opencrypto/cryptosoft_xform.c:1.24 Tue Jun 7 15:57:52 2011 +++ src/sys/opencrypto/cryptosoft_xform.c Mon Nov 28 08:05:06 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cryptosoft_xform.c,v 1.24 2011/06/07 15:57:52 drochner Exp $ */ +/* $NetBSD: cryptosoft_xform.c,v 1.25 2011/11/28 08:05:06 tls Exp $ */ /* $FreeBSD: src/sys/opencrypto/xform.c,v 1.1.2.1 2002/11/21 23:34:23 sam Exp $ */ /* $OpenBSD: xform.c,v 1.19 2002/08/16 22:47:25 dhartmei Exp $ */ @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: cryptosoft_xform.c,v 1.24 2011/06/07 15:57:52 drochner Exp $"); +__KERNEL_RCSID(1, "$NetBSD: cryptosoft_xform.c,v 1.25 2011/11/28 08:05:06 tls Exp $"); #include <crypto/blowfish/blowfish.h> #include <crypto/cast128/cast128.h> @@ -744,7 +744,7 @@ aes_ctr_setkey(u_int8_t **sched, const u } memcpy(ctx->ac_block, key + len - AESCTR_NONCESIZE, AESCTR_NONCESIZE); /* random start value for simple counter */ - arc4randbytes(&ctx->ivgenctx.lastiv, sizeof(ctx->ivgenctx.lastiv)); + cprng_fast(&ctx->ivgenctx.lastiv, sizeof(ctx->ivgenctx.lastiv)); *sched = (void *)ctx; return 0; } @@ -808,7 +808,7 @@ aes_gmac_setkey(u_int8_t **sched, const return ENOMEM; /* random start value for simple counter */ - arc4randbytes(&ctx->ivgenctx.lastiv, sizeof(ctx->ivgenctx.lastiv)); + cprng_fast(&ctx->ivgenctx.lastiv, sizeof(ctx->ivgenctx.lastiv)); *sched = (void *)ctx; return 0; } Index: src/sys/rump/include/rump/rumpuser.h diff -u src/sys/rump/include/rump/rumpuser.h:1.70 src/sys/rump/include/rump/rumpuser.h:1.71 --- src/sys/rump/include/rump/rumpuser.h:1.70 Mon Aug 29 20:48:36 2011 +++ src/sys/rump/include/rump/rumpuser.h Mon Nov 28 08:05:06 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser.h,v 1.70 2011/08/29 20:48:36 joerg Exp $ */ +/* $NetBSD: rumpuser.h,v 1.71 2011/11/28 08:05:06 tls Exp $ */ /* * Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved. @@ -112,6 +112,8 @@ int rumpuser_dprintf(const char *, ...); int rumpuser_getnhostcpu(void); +uint32_t rumpuser_arc4random(void); + /* rumpuser_pth */ void rumpuser_thrinit(kernel_lockfn, kernel_unlockfn, int); __dead void rumpuser_biothread(void *); Index: src/sys/rump/librump/rumpkern/cprng_stub.c diff -u src/sys/rump/librump/rumpkern/cprng_stub.c:1.2 src/sys/rump/librump/rumpkern/cprng_stub.c:1.3 --- src/sys/rump/librump/rumpkern/cprng_stub.c:1.2 Mon Nov 21 13:42:37 2011 +++ src/sys/rump/librump/rumpkern/cprng_stub.c Mon Nov 28 08:05:07 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cprng_stub.c,v 1.2 2011/11/21 13:42:37 tsutsui Exp $ */ +/* $NetBSD: cprng_stub.c,v 1.3 2011/11/28 08:05:07 tls Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -40,6 +40,8 @@ #include <sys/cprng.h> +#include <rump/rumpuser.h> + /* * This is all stubbed out because of rump build dependency issues I * cannot fix. One is more-or-less caused by the longstanding bogosity @@ -89,3 +91,41 @@ void cprng_strong_destroy(cprng_strong_t memset(c, 0, sizeof(*c)); kmem_free(c, sizeof(*c)); } + +size_t +cprng_fast(void *p, size_t len) +{ + uint8_t *resp, *pchar = (uint8_t *)p; + uint32_t res; + size_t i; + + do { + res = rumpuser_arc4random(); + resp = (uint8_t *)&res; + + for (i = 0; i < sizeof(res); i++) { + *pchar++ = resp[i]; + if (pchar == (uint8_t *)p + len) { + return len; + } + } + } while(1); +} + +uint32_t +cprng_fast32(void) +{ + return rumpuser_arc4random(); +} + +uint64_t +cprng_fast64(void) +{ + uint64_t ret; + uint32_t *ret32; + + ret32 = (uint32_t *)&ret; + ret32[0] = rumpuser_arc4random(); + ret32[1] = rumpuser_arc4random(); + return ret; +} Index: src/sys/sys/cprng.h diff -u src/sys/sys/cprng.h:1.1 src/sys/sys/cprng.h:1.2 --- src/sys/sys/cprng.h:1.1 Sat Nov 19 22:51:31 2011 +++ src/sys/sys/cprng.h Mon Nov 28 08:05:07 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cprng.h,v 1.1 2011/11/19 22:51:31 tls Exp $ */ +/* $NetBSD: cprng.h,v 1.2 2011/11/28 08:05:07 tls Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -42,26 +42,38 @@ */ #define CPRNG_MAX_LEN 524288 +#ifndef _RUMPKERNEL +/* + * We do not want an arc4random() prototype available to anyone. + */ +void _arc4randbytes(void *, size_t); +uint32_t _arc4random(void); + static inline size_t cprng_fast(void *p, size_t len) { - arc4randbytes(p, len); + _arc4randbytes(p, len); return len; } static inline uint32_t cprng_fast32(void) { - return arc4random(); + return _arc4random(); } static inline uint64_t cprng_fast64(void) { uint64_t r; - arc4randbytes(&r, sizeof(r)); + _arc4randbytes(&r, sizeof(r)); return r; } +#else +size_t cprng_fast(void *, size_t); +uint32_t cprng_fast32(void); +uint64_t cprng_fast64(void); +#endif typedef struct _cprng_strong { kmutex_t mtx; Index: src/sys/sys/param.h diff -u src/sys/sys/param.h:1.396 src/sys/sys/param.h:1.397 --- src/sys/sys/param.h:1.396 Wed Nov 23 23:07:36 2011 +++ src/sys/sys/param.h Mon Nov 28 08:05:07 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: param.h,v 1.396 2011/11/23 23:07:36 jmcneill Exp $ */ +/* $NetBSD: param.h,v 1.397 2011/11/28 08:05:07 tls Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1993 @@ -63,7 +63,7 @@ * 2.99.9 (299000900) */ -#define __NetBSD_Version__ 599005700 /* NetBSD 5.99.57 */ +#define __NetBSD_Version__ 599005800 /* NetBSD 5.99.58 */ #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \ (m) * 1000000) + (p) * 100) <= __NetBSD_Version__) Index: src/sys/ufs/ffs/ffs_alloc.c diff -u src/sys/ufs/ffs/ffs_alloc.c:1.129 src/sys/ufs/ffs/ffs_alloc.c:1.130 --- src/sys/ufs/ffs/ffs_alloc.c:1.129 Tue Sep 20 14:01:32 2011 +++ src/sys/ufs/ffs/ffs_alloc.c Mon Nov 28 08:05:07 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_alloc.c,v 1.129 2011/09/20 14:01:32 chs Exp $ */ +/* $NetBSD: ffs_alloc.c,v 1.130 2011/11/28 08:05:07 tls Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ffs_alloc.c,v 1.129 2011/09/20 14:01:32 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_alloc.c,v 1.130 2011/11/28 08:05:07 tls Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -81,6 +81,7 @@ __KERNEL_RCSID(0, "$NetBSD: ffs_alloc.c, #include <sys/param.h> #include <sys/systm.h> #include <sys/buf.h> +#include <sys/cprng.h> #include <sys/fstrans.h> #include <sys/kauth.h> #include <sys/kernel.h> @@ -1388,7 +1389,7 @@ gotit: * Don't bother to swap, it's supposed to be * random, after all. */ - dp2->di_gen = (arc4random() & INT32_MAX) / 2 + 1; + dp2->di_gen = (cprng_fast32() & INT32_MAX) / 2 + 1; dp2++; } initediblk += INOPB(fs);