blob: 3b9a73b83e58cf07ce43a9aabc191ff530efaad6 [file] [log] [blame]
Maulik Patel58595d32023-06-22 10:08:53 +01001/*
Maulik Patel16e03262024-01-05 14:40:52 +00002 * Copyright (c) 2023-2024, Arm Limited. All rights reserved.
Maulik Patel58595d32023-06-22 10:08:53 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#include "dpe_crypto_interface.h"
Maulik Patel2358bbb2023-07-21 10:56:56 +01009#include <assert.h>
Maulik Patel58595d32023-06-22 10:08:53 +010010#include <stdbool.h>
11#include <string.h>
12#include "dpe_context_mngr.h"
13#include "dpe_crypto_config.h"
14#include "psa/crypto.h"
15#include "tfm_crypto_defs.h"
16
17static const char attest_cdi_label[] = DPE_ATTEST_CDI_LABEL;
Maulik Patel9fd8bd22023-10-30 10:58:30 +000018static const char exported_attest_cdi_label[] = DPE_ATTEST_EXPORTED_CDI_LABEL;
Maulik Patel4fed7812023-12-08 09:55:22 +000019static const char default_attest_key_deriv_label[] = DPE_ATTEST_KEY_PAIR_LABEL;
Maulik Patel2358bbb2023-07-21 10:56:56 +010020static const char id_label[] = DPE_ID_LABEL;
Maulik Patel58595d32023-06-22 10:08:53 +010021static const uint8_t attest_key_salt[] = DPE_ATTEST_KEY_SALT;
Maulik Patel2358bbb2023-07-21 10:56:56 +010022static const uint8_t id_salt[] = DPE_ID_SALT;
Maulik Patel58595d32023-06-22 10:08:53 +010023
24static psa_status_t perform_derivation(psa_key_id_t base_key,
25 const psa_key_attributes_t *key_attr,
26 const uint8_t *key_label,
27 size_t key_label_len,
28 const uint8_t *salt,
29 size_t salt_len,
30 psa_key_id_t *out_key_id)
31{
32 psa_status_t status;
33 psa_key_derivation_operation_t op = PSA_KEY_DERIVATION_OPERATION_INIT;
34
35 assert((key_label_len != 0) && (key_label != NULL) &&
36 (base_key != 0) && (key_attr != NULL) &&
37 (salt_len != 0) && (salt != NULL));
38
39 status = psa_key_derivation_setup(&op, PSA_ALG_HKDF(PSA_ALG_SHA_256));
40 if (status != PSA_SUCCESS) {
41 return status;
42 }
43
44 status = psa_key_derivation_input_bytes(&op, PSA_KEY_DERIVATION_INPUT_SALT,
45 salt, salt_len);
46 if (status != PSA_SUCCESS) {
47 goto err_abort;
48 }
49
50 status = psa_key_derivation_input_key(&op, PSA_KEY_DERIVATION_INPUT_SECRET,
51 base_key);
52 if (status != PSA_SUCCESS) {
53 goto err_abort;
54 }
55
56 /* Supply the key label as an input to the key derivation */
57 status = psa_key_derivation_input_bytes(&op, PSA_KEY_DERIVATION_INPUT_INFO,
58 key_label, key_label_len);
59 if (status != PSA_SUCCESS) {
60 goto err_abort;
61 }
62
63 status = psa_key_derivation_output_key(key_attr, &op, out_key_id);
64 if (status != PSA_SUCCESS) {
65 goto err_abort;
66 }
67
68 /* Free resources associated with the key derivation operation */
69 status = psa_key_derivation_abort(&op);
70 if (status == PSA_SUCCESS) {
71 goto done;
72 }
73
74 (void)psa_destroy_key(*out_key_id);
75
76err_abort:
77 (void)psa_key_derivation_abort(&op);
78
79done:
80 return status;
81}
82
83psa_status_t derive_attestation_cdi(struct layer_context_t *layer_ctx,
84 const struct layer_context_t *parent_layer_ctx)
85{
86 psa_key_attributes_t derive_key_attr = PSA_KEY_ATTRIBUTES_INIT;
87
88 /* Set key attributes for CDI key */
89 psa_set_key_type(&derive_key_attr, DPE_CDI_KEY_TYPE);
90 psa_set_key_algorithm(&derive_key_attr, DPE_CDI_KEY_ALG);
91 psa_set_key_bits(&derive_key_attr, DPE_CDI_KEY_BITS);
92 psa_set_key_usage_flags(&derive_key_attr, DPE_CDI_KEY_USAGE);
93
94 /* Perform CDI derivation */
95 /* Parent layer CDI is the base key (input secret to key derivation) */
Maulik Patel9fd8bd22023-10-30 10:58:30 +000096
97 if (layer_ctx->is_cdi_to_be_exported) {
98 return perform_derivation(parent_layer_ctx->data.cdi_key_id,
99 &derive_key_attr,
100 (uint8_t *) &exported_attest_cdi_label[0],
101 sizeof(exported_attest_cdi_label),
102 layer_ctx->attest_cdi_hash_input,
103 sizeof(layer_ctx->attest_cdi_hash_input),
104 &layer_ctx->data.cdi_key_id);
105
106 } else {
107 return perform_derivation(parent_layer_ctx->data.cdi_key_id,
108 &derive_key_attr,
109 (uint8_t *) &attest_cdi_label[0],
110 sizeof(attest_cdi_label),
111 layer_ctx->attest_cdi_hash_input,
112 sizeof(layer_ctx->attest_cdi_hash_input),
113 &layer_ctx->data.cdi_key_id);
114 }
Maulik Patel58595d32023-06-22 10:08:53 +0100115}
116
117psa_status_t derive_attestation_key(struct layer_context_t *layer_ctx)
118{
Maulik Patel2358bbb2023-07-21 10:56:56 +0100119 psa_status_t status;
Maulik Patel58595d32023-06-22 10:08:53 +0100120 psa_key_attributes_t attest_key_attr = PSA_KEY_ATTRIBUTES_INIT;
121
122 /* Set key attributes for Attest key pair derivation */
123 psa_set_key_type(&attest_key_attr, DPE_ATTEST_KEY_TYPE);
124 psa_set_key_algorithm(&attest_key_attr, DPE_ATTEST_KEY_ALG);
125 psa_set_key_bits(&attest_key_attr, DPE_ATTEST_KEY_BITS);
126 psa_set_key_usage_flags(&attest_key_attr, DPE_ATTEST_KEY_USAGE);
127
128 /* Perform key pair derivation */
Maulik Patel4fed7812023-12-08 09:55:22 +0000129
130 if (layer_ctx->data.external_key_deriv_label_len > 0) {
131 /* Use the external label provided for key derivation */
132 status = perform_derivation(layer_ctx->data.cdi_key_id,
133 &attest_key_attr,
134 &layer_ctx->data.external_key_deriv_label[0], /* External label */
135 layer_ctx->data.external_key_deriv_label_len,
136 attest_key_salt,
137 sizeof(attest_key_salt),
138 &layer_ctx->data.attest_key_id);
139 } else {
140 /* Use the default label for key derivation */
141 status = perform_derivation(layer_ctx->data.cdi_key_id,
142 &attest_key_attr,
143 (uint8_t *)&default_attest_key_deriv_label[0], /* Default label */
144 sizeof(default_attest_key_deriv_label),
145 attest_key_salt,
146 sizeof(attest_key_salt),
147 &layer_ctx->data.attest_key_id);
148 }
149
Maulik Patel2358bbb2023-07-21 10:56:56 +0100150 if (status != PSA_SUCCESS) {
151 return status;
152 }
153
154 return psa_export_public_key(layer_ctx->data.attest_key_id,
155 &layer_ctx->data.attest_pub_key[0],
156 sizeof(layer_ctx->data.attest_pub_key),
157 &layer_ctx->data.attest_pub_key_len);
Maulik Patel58595d32023-06-22 10:08:53 +0100158}
159
160psa_status_t create_layer_cdi_key(struct layer_context_t *layer_ctx,
161 const uint8_t *cdi_input,
162 size_t cdi_input_size)
163{
164 psa_key_attributes_t base_attributes = PSA_KEY_ATTRIBUTES_INIT;
165
166 /* Set key attributes for CDI key */
167 psa_set_key_type(&base_attributes, DPE_CDI_KEY_TYPE);
168 psa_set_key_algorithm(&base_attributes, DPE_CDI_KEY_ALG);
169 psa_set_key_bits(&base_attributes, DPE_CDI_KEY_BITS);
170 psa_set_key_usage_flags(&base_attributes, DPE_CDI_KEY_USAGE);
171
172 return psa_import_key(&base_attributes,
173 cdi_input,
174 cdi_input_size,
175 &layer_ctx->data.cdi_key_id);
176}
177
178psa_status_t derive_sealing_cdi(struct layer_context_t *layer_ctx)
179{
180 //TODO:
181 (void)layer_ctx;
182 return PSA_SUCCESS;
183}
184
185psa_status_t derive_wrapping_key(struct layer_context_t *layer_ctx)
186{
187 //TODO:
188 (void)layer_ctx;
189 return PSA_SUCCESS;
190}
191
Maulik Patel2358bbb2023-07-21 10:56:56 +0100192psa_status_t derive_id_from_public_key(struct layer_context_t *layer_ctx)
Maulik Patel58595d32023-06-22 10:08:53 +0100193{
Maulik Patel2358bbb2023-07-21 10:56:56 +0100194 psa_status_t status;
195 psa_key_attributes_t derive_key_attr = PSA_KEY_ATTRIBUTES_INIT;
196 psa_key_attributes_t base_attr = PSA_KEY_ATTRIBUTES_INIT;
197 size_t output_id_len;
Maulik Patel58595d32023-06-22 10:08:53 +0100198
Maulik Patel2358bbb2023-07-21 10:56:56 +0100199 psa_key_id_t base_key = PSA_KEY_ID_NULL;
200 psa_key_id_t derived_key_id = PSA_KEY_ID_NULL;
201
202 psa_set_key_type(&base_attr, PSA_KEY_TYPE_DERIVE);
203 psa_set_key_algorithm(&base_attr, PSA_ALG_HKDF(PSA_ALG_SHA_256));
204 psa_set_key_bits(&base_attr, PSA_BYTES_TO_BITS(layer_ctx->data.attest_pub_key_len));
205 psa_set_key_usage_flags(&base_attr, PSA_KEY_USAGE_DERIVE);
206
207 status = psa_import_key(&base_attr,
208 &layer_ctx->data.attest_pub_key[0],
209 layer_ctx->data.attest_pub_key_len,
210 &base_key);
211 if (status != PSA_SUCCESS) {
212 return status;
213 }
214
215 /* Derive Key attributes same as CDI attributes except the label */
216 psa_set_key_type(&derive_key_attr, PSA_KEY_TYPE_RAW_DATA);
217 psa_set_key_algorithm(&derive_key_attr, PSA_ALG_HKDF(PSA_ALG_SHA_256));
218 psa_set_key_bits(&derive_key_attr, PSA_BYTES_TO_BITS(DICE_ID_SIZE));
219 psa_set_key_usage_flags(&derive_key_attr, PSA_KEY_USAGE_EXPORT);
220
221 /* Perform ID derivation */
222 /* Supply the ID label as an input to the key derivation */
223 status = perform_derivation(base_key,
224 &derive_key_attr,
225 (uint8_t *) &id_label[0],
226 sizeof(id_label),
227 id_salt,
228 sizeof(id_salt),
229 &derived_key_id);
230 if (status != PSA_SUCCESS) {
231 goto err_destroy_base_key;
232 }
233 status = psa_export_key(derived_key_id,
234 &layer_ctx->data.cdi_id[0],
235 sizeof(layer_ctx->data.cdi_id),
236 &output_id_len);
237
238 (void)psa_destroy_key(derived_key_id);
239
240err_destroy_base_key:
241 (void)psa_destroy_key(base_key);
242
243 return status;
Maulik Patel58595d32023-06-22 10:08:53 +0100244}
Jamie Fox93225232023-09-22 14:09:30 +0100245
246psa_status_t derive_cdi_id(psa_key_id_t attest_key_id, uint8_t *cdi_id,
247 size_t cdi_id_size)
248{
249 psa_status_t status;
250 psa_key_derivation_operation_t op = PSA_KEY_DERIVATION_OPERATION_INIT;
251 uint8_t attest_pub_key[DPE_ATTEST_PUB_KEY_SIZE];
252 size_t attest_pub_key_len;
253
254 status = psa_export_public_key(attest_key_id, attest_pub_key,
255 sizeof(attest_pub_key), &attest_pub_key_len);
256 if (status != PSA_SUCCESS) {
257 return status;
258 }
259
260 status = psa_key_derivation_setup(&op, PSA_ALG_HKDF(PSA_ALG_SHA_256));
261 if (status != PSA_SUCCESS) {
262 return status;
263 }
264
265 status = psa_key_derivation_input_bytes(&op, PSA_KEY_DERIVATION_INPUT_SALT,
266 id_salt, sizeof(id_salt));
267 if (status != PSA_SUCCESS) {
268 goto err_abort;
269 }
270
271 status = psa_key_derivation_input_bytes(&op,
272 PSA_KEY_DERIVATION_INPUT_SECRET,
273 attest_pub_key, attest_pub_key_len);
274 if (status != PSA_SUCCESS) {
275 goto err_abort;
276 }
277
278 status = psa_key_derivation_input_bytes(&op, PSA_KEY_DERIVATION_INPUT_INFO,
279 (const uint8_t *)id_label,
280 sizeof(id_label));
281 if (status != PSA_SUCCESS) {
282 goto err_abort;
283 }
284
285 status = psa_key_derivation_output_bytes(&op, cdi_id, cdi_id_size);
286 if (status != PSA_SUCCESS) {
287 goto err_abort;
288 }
289
290 return psa_key_derivation_abort(&op);
291
292err_abort:
293 (void)psa_key_derivation_abort(&op);
294 return status;
295}
Maulik Patel9fd8bd22023-10-30 10:58:30 +0000296
297psa_status_t get_layer_cdi_value(const struct layer_context_t *layer_ctx,
298 uint8_t *cdi_buf,
299 size_t cdi_buf_size,
300 size_t *cdi_actual_size)
301{
302 psa_status_t status;
303
304 //TODO: Sealing CDI to be added later
305 status = psa_export_key(layer_ctx->data.cdi_key_id,
306 cdi_buf,
Maulik Patel16e03262024-01-05 14:40:52 +0000307 cdi_buf_size,
308 cdi_actual_size);
Maulik Patel9fd8bd22023-10-30 10:58:30 +0000309 if (status != PSA_SUCCESS) {
310 *cdi_actual_size = 0;
311 }
312
313 return status;
314}