diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2022-11-14 16:43:03 +0100 |
---|---|---|
committer | Simon Horman <horms@kernel.org> | 2022-11-18 16:11:43 +0100 |
commit | b9de05184816f15f0d615fe19c4067c13872598b (patch) | |
tree | 4d8c5bd4dc8fe8189f0ce280be296797c4a358f1 | |
parent | b0381b817910fcf1cd61c74458610d3ae6b153e5 (diff) |
m68k: pass rng seed via BI_RNG_SEED
In order to pass fresh entropy to kexec'd kernels, use BI_RNG_SEED
for passing a seed, with the same semantics that kexec-tools currently
uses for i386's setup_data.
Link: https://git.kernel.org/torvalds/c/dc63a086daee92c63e3
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Simon Horman <horms@kernel.org>
-rw-r--r-- | kexec/arch/m68k/bootinfo.c | 23 | ||||
-rw-r--r-- | kexec/arch/m68k/bootinfo.h | 10 | ||||
-rw-r--r-- | kexec/arch/m68k/kexec-elf-m68k.c | 1 |
3 files changed, 34 insertions, 0 deletions
diff --git a/kexec/arch/m68k/bootinfo.c b/kexec/arch/m68k/bootinfo.c index 18bf226..086a34b 100644 --- a/kexec/arch/m68k/bootinfo.c +++ b/kexec/arch/m68k/bootinfo.c @@ -2,6 +2,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/random.h> #include "../../kexec.h" @@ -152,6 +153,11 @@ void bootinfo_print(void) printf("BI_COMMAND_LINE: %s\n", bi->string); break; + case BI_RNG_SEED: + /* These are secret, so never print them to the console */ + printf("BI_RNG_SEED: 0x%08x bytes\n", be16_to_cpu(bi->rng_seed.len)); + break; + default: printf("BI tag 0x%04x size %u\n", tag, size); break; @@ -212,6 +218,23 @@ void bootinfo_set_ramdisk(unsigned long ramdisk_addr, bi->mem_info.size = ramdisk_size; } +void bootinfo_add_rng_seed(void) +{ + enum { RNG_SEED_LEN = 32 }; + struct bi_rec *bi; + + /* Remove existing rng seed records */ + bi_remove(BI_RNG_SEED); + + /* Add new rng seed record */ + bi = bi_add(BI_RNG_SEED, sizeof(bi->rng_seed) + RNG_SEED_LEN); + if (getrandom(bi->rng_seed.data, RNG_SEED_LEN, GRND_NONBLOCK) != RNG_SEED_LEN) { + bi_remove(BI_RNG_SEED); + return; + } + bi->rng_seed.len = cpu_to_be16(RNG_SEED_LEN); +} + /* * Check the bootinfo version in the kernel image diff --git a/kexec/arch/m68k/bootinfo.h b/kexec/arch/m68k/bootinfo.h index b6f453d..bb8a03a 100644 --- a/kexec/arch/m68k/bootinfo.h +++ b/kexec/arch/m68k/bootinfo.h @@ -3,6 +3,11 @@ #define DEFAULT_BOOTINFO_FILE "/proc/bootinfo" #define MAX_BOOTINFO_SIZE 1536 +/* New in 6.2's <asm/bootinfo.h>. Remove once 6.2 is baseline version. */ +#ifndef BI_RNG_SEED +#define BI_RNG_SEED 0x0008 +#endif + /* * Convenience overlay of several struct bi_record variants @@ -20,6 +25,10 @@ struct bi_rec { __be32 size; } mem_info; char string[0]; + struct { + __be16 len; + __u8 data[0]; + } rng_seed; }; }; @@ -39,5 +48,6 @@ extern int bootinfo_get_memory_ranges(struct memory_range **range); extern void bootinfo_set_cmdline(const char *cmdline); extern void bootinfo_set_ramdisk(unsigned long ramdisk_addr, unsigned long ramdisk_size); +extern void bootinfo_add_rng_seed(void); extern void bootinfo_check_bootversion(const struct kexec_info *info); extern void add_bootinfo(struct kexec_info *info, unsigned long addr); diff --git a/kexec/arch/m68k/kexec-elf-m68k.c b/kexec/arch/m68k/kexec-elf-m68k.c index 8d00eb9..a2bf7ee 100644 --- a/kexec/arch/m68k/kexec-elf-m68k.c +++ b/kexec/arch/m68k/kexec-elf-m68k.c @@ -162,6 +162,7 @@ int elf_m68k_load(int argc, char **argv, const char *buf, off_t len, /* Update and add bootinfo */ bootinfo_set_cmdline(cmdline); bootinfo_set_ramdisk(ramdisk_addr, ramdisk_size); + bootinfo_add_rng_seed(); if (kexec_debug) bootinfo_print(); add_bootinfo(info, bootinfo_addr); |