123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- /*
- * Copyright 2015 Freescale Semiconductor, Inc.
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
- #ifndef _FSL_VALIDATE_H_
- #define _FSL_VALIDATE_H_
- #include <fsl_sec.h>
- #include <fsl_sec_mon.h>
- #include <command.h>
- #include <linux/types.h>
- #define WORD_SIZE 4
- /* Minimum and maximum size of RSA signature length in bits */
- #define KEY_SIZE 4096
- #define KEY_SIZE_BYTES (KEY_SIZE/8)
- #define KEY_SIZE_WORDS (KEY_SIZE_BYTES/(WORD_SIZE))
- extern struct jobring jr;
- /* Barker code size in bytes */
- #define ESBC_BARKER_LEN 4 /* barker code length in ESBC uboot client */
- /* header */
- /* No-error return values */
- #define ESBC_VALID_HDR 0 /* header is valid */
- /* Maximum number of SG entries allowed */
- #define MAX_SG_ENTRIES 8
- /* Different Header Struct for LS-CH3 */
- #ifdef CONFIG_ESBC_HDR_LS
- struct fsl_secboot_img_hdr {
- u8 barker[ESBC_BARKER_LEN]; /* barker code */
- u32 srk_tbl_off;
- struct {
- u8 num_srk;
- u8 srk_sel;
- u8 reserve;
- u8 ie_flag;
- } len_kr;
- u32 uid_flag;
- u32 psign; /* signature offset */
- u32 sign_len; /* length of the signature in bytes */
- u64 pimg64; /* 64 bit pointer to ESBC Image */
- u32 img_size; /* ESBC client image size in bytes */
- u32 ie_key_sel;
- u32 fsl_uid_0;
- u32 fsl_uid_1;
- u32 oem_uid_0;
- u32 oem_uid_1;
- u32 oem_uid_2;
- u32 oem_uid_3;
- u32 oem_uid_4;
- u32 reserved1[3];
- };
- #ifdef CONFIG_KEY_REVOCATION
- /* Srk table and key revocation check */
- #define UNREVOCABLE_KEY 8
- #define ALIGN_REVOC_KEY 7
- #define MAX_KEY_ENTRIES 8
- #endif
- #else /* CONFIG_ESBC_HDR_LS */
- /*
- * ESBC uboot client header structure.
- * The struct contain the following fields
- * barker code
- * public key offset
- * pub key length
- * signature offset
- * length of the signature
- * ptr to SG table
- * no of entries in SG table
- * esbc ptr
- * size of esbc
- * esbc entry point
- * Scatter gather flag
- * UID flag
- * FSL UID
- * OEM UID
- * Here, pub key is modulus concatenated with exponent
- * of equal length
- */
- struct fsl_secboot_img_hdr {
- u8 barker[ESBC_BARKER_LEN]; /* barker code */
- union {
- u32 pkey; /* public key offset */
- #ifdef CONFIG_KEY_REVOCATION
- u32 srk_tbl_off;
- #endif
- };
- union {
- u32 key_len; /* pub key length in bytes */
- #ifdef CONFIG_KEY_REVOCATION
- struct {
- u32 srk_table_flag:8;
- u32 srk_sel:8;
- u32 num_srk:16;
- } len_kr;
- #endif
- };
- u32 psign; /* signature offset */
- u32 sign_len; /* length of the signature in bytes */
- union {
- u32 psgtable; /* ptr to SG table */
- #ifndef CONFIG_ESBC_ADDR_64BIT
- u32 pimg; /* ptr to ESBC client image */
- #endif
- };
- union {
- u32 sg_entries; /* no of entries in SG table */
- u32 img_size; /* ESBC client image size in bytes */
- };
- u32 img_start; /* ESBC client entry point */
- u32 sg_flag; /* Scatter gather flag */
- u32 uid_flag;
- u32 fsl_uid_0;
- u32 oem_uid_0;
- u32 reserved1[2];
- u32 fsl_uid_1;
- u32 oem_uid_1;
- union {
- u32 reserved2[2];
- #ifdef CONFIG_ESBC_ADDR_64BIT
- u64 pimg64; /* 64 bit pointer to ESBC Image */
- #endif
- };
- u32 ie_flag;
- u32 ie_key_sel;
- };
- #ifdef CONFIG_KEY_REVOCATION
- /* Srk table and key revocation check */
- #define SRK_FLAG 0x01
- #define UNREVOCABLE_KEY 4
- #define ALIGN_REVOC_KEY 3
- #define MAX_KEY_ENTRIES 4
- #endif
- #endif /* CONFIG_ESBC_HDR_LS */
- #if defined(CONFIG_FSL_ISBC_KEY_EXT)
- struct ie_key_table {
- u32 key_len;
- u8 pkey[2 * KEY_SIZE_BYTES];
- };
- struct ie_key_info {
- uint32_t key_revok;
- uint32_t num_keys;
- struct ie_key_table ie_key_tbl[32];
- };
- #endif
- #ifdef CONFIG_KEY_REVOCATION
- struct srk_table {
- u32 key_len;
- u8 pkey[2 * KEY_SIZE_BYTES];
- };
- #endif
- /*
- * SG table.
- */
- #if defined(CONFIG_FSL_TRUST_ARCH_v1) && defined(CONFIG_FSL_CORENET)
- /*
- * This struct contains the following fields
- * length of the segment
- * source address
- */
- struct fsl_secboot_sg_table {
- u32 len; /* length of the segment in bytes */
- u32 src_addr; /* ptr to the data segment */
- };
- #else
- /*
- * This struct contains the following fields
- * length of the segment
- * Destination Target ID
- * source address
- * destination address
- */
- struct fsl_secboot_sg_table {
- u32 len;
- u32 trgt_id;
- u32 src_addr;
- u32 dst_addr;
- };
- #endif
- /*
- * ESBC private structure.
- * Private structure used by ESBC to store following fields
- * ESBC client key
- * ESBC client key hash
- * ESBC client Signature
- * Encoded hash recovered from signature
- * Encoded hash of ESBC client header plus ESBC client image
- */
- struct fsl_secboot_img_priv {
- uint32_t hdr_location;
- u32 ie_addr;
- u32 key_len;
- struct fsl_secboot_img_hdr hdr;
- u8 img_key[2 * KEY_SIZE_BYTES]; /* ESBC client key */
- u8 img_key_hash[32]; /* ESBC client key hash */
- #ifdef CONFIG_KEY_REVOCATION
- struct srk_table srk_tbl[MAX_KEY_ENTRIES];
- #endif
- u8 img_sign[KEY_SIZE_BYTES]; /* ESBC client signature */
- u8 img_encoded_hash[KEY_SIZE_BYTES]; /* EM wrt RSA PKCSv1.5 */
- /* Includes hash recovered after
- * signature verification
- */
- u8 img_encoded_hash_second[KEY_SIZE_BYTES];/* EM' wrt RSA PKCSv1.5 */
- /* Includes hash of
- * ESBC client header plus
- * ESBC client image
- */
- struct fsl_secboot_sg_table sgtbl[MAX_SG_ENTRIES]; /* SG table */
- uintptr_t ehdrloc; /* ESBC Header location */
- uintptr_t *img_addr_ptr; /* ESBC Image Location */
- uint32_t img_size; /* ESBC Image Size */
- };
- int do_esbc_halt(cmd_tbl_t *cmdtp, int flag, int argc,
- char * const argv[]);
- int fsl_secboot_validate(uintptr_t haddr, char *arg_hash_str,
- uintptr_t *img_addr_ptr);
- 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,
- char * const argv[]);
- int fsl_check_boot_mode_secure(void);
- int fsl_setenv_chain_of_trust(void);
- /*
- * This function is used to validate the main U-boot binary from
- * SPL just before passing control to it using QorIQ Trust
- * Architecture header (appended to U-boot image).
- */
- void spl_validate_uboot(uint32_t hdr_addr, uintptr_t img_addr);
- #endif
|