From owner-svn-src-projects@FreeBSD.ORG Tue Oct 8 11:05:28 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id AF38AA11; Tue, 8 Oct 2013 11:05:28 +0000 (UTC) (envelope-from des@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 9C94928C6; Tue, 8 Oct 2013 11:05:28 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r98B5StG049530; Tue, 8 Oct 2013 11:05:28 GMT (envelope-from des@svn.freebsd.org) Received: (from des@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r98B5RmC049521; Tue, 8 Oct 2013 11:05:27 GMT (envelope-from des@svn.freebsd.org) Message-Id: <201310081105.r98B5RmC049521@svn.freebsd.org> From: Dag-Erling Smørgrav Date: Tue, 8 Oct 2013 11:05:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r256138 - in projects/random_number_generator/sys: conf dev/random kern modules/random sys X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Oct 2013 11:05:28 -0000 Author: des Date: Tue Oct 8 11:05:26 2013 New Revision: 256138 URL: http://svnweb.freebsd.org/changeset/base/256138 Log: Add YARROW_RNG and FORTUNA_RNG to sys/conf/options. Add a SYSINIT that forces a reseed during proc0 setup, which happens fairly late in the boot process. Add a RANDOM_DEBUG option which enables some debugging printf()s. Add a new RANDOM_ATTACH entropy source which harvests entropy from the get_cyclecount() delta across each call to a device attach method. Modified: projects/random_number_generator/sys/conf/options projects/random_number_generator/sys/dev/random/random_adaptors.c projects/random_number_generator/sys/dev/random/randomdev_soft.c projects/random_number_generator/sys/dev/random/yarrow.c projects/random_number_generator/sys/kern/subr_bus.c projects/random_number_generator/sys/modules/random/Makefile projects/random_number_generator/sys/sys/random.h Modified: projects/random_number_generator/sys/conf/options ============================================================================== --- projects/random_number_generator/sys/conf/options Tue Oct 8 08:16:17 2013 (r256137) +++ projects/random_number_generator/sys/conf/options Tue Oct 8 11:05:26 2013 (r256138) @@ -904,3 +904,8 @@ RACCT opt_global.h # Resource Limits RCTL opt_global.h + +# Random number generator(s) +YARROW_RNG opt_random.h +FORTUNA_RNG opt_random.h +RANDOM_DEBUG opt_random.h Modified: projects/random_number_generator/sys/dev/random/random_adaptors.c ============================================================================== --- projects/random_number_generator/sys/dev/random/random_adaptors.c Tue Oct 8 08:16:17 2013 (r256137) +++ projects/random_number_generator/sys/dev/random/random_adaptors.c Tue Oct 8 11:05:26 2013 (r256138) @@ -227,3 +227,17 @@ SYSINIT(random_adaptors, SI_SUB_DRIVERS, NULL); SYSUNINIT(random_adaptors, SI_SUB_DRIVERS, SI_ORDER_FIRST, random_adaptors_deinit, NULL); + +static void +random_adaptors_reseed(void *unused) +{ + + (void)unused; + if (random_adaptor != NULL) { + (*random_adaptor->reseed)(); + random_adaptor->seeded = 1; + } + arc4rand(NULL, 0, 1); +} +SYSINIT(random_reseed, SI_SUB_INTRINSIC_POST, SI_ORDER_SECOND, + random_adaptors_reseed, NULL); Modified: projects/random_number_generator/sys/dev/random/randomdev_soft.c ============================================================================== --- projects/random_number_generator/sys/dev/random/randomdev_soft.c Tue Oct 8 08:16:17 2013 (r256137) +++ projects/random_number_generator/sys/dev/random/randomdev_soft.c Tue Oct 8 11:05:26 2013 (r256138) @@ -26,11 +26,16 @@ * */ +#include "opt_random.h" + #if !defined(YARROW_RNG) && !defined(FORTUNA_RNG) #define YARROW_RNG #elif defined(YARROW_RNG) && defined(FORTUNA_RNG) #error "Must define either YARROW_RNG or FORTUNA_RNG" #endif +#if defined(FORTUNA_RNG) +#error "Fortuna is not yet implemented" +#endif #include __FBSDID("$FreeBSD$"); Modified: projects/random_number_generator/sys/dev/random/yarrow.c ============================================================================== --- projects/random_number_generator/sys/dev/random/yarrow.c Tue Oct 8 08:16:17 2013 (r256137) +++ projects/random_number_generator/sys/dev/random/yarrow.c Tue Oct 8 11:05:26 2013 (r256138) @@ -28,6 +28,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_random.h" + #include #include #include @@ -398,5 +400,17 @@ generator_gate(void) void random_yarrow_reseed(void) { +#ifdef RANDOM_DEBUG + int i; + + printf("%s(): fast:", __func__); + for (i = RANDOM_START; i < ENTROPYSOURCE; ++i) + printf(" %d", random_state.pool[FAST].source[i].bits); + printf("\n"); + printf("%s(): slow:", __func__); + for (i = RANDOM_START; i < ENTROPYSOURCE; ++i) + printf(" %d", random_state.pool[SLOW].source[i].bits); + printf("\n"); +#endif reseed(SLOW); } Modified: projects/random_number_generator/sys/kern/subr_bus.c ============================================================================== --- projects/random_number_generator/sys/kern/subr_bus.c Tue Oct 8 08:16:17 2013 (r256137) +++ projects/random_number_generator/sys/kern/subr_bus.c Tue Oct 8 11:05:26 2013 (r256138) @@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$"); #include "opt_bus.h" +#include "opt_random.h" #include #include @@ -44,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -55,6 +57,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include @@ -2766,6 +2769,7 @@ device_probe_and_attach(device_t dev) int device_attach(device_t dev) { + uint64_t attachtime; int error; if (resource_disabled(dev->driver->name, dev->unit)) { @@ -2778,6 +2782,7 @@ device_attach(device_t dev) device_sysctl_init(dev); if (!device_is_quiet(dev)) device_print_child(dev->parent, dev); + attachtime = get_cyclecount(); dev->state = DS_ATTACHING; if ((error = DEVICE_ATTACH(dev)) != 0) { printf("device_attach: %s%d attach returned %d\n", @@ -2790,6 +2795,17 @@ device_attach(device_t dev) dev->state = DS_NOTPRESENT; return (error); } + attachtime = get_cyclecount() - attachtime; + /* + * 4 bits per device is a reasonable value for desktop and server + * hardware with good get_cyclecount() implementations, but may + * need to be adjusted on other platforms. + */ +#ifdef RANDOM_DEBUG + printf("%s(): feeding %d bit(s) of entropy from %s%d\n", + __func__, 4, dev->driver->name, dev->unit); +#endif + random_harvest(&attachtime, sizeof(attachtime), 4, RANDOM_ATTACH); device_sysctl_update(dev); if (dev->busy) dev->state = DS_BUSY; Modified: projects/random_number_generator/sys/modules/random/Makefile ============================================================================== --- projects/random_number_generator/sys/modules/random/Makefile Tue Oct 8 08:16:17 2013 (r256137) +++ projects/random_number_generator/sys/modules/random/Makefile Tue Oct 8 11:05:26 2013 (r256138) @@ -12,7 +12,7 @@ SRCS+= ivy.c .endif SRCS+= randomdev_soft.c yarrow.c hash.c SRCS+= rijndael-alg-fst.c rijndael-api-fst.c sha2.c -SRCS+= bus_if.h device_if.h vnode_if.h opt_cpu.h +SRCS+= bus_if.h device_if.h vnode_if.h opt_cpu.h opt_random.h CFLAGS+= -I${.CURDIR}/../.. Modified: projects/random_number_generator/sys/sys/random.h ============================================================================== --- projects/random_number_generator/sys/sys/random.h Tue Oct 8 08:16:17 2013 (r256137) +++ projects/random_number_generator/sys/sys/random.h Tue Oct 8 11:05:26 2013 (r256138) @@ -46,6 +46,7 @@ enum esource { RANDOM_NET_ETHER, RANDOM_NET_NG, RANDOM_INTERRUPT, + RANDOM_ATTACH, RANDOM_SWI, RANDOM_PURE_OCTEON, RANDOM_PURE_SAFE,