xref: /arm-trusted-firmware/include/drivers/nxp/auth/csf_hdr_parser/csf_hdr.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright 2017-2021 NXP
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  *
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #ifndef CSF_HDR_H
9*91f16700Schasinglulu #define CSF_HDR_H
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #include "caam.h"
12*91f16700Schasinglulu #include "hash.h"
13*91f16700Schasinglulu #include "rsa.h"
14*91f16700Schasinglulu 
15*91f16700Schasinglulu /* Barker code size in bytes */
16*91f16700Schasinglulu #define CSF_BARKER_LEN	4	/* barker code length in ESBC uboot client */
17*91f16700Schasinglulu 				/* header */
18*91f16700Schasinglulu 
19*91f16700Schasinglulu #ifdef CSF_HDR_CH3
20*91f16700Schasinglulu struct csf_hdr {
21*91f16700Schasinglulu 	uint8_t barker[CSF_BARKER_LEN];	/* 0x00 Barker code */
22*91f16700Schasinglulu 	uint32_t srk_tbl_off;		/* 0x04 SRK Table Offset */
23*91f16700Schasinglulu 
24*91f16700Schasinglulu 	struct {
25*91f16700Schasinglulu 		uint8_t num_srk;	/* 0x08 No. of keys */
26*91f16700Schasinglulu 		uint8_t srk_sel;	/*  Key no. to be used */
27*91f16700Schasinglulu 		uint8_t reserve;	/* 0x0a rseerved */
28*91f16700Schasinglulu 	} len_kr;
29*91f16700Schasinglulu 	uint8_t ie_flag;
30*91f16700Schasinglulu 
31*91f16700Schasinglulu 	uint32_t uid_flag;
32*91f16700Schasinglulu 
33*91f16700Schasinglulu 	uint32_t psign;			/* 0x10 signature offset */
34*91f16700Schasinglulu 	uint32_t sign_len;			/* 0x14 length of signature */
35*91f16700Schasinglulu 
36*91f16700Schasinglulu 	union {
37*91f16700Schasinglulu 		struct {
38*91f16700Schasinglulu 			uint32_t sg_table_offset; /* 0x18 SG Table Offset */
39*91f16700Schasinglulu 			uint32_t sg_entries;	  /* 0x1c no of entries in SG */
40*91f16700Schasinglulu 		} sg_isbc;
41*91f16700Schasinglulu 		uint64_t img_addr;	/* 64 bit pointer to ESBC Image */
42*91f16700Schasinglulu 	};
43*91f16700Schasinglulu 
44*91f16700Schasinglulu 	union {
45*91f16700Schasinglulu 		struct {
46*91f16700Schasinglulu 			uint32_t img_size;   /* ESBC client img size in bytes */
47*91f16700Schasinglulu 			uint32_t ie_key_sel;
48*91f16700Schasinglulu 		} img;
49*91f16700Schasinglulu 		uint64_t entry_point;	  /* 0x20-0x24 ESBC entry point */
50*91f16700Schasinglulu 	};
51*91f16700Schasinglulu 
52*91f16700Schasinglulu 	uint32_t fsl_uid_0;			/* 0x28 Freescale unique id 0 */
53*91f16700Schasinglulu 	uint32_t fsl_uid_1;			/* 0x2c Freescale unique id 1 */
54*91f16700Schasinglulu 	uint32_t oem_uid_0;			/* 0x30 OEM unique id 0 */
55*91f16700Schasinglulu 	uint32_t oem_uid_1;			/* 0x34 OEM unique id 1 */
56*91f16700Schasinglulu 	uint32_t oem_uid_2;			/* 0x38 OEM unique id 2 */
57*91f16700Schasinglulu 	uint32_t oem_uid_3;			/* 0x3c OEM unique id 3 */
58*91f16700Schasinglulu 	uint32_t oem_uid_4;			/* 0x40 OEM unique id 4 */
59*91f16700Schasinglulu 
60*91f16700Schasinglulu 	uint32_t reserved[3];		/* 0x44 - 0x4f */
61*91f16700Schasinglulu };
62*91f16700Schasinglulu 
63*91f16700Schasinglulu /* Srk table and key revocation check */
64*91f16700Schasinglulu #define UNREVOCABLE_KEY	8
65*91f16700Schasinglulu #define REVOC_KEY_ALIGN 7
66*91f16700Schasinglulu #define MAX_KEY_ENTRIES 8
67*91f16700Schasinglulu 
68*91f16700Schasinglulu #else
69*91f16700Schasinglulu 
70*91f16700Schasinglulu /* CSF header for Chassis 2 */
71*91f16700Schasinglulu struct csf_hdr {
72*91f16700Schasinglulu 	uint8_t barker[CSF_BARKER_LEN];	/* barker code */
73*91f16700Schasinglulu 	union {
74*91f16700Schasinglulu 		uint32_t pkey;		/* public key offset */
75*91f16700Schasinglulu 		uint32_t srk_tbl_off;
76*91f16700Schasinglulu 	};
77*91f16700Schasinglulu 
78*91f16700Schasinglulu 	union {
79*91f16700Schasinglulu 		uint32_t key_len;		/* pub key length in bytes */
80*91f16700Schasinglulu 		struct {
81*91f16700Schasinglulu 			uint32_t srk_table_flag:8;
82*91f16700Schasinglulu 			uint32_t srk_sel:8;
83*91f16700Schasinglulu 			uint32_t num_srk:16;
84*91f16700Schasinglulu 		} len_kr;
85*91f16700Schasinglulu 	};
86*91f16700Schasinglulu 
87*91f16700Schasinglulu 	uint32_t psign;		/* signature offset */
88*91f16700Schasinglulu 	uint32_t sign_len;		/* length of the signature in bytes */
89*91f16700Schasinglulu 
90*91f16700Schasinglulu 	/* SG Table used by ISBC header */
91*91f16700Schasinglulu 	union {
92*91f16700Schasinglulu 		struct {
93*91f16700Schasinglulu 			uint32_t sg_table_offset; /* 0x14 SG Table Offset */
94*91f16700Schasinglulu 			uint32_t sg_entries;	/* no of entries in SG table */
95*91f16700Schasinglulu 		} sg_isbc;
96*91f16700Schasinglulu 		struct {
97*91f16700Schasinglulu 			uint32_t reserved1;	/* Reserved field */
98*91f16700Schasinglulu 			uint32_t img_size;	/* ESBC img size in bytes */
99*91f16700Schasinglulu 		} img;
100*91f16700Schasinglulu 	};
101*91f16700Schasinglulu 
102*91f16700Schasinglulu 	uint32_t entry_point;		/* ESBC client entry point */
103*91f16700Schasinglulu 	uint32_t reserved2;		/* Scatter gather flag */
104*91f16700Schasinglulu 	uint32_t uid_flag;
105*91f16700Schasinglulu 	uint32_t fsl_uid_0;
106*91f16700Schasinglulu 	uint32_t oem_uid_0;
107*91f16700Schasinglulu 	uint32_t reserved3[2];
108*91f16700Schasinglulu 	uint32_t fsl_uid_1;
109*91f16700Schasinglulu 	uint32_t oem_uid_1;
110*91f16700Schasinglulu 
111*91f16700Schasinglulu 	/* The entries below aren't present in ISBC header */
112*91f16700Schasinglulu 	uint64_t img_addr;	/* 64 bit pointer to ESBC Image */
113*91f16700Schasinglulu 	uint32_t ie_flag;
114*91f16700Schasinglulu 	uint32_t ie_key_sel;
115*91f16700Schasinglulu };
116*91f16700Schasinglulu 
117*91f16700Schasinglulu /* Srk table and key revocation check */
118*91f16700Schasinglulu #define UNREVOCABLE_KEY	4
119*91f16700Schasinglulu #define REVOC_KEY_ALIGN 3
120*91f16700Schasinglulu #define MAX_KEY_ENTRIES 4
121*91f16700Schasinglulu 
122*91f16700Schasinglulu #endif
123*91f16700Schasinglulu 
124*91f16700Schasinglulu struct srk_table {
125*91f16700Schasinglulu 	uint32_t key_len;
126*91f16700Schasinglulu 	uint8_t pkey[2 * RSA_4K_KEY_SZ_BYTES];
127*91f16700Schasinglulu };
128*91f16700Schasinglulu 
129*91f16700Schasinglulu /*
130*91f16700Schasinglulu  * This struct contains the following fields
131*91f16700Schasinglulu  * length of the segment
132*91f16700Schasinglulu  * Destination Target ID
133*91f16700Schasinglulu  * source address
134*91f16700Schasinglulu  * destination address
135*91f16700Schasinglulu  */
136*91f16700Schasinglulu struct sg_table {
137*91f16700Schasinglulu 	uint32_t len;			/* Length of Image */
138*91f16700Schasinglulu 	uint32_t res1;
139*91f16700Schasinglulu 	union {
140*91f16700Schasinglulu 		uint64_t src_addr;	/* SRC Address of Image */
141*91f16700Schasinglulu 		struct {
142*91f16700Schasinglulu 			uint32_t src_addr;
143*91f16700Schasinglulu 			uint32_t dst_addr;
144*91f16700Schasinglulu 		} img;
145*91f16700Schasinglulu 	};
146*91f16700Schasinglulu };
147*91f16700Schasinglulu 
148*91f16700Schasinglulu int validate_esbc_header(void *img_hdr, void **img_key, uint32_t *key_len,
149*91f16700Schasinglulu 			 void **img_sign, uint32_t *sign_len,
150*91f16700Schasinglulu 			 enum sig_alg *algo);
151*91f16700Schasinglulu 
152*91f16700Schasinglulu int calc_img_hash(struct csf_hdr *hdr, void *img_addr, uint32_t img_size,
153*91f16700Schasinglulu 		  uint8_t *img_hash, uint32_t *hash_len);
154*91f16700Schasinglulu 
155*91f16700Schasinglulu #endif
156