From 557981f3ace1f11f1483668dd97076e6c3f1d1cc Mon Sep 17 00:00:00 2001 From: Ji Luo Date: Wed, 10 Oct 2018 17:29:35 +0800 Subject: MA-13048 [AUTO] Support program rpmb key with fastboot command Add fastboot command "fastboot oem set-rpmb-key" to program the rpmb key which should be staged first. Usage: 1. fastboot stage my-rpmb-key.bin 2. fastboot oem set-rpmb-key Test: rpmb key programed successfully on imx8qxp. Change-Id: I95474a6367eb8ef0db16bb38680975b8c45b84f1 Signed-off-by: Ji Luo --- lib/avb/fsl/fsl_avbkey.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/avb/fsl/fsl_avbkey.h | 3 +++ 2 files changed, 63 insertions(+) (limited to 'lib') diff --git a/lib/avb/fsl/fsl_avbkey.c b/lib/avb/fsl/fsl_avbkey.c index 71a012906b..7c192f31ef 100644 --- a/lib/avb/fsl/fsl_avbkey.c +++ b/lib/avb/fsl/fsl_avbkey.c @@ -1368,3 +1368,63 @@ fail: } #endif /* AVB_RPMB && CONFIG_AVB_ATX */ + +#ifdef CONFIG_ANDROID_AUTO_SUPPORT +int fastboot_set_rpmb_key(uint8_t *staged_buf, uint32_t key_size) +{ + int ret = 0; + int mmcc; + struct mmc *mmc; + char original_part; + struct blk_desc *desc = NULL; + uint8_t rpmb_key[RPMBKEY_LENGTH]; + + if (memcmp(staged_buf, RPMB_KEY_MAGIC, strlen(RPMB_KEY_MAGIC))) { + printf("ERROR - rpmb magic doesn't match!\n"); + return -1; + } + + /* Get current mmc device. */ + mmcc = mmc_get_env_dev(); + mmc = find_mmc_device(mmcc); + if (!mmc) { + printf("error - cannot find '%d' mmc device\n", mmcc); + return -1; + } + desc = mmc_get_blk_desc(mmc); + original_part = desc->hwpart; + + /* Switch to the RPMB partition */ + if (desc->hwpart != MMC_PART_RPMB) { + if (mmc_switch_part(mmc, MMC_PART_RPMB) != 0) { + printf("ERROR - can't switch to rpmb partition \n"); + return -1; + } + desc->hwpart = MMC_PART_RPMB; + } + + /* Set rpmb key. */ + memset(rpmb_key, 0, RPMBKEY_LENGTH); + memcpy(rpmb_key, staged_buf + strlen(RPMB_KEY_MAGIC), RPMBKEY_LENGTH); + + if (mmc_rpmb_set_key(mmc, rpmb_key)) { + printf("ERROR - Key already programmed ?\n"); + ret = -1; + goto fail; + } else + printf("RPMB key programed successfully!"); + + /* TODO Generate keyblob with CAAM and store it to boot1, + * this requires CAAM is ready for Android Auto. + */ +fail: + /* Return to original partition */ + if (desc->hwpart != original_part) { + if (mmc_switch_part(mmc, original_part) != 0) + return -1; + desc->hwpart = original_part; + } + + return ret; +} +#endif diff --git a/lib/avb/fsl/fsl_avbkey.h b/lib/avb/fsl/fsl_avbkey.h index 1a1b76ad09..7300a12d2f 100644 --- a/lib/avb/fsl/fsl_avbkey.h +++ b/lib/avb/fsl/fsl_avbkey.h @@ -31,6 +31,9 @@ #define AVB_KBLB_MAGIC "\0KBLB!" #define AVB_KBLB_MAGIC_LEN 6 +#ifdef CONFIG_ANDROID_AUTO_SUPPORT +#define RPMB_KEY_MAGIC "RPMB" +#endif struct kblb_tag { uint32_t flag; -- cgit v1.2.3