svn commit: r278907 - head/sys/dev/random
Mark R V Murray
mark at grondar.org
Tue Feb 17 17:46:30 UTC 2015
Hi
Thanks John-Mark!
M
> On 17 Feb 2015, at 17:37, John-Mark Gurney <jmg at 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 344 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.freebsd.org/pipermail/svn-src-head/attachments/20150217/4fa775e8/attachment.sig>
More information about the svn-src-head
mailing list