Date: Tue, 17 Feb 2015 17:46:13 +0000 From: Mark R V Murray <mark@grondar.org> To: John-Mark Gurney <jmg@FreeBSD.org> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r278907 - head/sys/dev/random Message-ID: <30B45F07-482F-44D2-B871-468709C5B3F3@grondar.org> In-Reply-To: <201502171737.t1HHb1Gq035943@svn.freebsd.org> References: <201502171737.t1HHb1Gq035943@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --] Hi Thanks John-Mark! M > On 17 Feb 2015, at 17:37, John-Mark Gurney <jmg@FreeBSD.org> wrote: > > Author: jmg > Date: Tue Feb 17 17:37:00 2015 > New Revision: 278907 > URL: https://svnweb.freebsd.org/changeset/base/278907 > > Log: > When the new random adaptor code was brought it in r273872, a call to > randomdev_init_reader to change read_random over to the newly installed > adaptor was missed. This means both read_random and arc4random (seeded > from read_random) were not returning very random data. This also > effects userland arc4random as it is seeded from kernel arc4random. > > The random devices are uneffected and have returned good randomness > since the change. > > All keys generated with a kernel of r273872 must be regenerated with > a kernel with this patch. Keys generated may be predictable. > > Remove the warning as log is too early to print anything, and it would > always get printed due to early use of arc4random... > > Reviewed by: delphij, markm > Approved by: so (delphij) > > Modified: > head/sys/dev/random/dummy_rng.c > head/sys/dev/random/random_adaptors.c > head/sys/dev/random/randomdev.c > head/sys/dev/random/randomdev.h > > Modified: head/sys/dev/random/dummy_rng.c > ============================================================================== > --- head/sys/dev/random/dummy_rng.c Tue Feb 17 17:34:45 2015 (r278906) > +++ head/sys/dev/random/dummy_rng.c Tue Feb 17 17:37:00 2015 (r278907) > @@ -82,19 +82,13 @@ dummy_random_init(void) > * > * Caveat Emptor. > */ > -u_int > +void > dummy_random_read_phony(uint8_t *buf, u_int count) > { > /* If no entropy device is loaded, don't spam the console with warnings */ > - static int warned = 0; > u_long randval; > size_t size, i; > > - if (!warned) { > - log(LOG_WARNING, "random device not loaded/active; using insecure pseudo-random number generator\n"); > - warned = 1; > - } > - > /* srandom() is called in kern/init_main.c:proc0_post() */ > > /* Fill buf[] with random(9) output */ > @@ -103,8 +97,6 @@ dummy_random_read_phony(uint8_t *buf, u_ > size = MIN(count - i, sizeof(randval)); > memcpy(buf + i, &randval, (size_t)size); > } > - > - return (count); > } > > struct random_adaptor randomdev_dummy = { > > Modified: head/sys/dev/random/random_adaptors.c > ============================================================================== > --- head/sys/dev/random/random_adaptors.c Tue Feb 17 17:34:45 2015 (r278906) > +++ head/sys/dev/random/random_adaptors.c Tue Feb 17 17:37:00 2015 (r278907) > @@ -149,10 +149,14 @@ random_adaptor_choose(void) > (random_adaptor_previous == NULL ? "NULL" : random_adaptor_previous->ra_ident), > random_adaptor->ra_ident); > #endif > - if (random_adaptor_previous != NULL) > + if (random_adaptor_previous != NULL) { > + randomdev_deinit_reader(); > (random_adaptor_previous->ra_deinit)(); > + } > (random_adaptor->ra_init)(); > } > + > + randomdev_init_reader(random_adaptor->ra_read); > } > > > > Modified: head/sys/dev/random/randomdev.c > ============================================================================== > --- head/sys/dev/random/randomdev.c Tue Feb 17 17:34:45 2015 (r278906) > +++ head/sys/dev/random/randomdev.c Tue Feb 17 17:37:00 2015 (r278907) > @@ -214,11 +214,11 @@ random_harvest(const void *entropy, u_in > */ > > /* Hold the address of the routine which is actually called */ > -static u_int (*read_func)(uint8_t *, u_int) = dummy_random_read_phony; > +static void (*read_func)(uint8_t *, u_int) = dummy_random_read_phony; > > /* Initialise the reader when/if it is loaded */ > void > -randomdev_init_reader(u_int (*reader)(uint8_t *, u_int)) > +randomdev_init_reader(void (*reader)(uint8_t *, u_int)) > { > > read_func = reader; > @@ -240,5 +240,10 @@ int > read_random(void *buf, int count) > { > > - return ((int)(*read_func)(buf, (u_int)count)); > + if (count < 0) > + return 0; > + > + read_func(buf, count); > + > + return count; > } > > Modified: head/sys/dev/random/randomdev.h > ============================================================================== > --- head/sys/dev/random/randomdev.h Tue Feb 17 17:34:45 2015 (r278906) > +++ head/sys/dev/random/randomdev.h Tue Feb 17 17:37:00 2015 (r278907) > @@ -37,12 +37,12 @@ typedef void random_init_func_t(void); > typedef void random_deinit_func_t(void); > > void randomdev_init_harvester(void (*)(const void *, u_int, u_int, enum random_entropy_source)); > -void randomdev_init_reader(u_int (*)(uint8_t *, u_int)); > +void randomdev_init_reader(void (*)(uint8_t *, u_int)); > void randomdev_deinit_harvester(void); > void randomdev_deinit_reader(void); > > /* Stub/fake routines for when no entropy processor is loaded */ > -extern u_int dummy_random_read_phony(uint8_t *, u_int); > +extern void dummy_random_read_phony(uint8_t *, u_int); > > /* kern.random sysctls */ > #ifdef SYSCTL_DECL /* from sysctl.h */ > -- Mark R V Murray [-- Attachment #2 --] -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.26 Comment: GPGTools - http://gpgtools.org iQCVAwUBVON+a958vKOKE6LNAQqzIQP9GsJmnqiQD88DWxyM35e0Pcyi+Jm3tXde MVFXvvNRpJ9h1WJLEkb7MzNfeWMCgMC4riFs1CrgCrC1iiOYl4ZmdwTRqE1vd1yI Wx/uf1AEZIPzWOJiX27c0+4WUSNQq+/rLJGjqmIOf8saVpqfzraV4IvramvT5hVS NBlhf0ALF9Q= =4eLd -----END PGP SIGNATURE-----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?30B45F07-482F-44D2-B871-468709C5B3F3>
