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