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 <ji.luo@nxp.com>
This commit is contained in:
Ji Luo 2018-10-10 17:29:35 +08:00 committed by Luo Ji
parent ef7693982c
commit 557981f3ac
5 changed files with 80 additions and 0 deletions

View File

@ -3348,6 +3348,15 @@ static void cb_flashing(struct usb_ep *ep, struct usb_request *req)
strcpy(response, "OKAY");
}
#endif /* CONFIG_AVB_ATX || CONFIG_ANDROID_AUTO_SUPPORT */
#ifdef CONFIG_ANDROID_AUTO_SUPPORT
else if (endswith(cmd, FASTBOOT_SET_RPMB_KEY)) {
if (fastboot_set_rpmb_key(interface.transfer_buffer, download_bytes)) {
printf("ERROR set rpmb key failed!\n");
strcpy(response, "FAILset rpmb key failed!");
} else
strcpy(response, "OKAY");
}
#endif
#endif /* CONFIG_IMX_TRUSTY_OS */
else if (endswith(cmd, "unlock_critical")) {
strcpy(response, "OKAY");

View File

@ -240,4 +240,7 @@ AvbABFlowResult avb_flow_dual_uboot(AvbABOps* ab_ops,
/* Program ATX perm_attr into RPMB partition */
int avb_atx_fuse_perm_attr(uint8_t *staged_buffer, uint32_t size);
/* Initialize rpmb key with the staged key */
int fastboot_set_rpmb_key(uint8_t *staged_buf, uint32_t key_size);
#endif /* __FSL_AVB_H__ */

View File

@ -83,10 +83,15 @@
#define FASTBOOT_PARTITION_FBMISC "fbmisc"
#endif
#ifdef CONFIG_ANDROID_AUTO_SUPPORT
#define FASTBOOT_SET_RPMB_KEY "set-rpmb-key"
#endif
#if defined(CONFIG_AVB_ATX) || defined(CONFIG_ANDROID_AUTO_SUPPORT)
#define FASTBOOT_SET_CA_RESP "at-set-ca-response"
#define FASTBOOT_GET_CA_REQ "at-get-ca-request"
#endif /* CONFIG_AVB_ATX || CONFIG_ANDROID_AUTO_SUPPORT */
#ifdef CONFIG_ANDROID_THINGS_SUPPORT
#define FASTBOOT_BOOTLOADER_VBOOT_KEY "fuse at-bootloader-vboot-key"
#ifdef CONFIG_AVB_ATX

View File

@ -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

View File

@ -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;