xref: /rk3399_rockchip-uboot/include/fsl_validate.h (revision 8f01397ba76d1ee210bedbf031d807e8df34c482)
147151e4bSgaurav rana /*
247151e4bSgaurav rana  * Copyright 2015 Freescale Semiconductor, Inc.
347151e4bSgaurav rana  *
447151e4bSgaurav rana  * SPDX-License-Identifier:	GPL-2.0+
547151e4bSgaurav rana  */
647151e4bSgaurav rana 
747151e4bSgaurav rana #ifndef _FSL_VALIDATE_H_
847151e4bSgaurav rana #define _FSL_VALIDATE_H_
947151e4bSgaurav rana 
1047151e4bSgaurav rana #include <fsl_sec.h>
1147151e4bSgaurav rana #include <fsl_sec_mon.h>
1247151e4bSgaurav rana #include <command.h>
1347151e4bSgaurav rana #include <linux/types.h>
1447151e4bSgaurav rana 
1547151e4bSgaurav rana #define WORD_SIZE 4
1647151e4bSgaurav rana 
1747151e4bSgaurav rana /* Minimum and maximum size of RSA signature length in bits */
1847151e4bSgaurav rana #define KEY_SIZE       4096
1947151e4bSgaurav rana #define KEY_SIZE_BYTES (KEY_SIZE/8)
2047151e4bSgaurav rana #define KEY_SIZE_WORDS (KEY_SIZE_BYTES/(WORD_SIZE))
2147151e4bSgaurav rana 
2247151e4bSgaurav rana extern struct jobring jr;
2347151e4bSgaurav rana 
2447151e4bSgaurav rana /* Barker code size in bytes */
2547151e4bSgaurav rana #define ESBC_BARKER_LEN	4	/* barker code length in ESBC uboot client */
2647151e4bSgaurav rana 				/* header */
2747151e4bSgaurav rana 
2847151e4bSgaurav rana /* No-error return values */
2947151e4bSgaurav rana #define ESBC_VALID_HDR	0	/* header is valid */
3047151e4bSgaurav rana 
3147151e4bSgaurav rana /* Maximum number of SG entries allowed */
3247151e4bSgaurav rana #define MAX_SG_ENTRIES	8
3347151e4bSgaurav rana 
34fd6dbc98SSaksham Jain /* Different Header Struct for LS-CH3 */
35fd6dbc98SSaksham Jain #ifdef CONFIG_ESBC_HDR_LS
36fd6dbc98SSaksham Jain struct fsl_secboot_img_hdr {
37fd6dbc98SSaksham Jain 	u8 barker[ESBC_BARKER_LEN];	/* barker code */
38fd6dbc98SSaksham Jain 	u32 srk_tbl_off;
39fd6dbc98SSaksham Jain 	struct {
40fd6dbc98SSaksham Jain 		u8 num_srk;
41fd6dbc98SSaksham Jain 		u8 srk_sel;
42fd6dbc98SSaksham Jain 		u8 reserve;
43fd6dbc98SSaksham Jain 		u8 ie_flag;
44fd6dbc98SSaksham Jain 	} len_kr;
45fd6dbc98SSaksham Jain 
46fd6dbc98SSaksham Jain 	u32 uid_flag;
47fd6dbc98SSaksham Jain 
48fd6dbc98SSaksham Jain 	u32 psign;		/* signature offset */
49fd6dbc98SSaksham Jain 	u32 sign_len;		/* length of the signature in bytes */
50fd6dbc98SSaksham Jain 
51fd6dbc98SSaksham Jain 	u64 pimg64;		/* 64 bit pointer to ESBC Image */
52fd6dbc98SSaksham Jain 	u32 img_size;		/* ESBC client image size in bytes */
53fd6dbc98SSaksham Jain 	u32 ie_key_sel;
54fd6dbc98SSaksham Jain 
55fd6dbc98SSaksham Jain 	u32 fsl_uid_0;
56fd6dbc98SSaksham Jain 	u32 fsl_uid_1;
57fd6dbc98SSaksham Jain 	u32 oem_uid_0;
58fd6dbc98SSaksham Jain 	u32 oem_uid_1;
59fd6dbc98SSaksham Jain 	u32 oem_uid_2;
60fd6dbc98SSaksham Jain 	u32 oem_uid_3;
61fd6dbc98SSaksham Jain 	u32 oem_uid_4;
62fd6dbc98SSaksham Jain 	u32 reserved1[3];
63fd6dbc98SSaksham Jain };
64fd6dbc98SSaksham Jain 
65fd6dbc98SSaksham Jain #ifdef CONFIG_KEY_REVOCATION
66fd6dbc98SSaksham Jain /* Srk table and key revocation check */
67fd6dbc98SSaksham Jain #define UNREVOCABLE_KEY	8
68fd6dbc98SSaksham Jain #define ALIGN_REVOC_KEY 7
69fd6dbc98SSaksham Jain #define MAX_KEY_ENTRIES 8
70fd6dbc98SSaksham Jain #endif
71fd6dbc98SSaksham Jain 
72fd6dbc98SSaksham Jain 
73fd6dbc98SSaksham Jain #else /* CONFIG_ESBC_HDR_LS */
74fd6dbc98SSaksham Jain 
7547151e4bSgaurav rana /*
7647151e4bSgaurav rana  * ESBC uboot client header structure.
7747151e4bSgaurav rana  * The struct contain the following fields
7847151e4bSgaurav rana  * barker code
7947151e4bSgaurav rana  * public key offset
8047151e4bSgaurav rana  * pub key length
8147151e4bSgaurav rana  * signature offset
8247151e4bSgaurav rana  * length of the signature
8347151e4bSgaurav rana  * ptr to SG table
8447151e4bSgaurav rana  * no of entries in SG table
8547151e4bSgaurav rana  * esbc ptr
8647151e4bSgaurav rana  * size of esbc
8747151e4bSgaurav rana  * esbc entry point
8847151e4bSgaurav rana  * Scatter gather flag
8947151e4bSgaurav rana  * UID flag
9047151e4bSgaurav rana  * FSL UID
9147151e4bSgaurav rana  * OEM UID
9247151e4bSgaurav rana  * Here, pub key is modulus concatenated with exponent
9347151e4bSgaurav rana  * of equal length
9447151e4bSgaurav rana  */
9547151e4bSgaurav rana struct fsl_secboot_img_hdr {
9647151e4bSgaurav rana 	u8 barker[ESBC_BARKER_LEN];	/* barker code */
9747151e4bSgaurav rana 	union {
9847151e4bSgaurav rana 		u32 pkey;		/* public key offset */
9947151e4bSgaurav rana #ifdef CONFIG_KEY_REVOCATION
10047151e4bSgaurav rana 		u32 srk_tbl_off;
10147151e4bSgaurav rana #endif
10247151e4bSgaurav rana 	};
10347151e4bSgaurav rana 
10447151e4bSgaurav rana 	union {
10547151e4bSgaurav rana 		u32 key_len;		/* pub key length in bytes */
10647151e4bSgaurav rana #ifdef CONFIG_KEY_REVOCATION
10747151e4bSgaurav rana 		struct {
10847151e4bSgaurav rana 			u32 srk_table_flag:8;
10947151e4bSgaurav rana 			u32 srk_sel:8;
11047151e4bSgaurav rana 			u32 num_srk:16;
11147151e4bSgaurav rana 		} len_kr;
11247151e4bSgaurav rana #endif
11347151e4bSgaurav rana 	};
11447151e4bSgaurav rana 
11547151e4bSgaurav rana 	u32 psign;		/* signature offset */
11647151e4bSgaurav rana 	u32 sign_len;		/* length of the signature in bytes */
11747151e4bSgaurav rana 	union {
1187bcb0eb2SAneesh Bansal 		u32 psgtable;	/* ptr to SG table */
1199711f528SAneesh Bansal #ifndef CONFIG_ESBC_ADDR_64BIT
1207bcb0eb2SAneesh Bansal 		u32 pimg;	/* ptr to ESBC client image */
1219711f528SAneesh Bansal #endif
12247151e4bSgaurav rana 	};
12347151e4bSgaurav rana 	union {
12447151e4bSgaurav rana 		u32 sg_entries;	/* no of entries in SG table */
12547151e4bSgaurav rana 		u32 img_size;	/* ESBC client image size in bytes */
12647151e4bSgaurav rana 	};
1277bcb0eb2SAneesh Bansal 	u32 img_start;		/* ESBC client entry point */
12847151e4bSgaurav rana 	u32 sg_flag;		/* Scatter gather flag */
12947151e4bSgaurav rana 	u32 uid_flag;
13047151e4bSgaurav rana 	u32 fsl_uid_0;
13147151e4bSgaurav rana 	u32 oem_uid_0;
13247151e4bSgaurav rana 	u32 reserved1[2];
13347151e4bSgaurav rana 	u32 fsl_uid_1;
13447151e4bSgaurav rana 	u32 oem_uid_1;
1359711f528SAneesh Bansal 	union {
13647151e4bSgaurav rana 		u32 reserved2[2];
1379711f528SAneesh Bansal #ifdef CONFIG_ESBC_ADDR_64BIT
1389711f528SAneesh Bansal 		u64 pimg64;	/* 64 bit pointer to ESBC Image */
1399711f528SAneesh Bansal #endif
1409711f528SAneesh Bansal 	};
14147151e4bSgaurav rana 	u32 ie_flag;
14247151e4bSgaurav rana 	u32 ie_key_sel;
14347151e4bSgaurav rana };
14447151e4bSgaurav rana 
145fd6dbc98SSaksham Jain #ifdef CONFIG_KEY_REVOCATION
146fd6dbc98SSaksham Jain /* Srk table and key revocation check */
147fd6dbc98SSaksham Jain #define SRK_FLAG	0x01
148fd6dbc98SSaksham Jain #define UNREVOCABLE_KEY	4
149fd6dbc98SSaksham Jain #define ALIGN_REVOC_KEY 3
150fd6dbc98SSaksham Jain #define MAX_KEY_ENTRIES 4
151fd6dbc98SSaksham Jain #endif
152fd6dbc98SSaksham Jain 
153fd6dbc98SSaksham Jain #endif /* CONFIG_ESBC_HDR_LS */
154fd6dbc98SSaksham Jain 
155fd6dbc98SSaksham Jain 
15647151e4bSgaurav rana #if defined(CONFIG_FSL_ISBC_KEY_EXT)
15747151e4bSgaurav rana struct ie_key_table {
15847151e4bSgaurav rana 	u32 key_len;
15947151e4bSgaurav rana 	u8 pkey[2 * KEY_SIZE_BYTES];
16047151e4bSgaurav rana };
16147151e4bSgaurav rana 
16247151e4bSgaurav rana struct ie_key_info {
16347151e4bSgaurav rana 	uint32_t key_revok;
16447151e4bSgaurav rana 	uint32_t num_keys;
16547151e4bSgaurav rana 	struct ie_key_table ie_key_tbl[32];
16647151e4bSgaurav rana };
16747151e4bSgaurav rana #endif
16847151e4bSgaurav rana 
16947151e4bSgaurav rana #ifdef CONFIG_KEY_REVOCATION
17047151e4bSgaurav rana struct srk_table {
17147151e4bSgaurav rana 	u32 key_len;
17247151e4bSgaurav rana 	u8 pkey[2 * KEY_SIZE_BYTES];
17347151e4bSgaurav rana };
17447151e4bSgaurav rana #endif
17547151e4bSgaurav rana 
17647151e4bSgaurav rana /*
17747151e4bSgaurav rana  * SG table.
17847151e4bSgaurav rana  */
17947151e4bSgaurav rana #if defined(CONFIG_FSL_TRUST_ARCH_v1) && defined(CONFIG_FSL_CORENET)
18047151e4bSgaurav rana /*
18147151e4bSgaurav rana  * This struct contains the following fields
18247151e4bSgaurav rana  * length of the segment
18347151e4bSgaurav rana  * source address
18447151e4bSgaurav rana  */
18547151e4bSgaurav rana struct fsl_secboot_sg_table {
18647151e4bSgaurav rana 	u32 len;		/* length of the segment in bytes */
1877bcb0eb2SAneesh Bansal 	u32 src_addr;		/* ptr to the data segment */
18847151e4bSgaurav rana };
18947151e4bSgaurav rana #else
19047151e4bSgaurav rana /*
19147151e4bSgaurav rana  * This struct contains the following fields
19247151e4bSgaurav rana  * length of the segment
19347151e4bSgaurav rana  * Destination Target ID
19447151e4bSgaurav rana  * source address
19547151e4bSgaurav rana  * destination address
19647151e4bSgaurav rana  */
19747151e4bSgaurav rana struct fsl_secboot_sg_table {
19847151e4bSgaurav rana 	u32 len;
19947151e4bSgaurav rana 	u32 trgt_id;
2007bcb0eb2SAneesh Bansal 	u32 src_addr;
2017bcb0eb2SAneesh Bansal 	u32 dst_addr;
20247151e4bSgaurav rana };
20347151e4bSgaurav rana #endif
20447151e4bSgaurav rana 
20547151e4bSgaurav rana /*
20647151e4bSgaurav rana  * ESBC private structure.
20747151e4bSgaurav rana  * Private structure used by ESBC to store following fields
20847151e4bSgaurav rana  * ESBC client key
20947151e4bSgaurav rana  * ESBC client key hash
21047151e4bSgaurav rana  * ESBC client Signature
21147151e4bSgaurav rana  * Encoded hash recovered from signature
21247151e4bSgaurav rana  * Encoded hash of ESBC client header plus ESBC client image
21347151e4bSgaurav rana  */
21447151e4bSgaurav rana struct fsl_secboot_img_priv {
21547151e4bSgaurav rana 	uint32_t hdr_location;
2167bcb0eb2SAneesh Bansal 	u32 ie_addr;
21747151e4bSgaurav rana 	u32 key_len;
21847151e4bSgaurav rana 	struct fsl_secboot_img_hdr hdr;
21947151e4bSgaurav rana 
22047151e4bSgaurav rana 	u8 img_key[2 * KEY_SIZE_BYTES];	/* ESBC client key */
22147151e4bSgaurav rana 	u8 img_key_hash[32];	/* ESBC client key hash */
22247151e4bSgaurav rana 
22347151e4bSgaurav rana #ifdef CONFIG_KEY_REVOCATION
22447151e4bSgaurav rana 	struct srk_table srk_tbl[MAX_KEY_ENTRIES];
22547151e4bSgaurav rana #endif
22647151e4bSgaurav rana 	u8 img_sign[KEY_SIZE_BYTES];		/* ESBC client signature */
22747151e4bSgaurav rana 
22847151e4bSgaurav rana 	u8 img_encoded_hash[KEY_SIZE_BYTES];	/* EM wrt RSA PKCSv1.5  */
22947151e4bSgaurav rana 						/* Includes hash recovered after
23047151e4bSgaurav rana 						 * signature verification
23147151e4bSgaurav rana 						 */
23247151e4bSgaurav rana 
23347151e4bSgaurav rana 	u8 img_encoded_hash_second[KEY_SIZE_BYTES];/* EM' wrt RSA PKCSv1.5 */
23447151e4bSgaurav rana 						/* Includes hash of
23547151e4bSgaurav rana 						 * ESBC client header plus
23647151e4bSgaurav rana 						 * ESBC client image
23747151e4bSgaurav rana 						 */
23847151e4bSgaurav rana 
23947151e4bSgaurav rana 	struct fsl_secboot_sg_table sgtbl[MAX_SG_ENTRIES];	/* SG table */
240b055a0fdSAneesh Bansal 	uintptr_t ehdrloc;	/* ESBC Header location */
24185bb3896SSaksham Jain 	uintptr_t *img_addr_ptr;	/* ESBC Image Location */
242b055a0fdSAneesh Bansal 	uint32_t img_size;	/* ESBC Image Size */
24347151e4bSgaurav rana };
24447151e4bSgaurav rana 
245c4666cf6SSaksham Jain int do_esbc_halt(cmd_tbl_t *cmdtp, int flag, int argc,
246c4666cf6SSaksham Jain 				char * const argv[]);
247c4666cf6SSaksham Jain 
248b055a0fdSAneesh Bansal int fsl_secboot_validate(uintptr_t haddr, char *arg_hash_str,
24985bb3896SSaksham Jain 	uintptr_t *img_addr_ptr);
25047151e4bSgaurav rana int fsl_secboot_blob_encap(cmd_tbl_t *cmdtp, int flag, int argc,
25147151e4bSgaurav rana 	char * const argv[]);
25247151e4bSgaurav rana int fsl_secboot_blob_decap(cmd_tbl_t *cmdtp, int flag, int argc,
25347151e4bSgaurav rana 	char * const argv[]);
25447151e4bSgaurav rana 
255d0412885SAneesh Bansal int fsl_check_boot_mode_secure(void);
256d0412885SAneesh Bansal int fsl_setenv_chain_of_trust(void);
257*8f01397bSSumit Garg 
258*8f01397bSSumit Garg /*
259*8f01397bSSumit Garg  * This function is used to validate the main U-boot binary from
260*8f01397bSSumit Garg  * SPL just before passing control to it using QorIQ Trust
261*8f01397bSSumit Garg  * Architecture header (appended to U-boot image).
262*8f01397bSSumit Garg  */
263*8f01397bSSumit Garg void spl_validate_uboot(uint32_t hdr_addr, uintptr_t img_addr);
26447151e4bSgaurav rana #endif
265