[U-Boot] net: make net_random_ethaddr() more random
diff mbox series

Message ID 20190822220801.28439-1-michael@walle.cc
State Superseded
Delegated to: Joe Hershberger
Headers show
Series
  • [U-Boot] net: make net_random_ethaddr() more random
Related show

Commit Message

Michael Walle Aug. 22, 2019, 10:08 p.m. UTC
The net_random_ethaddr() tries to get some entropy from different
startup times of a board. The seed is initialized with get_timer() which
has only a granularity of milliseconds. We can do better if we use
get_ticks() which returns the raw timer ticks. Using this we have a
higher chance of getting different values at startup.

Signed-off-by: Michael Walle <michael@walle.cc>
---
 include/net.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Bin Meng Aug. 23, 2019, 3:17 a.m. UTC | #1
On Fri, Aug 23, 2019 at 6:08 AM Michael Walle <michael@walle.cc> wrote:
>
> The net_random_ethaddr() tries to get some entropy from different
> startup times of a board. The seed is initialized with get_timer() which
> has only a granularity of milliseconds. We can do better if we use
> get_ticks() which returns the raw timer ticks. Using this we have a
> higher chance of getting different values at startup.
>
> Signed-off-by: Michael Walle <michael@walle.cc>
> ---
>  include/net.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/include/net.h b/include/net.h
> index a54d5eeac5..8215316bd3 100644
> --- a/include/net.h
> +++ b/include/net.h
> @@ -816,7 +816,7 @@ static inline int is_valid_ethaddr(const u8 *addr)
>  static inline void net_random_ethaddr(uchar *addr)
>  {
>         int i;
> -       unsigned int seed = get_timer(0);
> +       unsigned int seed = get_ticks() & (unsigned int)-1;

Shouldn't this be directly:

unsigned int seed = get_ticks();

>
>         for (i = 0; i < 6; i++)
>                 addr[i] = rand_r(&seed);

Regards,
Bin
Michael Walle Aug. 23, 2019, 7:50 a.m. UTC | #2
Am 2019-08-23 05:17, schrieb Bin Meng:
> On Fri, Aug 23, 2019 at 6:08 AM Michael Walle <michael@walle.cc> wrote:
>> 
>> The net_random_ethaddr() tries to get some entropy from different
>> startup times of a board. The seed is initialized with get_timer() 
>> which
>> has only a granularity of milliseconds. We can do better if we use
>> get_ticks() which returns the raw timer ticks. Using this we have a
>> higher chance of getting different values at startup.
>> 
>> Signed-off-by: Michael Walle <michael@walle.cc>
>> ---
>>  include/net.h | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> 
>> diff --git a/include/net.h b/include/net.h
>> index a54d5eeac5..8215316bd3 100644
>> --- a/include/net.h
>> +++ b/include/net.h
>> @@ -816,7 +816,7 @@ static inline int is_valid_ethaddr(const u8 *addr)
>>  static inline void net_random_ethaddr(uchar *addr)
>>  {
>>         int i;
>> -       unsigned int seed = get_timer(0);
>> +       unsigned int seed = get_ticks() & (unsigned int)-1;
> 
> Shouldn't this be directly:
> 
> unsigned int seed = get_ticks();

get_ticks() returns an uint64_t. I wanted to explicitly strip the top 
bits if sizeof(uint64_t) != sizeof(unsigned int). Frankly, I also find 
this kinda ugly but wanted to avoid any compiler warnings. But 
apparently there is no warning (yet?).

So I'm happy to remove it if this is not an issue.

-michael

Patch
diff mbox series

diff --git a/include/net.h b/include/net.h
index a54d5eeac5..8215316bd3 100644
--- a/include/net.h
+++ b/include/net.h
@@ -816,7 +816,7 @@  static inline int is_valid_ethaddr(const u8 *addr)
 static inline void net_random_ethaddr(uchar *addr)
 {
 	int i;
-	unsigned int seed = get_timer(0);
+	unsigned int seed = get_ticks() & (unsigned int)-1;
 
 	for (i = 0; i < 6; i++)
 		addr[i] = rand_r(&seed);