1 /*
2  * Copyright (c) 2001-2019, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 
8 #ifndef _SECDEBUG_DEFS_H
9 #define _SECDEBUG_DEFS_H
10 
11 //#include "cc_pal_types_plat.h"
12 #include "cc_pal_sb_plat.h"
13 #include "secureboot_basetypes.h"
14 #include "secdebug_api.h"
15 #include "bootimagesverifier_def.h"
16 #include "dx_nvm.h"
17 #include "dx_crys_kernel.h"
18 #include "rsa_bsv.h"
19 #include "cc_crypto_defs.h"
20 #include "secureboot_gen_defs.h"
21 #include  "secureboot_parser_gen_defs.h"
22 
23 #define CC_BSV_SEC_DEBUG_HASH_SIZE_IN_WORDS (HASH_SHA256_DIGEST_SIZE_IN_BYTES/CC_32BIT_WORD_SIZE)
24 
25 #define CC_BSV_SEC_DEBUG_DCU_SIZE_IN_BITS   128
26 #define CC_BSV_SEC_DEBUG_DCU_SIZE_IN_BYTES   (CC_BSV_SEC_DEBUG_DCU_SIZE_IN_BITS/CC_BITS_IN_BYTE)
27 #define CC_BSV_SEC_DEBUG_DCU_SIZE_IN_WORDS   (CC_BSV_SEC_DEBUG_DCU_SIZE_IN_BITS/CC_BITS_IN_32BIT_WORD)
28 
29 /*! Defines SOC ID */
30 typedef uint8_t        SocId_t[CC_BSV_SEC_DEBUG_SOC_ID_SIZE];
31 /*! Defines DCU */
32 typedef uint32_t       Dcu_t[CC_BSV_SEC_DEBUG_DCU_SIZE_IN_WORDS];
33 
34 typedef struct {  // must be word aligned!!!
35         CCSbNParams_t   pubKey;
36         CCSbSignature_t     signature;
37 } workspaceInt_t;
38 
39 
40 /*! Secure Boot key certificate magic number. "S,B,K,C" */
41 #define CC_SB_KEY_CERT_MAGIC_NUMBER     0x53426b63
42 /*! Secure Boot content certificate magic number.  "S,B,C,C" */
43 #define CC_SB_CONTENT_CERT_MAGIC_NUMBER     0x53426363
44 /*! Certificate debug enabler magic number. */
45 #define CC_CERT_SEC_DEBUG_ENABLER_MAGIC     0x5364656E
46 /*! Certificate debug developer magic number. */
47 #define CC_CERT_SEC_DEBUG_DEVELOPER_MAGIC   0x53646465
48 
49 
50 
51 /* The  restiction mask is actualy teh ICV ownership mask; meaning all ICV bits are set to 1 , OEM bit are 0 */
52 #define DX_AO_ICV_DCU_OWNERSHIP_MASK0_REG_OFFSET                 DX_AO_ICV_DCU_RESTRICTION_MASK0_REG_OFFSET
53 #define DX_AO_ICV_DCU_OWNERSHIP_MASK0_VALUE_BIT_SHIFT           DX_AO_ICV_DCU_RESTRICTION_MASK0_VALUE_BIT_SHIFT
54 #define DX_AO_ICV_DCU_OWNERSHIP_MASK0_VALUE_BIT_SIZE               DX_AO_ICV_DCU_RESTRICTION_MASK0_VALUE_BIT_SIZE
55 #define DX_AO_ICV_DCU_OWNERSHIP_MASK1_REG_OFFSET                 DX_AO_ICV_DCU_RESTRICTION_MASK1_REG_OFFSET
56 #define DX_AO_ICV_DCU_OWNERSHIP_MASK1_VALUE_BIT_SHIFT           DX_AO_ICV_DCU_RESTRICTION_MASK1_VALUE_BIT_SHIFT
57 #define DX_AO_ICV_DCU_OWNERSHIP_MASK1_VALUE_BIT_SIZE             DX_AO_ICV_DCU_RESTRICTION_MASK1_VALUE_BIT_SIZE
58 #define DX_AO_ICV_DCU_OWNERSHIP_MASK2_REG_OFFSET                 DX_AO_ICV_DCU_RESTRICTION_MASK2_REG_OFFSET
59 #define DX_AO_ICV_DCU_OWNERSHIP_MASK2_VALUE_BIT_SHIFT           DX_AO_ICV_DCU_RESTRICTION_MASK2_VALUE_BIT_SHIFT
60 #define DX_AO_ICV_DCU_OWNERSHIP_MASK2_VALUE_BIT_SIZE               DX_AO_ICV_DCU_RESTRICTION_MASK2_VALUE_BIT_SIZE
61 #define DX_AO_ICV_DCU_OWNERSHIP_MASK3_REG_OFFSET                 DX_AO_ICV_DCU_RESTRICTION_MASK3_REG_OFFSET
62 #define DX_AO_ICV_DCU_OWNERSHIP_MASK3_VALUE_BIT_SHIFT           DX_AO_ICV_DCU_RESTRICTION_MASK3_VALUE_BIT_SHIFT
63 #define DX_AO_ICV_DCU_OWNERSHIP_MASK3_VALUE_BIT_SIZE               DX_AO_ICV_DCU_RESTRICTION_MASK3_VALUE_BIT_SIZE
64 
65 /********* Certificate structure definitions ***********/
66 
67 
68 /*! Certificate header structure. */
69 typedef struct {
70         uint32_t magicNumber;           /*!< Magic number to validate the certificate. */
71         uint32_t certVersion;           /*!< Certificate version to validate the certificate. */
72         uint32_t certSize;              /*!< Offset in words to the Certificate signature.
73                                             And number of SW components , if any exist.*/
74         uint32_t certFlags;             /*!< Bit field according to certificate type */
75 }CCSbCertHeader_t;
76 
77 
78 // All certificate header flags, first 4 bits are for certificate type,
79 // next 4 bits are rsa algorithm used.
80 // for  key certficate and enabler ecrtificate next 4 bits are HBK-id used
81 
82 /* Key certificate definitions */
83 typedef union {
84         struct {
85                 uint32_t      hbkId:4;  // must be first
86                 uint32_t      reserved:28;
87         }flagsBits;
88         uint32_t      flagsWord;
89 } keyCertFlags_t;
90 
91 typedef struct {
92         uint32_t    swVer;
93         CCHashResult_t      nextPubKeyHash;
94 } KeyCertMain_t;
95 
96 
97 typedef struct {
98         CCSbCertHeader_t    certHeader;
99         CCSbNParams_t           certPubKey;
100         KeyCertMain_t       certBody;
101         CCSbSignature_t         certSign;
102 } KeyCert_t;
103 
104 /* Content certificate definitions */
105 /*! Content Certificate flag bit field structure. */
106 typedef union {
107         /*! Flags definitions in bits.*/
108         struct {
109                 uint32_t      hbkId:4;
110                 uint32_t      swCodeEncType:4;
111                 uint32_t      swLoadVerifyScheme:4;
112                 uint32_t      swCryptoType:4;
113                 uint32_t      numOfSwCmp:16;
114         }flagsBits;
115         /*! Flags definition as a word.*/
116         uint32_t      flagsWord;
117 } CCSbCertFlags_t;
118 
119 
120 typedef struct {
121         CCHashResult_t      imageHash;
122         CCAddr_t    loadAddr;
123         uint32_t    imageMaxSize;
124         uint32_t    isAesCodeEncUsed;
125 } ContentCertImageRecord_t;
126 
127 typedef struct {
128         uint32_t    swVer;
129         CCSbNonce_t     nonce;
130         ContentCertImageRecord_t    imageRec[CC_SB_MAX_NUM_OF_IMAGES];
131 } ContentCertMain_t;
132 
133 
134 
135 typedef struct {
136         CCSbCertHeader_t    certHeader;
137         CCSbNParams_t           certPubKey;
138         ContentCertMain_t   certBody;
139         CCSbSignature_t         certSign;
140 } ContentCert_t;
141 
142 
143 /* Enabler certificate definitions */
144 typedef union {
145         struct {
146                 uint32_t      hbkId:4; // must be first
147                 uint32_t      lcs:4;
148                 uint32_t      isRma:4;
149                 uint32_t      reserved:20;
150         }flagsBits;
151         uint32_t      flagsWord;
152 } EnablerCertFlags_t;
153 
154 /* definition for enabler certificate */
155 typedef struct {
156         Dcu_t       debugMask;
157         Dcu_t       debugLock;
158         CCHashResult_t      nextPubKeyHash;
159 } EnablerCertMain_t;
160 
161 typedef struct {
162         CCSbCertHeader_t    certHeader;
163         CCSbNParams_t       certPubKey;
164         EnablerCertMain_t   certBody;
165         CCSbSignature_t         certSign;
166 } EnablerCert_t;
167 
168 /* Developer certificate definitions */
169 typedef struct {
170         struct {
171                 uint32_t      reserved:32;
172         }flagsBits;
173         uint32_t      flagsWord;
174 } DeveloperCertFlags_t;
175 
176 typedef struct {
177         Dcu_t       debugMask;
178         SocId_t         socId;
179 } DeveloperCertMain_t;
180 
181 typedef struct {
182         CCSbCertHeader_t    certHeader;
183         CCSbNParams_t        certPubKey;
184         DeveloperCertMain_t certBody;
185         CCSbSignature_t         certSign;
186 } DeveloperCert_t;
187 
188 
189 
190 /*! Certificate types structure. */
191 typedef enum {
192         /*! Reserved.*/
193         CC_SB_MIN_CERT,
194         /*! Key certificate. */
195         CC_SB_KEY_CERT = 1,
196         /*! Content certificate. */
197         CC_SB_CONTENT_CERT = 2,
198         /*! Key or content certificate. */
199         CC_SB_KEY_OR_CONTENT_CERT = 3,
200         /*! Debug enabler certificate. */
201         CC_SB_ENABLER_CERT = 4,
202         /*! Debug developer certificate. */
203         CC_SB_DEVELOPER_CERT = 5,
204         /*! Max number of certificates types.*/
205         CC_SB_MAX_CERT,
206         /*! Reserved.*/
207         CC_SB_CERT_TYPE_LAST = 0x7FFFFFFF
208 
209 }CCSbCertTypes_t;
210 
211 
212 /*! Certificate types structure. */
213 typedef enum {
214         /*! First certificate in chain.*/
215         CC_SB_FIRST_CERT_IN_CHAIN = 0,
216         /*! Second certificate in chain.*/
217         CC_SB_SECOND_CERT_IN_CHAIN = 1,
218         /*! Third and last certificate in chain.*/
219         CC_SB_THIRD_CERT_IN_CHAIN = 2,
220         /*! Last certificate in chain.*/
221         CC_SB_LAST_CERT_IN_CHAIN = 3,
222         /*! Reserved.*/
223         CC_SB_RESERVED_CERT_IN_CHAIN = 0x7FFFFFFF
224 
225 }CCSbCertOrderInChain_t;
226 
227 
228 
229 /*!  MAX size of certificate pkg. */
230 #ifdef CC_SB_X509_CERT_SUPPORTED
231 #define CC_SB_MAX_KEY_CERT_SIZE_IN_BYTES    (0x500UL)
232 #define CC_SB_MAX_CONTENT_CERT_SIZE_IN_BYTES    (0x7A0UL) /* may contain up to 16 signed sw images */
233 #define CC_SB_MAX_ENABLER_CERT_SIZE_IN_BYTES    (0x500UL)
234 #define CC_SB_MAX_DEVELOPER_CERT_SIZE_IN_BYTES  (0x500UL)
235 #define CC_SB_MAX_CERT_SIGN_SIZE_IN_BYTES               (0x1D0)
236 #else
237 #define CC_SB_MAX_KEY_CERT_SIZE_IN_BYTES    (sizeof(KeyCert_t))
238 #define CC_SB_MAX_CONTENT_CERT_SIZE_IN_BYTES    (sizeof(ContentCert_t)) /* may contain up to 16 signed sw images */
239 #define CC_SB_MAX_ENABLER_CERT_SIZE_IN_BYTES    (sizeof(EnablerCert_t))
240 #define CC_SB_MAX_DEVELOPER_CERT_SIZE_IN_BYTES  (sizeof(DeveloperCert_t))
241 #define CC_SB_MAX_CERT_SIGN_SIZE_IN_BYTES               (sizeof(CCSbSignature_t))
242 #endif
243 
244 #define CC_SB_MAX_KEY_CERT_BODY_SIZE_IN_BYTES   (sizeof(KeyCertMain_t))
245 #define CC_SB_MAX_CONTENT_CERT_BODY_SIZE_IN_BYTES   (sizeof(ContentCertMain_t)) /* may contain up to 16 signed sw images */
246 #define CC_SB_MAX_ENABLER_CERT_BODY_SIZE_IN_BYTES   (sizeof(EnablerCertMain_t))
247 #define CC_SB_MAX_DEVELOPER_CERT_BODY_SIZE_IN_BYTES (sizeof(DeveloperCertMain_t))
248 
249 #define CC_SB_MAX_CONTENT_PKG_SIZE_IN_BYTES     (CC_SB_MAX_CONTENT_CERT_SIZE_IN_BYTES + SW_REC_NONE_SIGNED_DATA_SIZE_IN_BYTES*CC_SB_MAX_NUM_OF_IMAGES)
250 
251 #define CC_SB_MAX_CERT_PKG_SIZE_IN_BYTES    (CC_SB_MAX_KEY_CERT_SIZE_IN_BYTES+CC_SB_MAX_ENABLER_CERT_SIZE_IN_BYTES+CC_SB_MAX_DEVELOPER_CERT_SIZE_IN_BYTES)
252 
253 
254 /* check KDR error bit in LCS register */
255 #define DCU_RESET_OVERRIDE_BIT_SHIFT    0x0
256 #define DCU_RESET_OVERRIDE_BIT_SIZE 0x1
257 #define IS_DCU_RESET_OVERRIDE(dcuVal)   ((dcuVal>>DCU_RESET_OVERRIDE_BIT_SHIFT) & DCU_RESET_OVERRIDE_BIT_SIZE)
258 
259 #define CLEAR_ALL_DCU(dcuVal) {\
260     dcuVal[0] = DCU_DISABLE_ALL_DBG; \
261     dcuVal[1] = DCU_DISABLE_ALL_DBG; \
262     dcuVal[2] = DCU_DISABLE_ALL_DBG; \
263     dcuVal[3] = DCU_DISABLE_ALL_DBG; \
264 }
265 
266 #define LOCK_ALL_DCU(dcuLock) {\
267     dcuLock[0] = DCU_ENABLE_ALL_DBG; \
268     dcuLock[1] = DCU_ENABLE_ALL_DBG; \
269     dcuLock[2] = DCU_ENABLE_ALL_DBG; \
270     dcuLock[3] = DCU_ENABLE_ALL_DBG; \
271 }
272 
273 
274 #define WRITE_DCU_LOCK(hwBaseAddress, dcuLock, rc) {\
275     uint32_t ii = 0;\
276     volatile uint32_t rr = 0;\
277     for (ii = 0; ii < CC_BSV_SEC_DEBUG_DCU_SIZE_IN_WORDS; ii++) {\
278         SB_HAL_WRITE_REGISTER(SB_REG_ADDR(hwBaseAddress, HOST_DCU_LOCK0) + ii * sizeof(uint32_t), dcuLock[ii]); \
279         SB_HAL_READ_REGISTER(SB_REG_ADDR(hwBaseAddress,HOST_DCU_LOCK0) + ii * sizeof(uint32_t), rr);       \
280         if(rr!=dcuLock[ii]) { \
281             rc = CC_BSV_AO_WRITE_FAILED_ERR; \
282         } \
283     }\
284 }
285 
286 #define WRITE_DCU_VAL(hwBaseAddress, dcuVal) {\
287     uint32_t ii = 0;\
288     for (ii = 0; ii < CC_BSV_SEC_DEBUG_DCU_SIZE_IN_WORDS; ii++) {\
289         SB_HAL_WRITE_REGISTER(SB_REG_ADDR(hwBaseAddress, HOST_DCU_EN0) + ii * sizeof(uint32_t), dcuVal[ii]); \
290         CC_BSV_WAIT_ON_NVM_IDLE_BIT(hwBaseAddress); \
291     }\
292 }
293 
294 /* Read-Modify-Write a field of a register */
295 #define READ_MODIFY_WRITE_AO_REGISTER(hwBaseAddress, regName, fldName, fldVal, tc) \
296 do {                                            \
297     volatile uint32_t regVal = 0; \
298     volatile uint32_t rr = 0; \
299     SB_HAL_READ_REGISTER(SB_REG_ADDR(hwBaseAddress,regName), regVal);       \
300     CC_REG_FLD_SET(DX, regName, fldName, regVal, fldVal); \
301     SB_HAL_WRITE_REGISTER(SB_REG_ADDR(hwBaseAddress, regName), regVal);       \
302     SB_HAL_READ_REGISTER(SB_REG_ADDR(hwBaseAddress,regName), rr);       \
303     if(rr!=regVal) { \
304         rc = CC_BSV_AO_WRITE_FAILED_ERR; \
305     } \
306 } while (0)
307 
308 
309 #define READ_DCU_LOCK_DEFAULT(hwBaseAddress, dcuLock, rc) \
310 do {\
311     uint32_t ii; \
312     for (ii = 0; ii<CC_OTP_DCU_SIZE_IN_WORDS; ii++) { \
313         rc = CC_BsvOTPWordRead(hwBaseAddress, (CC_OTP_DCU_OFFSET+ii), &dcuLock[ii]); \
314         if (rc != CC_OK) { \
315             break;\
316         } \
317     }  \
318 } while(0)
319 #endif
320 
321 
322