xref: /rk3399_ARM-atf/lib/psa/measured_boot.c (revision 758c64715b691be92de623f81032494e38a43cc8)
1*758c6471STamas Ban /*
2*758c6471STamas Ban  * Copyright (c) 2022, Arm Limited. All rights reserved.
3*758c6471STamas Ban  *
4*758c6471STamas Ban  * SPDX-License-Identifier: BSD-3-Clause
5*758c6471STamas Ban  *
6*758c6471STamas Ban  */
7*758c6471STamas Ban 
8*758c6471STamas Ban #include <string.h>
9*758c6471STamas Ban 
10*758c6471STamas Ban #include <common/debug.h>
11*758c6471STamas Ban #include <measured_boot.h>
12*758c6471STamas Ban #include <psa/client.h>
13*758c6471STamas Ban #include <psa_manifest/sid.h>
14*758c6471STamas Ban 
15*758c6471STamas Ban #include "measured_boot_private.h"
16*758c6471STamas Ban 
17*758c6471STamas Ban static void print_byte_array(const uint8_t *array, size_t len)
18*758c6471STamas Ban {
19*758c6471STamas Ban 	unsigned int i;
20*758c6471STamas Ban 
21*758c6471STamas Ban 	if (array == NULL || len == 0U) {
22*758c6471STamas Ban 		(void)printf("\n");
23*758c6471STamas Ban 	}
24*758c6471STamas Ban 
25*758c6471STamas Ban 	for (i = 0U; i < len; ++i) {
26*758c6471STamas Ban 		(void)printf(" %02x", array[i]);
27*758c6471STamas Ban 		if ((i & U(0xF)) == U(0xF)) {
28*758c6471STamas Ban 			(void)printf("\n");
29*758c6471STamas Ban 			if (i < (len - 1U)) {
30*758c6471STamas Ban 				INFO("\t\t:");
31*758c6471STamas Ban 			}
32*758c6471STamas Ban 		}
33*758c6471STamas Ban 	}
34*758c6471STamas Ban }
35*758c6471STamas Ban 
36*758c6471STamas Ban static void log_measurement(uint8_t index,
37*758c6471STamas Ban 			    const uint8_t *signer_id,
38*758c6471STamas Ban 			    size_t signer_id_size,
39*758c6471STamas Ban 			    const uint8_t *version,     /* string */
40*758c6471STamas Ban 			    uint32_t measurement_algo,
41*758c6471STamas Ban 			    const uint8_t *sw_type,     /* string */
42*758c6471STamas Ban 			    const uint8_t *measurement_value,
43*758c6471STamas Ban 			    size_t measurement_value_size,
44*758c6471STamas Ban 			    bool lock_measurement)
45*758c6471STamas Ban {
46*758c6471STamas Ban 	INFO("Measured boot extend measurement:\n");
47*758c6471STamas Ban 	INFO(" - slot        : %u\n", index);
48*758c6471STamas Ban 	INFO(" - signer_id   :");
49*758c6471STamas Ban 	print_byte_array(signer_id, signer_id_size);
50*758c6471STamas Ban 	INFO(" - version     : %s\n", version);
51*758c6471STamas Ban 	INFO(" - algorithm   : %x\n", measurement_algo);
52*758c6471STamas Ban 	INFO(" - sw_type     : %s\n", sw_type);
53*758c6471STamas Ban 	INFO(" - measurement :");
54*758c6471STamas Ban 	print_byte_array(measurement_value, measurement_value_size);
55*758c6471STamas Ban 	INFO(" - locking     : %s\n", lock_measurement ? "true" : "false");
56*758c6471STamas Ban }
57*758c6471STamas Ban 
58*758c6471STamas Ban psa_status_t
59*758c6471STamas Ban rss_measured_boot_extend_measurement(uint8_t index,
60*758c6471STamas Ban 				     const uint8_t *signer_id,
61*758c6471STamas Ban 				     size_t signer_id_size,
62*758c6471STamas Ban 				     const uint8_t *version,
63*758c6471STamas Ban 				     size_t version_size,
64*758c6471STamas Ban 				     uint32_t measurement_algo,
65*758c6471STamas Ban 				     const uint8_t *sw_type,
66*758c6471STamas Ban 				     size_t sw_type_size,
67*758c6471STamas Ban 				     const uint8_t *measurement_value,
68*758c6471STamas Ban 				     size_t measurement_value_size,
69*758c6471STamas Ban 				     bool lock_measurement)
70*758c6471STamas Ban {
71*758c6471STamas Ban 	struct measured_boot_extend_iovec_t extend_iov = {
72*758c6471STamas Ban 		.index = index,
73*758c6471STamas Ban 		.lock_measurement = lock_measurement,
74*758c6471STamas Ban 		.measurement_algo = measurement_algo,
75*758c6471STamas Ban 		.sw_type = {0},
76*758c6471STamas Ban 		.sw_type_size = sw_type_size,
77*758c6471STamas Ban 	};
78*758c6471STamas Ban 
79*758c6471STamas Ban 	psa_invec in_vec[] = {
80*758c6471STamas Ban 		{.base = &extend_iov,
81*758c6471STamas Ban 			.len = sizeof(struct measured_boot_extend_iovec_t)},
82*758c6471STamas Ban 		{.base = signer_id, .len = signer_id_size},
83*758c6471STamas Ban 		{.base = version, .len = version_size},
84*758c6471STamas Ban 		{.base = measurement_value, .len = measurement_value_size}
85*758c6471STamas Ban 	};
86*758c6471STamas Ban 
87*758c6471STamas Ban 	uint32_t sw_type_size_limited;
88*758c6471STamas Ban 
89*758c6471STamas Ban 	if (sw_type != NULL) {
90*758c6471STamas Ban 		sw_type_size_limited = (sw_type_size < SW_TYPE_MAX_SIZE) ?
91*758c6471STamas Ban 					sw_type_size : SW_TYPE_MAX_SIZE;
92*758c6471STamas Ban 		memcpy(extend_iov.sw_type, sw_type, sw_type_size_limited);
93*758c6471STamas Ban 	}
94*758c6471STamas Ban 
95*758c6471STamas Ban 	log_measurement(index, signer_id, signer_id_size,
96*758c6471STamas Ban 			version, measurement_algo, sw_type,
97*758c6471STamas Ban 			measurement_value, measurement_value_size,
98*758c6471STamas Ban 			lock_measurement);
99*758c6471STamas Ban 
100*758c6471STamas Ban 	return psa_call(RSS_MEASURED_BOOT_HANDLE,
101*758c6471STamas Ban 			RSS_MEASURED_BOOT_EXTEND,
102*758c6471STamas Ban 			in_vec, IOVEC_LEN(in_vec),
103*758c6471STamas Ban 			NULL, 0);
104*758c6471STamas Ban }
105