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 172abd317dSSandrine Bailleux static void print_byte_array(const uint8_t *array __unused, size_t len __unused) 18758c6471STamas Ban { 192abd317dSSandrine 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 } 352abd317dSSandrine 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 */ 42901b0a30STamas Ban size_t version_size, 43758c6471STamas Ban const uint8_t *sw_type, /* string */ 44901b0a30STamas Ban size_t sw_type_size, 45901b0a30STamas Ban uint32_t measurement_algo, 46758c6471STamas Ban const uint8_t *measurement_value, 47758c6471STamas Ban size_t measurement_value_size, 48758c6471STamas Ban bool lock_measurement) 49758c6471STamas Ban { 50758c6471STamas Ban INFO("Measured boot extend measurement:\n"); 51758c6471STamas Ban INFO(" - slot : %u\n", index); 52758c6471STamas Ban INFO(" - signer_id :"); 53758c6471STamas Ban print_byte_array(signer_id, signer_id_size); 54758c6471STamas Ban INFO(" - version : %s\n", version); 55901b0a30STamas Ban INFO(" - version_size: %zu\n", version_size); 56758c6471STamas Ban INFO(" - sw_type : %s\n", sw_type); 57901b0a30STamas Ban INFO(" - sw_type_size: %zu\n", sw_type_size); 58901b0a30STamas Ban INFO(" - algorithm : %x\n", measurement_algo); 59758c6471STamas Ban INFO(" - measurement :"); 60758c6471STamas Ban print_byte_array(measurement_value, measurement_value_size); 61758c6471STamas Ban INFO(" - locking : %s\n", lock_measurement ? "true" : "false"); 62758c6471STamas Ban } 63758c6471STamas Ban 640ce2072dSTamas Ban #if !PLAT_RSS_NOT_SUPPORTED 65758c6471STamas Ban psa_status_t 66758c6471STamas Ban rss_measured_boot_extend_measurement(uint8_t index, 67758c6471STamas Ban const uint8_t *signer_id, 68758c6471STamas Ban size_t signer_id_size, 69758c6471STamas Ban const uint8_t *version, 70758c6471STamas Ban size_t version_size, 71758c6471STamas Ban uint32_t measurement_algo, 72758c6471STamas Ban const uint8_t *sw_type, 73758c6471STamas Ban size_t sw_type_size, 74758c6471STamas Ban const uint8_t *measurement_value, 75758c6471STamas Ban size_t measurement_value_size, 76758c6471STamas Ban bool lock_measurement) 77758c6471STamas Ban { 78758c6471STamas Ban struct measured_boot_extend_iovec_t extend_iov = { 79758c6471STamas Ban .index = index, 80758c6471STamas Ban .lock_measurement = lock_measurement, 81758c6471STamas Ban .measurement_algo = measurement_algo, 82758c6471STamas Ban .sw_type = {0}, 83*85a14bc0SDavid Vincze /* Removing \0 */ 84*85a14bc0SDavid Vincze .sw_type_size = (sw_type_size > 0) ? (sw_type_size - 1) : 0, 85758c6471STamas Ban }; 86758c6471STamas Ban 87758c6471STamas Ban psa_invec in_vec[] = { 88758c6471STamas Ban {.base = &extend_iov, 89758c6471STamas Ban .len = sizeof(struct measured_boot_extend_iovec_t)}, 90758c6471STamas Ban {.base = signer_id, .len = signer_id_size}, 91*85a14bc0SDavid Vincze {.base = version, 92*85a14bc0SDavid Vincze .len = (version_size > 0) ? (version_size - 1) : 0}, 93758c6471STamas Ban {.base = measurement_value, .len = measurement_value_size} 94758c6471STamas Ban }; 95758c6471STamas Ban 96758c6471STamas Ban if (sw_type != NULL) { 97*85a14bc0SDavid Vincze if (extend_iov.sw_type_size > SW_TYPE_MAX_SIZE) { 98471c9895STamas Ban return PSA_ERROR_INVALID_ARGUMENT; 99471c9895STamas Ban } 100*85a14bc0SDavid Vincze memcpy(extend_iov.sw_type, sw_type, extend_iov.sw_type_size); 101758c6471STamas Ban } 102758c6471STamas Ban 103758c6471STamas Ban log_measurement(index, signer_id, signer_id_size, 104901b0a30STamas Ban version, version_size, sw_type, sw_type_size, 105901b0a30STamas Ban measurement_algo, measurement_value, 106901b0a30STamas Ban measurement_value_size, lock_measurement); 107758c6471STamas Ban 108758c6471STamas Ban return psa_call(RSS_MEASURED_BOOT_HANDLE, 109758c6471STamas Ban RSS_MEASURED_BOOT_EXTEND, 110758c6471STamas Ban in_vec, IOVEC_LEN(in_vec), 111758c6471STamas Ban NULL, 0); 112758c6471STamas Ban } 1130ce2072dSTamas Ban 1140ce2072dSTamas Ban #else /* !PLAT_RSS_NOT_SUPPORTED */ 1150ce2072dSTamas Ban 1160ce2072dSTamas Ban psa_status_t 1170ce2072dSTamas Ban rss_measured_boot_extend_measurement(uint8_t index, 1180ce2072dSTamas Ban const uint8_t *signer_id, 1190ce2072dSTamas Ban size_t signer_id_size, 1200ce2072dSTamas Ban const uint8_t *version, 1210ce2072dSTamas Ban size_t version_size, 1220ce2072dSTamas Ban uint32_t measurement_algo, 1230ce2072dSTamas Ban const uint8_t *sw_type, 1240ce2072dSTamas Ban size_t sw_type_size, 1250ce2072dSTamas Ban const uint8_t *measurement_value, 1260ce2072dSTamas Ban size_t measurement_value_size, 1270ce2072dSTamas Ban bool lock_measurement) 1280ce2072dSTamas Ban { 1290ce2072dSTamas Ban log_measurement(index, signer_id, signer_id_size, 130901b0a30STamas Ban version, version_size, sw_type, sw_type_size, 131901b0a30STamas Ban measurement_algo, measurement_value, 132901b0a30STamas Ban measurement_value_size, lock_measurement); 1330ce2072dSTamas Ban 1340ce2072dSTamas Ban return PSA_SUCCESS; 1350ce2072dSTamas Ban } 1360ce2072dSTamas Ban #endif /* !PLAT_RSS_NOT_SUPPORTED */ 137