This adds the Kconfig option CONFIG_ARCH_K3_AUTHENTICATE_IMAGE. When enabled, the full barebox image will only be started when it can be authenticated using the ROM API. Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- arch/arm/mach-k3/Kconfig | 7 ++++++ arch/arm/mach-k3/r5.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-k3/Kconfig b/arch/arm/mach-k3/Kconfig index 37d5155577..e93e3154c8 100644 --- a/arch/arm/mach-k3/Kconfig +++ b/arch/arm/mach-k3/Kconfig @@ -37,6 +37,13 @@ config MACH_BEAGLEPLAY help Say Y here if you are using a TI AM62x based BeaglePlay board +config ARCH_K3_AUTHENTICATE_IMAGE + bool "Force authentication of FIP image against ROM API" + help + By enabling this option the FIP image loaded by the first stage + will be authenticated against the K3 ROM API. Images which fail + to authenticate will not be started. + config ARCH_K3_COMMAND_AUTHENTICATE bool "k3_authenticate_image command" depends on COMMAND_SUPPORT diff --git a/arch/arm/mach-k3/r5.c b/arch/arm/mach-k3/r5.c index c8a91e2597..d0093a3be7 100644 --- a/arch/arm/mach-k3/r5.c +++ b/arch/arm/mach-k3/r5.c @@ -244,6 +244,64 @@ static uuid_t uuid_ti_dm_fw = UUID_TI_DM_FW; static uuid_t uuid_bl33 = UUID_NON_TRUSTED_FIRMWARE_BL33; static uuid_t uuid_bl32 = UUID_SECURE_PAYLOAD_BL32; +static struct fip_state *fip_image_load_auth(const char *filename, size_t offset) +{ + struct fip_state *fip = NULL; + int fd; + unsigned int maxsize = SZ_4M; + size_t size; + void *buf = NULL; + int ret; + + fd = open(filename, O_RDONLY); + if (fd < 0) + return ERR_PTR(-errno); + + if (offset) { + loff_t pos; + pos = lseek(fd, offset, SEEK_SET); + if (pos < 0) { + ret = -errno; + goto err; + } + } + + buf = xzalloc(maxsize); + + /* + * There is no easy way to determine the size of the certificates the ROM + * takes as images, so the best we can do here is to assume a maximum size + * and load this. + */ + ret = read_full(fd, buf, maxsize); + if (ret < 0) + goto err; + + size = maxsize; + + ret = k3_authenticate_image(&buf, &size); + if (ret) { + pr_err("Failed to authenticate %s\n", filename); + goto err; + } + + fip = fip_new(); + ret = fip_parse_buf(fip, buf, size, NULL); + if (ret) + goto err; + + close(fd); + + return fip; +err: + if (fip) + fip_free(fip); + close(fd); + free(buf); + + return ERR_PTR(ret); +} + static int load_fip(const char *filename, off_t offset) { struct fip_state *fip; @@ -251,7 +309,11 @@ static int load_fip(const char *filename, off_t offset) unsigned char shasum[SHA256_DIGEST_SIZE]; int ret; - fip = fip_image_open(filename, offset); + if (IS_ENABLED(CONFIG_ARCH_K3_AUTHENTICATE_IMAGE)) + fip = fip_image_load_auth(filename, offset); + else + fip = fip_image_open(filename, offset); + if (IS_ERR(fip)) { pr_err("Cannot open FIP image: %pe\n", fip); return PTR_ERR(fip); -- 2.39.5