linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 0/3] add support for rng-seed
@ 2019-07-03  4:01 Hsin-Yi Wang
  2019-07-03  4:01 ` [PATCH v7 1/3] arm64: map FDT as RW for early_init_dt_scan() Hsin-Yi Wang
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Hsin-Yi Wang @ 2019-07-03  4:01 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Rob Herring, devicetree, linux-kernel, Frank Rowand,
	Catalin Marinas, Will Deacon, Andrew Morton, Mike Rapoport,
	Ard Biesheuvel, Miles Chen, Hsin-Yi Wang, James Morse,
	Andrew Murray, Mark Rutland, Jun Yao, Yu Zhao, Robin Murphy,
	Laura Abbott, Stephen Boyd, Kees Cook

Introducing a chosen node, rng-seed, which is an entropy that can be
passed to kernel called very early to increase initial device
randomness. This can be used for adding sufficient initial entropy
for stack canary. Especially architectures that lack per-stack canary.

Hsin-Yi Wang (3):
  arm64: map FDT as RW for early_init_dt_scan()
  fdt: add support for rng-seed
  arm64: kexec_file: add rng-seed support

 arch/arm64/include/asm/mmu.h           |  2 +-
 arch/arm64/kernel/kaslr.c              |  5 +----
 arch/arm64/kernel/machine_kexec_file.c | 18 +++++++++++++++++-
 arch/arm64/kernel/setup.c              |  9 ++++++++-
 arch/arm64/mm/mmu.c                    | 15 +--------------
 drivers/of/fdt.c                       | 10 ++++++++++
 6 files changed, 38 insertions(+), 21 deletions(-)

-- 
2.20.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v7 1/3] arm64: map FDT as RW for early_init_dt_scan()
  2019-07-03  4:01 [PATCH v7 0/3] add support for rng-seed Hsin-Yi Wang
@ 2019-07-03  4:01 ` Hsin-Yi Wang
  2019-07-03  4:01 ` [PATCH v7 2/3] fdt: add support for rng-seed Hsin-Yi Wang
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Hsin-Yi Wang @ 2019-07-03  4:01 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Rob Herring, devicetree, linux-kernel, Frank Rowand,
	Catalin Marinas, Will Deacon, Andrew Morton, Mike Rapoport,
	Ard Biesheuvel, Miles Chen, Hsin-Yi Wang, James Morse,
	Andrew Murray, Mark Rutland, Jun Yao, Yu Zhao, Robin Murphy,
	Laura Abbott, Stephen Boyd, Kees Cook

Currently in arm64, FDT is mapped to RO before it's passed to
early_init_dt_scan(). However, there might be some codes
(eg. commit "fdt: add support for rng-seed") that need to modify FDT
during init. Map FDT to RO after early fixups are done.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Reviewed-by: Mike Rapoport <rppt@linux.ibm.com>
---
No change since v5.
---
 arch/arm64/include/asm/mmu.h |  2 +-
 arch/arm64/kernel/kaslr.c    |  5 +----
 arch/arm64/kernel/setup.c    |  9 ++++++++-
 arch/arm64/mm/mmu.c          | 15 +--------------
 4 files changed, 11 insertions(+), 20 deletions(-)

diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h
index fd6161336653..f217e3292919 100644
--- a/arch/arm64/include/asm/mmu.h
+++ b/arch/arm64/include/asm/mmu.h
@@ -126,7 +126,7 @@ extern void init_mem_pgprot(void);
 extern void create_pgd_mapping(struct mm_struct *mm, phys_addr_t phys,
 			       unsigned long virt, phys_addr_t size,
 			       pgprot_t prot, bool page_mappings_only);
-extern void *fixmap_remap_fdt(phys_addr_t dt_phys);
+extern void *fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot);
 extern void mark_linear_text_alias_ro(void);
 
 #define INIT_MM_CONTEXT(name)	\
diff --git a/arch/arm64/kernel/kaslr.c b/arch/arm64/kernel/kaslr.c
index 708051655ad9..d94a3e41cef9 100644
--- a/arch/arm64/kernel/kaslr.c
+++ b/arch/arm64/kernel/kaslr.c
@@ -62,9 +62,6 @@ static __init const u8 *kaslr_get_cmdline(void *fdt)
 	return default_cmdline;
 }
 
-extern void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size,
-				       pgprot_t prot);
-
 /*
  * This routine will be executed with the kernel mapped at its default virtual
  * address, and if it returns successfully, the kernel will be remapped, and
@@ -93,7 +90,7 @@ u64 __init kaslr_early_init(u64 dt_phys)
 	 * attempt at mapping the FDT in setup_machine()
 	 */
 	early_fixmap_init();
-	fdt = __fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);
+	fdt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);
 	if (!fdt)
 		return 0;
 
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index 7e541f947b4c..754763b3fe28 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -170,9 +170,13 @@ static void __init smp_build_mpidr_hash(void)
 
 static void __init setup_machine_fdt(phys_addr_t dt_phys)
 {
-	void *dt_virt = fixmap_remap_fdt(dt_phys);
+	int size;
+	void *dt_virt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);
 	const char *name;
 
+	if (dt_virt)
+		memblock_reserve(dt_phys, size);
+
 	if (!dt_virt || !early_init_dt_scan(dt_virt)) {
 		pr_crit("\n"
 			"Error: invalid device tree blob at physical address %pa (virtual address 0x%p)\n"
@@ -184,6 +188,9 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)
 			cpu_relax();
 	}
 
+	/* Early fixups are done, map the FDT as read-only now */
+	fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL_RO);
+
 	name = of_flat_dt_get_machine_name();
 	if (!name)
 		return;
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index 750a69dde39b..54e93583085c 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -876,7 +876,7 @@ void __set_fixmap(enum fixed_addresses idx,
 	}
 }
 
-void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot)
+void *__init fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot)
 {
 	const u64 dt_virt_base = __fix_to_virt(FIX_FDT);
 	int offset;
@@ -929,19 +929,6 @@ void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot)
 	return dt_virt;
 }
 
-void *__init fixmap_remap_fdt(phys_addr_t dt_phys)
-{
-	void *dt_virt;
-	int size;
-
-	dt_virt = __fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL_RO);
-	if (!dt_virt)
-		return NULL;
-
-	memblock_reserve(dt_phys, size);
-	return dt_virt;
-}
-
 int __init arch_ioremap_p4d_supported(void)
 {
 	return 0;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v7 2/3] fdt: add support for rng-seed
  2019-07-03  4:01 [PATCH v7 0/3] add support for rng-seed Hsin-Yi Wang
  2019-07-03  4:01 ` [PATCH v7 1/3] arm64: map FDT as RW for early_init_dt_scan() Hsin-Yi Wang
