Skip to contentSkip to conversation

efi: add support for seeding the kernel RNG from UEFI

PATCH Superseded Ard Biesheuvel 4 participants 11 messages Oct 6, 2016 – Oct 19, 2016 EFI

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

cover efi: add support for seeding the kernel RNG from UEFI

This implements generic EFI core kernel code to seed the kernel entropy pool from a Linux specific UEFI configuration table containing a random seed supplied by the firmware. (#1)

In addition, it wires it up for ARM and arm64, by invoking the EFI_RNG_PROTOCOL UEFI protocol from the stub, and populating such a UEFI config table using its output.

How to wire this up for x86 is left as an exercise for the Intel developer.

Ard Biesheuvel (2):
efi: add support for seeding the RNG from a UEFI config table efi/arm*: libstub: invoke EFI_RNG_PROTOCOL to seed the UEFI RNG table

 drivers/firmware/efi/efi.c              | 26 +++++++++++
 drivers/firmware/efi/libstub/arm-stub.c |  2 +
 drivers/firmware/efi/libstub/efistub.h  |  2 +
 drivers/firmware/efi/libstub/random.c   | 48 ++++++++++++++++++++
 include/linux/efi.h                     |  9 ++++
 5 files changed, 87 insertions(+)
Signature · 1 line
2.7.4
#1 lore raw

PATCH 1/2 efi: add support for seeding the RNG from a UEFI config table

Specify a Linux specific UEFI configuration table that carries some random bits, and use the contents during early boot to seed the kernel's random number generator. This allows much strong random numbers to be generated early on.

The entropy is fed to the kernel using add_device_randomness(), which is documented as being appropriate for being called very early.

Note that the config table could be generated by the EFI stub or by any other UEFI driver or application (e.g., GRUB), but the random seed table GUID and the associated functionality should be considered an internal kernel interface (unless it is promoted to ABI later on)

---
 drivers/firmware/efi/efi.c | 26 ++++++++++++++++++++
 include/linux/efi.h        |  8 ++++++
 2 files changed, 34 insertions(+)
drivers/firmware/efi/efi.c +26 -0
index 1ac199cd75e7..c8ae40f9b674 100644
@@ -24,6 +24,7 @@
 #include <linux/of_fdt.h>
 #include <linux/io.h>
 #include <linux/platform_device.h>
+#include <linux/random.h>
 #include <linux/slab.h>
 #include <linux/acpi.h>
 #include <linux/ucs2_string.h>
@@ -48,6 +49,7 @@ struct efi __read_mostly efi = {
 	.esrt			= EFI_INVALID_TABLE_ADDR,
 	.properties_table	= EFI_INVALID_TABLE_ADDR,
 	.mem_attr_table		= EFI_INVALID_TABLE_ADDR,
+	.rng_seed		= EFI_INVALID_TABLE_ADDR,
 };
 EXPORT_SYMBOL(efi);
 
@@ -438,6 +440,7 @@ static __initdata efi_config_table_type_t common_tables[] = {
 	{EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
 	{EFI_PROPERTIES_TABLE_GUID, "PROP", &efi.properties_table},
 	{EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi.mem_attr_table},
+	{LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi.rng_seed},
 	{NULL_GUID, NULL, NULL},
 };
 
@@ -499,6 +502,29 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
 	pr_cont("\n");
 	set_bit(EFI_CONFIG_TABLES, &efi.flags);
 
+	if (efi.rng_seed != EFI_INVALID_TABLE_ADDR) {
+		struct linux_efi_random_seed *seed;
+		u32 size = 0;
+
+		seed = early_memremap(efi.rng_seed, sizeof(*seed));
+		if (seed != NULL) {
+			size = seed->size;
+			early_memunmap(seed, sizeof(*seed));
+		} else {
+			pr_err("Could not map UEFI random seed!\n");
+		}
+		if (size > 0) {
+			seed = early_memremap(efi.rng_seed,
+					      sizeof(*seed) + size);
+			if (seed != NULL) {
+				add_device_randomness(seed->bits, seed->size);
+				early_memunmap(seed, sizeof(*seed) + size);
+			} else {
+				pr_err("Could not map UEFI random seed!\n");
+			}
+		}
+	}
+
 	/* Parse the EFI Properties table if it exists */
 	if (efi.properties_table != EFI_INVALID_TABLE_ADDR) {
 		efi_properties_table_t *tbl;
include/linux/efi.h +8 -0
index 2d089487d2da..85e28b138cdd 100644
@@ -599,6 +599,7 @@ void efi_native_runtime_setup(void);
  */
 #define LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID	EFI_GUID(0xe03fc20a, 0x85dc, 0x406e,  0xb9, 0x0e, 0x4a, 0xb5, 0x02, 0x37, 0x1d, 0x95)
 #define LINUX_EFI_LOADER_ENTRY_GUID		EFI_GUID(0x4a67b082, 0x0a4c, 0x41cf,  0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f)
+#define LINUX_EFI_RANDOM_SEED_TABLE_GUID	EFI_GUID(0x1ce1e5bc, 0x7ceb, 0x42f2,  0x81, 0xe5, 0x8a, 0xad, 0xf1, 0x80, 0xf5, 0x7b)
 
 typedef struct {
 	efi_guid_t guid;
@@ -872,6 +873,7 @@ extern struct efi {
 	unsigned long esrt;		/* ESRT table */
 	unsigned long properties_table;	/* properties table */
 	unsigned long mem_attr_table;	/* memory attributes table */
+	unsigned long rng_seed;		/* UEFI firmware random seed */
 	efi_get_time_t *get_time;
 	efi_set_time_t *set_time;
 	efi_get_wakeup_time_t *get_wakeup_time;
@@ -1493,4 +1495,10 @@ efi_status_t efi_exit_boot_services(efi_system_table_t *sys_table,
 				    struct efi_boot_memmap *map,
 				    void *priv,
 				    efi_exit_boot_map_processing priv_func);
+
+struct linux_efi_random_seed {
+	u32	size;
+	u8	bits[];
+};
+
 #endif /* _LINUX_EFI_H */
Signature · 1 line
2.7.4
#2 lore raw

PATCH 1/2 efi: add support for seeding the RNG from a UEFI config table

(CC'ing other potentially interested randomness folks)

Quoted 13 lines · Ard Biesheuvel

Specify a Linux specific UEFI configuration table that carries some random bits, and use the contents during early boot to seed the kernel's random number generator. This allows much strong random numbers to be generated early on.

The entropy is fed to the kernel using add_device_randomness(), which is documented as being appropriate for being called very early.

Note that the config table could be generated by the EFI stub or by any other UEFI driver or application (e.g., GRUB), but the random seed table GUID and the associated functionality should be considered an internal kernel interface (unless it is promoted to ABI later on)

Quoted 5 lines
---
 drivers/firmware/efi/efi.c | 26 ++++++++++++++++++++
 include/linux/efi.h        |  8 ++++++
 2 files changed, 34 insertions(+)

This series looks fine to me. I'm leaving the patch below for the benefit of the Ted and Kees.

Quoted 92 lines
drivers/firmware/efi/efi.c +26 -0
index 1ac199cd75e7..c8ae40f9b674 100644
@@ -24,6 +24,7 @@
 #include <linux/of_fdt.h>
 #include <linux/io.h>
 #include <linux/platform_device.h>
+#include <linux/random.h>
 #include <linux/slab.h>
 #include <linux/acpi.h>
 #include <linux/ucs2_string.h>
@@ -48,6 +49,7 @@ struct efi __read_mostly efi = {
 	.esrt			= EFI_INVALID_TABLE_ADDR,
 	.properties_table	= EFI_INVALID_TABLE_ADDR,
 	.mem_attr_table		= EFI_INVALID_TABLE_ADDR,
+	.rng_seed		= EFI_INVALID_TABLE_ADDR,
 };
 EXPORT_SYMBOL(efi);
 
@@ -438,6 +440,7 @@ static __initdata efi_config_table_type_t common_tables[] = {
 	{EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
 	{EFI_PROPERTIES_TABLE_GUID, "PROP", &efi.properties_table},
 	{EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi.mem_attr_table},
+	{LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi.rng_seed},
 	{NULL_GUID, NULL, NULL},
 };
 
@@ -499,6 +502,29 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
 	pr_cont("\n");
 	set_bit(EFI_CONFIG_TABLES, &efi.flags);
 
+	if (efi.rng_seed != EFI_INVALID_TABLE_ADDR) {
+		struct linux_efi_random_seed *seed;
+		u32 size = 0;
+
+		seed = early_memremap(efi.rng_seed, sizeof(*seed));
+		if (seed != NULL) {
+			size = seed->size;
+			early_memunmap(seed, sizeof(*seed));
+		} else {
+			pr_err("Could not map UEFI random seed!\n");
+		}
+		if (size > 0) {
+			seed = early_memremap(efi.rng_seed,
+					      sizeof(*seed) + size);
+			if (seed != NULL) {
+				add_device_randomness(seed->bits, seed->size);
+				early_memunmap(seed, sizeof(*seed) + size);
+			} else {
+				pr_err("Could not map UEFI random seed!\n");
+			}
+		}
+	}
+
 	/* Parse the EFI Properties table if it exists */
 	if (efi.properties_table != EFI_INVALID_TABLE_ADDR) {
 		efi_properties_table_t *tbl;
include/linux/efi.h +8 -0
index 2d089487d2da..85e28b138cdd 100644
@@ -599,6 +599,7 @@ void efi_native_runtime_setup(void);
  */
 #define LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID	EFI_GUID(0xe03fc20a, 0x85dc, 0x406e,  0xb9, 0x0e, 0x4a, 0xb5, 0x02, 0x37, 0x1d, 0x95)
 #define LINUX_EFI_LOADER_ENTRY_GUID		EFI_GUID(0x4a67b082, 0x0a4c, 0x41cf,  0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f)
+#define LINUX_EFI_RANDOM_SEED_TABLE_GUID	EFI_GUID(0x1ce1e5bc, 0x7ceb, 0x42f2,  0x81, 0xe5, 0x8a, 0xad, 0xf1, 0x80, 0xf5, 0x7b)
 
 typedef struct {
 	efi_guid_t guid;
@@ -872,6 +873,7 @@ extern struct efi {
 	unsigned long esrt;		/* ESRT table */
 	unsigned long properties_table;	/* properties table */
 	unsigned long mem_attr_table;	/* memory attributes table */
+	unsigned long rng_seed;		/* UEFI firmware random seed */
 	efi_get_time_t *get_time;
 	efi_set_time_t *set_time;
 	efi_get_wakeup_time_t *get_wakeup_time;
@@ -1493,4 +1495,10 @@ efi_status_t efi_exit_boot_services(efi_system_table_t *sys_table,
 				    struct efi_boot_memmap *map,
 				    void *priv,
 				    efi_exit_boot_map_processing priv_func);
+
+struct linux_efi_random_seed {
+	u32	size;
+	u8	bits[];
+};
+
 #endif /* _LINUX_EFI_H */
Signature · 1 line
2.7.4
#3 lore raw

PATCH 1/2 efi: add support for seeding the RNG from a UEFI config table

In reply to Ard Biesheuvel

Hi Ard,

Quoted 5 lines · Ard Biesheuvel

Specify a Linux specific UEFI configuration table that carries some random bits, and use the contents during early boot to seed the kernel's random number generator. This allows much strong random numbers to be generated early on.

Quoted 7 lines

The entropy is fed to the kernel using add_device_randomness(), which is documented as being appropriate for being called very early.

Note that the config table could be generated by the EFI stub or by any other UEFI driver or application (e.g., GRUB), but the random seed table GUID and the associated functionality should be considered an internal kernel interface (unless it is promoted to ABI later on)

What does this mean for kexec? Won't each successive kernel look for the table and find the same seed?

I think to some extent this mush be treated as an ABI, given cases like kexec.

Thanks,
Mark.

Quoted 103 lines
---
 drivers/firmware/efi/efi.c | 26 ++++++++++++++++++++
 include/linux/efi.h        |  8 ++++++
 2 files changed, 34 insertions(+)
drivers/firmware/efi/efi.c +26 -0
index 1ac199cd75e7..c8ae40f9b674 100644
@@ -24,6 +24,7 @@
 #include <linux/of_fdt.h>
 #include <linux/io.h>
 #include <linux/platform_device.h>
+#include <linux/random.h>
 #include <linux/slab.h>
 #include <linux/acpi.h>
 #include <linux/ucs2_string.h>
@@ -48,6 +49,7 @@ struct efi __read_mostly efi = {
 	.esrt			= EFI_INVALID_TABLE_ADDR,
 	.properties_table	= EFI_INVALID_TABLE_ADDR,
 	.mem_attr_table		= EFI_INVALID_TABLE_ADDR,
+	.rng_seed		= EFI_INVALID_TABLE_ADDR,
 };
 EXPORT_SYMBOL(efi);
 
@@ -438,6 +440,7 @@ static __initdata efi_config_table_type_t common_tables[] = {
 	{EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
 	{EFI_PROPERTIES_TABLE_GUID, "PROP", &efi.properties_table},
 	{EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi.mem_attr_table},
+	{LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi.rng_seed},
 	{NULL_GUID, NULL, NULL},
 };
 
@@ -499,6 +502,29 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
 	pr_cont("\n");
 	set_bit(EFI_CONFIG_TABLES, &efi.flags);
 
+	if (efi.rng_seed != EFI_INVALID_TABLE_ADDR) {
+		struct linux_efi_random_seed *seed;
+		u32 size = 0;
+
+		seed = early_memremap(efi.rng_seed, sizeof(*seed));
+		if (seed != NULL) {
+			size = seed->size;
+			early_memunmap(seed, sizeof(*seed));
+		} else {
+			pr_err("Could not map UEFI random seed!\n");
+		}
+		if (size > 0) {
+			seed = early_memremap(efi.rng_seed,
+					      sizeof(*seed) + size);
+			if (seed != NULL) {
+				add_device_randomness(seed->bits, seed->size);
+				early_memunmap(seed, sizeof(*seed) + size);
+			} else {
+				pr_err("Could not map UEFI random seed!\n");
+			}
+		}
+	}
+
 	/* Parse the EFI Properties table if it exists */
 	if (efi.properties_table != EFI_INVALID_TABLE_ADDR) {
 		efi_properties_table_t *tbl;
include/linux/efi.h +8 -0
index 2d089487d2da..85e28b138cdd 100644
@@ -599,6 +599,7 @@ void efi_native_runtime_setup(void);
  */
 #define LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID	EFI_GUID(0xe03fc20a, 0x85dc, 0x406e,  0xb9, 0x0e, 0x4a, 0xb5, 0x02, 0x37, 0x1d, 0x95)
 #define LINUX_EFI_LOADER_ENTRY_GUID		EFI_GUID(0x4a67b082, 0x0a4c, 0x41cf,  0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f)
+#define LINUX_EFI_RANDOM_SEED_TABLE_GUID	EFI_GUID(0x1ce1e5bc, 0x7ceb, 0x42f2,  0x81, 0xe5, 0x8a, 0xad, 0xf1, 0x80, 0xf5, 0x7b)
 
 typedef struct {
 	efi_guid_t guid;
@@ -872,6 +873,7 @@ extern struct efi {
 	unsigned long esrt;		/* ESRT table */
 	unsigned long properties_table;	/* properties table */
 	unsigned long mem_attr_table;	/* memory attributes table */
+	unsigned long rng_seed;		/* UEFI firmware random seed */
 	efi_get_time_t *get_time;
 	efi_set_time_t *set_time;
 	efi_get_wakeup_time_t *get_wakeup_time;
@@ -1493,4 +1495,10 @@ efi_status_t efi_exit_boot_services(efi_system_table_t *sys_table,
 				    struct efi_boot_memmap *map,
 				    void *priv,
 				    efi_exit_boot_map_processing priv_func);
+
+struct linux_efi_random_seed {
+	u32	size;
+	u8	bits[];
+};
+
 #endif /* _LINUX_EFI_H */
Signature · 6 lines
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe linux-efi" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#4 lore raw

PATCH 1/2 efi: add support for seeding the RNG from a UEFI config table

Quoted 11 lines · Mark Rutland

Hi Ard,

Quoted 8 lines · Ard Biesheuvel

Specify a Linux specific UEFI configuration table that carries some random bits, and use the contents during early boot to seed the kernel's random number generator. This allows much strong random numbers to be generated early on.

The entropy is fed to the kernel using add_device_randomness(), which is documented as being appropriate for being called very early.

Quoted 8 lines
Quoted 4 lines

Note that the config table could be generated by the EFI stub or by any other UEFI driver or application (e.g., GRUB), but the random seed table GUID and the associated functionality should be considered an internal kernel interface (unless it is promoted to ABI later on)

What does this mean for kexec? Won't each successive kernel look for the table and find the same seed?

Yes. Whether this is a problem or not is context dependent: for things like kdump, I don't think anyone cares. For other cases, having some seed may still be better than having no seed at all.

It does mean, however, that we have to preserve the memory this table points to for kexec boots.

Quoted 3 lines

I think to some extent this mush be treated as an ABI, given cases like kexec.

Perhaps, yes. That would also allow GRUB or other EFI aware bootloaders to generate the seed.

#5 lore raw

PATCH 1/2 efi: add support for seeding the RNG from a UEFI config table

Quoted 8 lines · Ard Biesheuvel
Quoted 3 lines · Mark Rutland

I think to some extent this mush be treated as an ABI, given cases like kexec.

Perhaps, yes. That would also allow GRUB or other EFI aware bootloaders to generate the seed.

If we're going to go down this route, we should try and get the GUID into the UEFI spec.

#6 lore raw

PATCH 1/2 efi: add support for seeding the RNG from a UEFI config table

Quoted 7 lines · Matt Fleming
Quoted 6 lines · Ard Biesheuvel
Quoted 3 lines · Mark Rutland

I think to some extent this mush be treated as an ABI, given cases like kexec.

Quoted 5 lines
Quoted 2 lines

Perhaps, yes. That would also allow GRUB or other EFI aware bootloaders to generate the seed.

If we're going to go down this route, we should try and get the GUID into the UEFI spec.

It seems like maybe under UEFI, both this table (which sounds like it'll not be rotated regularly) could be mixed with calls to EFI_PROTOCOL_RNG by the kernel? (Similar to how kaslr is seeded?)

-Kees

Signature · 2 lines
Kees Cook
Nexus Security
#7 lore raw

PATCH 1/2 efi: add support for seeding the RNG from a UEFI config table

Quoted 8 lines · Kees Cook
Quoted 7 lines · Matt Fleming
Quoted 6 lines · Ard Biesheuvel
Quoted 3 lines · Mark Rutland

I think to some extent this mush be treated as an ABI, given cases like kexec.

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

Perhaps, yes. That would also allow GRUB or other EFI aware bootloaders to generate the seed.

If we're going to go down this route, we should try and get the GUID into the UEFI spec.

It seems like maybe under UEFI, both this table (which sounds like it'll not be rotated regularly)

What do you mean 'rotated'? It is generated at boot. My 2/2 patch generates it from the stub using the EFI_RNG_PROTOCOL on ARM/arm64

Quoted 3 lines

could be mixed with calls to
EFI_PROTOCOL_RNG by the kernel? (Similar to how kaslr is seeded?)

That is kind of the point. KASLR is different because we need the entropy before even jumping to C code, but for all other uses of early entropy, this seemed like a useful approach

#8 lore raw

PATCH 1/2 efi: add support for seeding the RNG from a UEFI config table

Quoted 12 lines · Ard Biesheuvel
Quoted 11 lines · Kees Cook
Quoted 10 lines · Matt Fleming
Quoted 8 lines · Ard Biesheuvel
Quoted 3 lines · Mark Rutland

I think to some extent this mush be treated as an ABI, given cases like kexec.

Perhaps, yes. That would also allow GRUB or other EFI aware bootloaders to generate the seed.

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

If we're going to go down this route, we should try and get the GUID into the UEFI spec.

It seems like maybe under UEFI, both this table (which sounds like it'll not be rotated regularly)

What do you mean 'rotated'? It is generated at boot. My 2/2 patch generates it from the stub using the EFI_RNG_PROTOCOL on ARM/arm64

Oh! I entirely misunderstood. I thought doing regular writes to EFI variables was discouraged (since they may be stored in NVRAM that would "wear out").

Quoted 7 lines
Quoted 3 lines

could be mixed with calls to
EFI_PROTOCOL_RNG by the kernel? (Similar to how kaslr is seeded?)

That is kind of the point. KASLR is different because we need the entropy before even jumping to C code, but for all other uses of early entropy, this seemed like a useful approach

Yup, cool. If the table changes per boot, yeah, my suggestion is pointless. :)

-Kees

Signature · 2 lines
Kees Cook
Nexus Security
#9 lore raw

PATCH 1/2 efi: add support for seeding the RNG from a UEFI config table

Quoted 23 lines · Kees Cook
Quoted 18 lines · Ard Biesheuvel
Quoted 16 lines · Kees Cook
Quoted 8 lines · Matt Fleming
Quoted 7 lines · Ard Biesheuvel
Quoted 5 lines · Mark Rutland

I think to some extent this mush be treated as an ABI, given cases like kexec.

Quoted 5 lines
Quoted 2 lines

Perhaps, yes. That would also allow GRUB or other EFI aware bootloaders to generate the seed.

If we're going to go down this route, we should try and get the GUID into the UEFI spec.

It seems like maybe under UEFI, both this table (which sounds like it'll not be rotated regularly)

Quoted 6 lines
Quoted 2 lines

What do you mean 'rotated'? It is generated at boot. My 2/2 patch generates it from the stub using the EFI_RNG_PROTOCOL on ARM/arm64

Oh! I entirely misunderstood. I thought doing regular writes to EFI variables was discouraged (since they may be stored in NVRAM that would "wear out")

Uefi config tables only live in memory. They are used to provide the os with data that the firmware generates at boot, e.g., smbios and acpi tables etc

Quoted 10 lines
Quoted 7 lines
Quoted 3 lines

could be mixed with calls to
EFI_PROTOCOL_RNG by the kernel? (Similar to how kaslr is seeded?)

That is kind of the point. KASLR is different because we need the entropy before even jumping to C code, but for all other uses of early entropy, this seemed like a useful approach

Yup, cool. If the table changes per boot, yeah, my suggestion is pointless. :)

Yes, but as Mark pointed out, we need to decide how to handle kexec, which does not go through the stub

#10 lore raw

PATCH 2/2 efi/arm*: libstub: invoke EFI_RNG_PROTOCOL to seed the UEFI RNG table

In reply to Ard Biesheuvel

Invoke the EFI_RNG_PROTOCOL protocol in the context of the stub and install the Linux-specific RNG seed UEFI config table. This will be picked up by the EFI routines in the core kernel to seed the kernel entropy pool.

---
 drivers/firmware/efi/libstub/arm-stub.c |  2 +
 drivers/firmware/efi/libstub/efistub.h  |  2 +
 drivers/firmware/efi/libstub/random.c   | 48 ++++++++++++++++++++
 include/linux/efi.h                     |  1 +
 4 files changed, 53 insertions(+)
drivers/firmware/efi/libstub/arm-stub.c +2 -0
index 993aa56755f6..b4f7d78f9e8b 100644
@@ -340,6 +340,8 @@ unsigned long efi_entry(void *handle, efi_system_table_t *sys_table,
 	if (status != EFI_SUCCESS)
 		pr_efi_err(sys_table, "Failed initrd from command line!\n");
 
+	efi_random_get_seed(sys_table);
+
 	new_fdt_addr = fdt_addr;
 	status = allocate_new_fdt_and_exit_boot(sys_table, handle,
 				&new_fdt_addr, dram_base + MAX_FDT_OFFSET,
drivers/firmware/efi/libstub/efistub.h +2 -0
index ee49cd23ee63..1c57715286a7 100644
@@ -62,4 +62,6 @@ efi_status_t efi_random_alloc(efi_system_table_t *sys_table_arg,
 
 efi_status_t check_platform_features(efi_system_table_t *sys_table_arg);
 
+efi_status_t efi_random_get_seed(efi_system_table_t *sys_table_arg);
+
 #endif
drivers/firmware/efi/libstub/random.c +48 -0

51 lines not on this page · raw message

include/linux/efi.h +1 -0
index 85e28b138cdd..f5a821d9b90c 100644
@@ -589,6 +589,7 @@ void efi_native_runtime_setup(void);
 #define DEVICE_TREE_GUID			EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5,  0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
 #define EFI_PROPERTIES_TABLE_GUID		EFI_GUID(0x880aaca3, 0x4adc, 0x4a04,  0x90, 0x79, 0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5)
 #define EFI_RNG_PROTOCOL_GUID			EFI_GUID(0x3152bca5, 0xeade, 0x433d,  0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44)
+#define EFI_RNG_ALGORITHM_RAW			EFI_GUID(0xe43176d7, 0xb6e8, 0x4827,  0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61)
 #define EFI_MEMORY_ATTRIBUTES_TABLE_GUID	EFI_GUID(0xdcfa911d, 0x26eb, 0x469f,  0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
 #define EFI_CONSOLE_OUT_DEVICE_GUID		EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4,  0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 
Signature · 1 line
2.7.4