1758c6471STamas Ban /* 2758c6471STamas Ban * Copyright (c) 2022, Arm Limited. All rights reserved. 3758c6471STamas Ban * 4758c6471STamas Ban * SPDX-License-Identifier: BSD-3-Clause 5758c6471STamas Ban * 6758c6471STamas Ban */ 7758c6471STamas Ban 8758c6471STamas Ban #include <string.h> 9758c6471STamas Ban 10758c6471STamas Ban #include <common/debug.h> 11758c6471STamas Ban #include <measured_boot.h> 12758c6471STamas Ban #include <psa/client.h> 13758c6471STamas Ban #include <psa_manifest/sid.h> 14758c6471STamas Ban 15758c6471STamas Ban #include "measured_boot_private.h" 16758c6471STamas Ban 17*2abd317dSSandrine Bailleux static void print_byte_array(const uint8_t *array __unused, size_t len __unused) 18758c6471STamas Ban { 19*2abd317dSSandrine Bailleux #if LOG_LEVEL >= LOG_LEVEL_INFO 20c32ab75cSDavid Vincze size_t i; 21758c6471STamas Ban 22758c6471STamas Ban if (array == NULL || len == 0U) { 23758c6471STamas Ban (void)printf("\n"); 24c32ab75cSDavid Vincze } else { 25758c6471STamas Ban for (i = 0U; i < len; ++i) { 26758c6471STamas Ban (void)printf(" %02x", array[i]); 27758c6471STamas Ban if ((i & U(0xF)) == U(0xF)) { 28758c6471STamas Ban (void)printf("\n"); 29758c6471STamas Ban if (i < (len - 1U)) { 30758c6471STamas Ban INFO("\t\t:"); 31758c6471STamas Ban } 32758c6471STamas Ban } 33758c6471STamas Ban } 34758c6471STamas Ban } 35*2abd317dSSandrine Bailleux #endif 36c32ab75cSDavid Vincze } 37758c6471STamas Ban 38758c6471STamas Ban static void log_measurement(uint8_t index, 39758c6471STamas Ban const uint8_t *signer_id, 40758c6471STamas Ban size_t signer_id_size, 41758c6471STamas Ban const uint8_t *version, /* string */ 42758c6471STamas Ban uint32_t measurement_algo, 43758c6471STamas Ban const uint8_t *sw_type, /* string */ 44758c6471STamas Ban const uint8_t *measurement_value, 45758c6471STamas Ban size_t measurement_value_size, 46758c6471STamas Ban bool lock_measurement) 47758c6471STamas Ban { 48758c6471STamas Ban INFO("Measured boot extend measurement:\n"); 49758c6471STamas Ban INFO(" - slot : %u\n", index); 50758c6471STamas Ban INFO(" - signer_id :"); 51758c6471STamas Ban print_byte_array(signer_id, signer_id_size); 52758c6471STamas Ban INFO(" - version : %s\n", version); 53758c6471STamas Ban INFO(" - algorithm : %x\n", measurement_algo); 54758c6471STamas Ban INFO(" - sw_type : %s\n", sw_type); 55758c6471STamas Ban INFO(" - measurement :"); 56758c6471STamas Ban print_byte_array(measurement_value, measurement_value_size); 57758c6471STamas Ban INFO(" - locking : %s\n", lock_measurement ? "true" : "false"); 58758c6471STamas Ban } 59758c6471STamas Ban 600ce2072dSTamas Ban #if !PLAT_RSS_NOT_SUPPORTED 61758c6471STamas Ban psa_status_t 62758c6471STamas Ban rss_measured_boot_extend_measurement(uint8_t index, 63758c6471STamas Ban const uint8_t *signer_id, 64758c6471STamas Ban size_t signer_id_size, 65758c6471STamas Ban const uint8_t *version, 66758c6471STamas Ban size_t version_size, 67758c6471STamas Ban uint32_t measurement_algo, 68758c6471STamas Ban const uint8_t *sw_type, 69758c6471STamas Ban size_t sw_type_size, 70758c6471STamas Ban const uint8_t *measurement_value, 71758c6471STamas Ban size_t measurement_value_size, 72758c6471STamas Ban bool lock_measurement) 73758c6471STamas Ban { 74758c6471STamas Ban struct measured_boot_extend_iovec_t extend_iov = { 75758c6471STamas Ban .index = index, 76758c6471STamas Ban .lock_measurement = lock_measurement, 77758c6471STamas Ban .measurement_algo = measurement_algo, 78758c6471STamas Ban .sw_type = {0}, 79758c6471STamas Ban .sw_type_size = sw_type_size, 80758c6471STamas Ban }; 81758c6471STamas Ban 82758c6471STamas Ban psa_invec in_vec[] = { 83758c6471STamas Ban {.base = &extend_iov, 84758c6471STamas Ban .len = sizeof(struct measured_boot_extend_iovec_t)}, 85758c6471STamas Ban {.base = signer_id, .len = signer_id_size}, 86758c6471STamas Ban {.base = version, .len = version_size}, 87758c6471STamas Ban {.base = measurement_value, .len = measurement_value_size} 88758c6471STamas Ban }; 89758c6471STamas Ban 90758c6471STamas Ban uint32_t sw_type_size_limited; 91758c6471STamas Ban 92758c6471STamas Ban if (sw_type != NULL) { 93758c6471STamas Ban sw_type_size_limited = (sw_type_size < SW_TYPE_MAX_SIZE) ? 94758c6471STamas Ban sw_type_size : SW_TYPE_MAX_SIZE; 95758c6471STamas Ban memcpy(extend_iov.sw_type, sw_type, sw_type_size_limited); 96758c6471STamas Ban } 97758c6471STamas Ban 98758c6471STamas Ban log_measurement(index, signer_id, signer_id_size, 99758c6471STamas Ban version, measurement_algo, sw_type, 100758c6471STamas Ban measurement_value, measurement_value_size, 101758c6471STamas Ban lock_measurement); 102758c6471STamas Ban 103758c6471STamas Ban return psa_call(RSS_MEASURED_BOOT_HANDLE, 104758c6471STamas Ban RSS_MEASURED_BOOT_EXTEND, 105758c6471STamas Ban in_vec, IOVEC_LEN(in_vec), 106758c6471STamas Ban NULL, 0); 107758c6471STamas Ban } 1080ce2072dSTamas Ban 1090ce2072dSTamas Ban #else /* !PLAT_RSS_NOT_SUPPORTED */ 1100ce2072dSTamas Ban 1110ce2072dSTamas Ban psa_status_t 1120ce2072dSTamas Ban rss_measured_boot_extend_measurement(uint8_t index, 1130ce2072dSTamas Ban const uint8_t *signer_id, 1140ce2072dSTamas Ban size_t signer_id_size, 1150ce2072dSTamas Ban const uint8_t *version, 1160ce2072dSTamas Ban size_t version_size, 1170ce2072dSTamas Ban uint32_t measurement_algo, 1180ce2072dSTamas Ban const uint8_t *sw_type, 1190ce2072dSTamas Ban size_t sw_type_size, 1200ce2072dSTamas Ban const uint8_t *measurement_value, 1210ce2072dSTamas Ban size_t measurement_value_size, 1220ce2072dSTamas Ban bool lock_measurement) 1230ce2072dSTamas Ban { 1240ce2072dSTamas Ban log_measurement(index, signer_id, signer_id_size, 1250ce2072dSTamas Ban version, measurement_algo, sw_type, 1260ce2072dSTamas Ban measurement_value, measurement_value_size, 1270ce2072dSTamas Ban lock_measurement); 1280ce2072dSTamas Ban 1290ce2072dSTamas Ban return PSA_SUCCESS; 1300ce2072dSTamas Ban } 1310ce2072dSTamas Ban #endif /* !PLAT_RSS_NOT_SUPPORTED */ 132