forked from mirrors/linux
		
	fdt: add support for rng-seed
Introducing a chosen node, rng-seed, which is an entropy that can be passed to kernel called very early to increase initial device randomness. Bootloader should provide this entropy and the value is read from /chosen/rng-seed in DT. Obtain of_fdt_crc32 for CRC check after early_init_dt_scan_nodes(), since early_init_dt_scan_chosen() would modify fdt to erase rng-seed. Add a new interface add_bootloader_randomness() for rng-seed use case. Depends on whether the seed is trustworthy, rng seed would be passed to add_hwgenerator_randomness(). Otherwise it would be passed to add_device_randomness(). Decision is controlled by kernel config RANDOM_TRUST_BOOTLOADER. Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> Reviewed-by: Stephen Boyd <swboyd@chromium.org> Reviewed-by: Rob Herring <robh@kernel.org> Reviewed-by: Theodore Ts'o <tytso@mit.edu> # drivers/char/random.c Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
		
							parent
							
								
									e112b032a7
								
							
						
					
					
						commit
						428826f535
					
				
					 4 changed files with 36 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -573,3 +573,12 @@ config RANDOM_TRUST_CPU
 | 
			
		|||
	has not installed a hidden back door to compromise the CPU's
 | 
			
		||||
	random number generation facilities. This can also be configured
 | 
			
		||||
	at boot with "random.trust_cpu=on/off".
 | 
			
		||||
 | 
			
		||||
config RANDOM_TRUST_BOOTLOADER
 | 
			
		||||
	bool "Trust the bootloader to initialize Linux's CRNG"
 | 
			
		||||
	help
 | 
			
		||||
	Some bootloaders can provide entropy to increase the kernel's initial
 | 
			
		||||
	device randomness. Say Y here to assume the entropy provided by the
 | 
			
		||||
	booloader is trustworthy so it will be added to the kernel's entropy
 | 
			
		||||
	pool. Otherwise, say N here so it will be regarded as device input that
 | 
			
		||||
	only mixes the entropy pool.
 | 
			
		||||
| 
						 | 
				
			
			@ -2445,3 +2445,17 @@ void add_hwgenerator_randomness(const char *buffer, size_t count,
 | 
			
		|||
	credit_entropy_bits(poolp, entropy);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(add_hwgenerator_randomness);
 | 
			
		||||
 | 
			
		||||
/* Handle random seed passed by bootloader.
 | 
			
		||||
 * If the seed is trustworthy, it would be regarded as hardware RNGs. Otherwise
 | 
			
		||||
 * it would be regarded as device data.
 | 
			
		||||
 * The decision is controlled by CONFIG_RANDOM_TRUST_BOOTLOADER.
 | 
			
		||||
 */
 | 
			
		||||
void add_bootloader_randomness(const void *buf, unsigned int size)
 | 
			
		||||
{
 | 
			
		||||
	if (IS_ENABLED(CONFIG_RANDOM_TRUST_BOOTLOADER))
 | 
			
		||||
		add_hwgenerator_randomness(buf, size, size * 8);
 | 
			
		||||
	else
 | 
			
		||||
		add_device_randomness(buf, size);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(add_bootloader_randomness);
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +24,7 @@
 | 
			
		|||
#include <linux/debugfs.h>
 | 
			
		||||
#include <linux/serial_core.h>
 | 
			
		||||
#include <linux/sysfs.h>
 | 
			
		||||
#include <linux/random.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/setup.h>  /* for COMMAND_LINE_SIZE */
 | 
			
		||||
#include <asm/page.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -1044,6 +1045,7 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,
 | 
			
		|||
{
 | 
			
		||||
	int l;
 | 
			
		||||
	const char *p;
 | 
			
		||||
	const void *rng_seed;
 | 
			
		||||
 | 
			
		||||
	pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1078,6 +1080,14 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,
 | 
			
		|||
 | 
			
		||||
	pr_debug("Command line is: %s\n", (char*)data);
 | 
			
		||||
 | 
			
		||||
	rng_seed = of_get_flat_dt_prop(node, "rng-seed", &l);
 | 
			
		||||
	if (rng_seed && l > 0) {
 | 
			
		||||
		add_bootloader_randomness(rng_seed, l);
 | 
			
		||||
 | 
			
		||||
		/* try to clear seed so it won't be found. */
 | 
			
		||||
		fdt_nop_property(initial_boot_params, node, "rng-seed");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* break now */
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1166,8 +1176,6 @@ bool __init early_init_dt_verify(void *params)
 | 
			
		|||
 | 
			
		||||
	/* Setup flat device-tree pointer */
 | 
			
		||||
	initial_boot_params = params;
 | 
			
		||||
	of_fdt_crc32 = crc32_be(~0, initial_boot_params,
 | 
			
		||||
				fdt_totalsize(initial_boot_params));
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1197,6 +1205,8 @@ bool __init early_init_dt_scan(void *params)
 | 
			
		|||
		return false;
 | 
			
		||||
 | 
			
		||||
	early_init_dt_scan_nodes();
 | 
			
		||||
	of_fdt_crc32 = crc32_be(~0, initial_boot_params,
 | 
			
		||||
				fdt_totalsize(initial_boot_params));
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@ struct random_ready_callback {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
extern void add_device_randomness(const void *, unsigned int);
 | 
			
		||||
extern void add_bootloader_randomness(const void *, unsigned int);
 | 
			
		||||
 | 
			
		||||
#if defined(LATENT_ENTROPY_PLUGIN) && !defined(__CHECKER__)
 | 
			
		||||
static inline void add_latent_entropy(void)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue