Subject: bug#15366: closed (Re: bug#15366: MBR disk signature not random enough)

From: [email-masked] (GNU bug Tracking System)
Date: Sun, 24 Nov 2013 01:35:03 +0000

Your bug report

#15366: MBR disk signature not random enough

which was filed against the parted package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
15366: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=15366
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#15366: MBR disk signature not random enough
From: Phillip Susi <[email-masked]>
To: [email-masked]
Date: Sat, 23 Nov 2013 20:34:26 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

This was fixed by this commit:

commit 70aa35b2b4d2e723fe82ac3184e5921a52be73ab
Author: Jonathan Liu <[email-masked]>
Date:   Fri Oct 4 07:32:12 2013 -0700

    dos: improve MBR signature generation
    
    Using tv_usec in struct timeval from gettimeofday() doesn't provide
    enough precision to fill an unsigned 32-bit integer and isn't really
    random. It it always less than one million when using the GNU C library
    while an unsigned 32-bit integer ranges between 0 and 4294967295.
    
    In FAT filesystem creation, parted already uses a better random
    generator, so move that code into a common function and use it
    for MS-DOS MBR signature generation.
    
    * libparted/fs/r/fat/fat.c (_gen_new_serial_number): Remove.
    (fat_create): Use generate_random_uint32 instead of
    _gen_new_serial_number.
    * libparted/labels/dos.c (generate_random_id): Remove.
    (msdos_write): Use generate_random_uint32 instead of
    generate_random_id.
    * libparted/labels/misc.h (generate_random_uint32): New function.
    Created from _gen_new_serial_number in libparted/fs/r/fat/fat.c with
    additional check to avoid returning zero, which may be interpreted
    as no FAT serial number or no MBR signature.

Subject: MBR disk signature not random enough
From: Philip Rowlands <[email-masked]>
To: [email-masked]
Date: Fri, 13 Sep 2013 14:06:30 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

libparted/labels/dos.c:generate_random_id()
is used to create a new mbr_signature where none exists. The possible 
return values for generate_random_id() range from 0 to 999999, derived 
from the tv_usec field of gettimeofday(2).

This limits the actual value written to mbr_signature to 0.023% of the 
possible uint32 values.

I don't know how many MBRs in the world libparted has written the 
mbr_signature to, but the chance of collisions are greatly increased by 
having an artificially restricted value.

Is there a better libc-provided rand(3)/random(3) function which can be 
used to provide a full 32 bits of randomness?

I haven't checked all the other mklabel types, but it's possible they 
have similar limitations. gpt.c uses uuid_generate() which delegates the 
task to libuuid. Perhaps this could be used (with truncated output) for 
the MBR signature?

Cheers,
Phil