[PATCH v7 15/16] cmd: pre_load_verify: initial import

Philippe Reynes philippe.reynes at softathome.com
Mon Mar 14 15:57:44 CET 2022


Add the command pre_load_verify that check the signature of
an image with the pre-load header. If the check
succeed, the u-boot env variable 'loadaddr_verified'
is set to the address of the image (without the header).

It allows to run such commands:
tftp script.img && pre_load_verify $loadaddr && source $loadaddr_verified

Signed-off-by: Philippe Reynes <philippe.reynes at softathome.com>
---
 cmd/Kconfig                   |  8 ++++++
 cmd/Makefile                  |  2 ++
 cmd/pre-load-verify.c         | 53 +++++++++++++++++++++++++++++++++++
 doc/usage/pre-load-verify.rst | 44 +++++++++++++++++++++++++++++
 4 files changed, 107 insertions(+)
 create mode 100644 cmd/pre-load-verify.c
 create mode 100644 doc/usage/pre-load-verify.rst

diff --git a/cmd/Kconfig b/cmd/Kconfig
index 87aa3fb11a..9b235210e3 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -428,6 +428,14 @@ config CMD_THOR_DOWNLOAD
 	  There is no documentation about this within the U-Boot source code
 	  but you should be able to find something on the interwebs.
 
+config CMD_PRE_LOAD_VERIFY
+	bool "verify the global signature"
+	depends on IMAGE_PRE_LOAD
+	help
+	  Verify the signature provided in a pre-load header of
+	  a full image.
+          Documentation is available in doc/usage/pre-load-verify.txt
+
 config CMD_ZBOOT
 	bool "zboot - x86 boot command"
 	help
diff --git a/cmd/Makefile b/cmd/Makefile
index 166c652d98..29ee9b8fab 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -188,6 +188,8 @@ obj-$(CONFIG_CMD_ETHSW) += ethsw.o
 obj-$(CONFIG_CMD_AXI) += axi.o
 obj-$(CONFIG_CMD_PVBLOCK) += pvblock.o
 
+obj-$(CONFIG_CMD_PRE_LOAD_VERIFY) += pre-load-verify.o
+
 # Power
 obj-$(CONFIG_CMD_PMIC) += pmic.o
 obj-$(CONFIG_CMD_REGULATOR) += regulator.o
diff --git a/cmd/pre-load-verify.c b/cmd/pre-load-verify.c
new file mode 100644
index 0000000000..c2c4e57d5f
--- /dev/null
+++ b/cmd/pre-load-verify.c
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2022 Philippe Reynes <philippe.reynes at softathome.com>
+ */
+
+#include <common.h>
+#include <env.h>
+#include <image.h>
+#include <mapmem.h>
+
+static ulong verify_get_addr(int argc, char *const argv[])
+{
+	ulong addr;
+
+	if (argc > 0)
+		addr = hextoul(argv[0], NULL);
+	else
+		addr = image_load_addr;
+
+	return addr;
+}
+
+static int do_verify(struct cmd_tbl *cmdtp, int flag, int argc,
+		     char *const argv[])
+{
+	ulong addr = verify_get_addr(argc, argv);
+	int ret = 0;
+
+	argc--; argv++;
+
+	addr = verify_get_addr(argc, argv);
+
+	if (CONFIG_IS_ENABLED(IMAGE_PRE_LOAD)) {
+		ret = image_pre_load(addr);
+
+		if (ret) {
+			ret = CMD_RET_FAILURE;
+			goto out;
+		}
+
+		env_set_hex("loadaddr_verified", addr + image_load_offset);
+	}
+
+ out:
+	return ret;
+}
+
+U_BOOT_CMD(pre_load_verify, 2, 1, do_verify,
+	   "verify the global signature provided in the pre-load header,\n",
+	   "\tif the check succeed, the u-boot env variable loadaddr_verified\n"
+	   "\tis set to the address of the image (without the header)"
+	   "<image addr>"
+);
diff --git a/doc/usage/pre-load-verify.rst b/doc/usage/pre-load-verify.rst
new file mode 100644
index 0000000000..7b833d079b
--- /dev/null
+++ b/doc/usage/pre-load-verify.rst
@@ -0,0 +1,44 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+pre-load-verify command
+=======================
+
+Synopsis
+--------
+
+::
+
+    pre_load_verify <addr>
+
+Description
+-----------
+
+The pre-load-verify command verify the signature of the binary at address addr
+using the pre-load header that should be at the beginning of the binary.
+
+addr
+    Address of the binary to verify
+
+
+Examples
+--------
+
+
+::
+
+    => pre_load_verify 100
+    INFO: signature check has succeed
+
+If succeed, the u-boot env variable loadaddr_verified is set to the address
+if the binary after the pre-load header
+
+::
+
+    => printenv loadaddr_verified
+    loadaddr_verified=1100
+
+
+Return value
+------------
+
+The return value $? is 0 is the signature check succeed, 1 otherwise
-- 
2.17.1



More information about the U-Boot mailing list