xref: /arm-trusted-firmware/drivers/measured_boot/event_log/event_print.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2020, Arm Limited. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <assert.h>
8*91f16700Schasinglulu #include <string.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <common/debug.h>
11*91f16700Schasinglulu #include <drivers/measured_boot/event_log/event_log.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #if LOG_LEVEL >= EVENT_LOG_LEVEL
14*91f16700Schasinglulu 
15*91f16700Schasinglulu /*
16*91f16700Schasinglulu  * Print TCG_EfiSpecIDEventStruct
17*91f16700Schasinglulu  *
18*91f16700Schasinglulu  * @param[in/out] log_addr	Pointer to Event Log
19*91f16700Schasinglulu  * @param[in/out] log_size	Pointer to Event Log size
20*91f16700Schasinglulu  */
21*91f16700Schasinglulu static void id_event_print(uint8_t **log_addr, size_t *log_size)
22*91f16700Schasinglulu {
23*91f16700Schasinglulu 	unsigned int i;
24*91f16700Schasinglulu 	uint8_t info_size, *info_size_ptr;
25*91f16700Schasinglulu 	void *ptr = *log_addr;
26*91f16700Schasinglulu 	id_event_headers_t *event = (id_event_headers_t *)ptr;
27*91f16700Schasinglulu 	id_event_algorithm_size_t *alg_ptr;
28*91f16700Schasinglulu 	uint32_t event_size, number_of_algorithms;
29*91f16700Schasinglulu 	size_t digest_len;
30*91f16700Schasinglulu #if ENABLE_ASSERTIONS
31*91f16700Schasinglulu 	const uint8_t *end_ptr = (uint8_t *)((uintptr_t)*log_addr + *log_size);
32*91f16700Schasinglulu 	bool valid = true;
33*91f16700Schasinglulu #endif
34*91f16700Schasinglulu 
35*91f16700Schasinglulu 	assert(*log_size >= sizeof(id_event_headers_t));
36*91f16700Schasinglulu 
37*91f16700Schasinglulu 	/* The fields of the event log header are defined to be PCRIndex of 0,
38*91f16700Schasinglulu 	 * EventType of EV_NO_ACTION, Digest of 20 bytes of 0, and
39*91f16700Schasinglulu 	 * Event content defined as TCG_EfiSpecIDEventStruct.
40*91f16700Schasinglulu 	 */
41*91f16700Schasinglulu 	LOG_EVENT("TCG_EfiSpecIDEvent:\n");
42*91f16700Schasinglulu 	LOG_EVENT("  PCRIndex           : %u\n", event->header.pcr_index);
43*91f16700Schasinglulu 	assert(event->header.pcr_index == (uint32_t)PCR_0);
44*91f16700Schasinglulu 
45*91f16700Schasinglulu 	LOG_EVENT("  EventType          : %u\n", event->header.event_type);
46*91f16700Schasinglulu 	assert(event->header.event_type == EV_NO_ACTION);
47*91f16700Schasinglulu 
48*91f16700Schasinglulu 	LOG_EVENT("  Digest             :");
49*91f16700Schasinglulu 	for (i = 0U; i < sizeof(event->header.digest); ++i) {
50*91f16700Schasinglulu 		uint8_t val = event->header.digest[i];
51*91f16700Schasinglulu 
52*91f16700Schasinglulu 		(void)printf(" %02x", val);
53*91f16700Schasinglulu 		if ((i & U(0xF)) == 0U) {
54*91f16700Schasinglulu 			(void)printf("\n");
55*91f16700Schasinglulu 			LOG_EVENT("\t\t      :");
56*91f16700Schasinglulu 		}
57*91f16700Schasinglulu #if ENABLE_ASSERTIONS
58*91f16700Schasinglulu 		if (val != 0U) {
59*91f16700Schasinglulu 			valid = false;
60*91f16700Schasinglulu 		}
61*91f16700Schasinglulu #endif
62*91f16700Schasinglulu 	}
63*91f16700Schasinglulu 	if ((i & U(0xF)) != 0U) {
64*91f16700Schasinglulu 		(void)printf("\n");
65*91f16700Schasinglulu 	}
66*91f16700Schasinglulu 
67*91f16700Schasinglulu 	assert(valid);
68*91f16700Schasinglulu 
69*91f16700Schasinglulu 	/* EventSize */
70*91f16700Schasinglulu 	event_size = event->header.event_size;
71*91f16700Schasinglulu 	LOG_EVENT("  EventSize          : %u\n", event_size);
72*91f16700Schasinglulu 
73*91f16700Schasinglulu 	LOG_EVENT("  Signature          : %s\n",
74*91f16700Schasinglulu 			event->struct_header.signature);
75*91f16700Schasinglulu 	LOG_EVENT("  PlatformClass      : %u\n",
76*91f16700Schasinglulu 			event->struct_header.platform_class);
77*91f16700Schasinglulu 	LOG_EVENT("  SpecVersion        : %u.%u.%u\n",
78*91f16700Schasinglulu 			event->struct_header.spec_version_major,
79*91f16700Schasinglulu 			event->struct_header.spec_version_minor,
80*91f16700Schasinglulu 			event->struct_header.spec_errata);
81*91f16700Schasinglulu 	LOG_EVENT("  UintnSize          : %u\n",
82*91f16700Schasinglulu 			event->struct_header.uintn_size);
83*91f16700Schasinglulu 
84*91f16700Schasinglulu 	/* NumberOfAlgorithms */
85*91f16700Schasinglulu 	number_of_algorithms = event->struct_header.number_of_algorithms;
86*91f16700Schasinglulu 	LOG_EVENT("  NumberOfAlgorithms : %u\n", number_of_algorithms);
87*91f16700Schasinglulu 
88*91f16700Schasinglulu 	/* Address of DigestSizes[] */
89*91f16700Schasinglulu 	alg_ptr = event->struct_header.digest_size;
90*91f16700Schasinglulu 
91*91f16700Schasinglulu 	/* Size of DigestSizes[] */
92*91f16700Schasinglulu 	digest_len = number_of_algorithms * sizeof(id_event_algorithm_size_t);
93*91f16700Schasinglulu 	assert(((uintptr_t)alg_ptr + digest_len) <= (uintptr_t)end_ptr);
94*91f16700Schasinglulu 
95*91f16700Schasinglulu 	LOG_EVENT("  DigestSizes        :\n");
96*91f16700Schasinglulu 	for (i = 0U; i < number_of_algorithms; ++i) {
97*91f16700Schasinglulu 		LOG_EVENT("    #%u AlgorithmId   : SHA", i);
98*91f16700Schasinglulu 		uint16_t algorithm_id = alg_ptr[i].algorithm_id;
99*91f16700Schasinglulu 
100*91f16700Schasinglulu 		switch (algorithm_id) {
101*91f16700Schasinglulu 		case TPM_ALG_SHA256:
102*91f16700Schasinglulu 			(void)printf("256\n");
103*91f16700Schasinglulu 			break;
104*91f16700Schasinglulu 		case TPM_ALG_SHA384:
105*91f16700Schasinglulu 			(void)printf("384\n");
106*91f16700Schasinglulu 			break;
107*91f16700Schasinglulu 		case TPM_ALG_SHA512:
108*91f16700Schasinglulu 			(void)printf("512\n");
109*91f16700Schasinglulu 			break;
110*91f16700Schasinglulu 		default:
111*91f16700Schasinglulu 			(void)printf("?\n");
112*91f16700Schasinglulu 			ERROR("Algorithm 0x%x not found\n", algorithm_id);
113*91f16700Schasinglulu 			assert(false);
114*91f16700Schasinglulu 		}
115*91f16700Schasinglulu 
116*91f16700Schasinglulu 		LOG_EVENT("       DigestSize    : %u\n",
117*91f16700Schasinglulu 					alg_ptr[i].digest_size);
118*91f16700Schasinglulu 	}
119*91f16700Schasinglulu 
120*91f16700Schasinglulu 	/* Address of VendorInfoSize */
121*91f16700Schasinglulu 	info_size_ptr = (uint8_t *)((uintptr_t)alg_ptr + digest_len);
122*91f16700Schasinglulu 	assert((uintptr_t)info_size_ptr <= (uintptr_t)end_ptr);
123*91f16700Schasinglulu 
124*91f16700Schasinglulu 	info_size = *info_size_ptr++;
125*91f16700Schasinglulu 	LOG_EVENT("  VendorInfoSize     : %u\n", info_size);
126*91f16700Schasinglulu 
127*91f16700Schasinglulu 	/* Check VendorInfo end address */
128*91f16700Schasinglulu 	assert(((uintptr_t)info_size_ptr + info_size) <= (uintptr_t)end_ptr);
129*91f16700Schasinglulu 
130*91f16700Schasinglulu 	/* Check EventSize */
131*91f16700Schasinglulu 	assert(event_size == (sizeof(id_event_struct_t) +
132*91f16700Schasinglulu 				digest_len + info_size));
133*91f16700Schasinglulu 	if (info_size != 0U) {
134*91f16700Schasinglulu 		LOG_EVENT("  VendorInfo         :");
135*91f16700Schasinglulu 		for (i = 0U; i < info_size; ++i) {
136*91f16700Schasinglulu 			(void)printf(" %02x", *info_size_ptr++);
137*91f16700Schasinglulu 		}
138*91f16700Schasinglulu 		(void)printf("\n");
139*91f16700Schasinglulu 	}
140*91f16700Schasinglulu 
141*91f16700Schasinglulu 	*log_size -= (uintptr_t)info_size_ptr - (uintptr_t)*log_addr;
142*91f16700Schasinglulu 	*log_addr = info_size_ptr;
143*91f16700Schasinglulu }
144*91f16700Schasinglulu 
145*91f16700Schasinglulu /*
146*91f16700Schasinglulu  * Print TCG_PCR_EVENT2
147*91f16700Schasinglulu  *
148*91f16700Schasinglulu  * @param[in/out] log_addr	Pointer to Event Log
149*91f16700Schasinglulu  * @param[in/out] log_size	Pointer to Event Log size
150*91f16700Schasinglulu  */
151*91f16700Schasinglulu static void event2_print(uint8_t **log_addr, size_t *log_size)
152*91f16700Schasinglulu {
153*91f16700Schasinglulu 	uint32_t event_size, count;
154*91f16700Schasinglulu 	size_t sha_size, digests_size = 0U;
155*91f16700Schasinglulu 	void *ptr = *log_addr;
156*91f16700Schasinglulu #if ENABLE_ASSERTIONS
157*91f16700Schasinglulu 	const uint8_t *end_ptr = (uint8_t *)((uintptr_t)*log_addr + *log_size);
158*91f16700Schasinglulu #endif
159*91f16700Schasinglulu 
160*91f16700Schasinglulu 	assert(*log_size >= sizeof(event2_header_t));
161*91f16700Schasinglulu 
162*91f16700Schasinglulu 	LOG_EVENT("PCR_Event2:\n");
163*91f16700Schasinglulu 	LOG_EVENT("  PCRIndex           : %u\n",
164*91f16700Schasinglulu 			((event2_header_t *)ptr)->pcr_index);
165*91f16700Schasinglulu 	LOG_EVENT("  EventType          : %u\n",
166*91f16700Schasinglulu 			((event2_header_t *)ptr)->event_type);
167*91f16700Schasinglulu 
168*91f16700Schasinglulu 	count = ((event2_header_t *)ptr)->digests.count;
169*91f16700Schasinglulu 	LOG_EVENT("  Digests Count      : %u\n", count);
170*91f16700Schasinglulu 
171*91f16700Schasinglulu 	/* Address of TCG_PCR_EVENT2.Digests[] */
172*91f16700Schasinglulu 	ptr = (uint8_t *)ptr + sizeof(event2_header_t);
173*91f16700Schasinglulu 	assert(((uintptr_t)ptr <= (uintptr_t)end_ptr) && (count != 0U));
174*91f16700Schasinglulu 
175*91f16700Schasinglulu 	for (unsigned int i = 0U; i < count; ++i) {
176*91f16700Schasinglulu 		/* Check AlgorithmId address */
177*91f16700Schasinglulu 		assert(((uintptr_t)ptr +
178*91f16700Schasinglulu 			offsetof(tpmt_ha, digest)) <= (uintptr_t)end_ptr);
179*91f16700Schasinglulu 
180*91f16700Schasinglulu 		LOG_EVENT("    #%u AlgorithmId   : SHA", i);
181*91f16700Schasinglulu 		switch (((tpmt_ha *)ptr)->algorithm_id) {
182*91f16700Schasinglulu 		case TPM_ALG_SHA256:
183*91f16700Schasinglulu 			sha_size = SHA256_DIGEST_SIZE;
184*91f16700Schasinglulu 			(void)printf("256\n");
185*91f16700Schasinglulu 			break;
186*91f16700Schasinglulu 		case TPM_ALG_SHA384:
187*91f16700Schasinglulu 			sha_size = SHA384_DIGEST_SIZE;
188*91f16700Schasinglulu 			(void)printf("384\n");
189*91f16700Schasinglulu 			break;
190*91f16700Schasinglulu 		case TPM_ALG_SHA512:
191*91f16700Schasinglulu 			sha_size = SHA512_DIGEST_SIZE;
192*91f16700Schasinglulu 			(void)printf("512\n");
193*91f16700Schasinglulu 			break;
194*91f16700Schasinglulu 		default:
195*91f16700Schasinglulu 			(void)printf("?\n");
196*91f16700Schasinglulu 			ERROR("Algorithm 0x%x not found\n",
197*91f16700Schasinglulu 				((tpmt_ha *)ptr)->algorithm_id);
198*91f16700Schasinglulu 			panic();
199*91f16700Schasinglulu 		}
200*91f16700Schasinglulu 
201*91f16700Schasinglulu 		/* End of Digest[] */
202*91f16700Schasinglulu 		ptr = (uint8_t *)((uintptr_t)ptr + offsetof(tpmt_ha, digest));
203*91f16700Schasinglulu 		assert(((uintptr_t)ptr + sha_size) <= (uintptr_t)end_ptr);
204*91f16700Schasinglulu 
205*91f16700Schasinglulu 		/* Total size of all digests */
206*91f16700Schasinglulu 		digests_size += sha_size;
207*91f16700Schasinglulu 
208*91f16700Schasinglulu 		LOG_EVENT("       Digest        :");
209*91f16700Schasinglulu 		for (unsigned int j = 0U; j < sha_size; ++j) {
210*91f16700Schasinglulu 			(void)printf(" %02x", *(uint8_t *)ptr++);
211*91f16700Schasinglulu 			if ((j & U(0xF)) == U(0xF)) {
212*91f16700Schasinglulu 				(void)printf("\n");
213*91f16700Schasinglulu 				if (j < (sha_size - 1U)) {
214*91f16700Schasinglulu 					LOG_EVENT("\t\t      :");
215*91f16700Schasinglulu 				}
216*91f16700Schasinglulu 			}
217*91f16700Schasinglulu 		}
218*91f16700Schasinglulu 	}
219*91f16700Schasinglulu 
220*91f16700Schasinglulu 	/* TCG_PCR_EVENT2.EventSize */
221*91f16700Schasinglulu 	assert(((uintptr_t)ptr + offsetof(event2_data_t, event)) <= (uintptr_t)end_ptr);
222*91f16700Schasinglulu 
223*91f16700Schasinglulu 	event_size = ((event2_data_t *)ptr)->event_size;
224*91f16700Schasinglulu 	LOG_EVENT("  EventSize          : %u\n", event_size);
225*91f16700Schasinglulu 
226*91f16700Schasinglulu 	/* Address of TCG_PCR_EVENT2.Event[EventSize] */
227*91f16700Schasinglulu 	ptr = (uint8_t *)((uintptr_t)ptr + offsetof(event2_data_t, event));
228*91f16700Schasinglulu 
229*91f16700Schasinglulu 	/* End of TCG_PCR_EVENT2.Event[EventSize] */
230*91f16700Schasinglulu 	assert(((uintptr_t)ptr + event_size) <= (uintptr_t)end_ptr);
231*91f16700Schasinglulu 
232*91f16700Schasinglulu 	if ((event_size == sizeof(startup_locality_event_t)) &&
233*91f16700Schasinglulu 	     (strcmp((const char *)ptr, TCG_STARTUP_LOCALITY_SIGNATURE) == 0)) {
234*91f16700Schasinglulu 		LOG_EVENT("  Signature          : %s\n",
235*91f16700Schasinglulu 			((startup_locality_event_t *)ptr)->signature);
236*91f16700Schasinglulu 		LOG_EVENT("  StartupLocality    : %u\n",
237*91f16700Schasinglulu 			((startup_locality_event_t *)ptr)->startup_locality);
238*91f16700Schasinglulu 	} else {
239*91f16700Schasinglulu 		LOG_EVENT("  Event              : %s\n", (uint8_t *)ptr);
240*91f16700Schasinglulu 	}
241*91f16700Schasinglulu 
242*91f16700Schasinglulu 	*log_size -= (uintptr_t)ptr + event_size - (uintptr_t)*log_addr;
243*91f16700Schasinglulu 	*log_addr = (uint8_t *)ptr + event_size;
244*91f16700Schasinglulu }
245*91f16700Schasinglulu #endif	/* LOG_LEVEL >= EVENT_LOG_LEVEL */
246*91f16700Schasinglulu 
247*91f16700Schasinglulu /*
248*91f16700Schasinglulu  * Print Event Log
249*91f16700Schasinglulu  *
250*91f16700Schasinglulu  * @param[in]	log_addr	Pointer to Event Log
251*91f16700Schasinglulu  * @param[in]	log_size	Event Log size
252*91f16700Schasinglulu  */
253*91f16700Schasinglulu void dump_event_log(uint8_t *log_addr, size_t log_size)
254*91f16700Schasinglulu {
255*91f16700Schasinglulu #if LOG_LEVEL >= EVENT_LOG_LEVEL
256*91f16700Schasinglulu 	assert(log_addr != NULL);
257*91f16700Schasinglulu 
258*91f16700Schasinglulu 	/* Print TCG_EfiSpecIDEvent */
259*91f16700Schasinglulu 	id_event_print(&log_addr, &log_size);
260*91f16700Schasinglulu 
261*91f16700Schasinglulu 	while (log_size != 0U) {
262*91f16700Schasinglulu 		event2_print(&log_addr, &log_size);
263*91f16700Schasinglulu 	}
264*91f16700Schasinglulu #endif
265*91f16700Schasinglulu }
266