aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorJorge Ramirez-Ortiz <jorge@foundries.io>2021-10-10 16:43:14 +0200
committerJérôme Forissier <jerome@forissier.org>2021-11-08 10:13:23 +0100
commitf57e4036edaebe33a08d2ec6d785fb5141aefb48 (patch)
tree08e3fdfd13f61f85c0051f4e64229d0152c980ea /core
parent1d23b02e1ce5665e6552ebd9f8d67883a405cc4e (diff)
zynqmp: platform: use HUK derived from PUF KEK for RPMB
Enable the RPMB key when the HUK is generated from the PUF KEK. Signed-off-by: Jorge Ramirez-Ortiz <jorge@foundries.io> Tested-by: Ricardo Salveti <ricardo@foundries.io> Acked-by: Etienne Carriere <etienne.carriere@linaro.org>
Diffstat (limited to 'core')
-rw-r--r--core/arch/arm/plat-zynqmp/conf.mk4
-rw-r--r--core/arch/arm/plat-zynqmp/main.c26
2 files changed, 30 insertions, 0 deletions
diff --git a/core/arch/arm/plat-zynqmp/conf.mk b/core/arch/arm/plat-zynqmp/conf.mk
index 5d4a73af..8c640668 100644
--- a/core/arch/arm/plat-zynqmp/conf.mk
+++ b/core/arch/arm/plat-zynqmp/conf.mk
@@ -30,6 +30,10 @@ CFG_CRYPTO_WITH_CE ?= y
CFG_ZYNQMP_PM ?= $(CFG_ARM64_core)
+ifeq ($(CFG_RPMB_FS),y)
+$(call force,CFG_ZYNQMP_HUK,y,Mandated by CFG_RPMB_FS)
+endif
+
ifeq ($(CFG_ZYNQMP_HUK),y)
$(call force,CFG_ZYNQMP_CSU_AES,y,Mandated by CFG_ZYNQMP_HUK)
$(call force,CFG_ZYNQMP_CSU_PUF,y,Mandated by CFG_ZYNQMP_HUK)
diff --git a/core/arch/arm/plat-zynqmp/main.c b/core/arch/arm/plat-zynqmp/main.c
index da788364..58df7470 100644
--- a/core/arch/arm/plat-zynqmp/main.c
+++ b/core/arch/arm/plat-zynqmp/main.c
@@ -33,14 +33,18 @@
#include <drivers/gic.h>
#include <drivers/cdns_uart.h>
+#include <drivers/zynqmp_csu.h>
#include <arm.h>
#include <console.h>
+#include <io.h>
#include <kernel/boot.h>
#include <kernel/interrupt.h>
#include <kernel/misc.h>
+#include <kernel/tee_common_otp.h>
#include <kernel/tee_time.h>
#include <mm/core_memprot.h>
+#include <tee/tee_fs.h>
#include <trace.h>
static struct gic_data gic_data;
@@ -88,3 +92,25 @@ void console_init(void)
CONSOLE_UART_CLK_IN_HZ, CONSOLE_BAUDRATE);
register_serial_console(&console_data.chip);
}
+
+#if defined(CFG_RPMB_FS)
+bool plat_rpmb_key_is_ready(void)
+{
+ vaddr_t csu = core_mmu_get_va(CSU_BASE, MEM_AREA_IO_SEC, CSU_SIZE);
+ struct tee_hw_unique_key hwkey = { };
+ uint32_t status = 0;
+
+ if (tee_otp_get_hw_unique_key(&hwkey))
+ return false;
+
+ /*
+ * For security reasons, we don't allow writing the RPMB key using the
+ * development HUK even though it is unique.
+ */
+ status = io_read32(csu + ZYNQMP_CSU_STATUS_OFFSET);
+ if (status & ZYNQMP_CSU_STATUS_AUTH)
+ return true;
+
+ return false;
+}
+#endif