xref: /openbmc/u-boot/include/fsl_validate.h (revision e8f80a5a)
1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
247151e4bSgaurav rana /*
347151e4bSgaurav rana  * Copyright 2015 Freescale Semiconductor, Inc.
447151e4bSgaurav rana  */
547151e4bSgaurav rana 
647151e4bSgaurav rana #ifndef _FSL_VALIDATE_H_
747151e4bSgaurav rana #define _FSL_VALIDATE_H_
847151e4bSgaurav rana 
947151e4bSgaurav rana #include <fsl_sec.h>
1047151e4bSgaurav rana #include <fsl_sec_mon.h>
1147151e4bSgaurav rana #include <command.h>
1247151e4bSgaurav rana #include <linux/types.h>
1347151e4bSgaurav rana 
1447151e4bSgaurav rana #define WORD_SIZE 4
1547151e4bSgaurav rana 
1647151e4bSgaurav rana /* Minimum and maximum size of RSA signature length in bits */
1747151e4bSgaurav rana #define KEY_SIZE       4096
1847151e4bSgaurav rana #define KEY_SIZE_BYTES (KEY_SIZE/8)
1947151e4bSgaurav rana #define KEY_SIZE_WORDS (KEY_SIZE_BYTES/(WORD_SIZE))
2047151e4bSgaurav rana 
2147151e4bSgaurav rana extern struct jobring jr;
2247151e4bSgaurav rana 
2347151e4bSgaurav rana /* Barker code size in bytes */
2447151e4bSgaurav rana #define ESBC_BARKER_LEN	4	/* barker code length in ESBC uboot client */
2547151e4bSgaurav rana 				/* header */
2647151e4bSgaurav rana 
2747151e4bSgaurav rana /* No-error return values */
2847151e4bSgaurav rana #define ESBC_VALID_HDR	0	/* header is valid */
2947151e4bSgaurav rana 
3047151e4bSgaurav rana /* Maximum number of SG entries allowed */
3147151e4bSgaurav rana #define MAX_SG_ENTRIES	8
3247151e4bSgaurav rana 
33fd6dbc98SSaksham Jain /* Different Header Struct for LS-CH3 */
34fd6dbc98SSaksham Jain #ifdef CONFIG_ESBC_HDR_LS
35fd6dbc98SSaksham Jain struct fsl_secboot_img_hdr {
36fd6dbc98SSaksham Jain 	u8 barker[ESBC_BARKER_LEN];	/* barker code */
37fd6dbc98SSaksham Jain 	u32 srk_tbl_off;
38fd6dbc98SSaksham Jain 	struct {
39fd6dbc98SSaksham Jain 		u8 num_srk;
40fd6dbc98SSaksham Jain 		u8 srk_sel;
41fd6dbc98SSaksham Jain 		u8 reserve;
42fd6dbc98SSaksham Jain 	} len_kr;
43ac55dadbSUdit Agarwal 	u8 ie_flag;
44fd6dbc98SSaksham Jain 
45fd6dbc98SSaksham Jain 	u32 uid_flag;
46fd6dbc98SSaksham Jain 
47fd6dbc98SSaksham Jain 	u32 psign;		/* signature offset */
48fd6dbc98SSaksham Jain 	u32 sign_len;		/* length of the signature in bytes */
49fd6dbc98SSaksham Jain 
50fd6dbc98SSaksham Jain 	u64 pimg64;		/* 64 bit pointer to ESBC Image */
51fd6dbc98SSaksham Jain 	u32 img_size;		/* ESBC client image size in bytes */
52fd6dbc98SSaksham Jain 	u32 ie_key_sel;
53fd6dbc98SSaksham Jain 
54fd6dbc98SSaksham Jain 	u32 fsl_uid_0;
55fd6dbc98SSaksham Jain 	u32 fsl_uid_1;
56fd6dbc98SSaksham Jain 	u32 oem_uid_0;
57fd6dbc98SSaksham Jain 	u32 oem_uid_1;
58fd6dbc98SSaksham Jain 	u32 oem_uid_2;
59fd6dbc98SSaksham Jain 	u32 oem_uid_3;
60fd6dbc98SSaksham Jain 	u32 oem_uid_4;
61fd6dbc98SSaksham Jain 	u32 reserved1[3];
62fd6dbc98SSaksham Jain };
63fd6dbc98SSaksham Jain 
64fd6dbc98SSaksham Jain #ifdef CONFIG_KEY_REVOCATION
65fd6dbc98SSaksham Jain /* Srk table and key revocation check */
66fd6dbc98SSaksham Jain #define UNREVOCABLE_KEY	8
67fd6dbc98SSaksham Jain #define ALIGN_REVOC_KEY 7
68fd6dbc98SSaksham Jain #define MAX_KEY_ENTRIES 8
69fd6dbc98SSaksham Jain #endif
70fd6dbc98SSaksham Jain 
71ac55dadbSUdit Agarwal #if defined(CONFIG_FSL_ISBC_KEY_EXT)
72ac55dadbSUdit Agarwal #define IE_FLAG_MASK 0x1
73ac55dadbSUdit Agarwal #define SCRATCH_IE_LOW_ADR 13
74ac55dadbSUdit Agarwal #define SCRATCH_IE_HIGH_ADR 14
75ac55dadbSUdit Agarwal #endif
76fd6dbc98SSaksham Jain 
77fd6dbc98SSaksham Jain #else /* CONFIG_ESBC_HDR_LS */
78fd6dbc98SSaksham Jain 
7947151e4bSgaurav rana /*
8047151e4bSgaurav rana  * ESBC uboot client header structure.
8147151e4bSgaurav rana  * The struct contain the following fields
8247151e4bSgaurav rana  * barker code
8347151e4bSgaurav rana  * public key offset
8447151e4bSgaurav rana  * pub key length
8547151e4bSgaurav rana  * signature offset
8647151e4bSgaurav rana  * length of the signature
8747151e4bSgaurav rana  * ptr to SG table
8847151e4bSgaurav rana  * no of entries in SG table
8947151e4bSgaurav rana  * esbc ptr
9047151e4bSgaurav rana  * size of esbc
9147151e4bSgaurav rana  * esbc entry point
9247151e4bSgaurav rana  * Scatter gather flag
9347151e4bSgaurav rana  * UID flag
9447151e4bSgaurav rana  * FSL UID
9547151e4bSgaurav rana  * OEM UID
9647151e4bSgaurav rana  * Here, pub key is modulus concatenated with exponent
9747151e4bSgaurav rana  * of equal length
9847151e4bSgaurav rana  */
9947151e4bSgaurav rana struct fsl_secboot_img_hdr {
10047151e4bSgaurav rana 	u8 barker[ESBC_BARKER_LEN];	/* barker code */
10147151e4bSgaurav rana 	union {
10247151e4bSgaurav rana 		u32 pkey;		/* public key offset */
10347151e4bSgaurav rana #ifdef CONFIG_KEY_REVOCATION
10447151e4bSgaurav rana 		u32 srk_tbl_off;
10547151e4bSgaurav rana #endif
10647151e4bSgaurav rana 	};
10747151e4bSgaurav rana 
10847151e4bSgaurav rana 	union {
10947151e4bSgaurav rana 		u32 key_len;		/* pub key length in bytes */
11047151e4bSgaurav rana #ifdef CONFIG_KEY_REVOCATION
11147151e4bSgaurav rana 		struct {
11247151e4bSgaurav rana 			u32 srk_table_flag:8;
11347151e4bSgaurav rana 			u32 srk_sel:8;
11447151e4bSgaurav rana 			u32 num_srk:16;
11547151e4bSgaurav rana 		} len_kr;
11647151e4bSgaurav rana #endif
11747151e4bSgaurav rana 	};
11847151e4bSgaurav rana 
11947151e4bSgaurav rana 	u32 psign;		/* signature offset */
12047151e4bSgaurav rana 	u32 sign_len;		/* length of the signature in bytes */
12147151e4bSgaurav rana 	union {
1227bcb0eb2SAneesh Bansal 		u32 psgtable;	/* ptr to SG table */
1239711f528SAneesh Bansal #ifndef CONFIG_ESBC_ADDR_64BIT
1247bcb0eb2SAneesh Bansal 		u32 pimg;	/* ptr to ESBC client image */
1259711f528SAneesh Bansal #endif
12647151e4bSgaurav rana 	};
12747151e4bSgaurav rana 	union {
12847151e4bSgaurav rana 		u32 sg_entries;	/* no of entries in SG table */
12947151e4bSgaurav rana 		u32 img_size;	/* ESBC client image size in bytes */
13047151e4bSgaurav rana 	};
1317bcb0eb2SAneesh Bansal 	u32 img_start;		/* ESBC client entry point */
13247151e4bSgaurav rana 	u32 sg_flag;		/* Scatter gather flag */
13347151e4bSgaurav rana 	u32 uid_flag;
13447151e4bSgaurav rana 	u32 fsl_uid_0;
13547151e4bSgaurav rana 	u32 oem_uid_0;
13647151e4bSgaurav rana 	u32 reserved1[2];
13747151e4bSgaurav rana 	u32 fsl_uid_1;
13847151e4bSgaurav rana 	u32 oem_uid_1;
1399711f528SAneesh Bansal 	union {
14047151e4bSgaurav rana 		u32 reserved2[2];
1419711f528SAneesh Bansal #ifdef CONFIG_ESBC_ADDR_64BIT
1429711f528SAneesh Bansal 		u64 pimg64;	/* 64 bit pointer to ESBC Image */
1439711f528SAneesh Bansal #endif
1449711f528SAneesh Bansal 	};
14547151e4bSgaurav rana 	u32 ie_flag;
14647151e4bSgaurav rana 	u32 ie_key_sel;
14747151e4bSgaurav rana };
14847151e4bSgaurav rana 
149fd6dbc98SSaksham Jain #ifdef CONFIG_KEY_REVOCATION
150fd6dbc98SSaksham Jain /* Srk table and key revocation check */
151fd6dbc98SSaksham Jain #define SRK_FLAG	0x01
152fd6dbc98SSaksham Jain #define UNREVOCABLE_KEY	4
153fd6dbc98SSaksham Jain #define ALIGN_REVOC_KEY 3
154fd6dbc98SSaksham Jain #define MAX_KEY_ENTRIES 4
155fd6dbc98SSaksham Jain #endif
156fd6dbc98SSaksham Jain 
157ac55dadbSUdit Agarwal #if defined(CONFIG_FSL_ISBC_KEY_EXT)
158ac55dadbSUdit Agarwal #define IE_FLAG_MASK 0xFFFFFFFF
159ac55dadbSUdit Agarwal #endif
160ac55dadbSUdit Agarwal 
161fd6dbc98SSaksham Jain #endif /* CONFIG_ESBC_HDR_LS */
162fd6dbc98SSaksham Jain 
163fd6dbc98SSaksham Jain 
16447151e4bSgaurav rana #if defined(CONFIG_FSL_ISBC_KEY_EXT)
16547151e4bSgaurav rana struct ie_key_table {
16647151e4bSgaurav rana 	u32 key_len;
16747151e4bSgaurav rana 	u8 pkey[2 * KEY_SIZE_BYTES];
16847151e4bSgaurav rana };
16947151e4bSgaurav rana 
17047151e4bSgaurav rana struct ie_key_info {
17147151e4bSgaurav rana 	uint32_t key_revok;
17247151e4bSgaurav rana 	uint32_t num_keys;
17347151e4bSgaurav rana 	struct ie_key_table ie_key_tbl[32];
17447151e4bSgaurav rana };
17547151e4bSgaurav rana #endif
17647151e4bSgaurav rana 
17747151e4bSgaurav rana #ifdef CONFIG_KEY_REVOCATION
17847151e4bSgaurav rana struct srk_table {
17947151e4bSgaurav rana 	u32 key_len;
18047151e4bSgaurav rana 	u8 pkey[2 * KEY_SIZE_BYTES];
18147151e4bSgaurav rana };
18247151e4bSgaurav rana #endif
18347151e4bSgaurav rana 
18447151e4bSgaurav rana /*
18547151e4bSgaurav rana  * SG table.
18647151e4bSgaurav rana  */
18747151e4bSgaurav rana #if defined(CONFIG_FSL_TRUST_ARCH_v1) && defined(CONFIG_FSL_CORENET)
18847151e4bSgaurav rana /*
18947151e4bSgaurav rana  * This struct contains the following fields
19047151e4bSgaurav rana  * length of the segment
19147151e4bSgaurav rana  * source address
19247151e4bSgaurav rana  */
19347151e4bSgaurav rana struct fsl_secboot_sg_table {
19447151e4bSgaurav rana 	u32 len;		/* length of the segment in bytes */
1957bcb0eb2SAneesh Bansal 	u32 src_addr;		/* ptr to the data segment */
19647151e4bSgaurav rana };
19747151e4bSgaurav rana #else
19847151e4bSgaurav rana /*
19947151e4bSgaurav rana  * This struct contains the following fields
20047151e4bSgaurav rana  * length of the segment
20147151e4bSgaurav rana  * Destination Target ID
20247151e4bSgaurav rana  * source address
20347151e4bSgaurav rana  * destination address
20447151e4bSgaurav rana  */
20547151e4bSgaurav rana struct fsl_secboot_sg_table {
20647151e4bSgaurav rana 	u32 len;
20747151e4bSgaurav rana 	u32 trgt_id;
2087bcb0eb2SAneesh Bansal 	u32 src_addr;
2097bcb0eb2SAneesh Bansal 	u32 dst_addr;
21047151e4bSgaurav rana };
21147151e4bSgaurav rana #endif
21247151e4bSgaurav rana 
213ac55dadbSUdit Agarwal /* ESBC global structure.
214ac55dadbSUdit Agarwal  * Data to be used across verification of different images.
215ac55dadbSUdit Agarwal  * Stores follwoing Data:
216ac55dadbSUdit Agarwal  * IE Table
217ac55dadbSUdit Agarwal  */
218ac55dadbSUdit Agarwal struct fsl_secboot_glb {
219ac55dadbSUdit Agarwal #if defined(CONFIG_FSL_ISBC_KEY_EXT)
220ac55dadbSUdit Agarwal 	uintptr_t ie_addr;
221ac55dadbSUdit Agarwal 	struct ie_key_info ie_tbl;
222ac55dadbSUdit Agarwal #endif
223ac55dadbSUdit Agarwal };
22447151e4bSgaurav rana /*
22547151e4bSgaurav rana  * ESBC private structure.
22647151e4bSgaurav rana  * Private structure used by ESBC to store following fields
22747151e4bSgaurav rana  * ESBC client key
22847151e4bSgaurav rana  * ESBC client key hash
22947151e4bSgaurav rana  * ESBC client Signature
23047151e4bSgaurav rana  * Encoded hash recovered from signature
23147151e4bSgaurav rana  * Encoded hash of ESBC client header plus ESBC client image
23247151e4bSgaurav rana  */
23347151e4bSgaurav rana struct fsl_secboot_img_priv {
23447151e4bSgaurav rana 	uint32_t hdr_location;
235ac55dadbSUdit Agarwal 	uintptr_t ie_addr;
23647151e4bSgaurav rana 	u32 key_len;
23747151e4bSgaurav rana 	struct fsl_secboot_img_hdr hdr;
23847151e4bSgaurav rana 
23947151e4bSgaurav rana 	u8 img_key[2 * KEY_SIZE_BYTES];	/* ESBC client key */
24047151e4bSgaurav rana 	u8 img_key_hash[32];	/* ESBC client key hash */
24147151e4bSgaurav rana 
24247151e4bSgaurav rana #ifdef CONFIG_KEY_REVOCATION
24347151e4bSgaurav rana 	struct srk_table srk_tbl[MAX_KEY_ENTRIES];
24447151e4bSgaurav rana #endif
24547151e4bSgaurav rana 	u8 img_sign[KEY_SIZE_BYTES];		/* ESBC client signature */
24647151e4bSgaurav rana 
24747151e4bSgaurav rana 	u8 img_encoded_hash[KEY_SIZE_BYTES];	/* EM wrt RSA PKCSv1.5  */
24847151e4bSgaurav rana 						/* Includes hash recovered after
24947151e4bSgaurav rana 						 * signature verification
25047151e4bSgaurav rana 						 */
25147151e4bSgaurav rana 
25247151e4bSgaurav rana 	u8 img_encoded_hash_second[KEY_SIZE_BYTES];/* EM' wrt RSA PKCSv1.5 */
25347151e4bSgaurav rana 						/* Includes hash of
25447151e4bSgaurav rana 						 * ESBC client header plus
25547151e4bSgaurav rana 						 * ESBC client image
25647151e4bSgaurav rana 						 */
25747151e4bSgaurav rana 
25847151e4bSgaurav rana 	struct fsl_secboot_sg_table sgtbl[MAX_SG_ENTRIES];	/* SG table */
259b055a0fdSAneesh Bansal 	uintptr_t ehdrloc;	/* ESBC Header location */
26085bb3896SSaksham Jain 	uintptr_t *img_addr_ptr;	/* ESBC Image Location */
261b055a0fdSAneesh Bansal 	uint32_t img_size;	/* ESBC Image Size */
26247151e4bSgaurav rana };
26347151e4bSgaurav rana 
264c4666cf6SSaksham Jain int do_esbc_halt(cmd_tbl_t *cmdtp, int flag, int argc,
265c4666cf6SSaksham Jain 				char * const argv[]);
266c4666cf6SSaksham Jain 
267b055a0fdSAneesh Bansal int fsl_secboot_validate(uintptr_t haddr, char *arg_hash_str,
26885bb3896SSaksham Jain 	uintptr_t *img_addr_ptr);
26947151e4bSgaurav rana int fsl_secboot_blob_encap(cmd_tbl_t *cmdtp, int flag, int argc,
27047151e4bSgaurav rana 	char * const argv[]);
27147151e4bSgaurav rana int fsl_secboot_blob_decap(cmd_tbl_t *cmdtp, int flag, int argc,
27247151e4bSgaurav rana 	char * const argv[]);
27347151e4bSgaurav rana 
274d0412885SAneesh Bansal int fsl_check_boot_mode_secure(void);
275d0412885SAneesh Bansal int fsl_setenv_chain_of_trust(void);
2768f01397bSSumit Garg 
2778f01397bSSumit Garg /*
2788f01397bSSumit Garg  * This function is used to validate the main U-boot binary from
2798f01397bSSumit Garg  * SPL just before passing control to it using QorIQ Trust
2808f01397bSSumit Garg  * Architecture header (appended to U-boot image).
2818f01397bSSumit Garg  */
2828f01397bSSumit Garg void spl_validate_uboot(uint32_t hdr_addr, uintptr_t img_addr);
28347151e4bSgaurav rana #endif
284