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 17758c6471STamas Ban static void print_byte_array(const uint8_t *array, size_t len) 18758c6471STamas Ban { 19*c32ab75cSDavid Vincze size_t i; 20758c6471STamas Ban 21758c6471STamas Ban if (array == NULL || len == 0U) { 22758c6471STamas Ban (void)printf("\n"); 23*c32ab75cSDavid Vincze } else { 24758c6471STamas Ban for (i = 0U; i < len; ++i) { 25758c6471STamas Ban (void)printf(" %02x", array[i]); 26758c6471STamas Ban if ((i & U(0xF)) == U(0xF)) { 27758c6471STamas Ban (void)printf("\n"); 28758c6471STamas Ban if (i < (len - 1U)) { 29758c6471STamas Ban INFO("\t\t:"); 30758c6471STamas Ban } 31758c6471STamas Ban } 32758c6471STamas Ban } 33758c6471STamas Ban } 34*c32ab75cSDavid Vincze } 35758c6471STamas Ban 36758c6471STamas Ban static void log_measurement(uint8_t index, 37758c6471STamas Ban const uint8_t *signer_id, 38758c6471STamas Ban size_t signer_id_size, 39758c6471STamas Ban const uint8_t *version, /* string */ 40758c6471STamas Ban uint32_t measurement_algo, 41758c6471STamas Ban const uint8_t *sw_type, /* string */ 42758c6471STamas Ban const uint8_t *measurement_value, 43758c6471STamas Ban size_t measurement_value_size, 44758c6471STamas Ban bool lock_measurement) 45758c6471STamas Ban { 46758c6471STamas Ban INFO("Measured boot extend measurement:\n"); 47758c6471STamas Ban INFO(" - slot : %u\n", index); 48758c6471STamas Ban INFO(" - signer_id :"); 49758c6471STamas Ban print_byte_array(signer_id, signer_id_size); 50758c6471STamas Ban INFO(" - version : %s\n", version); 51758c6471STamas Ban INFO(" - algorithm : %x\n", measurement_algo); 52758c6471STamas Ban INFO(" - sw_type : %s\n", sw_type); 53758c6471STamas Ban INFO(" - measurement :"); 54758c6471STamas Ban print_byte_array(measurement_value, measurement_value_size); 55758c6471STamas Ban INFO(" - locking : %s\n", lock_measurement ? "true" : "false"); 56758c6471STamas Ban } 57758c6471STamas Ban 580ce2072dSTamas Ban #if !PLAT_RSS_NOT_SUPPORTED 59758c6471STamas Ban psa_status_t 60758c6471STamas Ban rss_measured_boot_extend_measurement(uint8_t index, 61758c6471STamas Ban const uint8_t *signer_id, 62758c6471STamas Ban size_t signer_id_size, 63758c6471STamas Ban const uint8_t *version, 64758c6471STamas Ban size_t version_size, 65758c6471STamas Ban uint32_t measurement_algo, 66758c6471STamas Ban const uint8_t *sw_type, 67758c6471STamas Ban size_t sw_type_size, 68758c6471STamas Ban const uint8_t *measurement_value, 69758c6471STamas Ban size_t measurement_value_size, 70758c6471STamas Ban bool lock_measurement) 71758c6471STamas Ban { 72758c6471STamas Ban struct measured_boot_extend_iovec_t extend_iov = { 73758c6471STamas Ban .index = index, 74758c6471STamas Ban .lock_measurement = lock_measurement, 75758c6471STamas Ban .measurement_algo = measurement_algo, 76758c6471STamas Ban .sw_type = {0}, 77758c6471STamas Ban .sw_type_size = sw_type_size, 78758c6471STamas Ban }; 79758c6471STamas Ban 80758c6471STamas Ban psa_invec in_vec[] = { 81758c6471STamas Ban {.base = &extend_iov, 82758c6471STamas Ban .len = sizeof(struct measured_boot_extend_iovec_t)}, 83758c6471STamas Ban {.base = signer_id, .len = signer_id_size}, 84758c6471STamas Ban {.base = version, .len = version_size}, 85758c6471STamas Ban {.base = measurement_value, .len = measurement_value_size} 86758c6471STamas Ban }; 87758c6471STamas Ban 88758c6471STamas Ban uint32_t sw_type_size_limited; 89758c6471STamas Ban 90758c6471STamas Ban if (sw_type != NULL) { 91758c6471STamas Ban sw_type_size_limited = (sw_type_size < SW_TYPE_MAX_SIZE) ? 92758c6471STamas Ban sw_type_size : SW_TYPE_MAX_SIZE; 93758c6471STamas Ban memcpy(extend_iov.sw_type, sw_type, sw_type_size_limited); 94758c6471STamas Ban } 95758c6471STamas Ban 96758c6471STamas Ban log_measurement(index, signer_id, signer_id_size, 97758c6471STamas Ban version, measurement_algo, sw_type, 98758c6471STamas Ban measurement_value, measurement_value_size, 99758c6471STamas Ban lock_measurement); 100758c6471STamas Ban 101758c6471STamas Ban return psa_call(RSS_MEASURED_BOOT_HANDLE, 102758c6471STamas Ban RSS_MEASURED_BOOT_EXTEND, 103758c6471STamas Ban in_vec, IOVEC_LEN(in_vec), 104758c6471STamas Ban NULL, 0); 105758c6471STamas Ban } 1060ce2072dSTamas Ban 1070ce2072dSTamas Ban #else /* !PLAT_RSS_NOT_SUPPORTED */ 1080ce2072dSTamas Ban 1090ce2072dSTamas Ban psa_status_t 1100ce2072dSTamas Ban rss_measured_boot_extend_measurement(uint8_t index, 1110ce2072dSTamas Ban const uint8_t *signer_id, 1120ce2072dSTamas Ban size_t signer_id_size, 1130ce2072dSTamas Ban const uint8_t *version, 1140ce2072dSTamas Ban size_t version_size, 1150ce2072dSTamas Ban uint32_t measurement_algo, 1160ce2072dSTamas Ban const uint8_t *sw_type, 1170ce2072dSTamas Ban size_t sw_type_size, 1180ce2072dSTamas Ban const uint8_t *measurement_value, 1190ce2072dSTamas Ban size_t measurement_value_size, 1200ce2072dSTamas Ban bool lock_measurement) 1210ce2072dSTamas Ban { 1220ce2072dSTamas Ban log_measurement(index, signer_id, signer_id_size, 1230ce2072dSTamas Ban version, measurement_algo, sw_type, 1240ce2072dSTamas Ban measurement_value, measurement_value_size, 1250ce2072dSTamas Ban lock_measurement); 1260ce2072dSTamas Ban 1270ce2072dSTamas Ban return PSA_SUCCESS; 1280ce2072dSTamas Ban } 1290ce2072dSTamas Ban #endif /* !PLAT_RSS_NOT_SUPPORTED */ 130