Hi

Thanks John-Mark!

M

> On 17 Feb 2015, at 17:37, John-Mark Gurney <[email protected]> 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: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to