[PATCH v2 1/2] lib: uuid: use RNG device if present

Matthias Brugger mbrugger at suse.com
Wed Dec 23 11:09:55 CET 2020


Hi Simon,

On 19/12/2020 03:29, Simon Glass wrote:
> Hi Mattias,
> 
> On Wed, 16 Dec 2020 at 09:28, <matthias.bgg at kernel.org> wrote:
>>
>> From: Matthias Brugger <mbrugger at suse.com>
>>
>> When calculating a random UUID we use a weak seed.
>> Use a RNG device if present to increase entropy.
>>
>> Signed-off-by: Matthias Brugger <mbrugger at suse.com>
>>
>> ---
>>
>> Changes in v2:
>> - fix dm_rng_read() parameters
>> - add missing include
>>
>>  lib/uuid.c | 21 ++++++++++++++++++---
>>  1 file changed, 18 insertions(+), 3 deletions(-)
>>
>> diff --git a/lib/uuid.c b/lib/uuid.c
>> index e62d5ca264..e3487380c3 100644
>> --- a/lib/uuid.c
>> +++ b/lib/uuid.c
>> @@ -15,6 +15,8 @@
>>  #include <asm/io.h>
>>  #include <part_efi.h>
>>  #include <malloc.h>
>> +#include <dm/uclass.h>
>> +#include <rng.h>
>>
>>  /*
>>   * UUID - Universally Unique IDentifier - 128 bits unique number.
>> @@ -249,9 +251,22 @@ void gen_rand_uuid(unsigned char *uuid_bin)
>>  {
>>         u32 ptr[4];
>>         struct uuid *uuid = (struct uuid *)ptr;
>> -       int i;
>> -
>> -       srand(get_ticks() + rand());
>> +       int i, ret;
>> +       struct udevice *devp;
>> +       u8 randv = 0;
>> +
>> +#if defined(CONFIG_DM_RNG)
> 
> This seems a little backwards to me. The caller should request a RNG
> device, getting either a hardware one or a software one, and then call
> the uclass method to get the uuid.
> 

The problem I see here is, that in case no DM_RNG is present the seed used is
different for uuid (get_ticks() + rand()) and bootp (seed_mac() uses the mac
address)

So we would need to pass this alternatives to the generic DM code, which makes
it a bit ugly. Apart from that beware that the seed used for srand() can vary
depending on the caller and the entropy it needs.

Regards,
Matthias

>> +       ret = uclass_get_device(UCLASS_RNG, 0, &devp);
>> +       if (ret) {
>> +               ret = dm_rng_read(devp, &randv, sizeof(randv));
>> +               if (ret < 0)
>> +                       randv = 0;
>> +       }
>> +       if (randv)
>> +               srand(randv);
>> +       else
>> +#endif
>> +               srand(get_ticks() + rand());
>>
>>         /* Set all fields randomly */
>>         for (i = 0; i < 4; i++)
>> --
>> 2.29.2
>>
> 
> Regards,
> Simon
> 



More information about the U-Boot mailing list