1 /*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4 */
5
6 #include <measurement.h>
7 #include <measurement_descs.h>
8 #include <string.h>
9
measurement_data_granule_measure(unsigned char rim_measurement[],enum hash_algo algorithm,void * data,unsigned long ipa,unsigned long flags)10 void measurement_data_granule_measure(unsigned char rim_measurement[],
11 enum hash_algo algorithm,
12 void *data,
13 unsigned long ipa,
14 unsigned long flags)
15 {
16 struct measurement_desc_data measure_desc = {0};
17
18 /* Initialize the measurement descriptior structure */
19 measure_desc.desc_type = MEASURE_DESC_TYPE_DATA;
20 measure_desc.len = sizeof(struct measurement_desc_data);
21 measure_desc.ipa = ipa;
22 measure_desc.flags = flags;
23 (void)memcpy(measure_desc.rim, rim_measurement,
24 measurement_get_size(algorithm));
25
26 if (flags == RMI_MEASURE_CONTENT) {
27 /*
28 * Hashing the data granules and store the result in the
29 * measurement descriptor structure.
30 */
31 measurement_hash_compute(algorithm,
32 data,
33 GRANULE_SIZE,
34 measure_desc.content);
35 }
36
37 /*
38 * Hashing the measurement descriptor structure; the result is the
39 * updated RIM.
40 */
41 /* coverity[overrun-buffer-val:SUPPRESS] */
42 measurement_hash_compute(algorithm,
43 &measure_desc,
44 sizeof(measure_desc),
45 rim_measurement);
46 }
47
measurement_realm_params_measure(unsigned char rim_measurement[],enum hash_algo algorithm,struct rmi_realm_params * realm_params)48 void measurement_realm_params_measure(unsigned char rim_measurement[],
49 enum hash_algo algorithm,
50 struct rmi_realm_params *realm_params)
51 {
52 /*
53 * Allocate a zero-filled RmiRealmParams data structure
54 * to hold the measured Realm parameters.
55 */
56 struct rmi_realm_params rim_params = {0};
57
58 /*
59 * The following attributes are used for calculation of the
60 * initial RIM value of the Realm:
61 * - flags
62 * - s2sz
63 * - sve_vl
64 * - num_bps
65 * - num_wps
66 * - pmu_num_ctrs
67 * - hash_algo
68 */
69 rim_params.flags0 = realm_params->flags0;
70 rim_params.s2sz = realm_params->s2sz;
71 rim_params.sve_vl = realm_params->sve_vl;
72 rim_params.num_bps = realm_params->num_bps;
73 rim_params.num_wps = realm_params->num_wps;
74 rim_params.pmu_num_ctrs = realm_params->pmu_num_ctrs;
75 rim_params.algorithm = realm_params->algorithm;
76
77 /* Measure relevant realm params this will be the init value of RIM */
78 /* coverity[overrun-buffer-val:SUPPRESS] */
79 measurement_hash_compute(algorithm,
80 &rim_params,
81 sizeof(struct rmi_realm_params),
82 rim_measurement);
83 }
84
measurement_rec_params_measure(unsigned char rim_measurement[],enum hash_algo algorithm,struct rmi_rec_params * rec_params)85 void measurement_rec_params_measure(unsigned char rim_measurement[],
86 enum hash_algo algorithm,
87 struct rmi_rec_params *rec_params)
88 {
89 struct measurement_desc_rec measure_desc = {0};
90 struct rmi_rec_params rec_params_measured = {0};
91
92 /*
93 * Copy the following attributes of the RmiRecParams data
94 * structure into the measured REC parameters data structure:
95 * - gprs
96 * - pc
97 * - flags
98 */
99 rec_params_measured.flags = rec_params->flags;
100 rec_params_measured.pc = rec_params->pc;
101 (void)memcpy(&rec_params_measured.gprs, rec_params->gprs,
102 sizeof(rec_params->gprs));
103
104 /* Initialize the measurement descriptior structure */
105 measure_desc.desc_type = MEASURE_DESC_TYPE_REC;
106 measure_desc.len = sizeof(struct measurement_desc_rec);
107 (void)memcpy(measure_desc.rim, rim_measurement,
108 measurement_get_size(algorithm));
109 /*
110 * Hash the REC params structure and store the result in the
111 * measurement descriptor structure.
112 */
113 /* coverity[overrun-buffer-val:SUPPRESS] */
114 measurement_hash_compute(algorithm,
115 &rec_params_measured,
116 sizeof(struct rmi_rec_params),
117 measure_desc.content);
118 /*
119 * Hash the measurement descriptor structure; the result is the
120 * updated RIM.
121 */
122 /* coverity[overrun-buffer-val:SUPPRESS] */
123 measurement_hash_compute(algorithm,
124 &measure_desc,
125 sizeof(struct measurement_desc_rec),
126 rim_measurement);
127 }
128
measurement_init_ripas_measure(unsigned char rim_measurement[],enum hash_algo algorithm,unsigned long base,unsigned long top)129 void measurement_init_ripas_measure(unsigned char rim_measurement[],
130 enum hash_algo algorithm,
131 unsigned long base,
132 unsigned long top)
133 {
134 struct measurement_desc_ripas measure_desc = {0};
135
136 /* Initialize the measurement descriptior structure */
137 measure_desc.desc_type = MEASURE_DESC_TYPE_RIPAS;
138 measure_desc.len = sizeof(struct measurement_desc_ripas);
139 measure_desc.base = base;
140 measure_desc.top = top;
141 (void)memcpy(measure_desc.rim,
142 rim_measurement,
143 measurement_get_size(algorithm));
144
145 /*
146 * Hashing the measurement descriptor structure; the result is the
147 * updated RIM.
148 */
149 /* coverity[overrun-buffer-val:SUPPRESS] */
150 measurement_hash_compute(algorithm,
151 &measure_desc,
152 sizeof(measure_desc),
153 rim_measurement);
154 }
155