[U-Boot] [PATCH 4/4] SECURE BOOT: support for validation of dynamic image

Ruchika Gupta ruchika.gupta at nxp.com
Fri Jan 15 08:08:18 CET 2016


> -----Original Message-----
> From: Aneesh Bansal
> Sent: Tuesday, December 08, 2015 2:14 PM
> To: u-boot at lists.denx.de
> Cc: Yusong Sun <yorksun at freescale.com>; Ruchika Gupta
> <ruchika.gupta at freescale.com>; Prabhakar Kushwaha
> <prabhakar at freescale.com>; Aneesh Bansal
> <aneesh.bansal at freescale.com>; Saksham Jain <saksham at freescale.com>
> Subject: [PATCH 4/4] SECURE BOOT: support for validation of dynamic image
> 
> Some images to be validated are relocated to a dynamic address at run time.
> So, these addresses cannot be known befor hand while signing the images
> and creating the header offline.
> So, support is required to pass the image address to the validate function as
> an argument.
> If an address is provided to the function, the address field in Header is not
> read and is treated as a reserved field.
> 
> Signed-off-by: Saksham Jain <saksham at freescale.com>
> Signed-off-by: Aneesh Bansal <aneesh.bansal at freescale.com>
> ---
>  board/freescale/common/cmd_esbc_validate.c | 10 ++++++---
>  board/freescale/common/fsl_validate.c      | 33 ++++++++++++++++++---------
> ---
>  include/fsl_validate.h                     |  7 +++++--
>  3 files changed, 32 insertions(+), 18 deletions(-)
> 
> diff --git a/board/freescale/common/cmd_esbc_validate.c
> b/board/freescale/common/cmd_esbc_validate.c
> index ae6a9af..ca7c737 100644
> --- a/board/freescale/common/cmd_esbc_validate.c
> +++ b/board/freescale/common/cmd_esbc_validate.c
> @@ -22,7 +22,7 @@ static int do_esbc_validate(cmd_tbl_t *cmdtp, int flag,
> int argc,
>  				char * const argv[])
>  {
>  	char *hash_str = NULL;
> -	ulong haddr;
> +	uintptr_t haddr;
>  	int ret;
> 
>  	if (argc < 2)
> @@ -32,9 +32,13 @@ static int do_esbc_validate(cmd_tbl_t *cmdtp, int flag,
> int argc,
>  		hash_str = argv[2];
> 
>  	/* First argument - header address -32/64bit */
> -	haddr = simple_strtoul(argv[1], NULL, 16);
> +	haddr = (uintptr_t)simple_strtoul(argv[1], NULL, 16);
> 
> -	ret = fsl_secboot_validate(haddr, hash_str);
> +	/* With esbc_validate command, Image address must be
> +	 * part of header. So, the function is called
> +	 * by passing this argument as 0.
> +	 */
> +	ret = fsl_secboot_validate(haddr, hash_str, 0);
>  	if (ret)
>  		return 1;
> 
> diff --git a/board/freescale/common/fsl_validate.c
> b/board/freescale/common/fsl_validate.c
> index 08a2f79..de40081 100644
> --- a/board/freescale/common/fsl_validate.c
> +++ b/board/freescale/common/fsl_validate.c
> @@ -536,13 +536,8 @@ static int calc_esbchdr_esbc_hash(struct
> fsl_secboot_img_priv *img)
>  		return ret;
> 
>  	/* Update hash for actual Image */
> -#ifdef CONFIG_ESBC_ADDR_64BIT
>  	ret = algo->hash_update(algo, ctx,
> -		(u8 *)(uintptr_t)img->hdr.pimg64, img->hdr.img_size, 1);
> -#else
> -	ret = algo->hash_update(algo, ctx,
> -		(u8 *)(uintptr_t)img->hdr.pimg, img->hdr.img_size, 1);
> -#endif
> +		(u8 *)img->img_addr, img->img_size, 1);
>  	if (ret)
>  		return ret;
> 
> @@ -632,16 +627,25 @@ static int read_validate_esbc_client_header(struct
> fsl_secboot_img_priv *img)
>  	if (memcmp(hdr->barker, barker_code, ESBC_BARKER_LEN))
>  		return ERROR_ESBC_CLIENT_HEADER_BARKER;
> 
> -#ifdef CONFIG_ESBC_ADDR_64BIT
> -	sprintf(buf, "%llx", hdr->pimg64);
> -#else
> -	sprintf(buf, "%x", hdr->pimg);
> -#endif
> +	/* If Image Address is not passed as argument to function,
> +	 * then Address and Size must be read from the Header.
> +	 */
> +	if (img->img_addr == 0) {
> +	#ifdef CONFIG_ESBC_ADDR_64BIT
> +		img->img_addr = hdr->pimg64;
> +	#else
> +		img->img_addr = hdr->pimg;
> +	#endif
> +	}
> +
> +	sprintf(buf, "%lx", img->img_addr);
>  	setenv("img_addr", buf);
> 
>  	if (!hdr->img_size)
>  		return ERROR_ESBC_CLIENT_HEADER_IMG_SIZE;
> 
> +	img->img_size = hdr->img_size;
> +
>  	/* Key checking*/
>  #ifdef CONFIG_KEY_REVOCATION
>  	if (check_srk(img)) {
> @@ -774,7 +778,8 @@ static int calculate_cmp_img_sig(struct
> fsl_secboot_img_priv *img)
>  	return 0;
>  }
> 
> -int fsl_secboot_validate(ulong haddr, char *arg_hash_str)
> +int fsl_secboot_validate(uintptr_t haddr, char *arg_hash_str,
> +			uintptr_t img_addr)
>  {
>  	struct ccsr_sfp_regs *sfp_regs = (void *)(CONFIG_SYS_SFP_ADDR);
>  	ulong hash[SHA256_BYTES/sizeof(ulong)]; @@ -824,9 +829,11 @@
> int fsl_secboot_validate(ulong haddr, char *arg_hash_str)
> 
>  	memset(img, 0, sizeof(struct fsl_secboot_img_priv));
> 
> +	/* Update the information in Private Struct */
>  	hdr = &img->hdr;
>  	img->ehdrloc = haddr;
> -	esbc = (u8 *)(uintptr_t)img->ehdrloc;
> +	img->img_addr = img_addr;
> +	esbc = (u8 *)img->ehdrloc;
> 
>  	memcpy(hdr, esbc, sizeof(struct fsl_secboot_img_hdr));
> 
> diff --git a/include/fsl_validate.h b/include/fsl_validate.h index
> bda802f..ad14867 100644
> --- a/include/fsl_validate.h
> +++ b/include/fsl_validate.h
> @@ -193,10 +193,13 @@ struct fsl_secboot_img_priv {
>  						 */
> 
>  	struct fsl_secboot_sg_table sgtbl[MAX_SG_ENTRIES];	/* SG table */
> -	ulong ehdrloc;		/* ESBC client location */
> +	uintptr_t ehdrloc;	/* ESBC Header location */
> +	uintptr_t img_addr;	/* ESBC Image Location */
> +	uint32_t img_size;	/* ESBC Image Size */
>  };
> 
> -int fsl_secboot_validate(ulong haddr, char *arg_hash_str);
> +int fsl_secboot_validate(uintptr_t haddr, char *arg_hash_str,
> +	uintptr_t img_loc);
>  int fsl_secboot_blob_encap(cmd_tbl_t *cmdtp, int flag, int argc,
>  	char * const argv[]);
>  int fsl_secboot_blob_decap(cmd_tbl_t *cmdtp, int flag, int argc,
> --
> 1.8.1.4
Acked-by: Ruchika Gupta <ruchika.gupta at nxp.com>


More information about the U-Boot mailing list