xref: /rk3399_ARM-atf/drivers/measured_boot/rse/rse_measured_boot.c (revision 024c49484d21b7b20b320051b38cea90fb482b13)
1*024c4948STamas Ban /*
2*024c4948STamas Ban  * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
3*024c4948STamas Ban  *
4*024c4948STamas Ban  * SPDX-License-Identifier: BSD-3-Clause
5*024c4948STamas Ban  */
6*024c4948STamas Ban #include <assert.h>
7*024c4948STamas Ban #include <stdint.h>
8*024c4948STamas Ban #include <string.h>
9*024c4948STamas Ban 
10*024c4948STamas Ban #include <common/debug.h>
11*024c4948STamas Ban #include <drivers/auth/crypto_mod.h>
12*024c4948STamas Ban #include <drivers/measured_boot/rss/rss_measured_boot.h>
13*024c4948STamas Ban #include <lib/psa/measured_boot.h>
14*024c4948STamas Ban #include <psa/crypto_types.h>
15*024c4948STamas Ban #include <psa/crypto_values.h>
16*024c4948STamas Ban #include <psa/error.h>
17*024c4948STamas Ban 
18*024c4948STamas Ban #define MBOOT_ALG_SHA512 0
19*024c4948STamas Ban #define MBOOT_ALG_SHA384 1
20*024c4948STamas Ban #define MBOOT_ALG_SHA256 2
21*024c4948STamas Ban 
22*024c4948STamas Ban #if MBOOT_ALG_ID == MBOOT_ALG_SHA512
23*024c4948STamas Ban #define	CRYPTO_MD_ID		CRYPTO_MD_SHA512
24*024c4948STamas Ban #define PSA_CRYPTO_MD_ID	PSA_ALG_SHA_512
25*024c4948STamas Ban #elif MBOOT_ALG_ID == MBOOT_ALG_SHA384
26*024c4948STamas Ban #define	CRYPTO_MD_ID		CRYPTO_MD_SHA384
27*024c4948STamas Ban #define PSA_CRYPTO_MD_ID	PSA_ALG_SHA_384
28*024c4948STamas Ban #elif MBOOT_ALG_ID == MBOOT_ALG_SHA256
29*024c4948STamas Ban #define	CRYPTO_MD_ID		CRYPTO_MD_SHA256
30*024c4948STamas Ban #define PSA_CRYPTO_MD_ID	PSA_ALG_SHA_256
31*024c4948STamas Ban #else
32*024c4948STamas Ban #  error Invalid Measured Boot algorithm.
33*024c4948STamas Ban #endif /* MBOOT_ALG_ID */
34*024c4948STamas Ban 
35*024c4948STamas Ban #if ENABLE_ASSERTIONS
36*024c4948STamas Ban static bool null_arr(const uint8_t *signer_id, size_t signer_id_size)
37*024c4948STamas Ban {
38*024c4948STamas Ban 	for (size_t i = 0U; i < signer_id_size; i++) {
39*024c4948STamas Ban 		if (signer_id[i] != 0U) {
40*024c4948STamas Ban 			return false;
41*024c4948STamas Ban 		}
42*024c4948STamas Ban 	}
43*024c4948STamas Ban 
44*024c4948STamas Ban 	return true;
45*024c4948STamas Ban }
46*024c4948STamas Ban #endif /* ENABLE_ASSERTIONS */
47*024c4948STamas Ban 
48*024c4948STamas Ban /* Functions' declarations */
49*024c4948STamas Ban void rss_measured_boot_init(struct rss_mboot_metadata *metadata_ptr)
50*024c4948STamas Ban {
51*024c4948STamas Ban 	assert(metadata_ptr != NULL);
52*024c4948STamas Ban 
53*024c4948STamas Ban 	/* Init the non-const members of the metadata structure */
54*024c4948STamas Ban 	while (metadata_ptr->id != RSS_MBOOT_INVALID_ID) {
55*024c4948STamas Ban 		assert(null_arr(metadata_ptr->signer_id, MBOOT_DIGEST_SIZE));
56*024c4948STamas Ban 		metadata_ptr->sw_type_size =
57*024c4948STamas Ban 			strlen((const char *)&metadata_ptr->sw_type) + 1;
58*024c4948STamas Ban 		metadata_ptr++;
59*024c4948STamas Ban 	}
60*024c4948STamas Ban }
61*024c4948STamas Ban 
62*024c4948STamas Ban int rss_mboot_measure_and_record(struct rss_mboot_metadata *metadata_ptr,
63*024c4948STamas Ban 				 uintptr_t data_base, uint32_t data_size,
64*024c4948STamas Ban 				 uint32_t data_id)
65*024c4948STamas Ban {
66*024c4948STamas Ban 	unsigned char hash_data[CRYPTO_MD_MAX_SIZE];
67*024c4948STamas Ban 	int rc;
68*024c4948STamas Ban 	psa_status_t ret;
69*024c4948STamas Ban 
70*024c4948STamas Ban 	assert(metadata_ptr != NULL);
71*024c4948STamas Ban 
72*024c4948STamas Ban 	/* Get the metadata associated with this image. */
73*024c4948STamas Ban 	while ((metadata_ptr->id != RSS_MBOOT_INVALID_ID) &&
74*024c4948STamas Ban 		(metadata_ptr->id != data_id)) {
75*024c4948STamas Ban 		metadata_ptr++;
76*024c4948STamas Ban 	}
77*024c4948STamas Ban 
78*024c4948STamas Ban 	/* If image is not present in metadata array then skip */
79*024c4948STamas Ban 	if (metadata_ptr->id == RSS_MBOOT_INVALID_ID) {
80*024c4948STamas Ban 		return 0;
81*024c4948STamas Ban 	}
82*024c4948STamas Ban 
83*024c4948STamas Ban 	/* Calculate hash */
84*024c4948STamas Ban 	rc = crypto_mod_calc_hash(CRYPTO_MD_ID,
85*024c4948STamas Ban 				  (void *)data_base, data_size, hash_data);
86*024c4948STamas Ban 	if (rc != 0) {
87*024c4948STamas Ban 		return rc;
88*024c4948STamas Ban 	}
89*024c4948STamas Ban 
90*024c4948STamas Ban 	ret = rss_measured_boot_extend_measurement(
91*024c4948STamas Ban 						metadata_ptr->slot,
92*024c4948STamas Ban 						metadata_ptr->signer_id,
93*024c4948STamas Ban 						metadata_ptr->signer_id_size,
94*024c4948STamas Ban 						metadata_ptr->version,
95*024c4948STamas Ban 						metadata_ptr->version_size,
96*024c4948STamas Ban 						PSA_CRYPTO_MD_ID,
97*024c4948STamas Ban 						metadata_ptr->sw_type,
98*024c4948STamas Ban 						metadata_ptr->sw_type_size,
99*024c4948STamas Ban 						hash_data,
100*024c4948STamas Ban 						MBOOT_DIGEST_SIZE,
101*024c4948STamas Ban 						metadata_ptr->lock_measurement);
102*024c4948STamas Ban 	if (ret != PSA_SUCCESS) {
103*024c4948STamas Ban 		return ret;
104*024c4948STamas Ban 	}
105*024c4948STamas Ban 
106*024c4948STamas Ban 	return 0;
107*024c4948STamas Ban }
108*024c4948STamas Ban 
109*024c4948STamas Ban int rss_mboot_set_signer_id(struct rss_mboot_metadata *metadata_ptr,
110*024c4948STamas Ban 			    const void *pk_oid,
111*024c4948STamas Ban 			    const void *pk_ptr,
112*024c4948STamas Ban 			    size_t pk_len)
113*024c4948STamas Ban {
114*024c4948STamas Ban 	unsigned char hash_data[CRYPTO_MD_MAX_SIZE];
115*024c4948STamas Ban 	int rc;
116*024c4948STamas Ban 	bool hash_calc_done = false;
117*024c4948STamas Ban 
118*024c4948STamas Ban 	assert(metadata_ptr != NULL);
119*024c4948STamas Ban 
120*024c4948STamas Ban 	/*
121*024c4948STamas Ban 	 * Do an exhaustive search over the platform metadata to find
122*024c4948STamas Ban 	 * all images whose key OID matches the one passed in argument.
123*024c4948STamas Ban 	 *
124*024c4948STamas Ban 	 * Note that it is not an error if do not get any matches.
125*024c4948STamas Ban 	 * The platform may decide not to measure all of the images
126*024c4948STamas Ban 	 * in the system.
127*024c4948STamas Ban 	 */
128*024c4948STamas Ban 	while (metadata_ptr->id != RSS_MBOOT_INVALID_ID) {
129*024c4948STamas Ban 		/* Get the metadata associated with this key-oid */
130*024c4948STamas Ban 		if (metadata_ptr->pk_oid == pk_oid) {
131*024c4948STamas Ban 			if (hash_calc_done == false) {
132*024c4948STamas Ban 				/* Calculate public key hash */
133*024c4948STamas Ban 				rc = crypto_mod_calc_hash(CRYPTO_MD_ID,
134*024c4948STamas Ban 							  (void *)pk_ptr,
135*024c4948STamas Ban 							  pk_len, hash_data);
136*024c4948STamas Ban 				if (rc != 0) {
137*024c4948STamas Ban 					return rc;
138*024c4948STamas Ban 				}
139*024c4948STamas Ban 
140*024c4948STamas Ban 				hash_calc_done = true;
141*024c4948STamas Ban 			}
142*024c4948STamas Ban 
143*024c4948STamas Ban 			/*
144*024c4948STamas Ban 			 * Fill the signer-ID field with the newly/already
145*024c4948STamas Ban 			 * computed hash of the public key and update its
146*024c4948STamas Ban 			 * signer ID size field with compile-time decided
147*024c4948STamas Ban 			 * digest size.
148*024c4948STamas Ban 			 */
149*024c4948STamas Ban 			(void)memcpy(metadata_ptr->signer_id,
150*024c4948STamas Ban 				     hash_data,
151*024c4948STamas Ban 				     MBOOT_DIGEST_SIZE);
152*024c4948STamas Ban 			metadata_ptr->signer_id_size = MBOOT_DIGEST_SIZE;
153*024c4948STamas Ban 		}
154*024c4948STamas Ban 
155*024c4948STamas Ban 		metadata_ptr++;
156*024c4948STamas Ban 	}
157*024c4948STamas Ban 
158*024c4948STamas Ban 	return 0;
159*024c4948STamas Ban }
160