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