• A
    efi: random: combine bootloader provided RNG seed with RNG protocol output · 196dff27
    Ard Biesheuvel 提交于
    Instead of blindly creating the EFI random seed configuration table if
    the RNG protocol is implemented and works, check whether such a EFI
    configuration table was provided by an earlier boot stage and if so,
    concatenate the existing and the new seeds, leaving it up to the core
    code to mix it in and credit it the way it sees fit.
    
    This can be used for, e.g., systemd-boot, to pass an additional seed to
    Linux in a way that can be consumed by the kernel very early. In that
    case, the following definitions should be used to pass the seed to the
    EFI stub:
    
    struct linux_efi_random_seed {
          u32     size; // of the 'seed' array in bytes
          u8      seed[];
    };
    
    The memory for the struct must be allocated as EFI_ACPI_RECLAIM_MEMORY
    pool memory, and the address of the struct in memory should be installed
    as a EFI configuration table using the following GUID:
    
    LINUX_EFI_RANDOM_SEED_TABLE_GUID        1ce1e5bc-7ceb-42f2-81e5-8aadf180f57b
    
    Note that doing so is safe even on kernels that were built without this
    patch applied, but the seed will simply be overwritten with a seed
    derived from the EFI RNG protocol, if available. The recommended seed
    size is 32 bytes, and seeds larger than 512 bytes are considered
    corrupted and ignored entirely.
    
    In order to preserve forward secrecy, seeds from previous bootloaders
    are memzero'd out, and in order to preserve memory, those older seeds
    are also freed from memory. Freeing from memory without first memzeroing
    is not safe to do, as it's possible that nothing else will ever
    overwrite those pages used by EFI.
    Reviewed-by: NJason A. Donenfeld <Jason@zx2c4.com>
    [ardb: incorporate Jason's followup changes to extend the maximum seed
           size on the consumer end, memzero() it and drop a needless printk]
    Signed-off-by: NArd Biesheuvel <ardb@kernel.org>
    196dff27
efi.h 43.2 KB