[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