[U-Boot] [PATCH] net: make net_random_ethaddr() more random

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;
for (i = 0; i < 6; i++) addr[i] = rand_r(&seed);

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

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
participants (2)
-
Bin Meng
-
Michael Walle