blob: f4216ebf1503a66ff81046f60e4f18deb65a6ba0 [file] [log] [blame]
Tamas Banf5492752022-01-18 16:19:17 +01001/*
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
17static 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
36static 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
58psa_status_t
59rss_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}