1*758c6471STamas Ban /* 2*758c6471STamas Ban * Copyright (c) 2022, Arm Limited. All rights reserved. 3*758c6471STamas Ban * 4*758c6471STamas Ban * SPDX-License-Identifier: BSD-3-Clause 5*758c6471STamas Ban * 6*758c6471STamas Ban */ 7*758c6471STamas Ban 8*758c6471STamas Ban #include <string.h> 9*758c6471STamas Ban 10*758c6471STamas Ban #include <common/debug.h> 11*758c6471STamas Ban #include <measured_boot.h> 12*758c6471STamas Ban #include <psa/client.h> 13*758c6471STamas Ban #include <psa_manifest/sid.h> 14*758c6471STamas Ban 15*758c6471STamas Ban #include "measured_boot_private.h" 16*758c6471STamas Ban 17*758c6471STamas Ban static void print_byte_array(const uint8_t *array, size_t len) 18*758c6471STamas Ban { 19*758c6471STamas Ban unsigned int i; 20*758c6471STamas Ban 21*758c6471STamas Ban if (array == NULL || len == 0U) { 22*758c6471STamas Ban (void)printf("\n"); 23*758c6471STamas Ban } 24*758c6471STamas Ban 25*758c6471STamas Ban for (i = 0U; i < len; ++i) { 26*758c6471STamas Ban (void)printf(" %02x", array[i]); 27*758c6471STamas Ban if ((i & U(0xF)) == U(0xF)) { 28*758c6471STamas Ban (void)printf("\n"); 29*758c6471STamas Ban if (i < (len - 1U)) { 30*758c6471STamas Ban INFO("\t\t:"); 31*758c6471STamas Ban } 32*758c6471STamas Ban } 33*758c6471STamas Ban } 34*758c6471STamas Ban } 35*758c6471STamas Ban 36*758c6471STamas Ban static void log_measurement(uint8_t index, 37*758c6471STamas Ban const uint8_t *signer_id, 38*758c6471STamas Ban size_t signer_id_size, 39*758c6471STamas Ban const uint8_t *version, /* string */ 40*758c6471STamas Ban uint32_t measurement_algo, 41*758c6471STamas Ban const uint8_t *sw_type, /* string */ 42*758c6471STamas Ban const uint8_t *measurement_value, 43*758c6471STamas Ban size_t measurement_value_size, 44*758c6471STamas Ban bool lock_measurement) 45*758c6471STamas Ban { 46*758c6471STamas Ban INFO("Measured boot extend measurement:\n"); 47*758c6471STamas Ban INFO(" - slot : %u\n", index); 48*758c6471STamas Ban INFO(" - signer_id :"); 49*758c6471STamas Ban print_byte_array(signer_id, signer_id_size); 50*758c6471STamas Ban INFO(" - version : %s\n", version); 51*758c6471STamas Ban INFO(" - algorithm : %x\n", measurement_algo); 52*758c6471STamas Ban INFO(" - sw_type : %s\n", sw_type); 53*758c6471STamas Ban INFO(" - measurement :"); 54*758c6471STamas Ban print_byte_array(measurement_value, measurement_value_size); 55*758c6471STamas Ban INFO(" - locking : %s\n", lock_measurement ? "true" : "false"); 56*758c6471STamas Ban } 57*758c6471STamas Ban 58*758c6471STamas Ban psa_status_t 59*758c6471STamas Ban rss_measured_boot_extend_measurement(uint8_t index, 60*758c6471STamas Ban const uint8_t *signer_id, 61*758c6471STamas Ban size_t signer_id_size, 62*758c6471STamas Ban const uint8_t *version, 63*758c6471STamas Ban size_t version_size, 64*758c6471STamas Ban uint32_t measurement_algo, 65*758c6471STamas Ban const uint8_t *sw_type, 66*758c6471STamas Ban size_t sw_type_size, 67*758c6471STamas Ban const uint8_t *measurement_value, 68*758c6471STamas Ban size_t measurement_value_size, 69*758c6471STamas Ban bool lock_measurement) 70*758c6471STamas Ban { 71*758c6471STamas Ban struct measured_boot_extend_iovec_t extend_iov = { 72*758c6471STamas Ban .index = index, 73*758c6471STamas Ban .lock_measurement = lock_measurement, 74*758c6471STamas Ban .measurement_algo = measurement_algo, 75*758c6471STamas Ban .sw_type = {0}, 76*758c6471STamas Ban .sw_type_size = sw_type_size, 77*758c6471STamas Ban }; 78*758c6471STamas Ban 79*758c6471STamas Ban psa_invec in_vec[] = { 80*758c6471STamas Ban {.base = &extend_iov, 81*758c6471STamas Ban .len = sizeof(struct measured_boot_extend_iovec_t)}, 82*758c6471STamas Ban {.base = signer_id, .len = signer_id_size}, 83*758c6471STamas Ban {.base = version, .len = version_size}, 84*758c6471STamas Ban {.base = measurement_value, .len = measurement_value_size} 85*758c6471STamas Ban }; 86*758c6471STamas Ban 87*758c6471STamas Ban uint32_t sw_type_size_limited; 88*758c6471STamas Ban 89*758c6471STamas Ban if (sw_type != NULL) { 90*758c6471STamas Ban sw_type_size_limited = (sw_type_size < SW_TYPE_MAX_SIZE) ? 91*758c6471STamas Ban sw_type_size : SW_TYPE_MAX_SIZE; 92*758c6471STamas Ban memcpy(extend_iov.sw_type, sw_type, sw_type_size_limited); 93*758c6471STamas Ban } 94*758c6471STamas Ban 95*758c6471STamas Ban log_measurement(index, signer_id, signer_id_size, 96*758c6471STamas Ban version, measurement_algo, sw_type, 97*758c6471STamas Ban measurement_value, measurement_value_size, 98*758c6471STamas Ban lock_measurement); 99*758c6471STamas Ban 100*758c6471STamas Ban return psa_call(RSS_MEASURED_BOOT_HANDLE, 101*758c6471STamas Ban RSS_MEASURED_BOOT_EXTEND, 102*758c6471STamas Ban in_vec, IOVEC_LEN(in_vec), 103*758c6471STamas Ban NULL, 0); 104*758c6471STamas Ban } 105