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