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 */ 42*901b0a30STamas Ban size_t version_size, 43758c6471STamas Ban const uint8_t *sw_type, /* string */ 44*901b0a30STamas Ban size_t sw_type_size, 45*901b0a30STamas 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); 55*901b0a30STamas Ban INFO(" - version_size: %zu\n", version_size); 56758c6471STamas Ban INFO(" - sw_type : %s\n", sw_type); 57*901b0a30STamas Ban INFO(" - sw_type_size: %zu\n", sw_type_size); 58*901b0a30STamas 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}, 83758c6471STamas Ban .sw_type_size = sw_type_size, 84758c6471STamas Ban }; 85758c6471STamas Ban 86758c6471STamas Ban psa_invec in_vec[] = { 87758c6471STamas Ban {.base = &extend_iov, 88758c6471STamas Ban .len = sizeof(struct measured_boot_extend_iovec_t)}, 89758c6471STamas Ban {.base = signer_id, .len = signer_id_size}, 90758c6471STamas Ban {.base = version, .len = version_size}, 91758c6471STamas Ban {.base = measurement_value, .len = measurement_value_size} 92758c6471STamas Ban }; 93758c6471STamas Ban 94758c6471STamas Ban if (sw_type != NULL) { 95471c9895STamas Ban if (sw_type_size > SW_TYPE_MAX_SIZE) { 96471c9895STamas Ban return PSA_ERROR_INVALID_ARGUMENT; 97471c9895STamas Ban } 98471c9895STamas Ban memcpy(extend_iov.sw_type, sw_type, sw_type_size); 99758c6471STamas Ban } 100758c6471STamas Ban 101758c6471STamas Ban log_measurement(index, signer_id, signer_id_size, 102*901b0a30STamas Ban version, version_size, sw_type, sw_type_size, 103*901b0a30STamas Ban measurement_algo, measurement_value, 104*901b0a30STamas Ban measurement_value_size, lock_measurement); 105758c6471STamas Ban 106758c6471STamas Ban return psa_call(RSS_MEASURED_BOOT_HANDLE, 107758c6471STamas Ban RSS_MEASURED_BOOT_EXTEND, 108758c6471STamas Ban in_vec, IOVEC_LEN(in_vec), 109758c6471STamas Ban NULL, 0); 110758c6471STamas Ban } 1110ce2072dSTamas Ban 1120ce2072dSTamas Ban #else /* !PLAT_RSS_NOT_SUPPORTED */ 1130ce2072dSTamas Ban 1140ce2072dSTamas Ban psa_status_t 1150ce2072dSTamas Ban rss_measured_boot_extend_measurement(uint8_t index, 1160ce2072dSTamas Ban const uint8_t *signer_id, 1170ce2072dSTamas Ban size_t signer_id_size, 1180ce2072dSTamas Ban const uint8_t *version, 1190ce2072dSTamas Ban size_t version_size, 1200ce2072dSTamas Ban uint32_t measurement_algo, 1210ce2072dSTamas Ban const uint8_t *sw_type, 1220ce2072dSTamas Ban size_t sw_type_size, 1230ce2072dSTamas Ban const uint8_t *measurement_value, 1240ce2072dSTamas Ban size_t measurement_value_size, 1250ce2072dSTamas Ban bool lock_measurement) 1260ce2072dSTamas Ban { 1270ce2072dSTamas Ban log_measurement(index, signer_id, signer_id_size, 128*901b0a30STamas Ban version, version_size, sw_type, sw_type_size, 129*901b0a30STamas Ban measurement_algo, measurement_value, 130*901b0a30STamas Ban measurement_value_size, lock_measurement); 1310ce2072dSTamas Ban 1320ce2072dSTamas Ban return PSA_SUCCESS; 1330ce2072dSTamas Ban } 1340ce2072dSTamas Ban #endif /* !PLAT_RSS_NOT_SUPPORTED */ 135