@ 2019-07-03  4:01 ` Hsin-Yi Wang
  2019-07-03  4:01 ` [PATCH v7 3/3] arm64: kexec_file: add rng-seed support Hsin-Yi Wang
  2019-08-05 16:34 ` [PATCH v7 0/3] add support for rng-seed Hsin-Yi Wang
  3 siblings, 0 replies; 5+ messages in thread
From: Hsin-Yi Wang @ 2019-07-03  4:01 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Rob Herring, devicetree, linux-kernel, Frank Rowand,
	Catalin Marinas, Will Deacon, Andrew Morton, Mike Rapoport,
	Ard Biesheuvel, Miles Chen, Hsin-Yi Wang, James Morse,
	Andrew Murray, Mark Rutland, Jun Yao, Yu Zhao, Robin Murphy,
	Laura Abbott, Stephen Boyd, Kees Cook

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.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Reviewed-by: Rob Herring <robh@kernel.org>
---
No change since v6.
---
 drivers/of/fdt.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index cd17dc62a719..7be50e287ba6 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -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>
@@ -1043,6 +1044,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);
 
@@ -1077,6 +1079,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_device_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;
 }
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v7 3/3] arm64: kexec_file: add rng-seed support
  2019-07-03  4:01 [PATCH v7 0/3] add support for rng-seed Hsin-Yi Wang
  2019-07-03  4:01 ` [PATCH v7 1/3] arm64: map FDT as RW for early_init_dt_scan() Hsin-Yi Wang
  2019-07-03  4:01 ` [PATCH v7 2/3] fdt: add support for rng-seed Hsin-Yi Wang
@ 2019-07-03  4:01 ` Hsin-Yi Wang
  2019-08-05 16:34 ` [PATCH v7 0/3] add support for rng-seed Hsin-Yi Wang
  3 siblings, 0 replies; 5+ messages in thread
From: Hsin-Yi Wang @ 2019-07-03  4:01 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Rob Herring, devicetree, linux-kernel, Frank Rowand,
	Catalin Marinas, Will Deacon, Andrew Morton, Mike Rapoport,
	Ard Biesheuvel, Miles Chen, Hsin-Yi Wang, James Morse,
	Andrew Murray, Mark Rutland, Jun Yao, Yu Zhao, Robin Murphy,
	Laura Abbott, Stephen Boyd, Kees Cook

Adding "rng-seed" to dtb. It's fine to add this property if original
fdt doesn't contain it. Since original seed will be wiped after
read, so use a default size 128 bytes here.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---
change log v6->v7:
* Use stack for rng_seed to avoid allocation failing.
---
 arch/arm64/kernel/machine_kexec_file.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/kernel/machine_kexec_file.c b/arch/arm64/kernel/machine_kexec_file.c
index 58871333737a..81b5baad97aa 100644
--- a/arch/arm64/kernel/machine_kexec_file.c
+++ b/arch/arm64/kernel/machine_kexec_file.c
@@ -27,6 +27,8 @@
 #define FDT_PROP_INITRD_END	"linux,initrd-end"
 #define FDT_PROP_BOOTARGS	"bootargs"
 #define FDT_PROP_KASLR_SEED	"kaslr-seed"
+#define FDT_PROP_RNG_SEED	"rng-seed"
+#define RNG_SEED_SIZE		128
 
 const struct kexec_file_ops * const kexec_file_loaders[] = {
 	&kexec_image_ops,
@@ -102,6 +104,19 @@ static int setup_dtb(struct kimage *image,
 				FDT_PROP_KASLR_SEED);
 	}
 
+	/* add rng-seed */
+	if (rng_is_initialized()) {
+		u8 rng_seed[RNG_SEED_SIZE];
+		get_random_bytes(rng_seed, RNG_SEED_SIZE);
+		ret = fdt_setprop(dtb, off, FDT_PROP_RNG_SEED, rng_seed,
+				RNG_SEED_SIZE);
+		if (ret)
+			goto out;
+	} else {
+		pr_notice("RNG is not initialised: omitting \"%s\" property\n",
+				FDT_PROP_RNG_SEED);
+	}
+
 out:
 	if (ret)
 		return (ret == -FDT_ERR_NOSPACE) ? -ENOMEM : -EINVAL;
@@ -110,7 +125,8 @@ static int setup_dtb(struct kimage *image,
 }
 
 /*
- * More space needed so that we can add initrd, bootargs and kaslr-seed.
+ * More space needed so that we can add initrd, bootargs, kaslr-seed, and
+ * rng-seed.
  */
 #define DTB_EXTRA_SPACE 0x1000
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v7 0/3] add support for rng-seed
  2019-07-03  4:01 [PATCH v7 0/3] add support for rng-seed Hsin-Yi Wang
                   ` (2 preceding siblings ...)
  2019-07-03  4:01 ` [PATCH v7 3/3] arm64: kexec_file: add rng-seed support Hsin-Yi Wang
@ 2019-08-05 16:34 ` Hsin-Yi Wang
  3 siblings, 0 replies; 5+ messages in thread
From: Hsin-Yi Wang @ 2019-08-05 16:34 UTC (permalink / raw)
  To: moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE
  Cc: Rob Herring, devicetree, lkml, Frank Rowand, Catalin Marinas,
	Will Deacon, Andrew Morton, Mike Rapoport, Ard Biesheuvel,
	Miles Chen, James Morse, Andrew Murray, Mark Rutland, Jun Yao,
	Yu Zhao, Robin Murphy, Laura Abbott, Stephen Boyd, Kees Cook

Ping on the thread.
Should the series be proceeded?

Thanks

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-08-05 16:35 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-03  4:01 [PATCH v7 0/3] add support for rng-seed Hsin-Yi Wang
2019-07-03  4:01 ` [PATCH v7 1/3] arm64: map FDT as RW for early_init_dt_scan() Hsin-Yi Wang
2019-07-03  4:01 ` [PATCH v7 2/3] fdt: add support for rng-seed Hsin-Yi Wang
2019-07-03  4:01 ` [PATCH v7 3/3] arm64: kexec_file: add rng-seed support Hsin-Yi Wang
2019-08-05 16:34 ` [PATCH v7 0/3] add support for rng-seed Hsin-Yi Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).