> -----Original Message-----
> From: Saksham Jain [mailto:[email protected]]
> Sent: Monday, February 01, 2016 5:14 PM
> To: [email protected]
> Cc: york sun <[email protected]>; Ruchika Gupta <[email protected]>;
> Prabhakar Kushwaha <[email protected]>; Saksham Jain
> <[email protected]>; Aneesh Bansal <[email protected]>
> Subject: [PATCH v3 15/15] SECURE_BOOT: Enable IE (Key extention) Feature in
> Ls2085a & LS2088a
> 
> For validating images from uboot (Such as Kernel Image), either keys from SoC 
> fuses
> can be used or keys from a veriied table of public keys can be used. The 
> latter feature
> is called IE Key Extension Feature.
> 
> For earlier SoCs, BootROM used to verify IE Key Table and then write the 
> address of
> this table in a secure register (SCRATCHREG). But in LS2088 and LS2085, no 
> such
> secure registers are available. Hence IE Table is left to be verified by 
> Uboot.
> 
> The new procedure is to first verify IE table using Keys stored in fuses, and 
> then use
> the keys in this table to verify further images. So the steps
> are:
> 
> 1) Verify IE Table (If "IE Table Flag" set in any image i.e. Verify IE Table 
> only when
> any image needs IE Table's Key to be verified)
> 2) Install IE table. (To be used across verification of multiple images.
> Stored in a static global structure.)
> 3) If IE flag enabled in header of any image, Use keys from IE table, 
> otherwise use
> keys tied up with SoC's fuses (SRK).
> 
> The address of IE Table HDR is fixed for NOR. In case of boot from other 
> devices, IE
> Table and it's Header needs to be copied to an XIP Memory.
> 
> Signed-off-by: Aneesh Bansal <[email protected]>
> Signed-off-by: Saksham Jain <[email protected]>
> ---
> Changes for v2:
>       - No changes
> Changes for v3:
>       -changes to remove compliation warning for various platforms
> 
>  arch/arm/include/asm/fsl_secure_boot.h |  6 +--
> board/freescale/common/fsl_validate.c  | 97 ++++++++++++++++++++++++++++------
>  include/fsl_validate.h                 | 23 +++++++-
>  3 files changed, 105 insertions(+), 21 deletions(-)
> 
> diff --git a/arch/arm/include/asm/fsl_secure_boot.h
> b/arch/arm/include/asm/fsl_secure_boot.h
> index eafdc0b..061c9f5 100644
> --- a/arch/arm/include/asm/fsl_secure_boot.h
> +++ b/arch/arm/include/asm/fsl_secure_boot.h
> @@ -41,11 +41,11 @@
>   * in boot ROM of the SoC.
>   * The feature is only applicable in case of NOR boot and is
>   * not applicable in case of RAMBOOT (NAND, SD, SPI).
> + * For LS, this feature is available for all device if IE Table
> + * is copied to XIP memory
> + * Also, for LS, ISBC doesn't verify this table.
>   */
> -#ifndef CONFIG_ESBC_HDR_LS
> -/* Current Key EXT feature not available in LS ESBC Header */  #define
> CONFIG_FSL_ISBC_KEY_EXT -#endif
> 
>  #endif
> 
> diff --git a/board/freescale/common/fsl_validate.c
> b/board/freescale/common/fsl_validate.c
> index 64e4e30..248a759 100644
> --- a/board/freescale/common/fsl_validate.c
> +++ b/board/freescale/common/fsl_validate.c
> @@ -27,6 +27,10 @@
>  #define CHECK_KEY_LEN(key_len)       (((key_len) == 2 * KEY_SIZE_BYTES /
> 4) || \
>                                ((key_len) == 2 * KEY_SIZE_BYTES / 2) || \
>                                ((key_len) == 2 * KEY_SIZE_BYTES))
> +#if defined(CONFIG_FSL_ISBC_KEY_EXT)
> +/* Global data structure */
> +static struct fsl_secboot_glb glb;
> +#endif
> 
>  /* This array contains DER value for SHA-256 */  static const u8 
> hash_identifier[] = {
> 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, @@ -60,7 +64,7 @@ self:
>  #if defined(CONFIG_FSL_ISBC_KEY_EXT)
>  static u32 check_ie(struct fsl_secboot_img_priv *img)  {
> -     if (img->hdr.ie_flag)
> +     if (img->hdr.ie_flag & IE_FLAG_MASK)
>               return 1;
> 
>       return 0;
> @@ -119,7 +123,8 @@ int get_csf_base_addr(u32 *csf_addr, u32 *flash_base_addr)
> }  #endif
> 
> -static int get_ie_info_addr(u32 *ie_addr)
> +#if !defined(CONFIG_ESBC_HDR_LS)
> +static int get_ie_info_addr(uintptr_t *ie_addr)
>  {
>       struct fsl_secboot_img_hdr *hdr;
>       struct fsl_secboot_sg_table *sg_tbl;
> @@ -147,16 +152,17 @@ static int get_ie_info_addr(u32 *ie_addr)
> 
>       /* IE Key Table is the first entry in the SG Table */  #if
> defined(CONFIG_MPC85xx)
> -     *ie_addr = (sg_tbl->src_addr & ~(CONFIG_SYS_PBI_FLASH_BASE)) +
> -                flash_base_addr;
> +     *ie_addr = (uintptr_t)((sg_tbl->src_addr &
> +                     ~(CONFIG_SYS_PBI_FLASH_BASE)) +
> +                     flash_base_addr);
>  #else
> -     *ie_addr = sg_tbl->src_addr;
> +     *ie_addr = (uintptr_t)sg_tbl->src_addr;
>  #endif
> 
> -     debug("IE Table address is %x\n", *ie_addr);
> +     debug("IE Table address is %lx\n", *ie_addr);
>       return 0;
>  }
> -
> +#endif /* CONFIG_ESBC_HDR_LS */
>  #endif
> 
>  #ifdef CONFIG_KEY_REVOCATION
> @@ -164,7 +170,10 @@ static int get_ie_info_addr(u32 *ie_addr)  static u32
> check_srk(struct fsl_secboot_img_priv *img)  {  #ifdef CONFIG_ESBC_HDR_LS
> -     /* In LS, No SRK Flag as SRK is always present*/
> +     /* In LS, No SRK Flag as SRK is always present if IE not present*/ #if
> +defined(CONFIG_FSL_ISBC_KEY_EXT)
> +     return !check_ie(img);
> +#endif
>       return 1;
>  #else
>       if (img->hdr.len_kr.srk_table_flag & SRK_FLAG) @@ -253,14 +262,51 @@
> static u32 read_validate_single_key(struct fsl_secboot_img_priv *img)  #endif 
> /*
> CONFIG_ESBC_HDR_LS */
> 
>  #if defined(CONFIG_FSL_ISBC_KEY_EXT)
> +
> +#if defined(CONFIG_ESBC_HDR_LS)
> +static void install_ie_tbl(uintptr_t ie_tbl_addr,
> +             struct fsl_secboot_img_priv *img)
> +{
> +     /* Copy IE tbl to Global Data */
> +     memcpy(&glb.ie_tbl, (u8 *)ie_tbl_addr, sizeof(struct ie_key_info));
> +     img->ie_addr = (uintptr_t)&glb.ie_tbl;
> +     glb.ie_addr = img->ie_addr;
> +}
> +#endif
> +
>  static u32 read_validate_ie_tbl(struct fsl_secboot_img_priv *img)  {
>       struct fsl_secboot_img_hdr *hdr = &img->hdr;
>       u32 ie_key_len, ie_revoc_flag, ie_num;
>       struct ie_key_info *ie_info;
> 
> -     if (get_ie_info_addr(&img->ie_addr))
> -             return ERROR_IE_TABLE_NOT_FOUND;
> +/* For LS, IE Table is installed as a separate image.
> + * It is not verified by ISBC.
> + */
> +     if (!img->ie_addr)
> +#if defined(CONFIG_ESBC_HDR_LS)
> +             /* Verify and Install IE Table */
> +             debug("Verifying IE Table\n");
> +
> +             int ret;
> +             uintptr_t ie_tbl_addr = 0;
> +             ret = fsl_secboot_validate(IE_TABLE_HDR_ADR, NULL,
> +                     &ie_tbl_addr);
> +             if (ret) {
> +                     printf("IE Table Verification Failed\n");
> +                     return ret;
> +             } else {
> +                     printf("IE Table Verified Successfully\n");
> +                     /* If the image is IE Table,
> +                      * then install that IE Table for
> +                      * future verification process.
> +                      */
> +                     install_ie_tbl(ie_tbl_addr, img);
> +             }
> +#else
> +             if (get_ie_info_addr(&img->ie_addr))
> +                     return ERROR_IE_TABLE_NOT_FOUND;
> +#endif
>       ie_info = (struct ie_key_info *)(uintptr_t)img->ie_addr;
>       if (ie_info->num_keys == 0 || ie_info->num_keys > 32)
>               return
> ERROR_ESBC_CLIENT_HEADER_INVALID_IE_NUM_ENTRY;
> @@ -810,6 +856,26 @@ static int calculate_cmp_img_sig(struct
> fsl_secboot_img_priv *img)
> 
>       return 0;
>  }
> +/* Function to initialize img priv and global data structure  */ static
> +int secboot_init(struct fsl_secboot_img_priv **img_ptr) {
> +     *img_ptr = malloc(sizeof(struct fsl_secboot_img_priv));
> +
> +     struct fsl_secboot_img_priv *img = *img_ptr;
> +
> +     if (!img)
> +             return -ENOMEM;
> +     memset(img, 0, sizeof(struct fsl_secboot_img_priv));
> +
> +#if defined(CONFIG_FSL_ISBC_KEY_EXT)
> +     if (glb.ie_addr)
> +             img->ie_addr = glb.ie_addr;
> +#endif
> +     return 0;
> +}
> +
> +
>  /* haddr - Address of the header of image to be validated.
>   * arg_hash_str - Option hash string. If provided, this
>   * overides the key hash in the SFP fuses.
> @@ -863,12 +929,9 @@ int fsl_secboot_validate(uintptr_t haddr, char 
> *arg_hash_str,
>               hash_cmd = 1;
>       }
> 
> -     img = malloc(sizeof(struct fsl_secboot_img_priv));
> -
> -     if (!img)
> -             return -1;
> -
> -     memset(img, 0, sizeof(struct fsl_secboot_img_priv));
> +     ret = secboot_init(&img);
> +     if (ret)
> +             goto exit;
> 
>       /* Update the information in Private Struct */
>       hdr = &img->hdr;
> @@ -923,5 +986,7 @@ int fsl_secboot_validate(uintptr_t haddr, char 
> *arg_hash_str,
>       }
> 
>  exit:
> +     /* Free Img as it was malloc'ed*/
> +     free(img);
>       return ret;
>  }
> diff --git a/include/fsl_validate.h b/include/fsl_validate.h index 
> a71e1ce..7aae5c9
> 100644
> --- a/include/fsl_validate.h
> +++ b/include/fsl_validate.h
> @@ -40,8 +40,8 @@ struct fsl_secboot_img_hdr {
>               u8 num_srk;
>               u8 srk_sel;
>               u8 reserve;
> -             u8 ie_flag;
>       } len_kr;
> +     u8 ie_flag;
> 
>       u32 uid_flag;
> 
> @@ -69,6 +69,10 @@ struct fsl_secboot_img_hdr {  #define MAX_KEY_ENTRIES
> 8  #endif
> 
> +#if defined(CONFIG_FSL_ISBC_KEY_EXT)
> +#define IE_FLAG_MASK 0x1
> +#define IE_TABLE_HDR_ADR 0x5839c0000
> +#endif
> 
>  #else /* CONFIG_ESBC_HDR_LS */
> 
> @@ -150,6 +154,10 @@ struct fsl_secboot_img_hdr {  #define
> MAX_KEY_ENTRIES 4  #endif
> 
> +#if defined(CONFIG_FSL_ISBC_KEY_EXT)
> +#define IE_FLAG_MASK 0xFFFFFFFF
> +#endif
> +
>  #endif /* CONFIG_ESBC_HDR_LS */
> 
> 
> @@ -202,6 +210,17 @@ struct fsl_secboot_sg_table {  };  #endif
> 
> +/* ESBC global structure.
> + * Data to be used across verification of different images.
> + * Stores follwoing Data:
> + * IE Table
> + */
> +struct fsl_secboot_glb {
> +#if defined(CONFIG_FSL_ISBC_KEY_EXT)
> +     uintptr_t ie_addr;
> +     struct ie_key_info ie_tbl;
> +#endif
> +};
>  /*
>   * ESBC private structure.
>   * Private structure used by ESBC to store following fields @@ -213,7 +232,7 
> @@
> struct fsl_secboot_sg_table {
>   */
>  struct fsl_secboot_img_priv {
>       uint32_t hdr_location;
> -     u32 ie_addr;
> +     uintptr_t ie_addr;
>       u32 key_len;
>       struct fsl_secboot_img_hdr hdr;
> 
> --
> 1.8.1.4
IE Table must be verified my ISBC only and not by ESBC.
This should be done in similar way as legacy QorIQ PBL based platforms. The 
address of a verified IE Table must
be read from a SCRATCH Register and that should be used.

_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to