Software APIs
keymgr_dpe_key_derivation_test.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include <stdbool.h>
6 #include <stdint.h>
7 
8 #include "dt/dt_kmac.h"
18 #include "sw/device/lib/testing/keymgr_dpe_testutils.h"
19 #include "sw/device/lib/testing/rstmgr_testutils.h"
20 #include "sw/device/lib/testing/test_framework/check.h"
22 
23 OTTF_DEFINE_TEST_CONFIG();
24 
25 static void init_kmac_for_keymgr(void) {
26  dif_kmac_t kmac;
27  CHECK_DIF_OK(dif_kmac_init_from_dt(kDtKmac, &kmac));
28 
29  // Configure KMAC hardware using software entropy.
31  .entropy_mode = kDifKmacEntropyModeSoftware,
32  .entropy_fast_process = false,
33  .entropy_seed = {0xaa25b4bf, 0x48ce8fff, 0x5a78282a, 0x48465647,
34  0x70410fef},
35  .sideload = true,
36  .msg_mask = true,
37  };
38  CHECK_DIF_OK(dif_kmac_configure(&kmac, config));
39 }
40 
41 // Perform an advance operation with the given parameters, check that all DIF
42 // statuses are OK, and await completion of the operation.
43 void advance(dif_keymgr_dpe_t *keymgr_dpe,
45  CHECK_STATUS_OK(keymgr_dpe_testutils_advance_state(keymgr_dpe, params));
46  CHECK_STATUS_OK(keymgr_dpe_testutils_check_state(
47  keymgr_dpe, kDifKeymgrDpeStateAvailable));
48  CHECK_STATUS_OK(keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe));
49 }
50 
51 // Perform a generate operation with the given parameters, check that all DIF
52 // statuses are OK, and await completion of the operation.
53 void generate(dif_keymgr_dpe_t *keymgr_dpe,
55  CHECK_DIF_OK(dif_keymgr_dpe_generate(keymgr_dpe, params));
56  CHECK_STATUS_OK(keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe));
57 }
58 
59 bool test_main(void) {
60  dif_keymgr_dpe_t keymgr_dpe;
63 
64  // Start keymgr_dpe, letting it derive the boot stage 0 key into slot 1.
65  CHECK_STATUS_OK(keymgr_dpe_testutils_startup(&keymgr_dpe,
66  /*slot_dst_sel=*/1));
67  CHECK_STATUS_OK(keymgr_dpe_testutils_check_state(
68  &keymgr_dpe, kDifKeymgrDpeStateAvailable));
69  LOG_INFO("KeymgrDpe derived boot stage 0 key");
70 
71  init_kmac_for_keymgr();
72 
73  // Generate OTBN output from the boot stage 0 key.
74  gen_params.slot_src_sel = 1;
75  gen_params.sideload_key = true; // HW key
77  gen_params.version = 0;
78  gen_params.salt[7] = 0x49379059;
79  gen_params.salt[6] = 0xff523992;
80  gen_params.salt[5] = 0x75666880;
81  gen_params.salt[4] = 0xc0e44716;
82  gen_params.salt[3] = 0x999612df;
83  gen_params.salt[2] = 0x80f1a9de;
84  gen_params.salt[1] = 0x481eae40;
85  gen_params.salt[0] = 0x45e2c7f0;
86  generate(&keymgr_dpe, &gen_params);
87  LOG_INFO("KeymgrDpe generated OTBN output from boot stage 0");
88 
89  // Generate SW output from boot stage 0 key.
90  gen_params.slot_src_sel = 1;
91  gen_params.sideload_key = false; // SW key
93  gen_params.version = 0;
94  gen_params.salt[7] = 0x72d5886b;
95  gen_params.salt[6] = 0x4e359e52;
96  gen_params.salt[5] = 0x0d7ff336;
97  gen_params.salt[4] = 0x267773cf;
98  gen_params.salt[3] = 0x00c7d10c;
99  gen_params.salt[2] = 0x6dea4fb9;
100  gen_params.salt[1] = 0x77fa328a;
101  gen_params.salt[0] = 0x15779805;
102  generate(&keymgr_dpe, &gen_params);
103  LOG_INFO("KeymgrDpe generated SW output from boot stage 0");
104 
105  // Generate KMAC output from the boot stage 0 key.
106  gen_params.slot_src_sel = 1;
107  gen_params.sideload_key = true; // HW key
108  gen_params.key_dest = kDifKeymgrDpeKeyDestKmac;
109  gen_params.version = 0;
110  gen_params.salt[7] = 0x78ad5715;
111  gen_params.salt[6] = 0x508680d4;
112  gen_params.salt[5] = 0xc7f825b2;
113  gen_params.salt[4] = 0xa7924b8d;
114  gen_params.salt[3] = 0x0906825f;
115  gen_params.salt[2] = 0x77cf81a3;
116  gen_params.salt[1] = 0xd63d89bd;
117  gen_params.salt[0] = 0x88fd3697;
118  generate(&keymgr_dpe, &gen_params);
119  LOG_INFO("KeymgrDpe generated KMAC output from boot stage 0");
120 
121  // Generate AES output from the boot stage 0 key.
122  gen_params.slot_src_sel = 1;
123  gen_params.sideload_key = true; // HW key
124  gen_params.key_dest = kDifKeymgrDpeKeyDestAes;
125  gen_params.version = 0;
126  gen_params.salt[7] = 0x945642d9;
127  gen_params.salt[6] = 0xfbcbc925;
128  gen_params.salt[5] = 0xdb7b0691;
129  gen_params.salt[4] = 0xcd973f4d;
130  gen_params.salt[3] = 0x278e051d;
131  gen_params.salt[2] = 0x0d9f1f0d;
132  gen_params.salt[1] = 0x45eff95b;
133  gen_params.salt[0] = 0xb1ad6ba7;
134  generate(&keymgr_dpe, &gen_params);
135  LOG_INFO("KeymgrDpe generated AES output from boot stage 0");
136 
137  // Derive a boot stage 1 key from the boot stage 0 key.
138  adv_params.slot_src_sel = 1;
139  adv_params.slot_dst_sel = 1;
140  adv_params.max_key_version = 0x100;
141  adv_params.binding_value[7] = 0x4ec9c6d6;
142  adv_params.binding_value[6] = 0x19f5cff7;
143  adv_params.binding_value[5] = 0x426dc745;
144  adv_params.binding_value[4] = 0xb8a8379d;
145  adv_params.binding_value[3] = 0xe92f76e2;
146  adv_params.binding_value[2] = 0xcb68ff71;
147  adv_params.binding_value[1] = 0xaf36e268;
148  adv_params.binding_value[0] = 0xdc96c23d;
149  // Set policy to *Allow Child* and *Retain Parent* (*Exportable* not
150  // implemented yet).
151  adv_params.slot_policy = 0x5;
152  advance(&keymgr_dpe, &adv_params);
153  LOG_INFO("KeymgrDpe derived boot stage 1 key");
154 
155  // Generate KMAC output from the boot stage 1 key.
156  gen_params.slot_src_sel = 1;
157  gen_params.sideload_key = true; // HW key
158  gen_params.key_dest = kDifKeymgrDpeKeyDestKmac;
159  gen_params.version = 0;
160  gen_params.salt[7] = 0x6b21d5da;
161  gen_params.salt[6] = 0x929ea4f4;
162  gen_params.salt[5] = 0xeb06038b;
163  gen_params.salt[4] = 0xcecba4ea;
164  gen_params.salt[3] = 0x8c8e756a;
165  gen_params.salt[2] = 0x26691553;
166  gen_params.salt[1] = 0x7189202b;
167  gen_params.salt[0] = 0x5e560c86;
168  generate(&keymgr_dpe, &gen_params);
169  LOG_INFO("KeymgrDpe generated KMAC output from boot stage 1");
170 
171  // Generate AES output from the boot stage 1 key.
172  gen_params.slot_src_sel = 1;
173  gen_params.sideload_key = true; // HW key
174  gen_params.key_dest = kDifKeymgrDpeKeyDestAes;
175  gen_params.version = 1;
176  gen_params.salt[7] = 0xcd887c60;
177  gen_params.salt[6] = 0xcc40f919;
178  gen_params.salt[5] = 0xdd2972b7;
179  gen_params.salt[4] = 0x09cdc35f;
180  gen_params.salt[3] = 0x3a10980c;
181  gen_params.salt[2] = 0x4b38fdec;
182  gen_params.salt[1] = 0x3d56d980;
183  gen_params.salt[0] = 0x25314e07;
184  generate(&keymgr_dpe, &gen_params);
185  LOG_INFO("KeymgrDpe generated AES output from boot stage 1");
186 
187  // Generate SW output from the boot stage 1 key.
188  gen_params.slot_src_sel = 1;
189  gen_params.sideload_key = false; // SW key
190  gen_params.key_dest = kDifKeymgrDpeKeyDestNone;
191  gen_params.version = 2;
192  gen_params.salt[7] = 0x72d5886b;
193  gen_params.salt[6] = 0x4e359e52;
194  gen_params.salt[5] = 0x0d7ff336;
195  gen_params.salt[4] = 0x267773cf;
196  gen_params.salt[3] = 0x00c7d10c;
197  gen_params.salt[2] = 0x6dea4fb9;
198  gen_params.salt[1] = 0x77fa328a;
199  gen_params.salt[0] = 0x15779805;
200  generate(&keymgr_dpe, &gen_params);
201  LOG_INFO("KeymgrDpe generated SW output from boot stage 1");
202 
203  // Generate OTBN output from the boot stage 1 key.
204  gen_params.slot_src_sel = 1;
205  gen_params.sideload_key = true; // HW key
206  gen_params.key_dest = kDifKeymgrDpeKeyDestOtbn;
207  gen_params.version = 3;
208  gen_params.salt[7] = 0x564712d4;
209  gen_params.salt[6] = 0x7ab745f5;
210  gen_params.salt[5] = 0x5fa8faa9;
211  gen_params.salt[4] = 0x77fce728;
212  gen_params.salt[3] = 0xffa3fd3c;
213  gen_params.salt[2] = 0x876930f2;
214  gen_params.salt[1] = 0x593b54d4;
215  gen_params.salt[0] = 0xa75e231b;
216  generate(&keymgr_dpe, &gen_params);
217  LOG_INFO("KeymgrDpe generated OTBN output from boot stage 1");
218 
219  // Derive a boot stage 2 key from the boot stage 1 key.
220  adv_params.slot_dst_sel = 2;
221  adv_params.binding_value[7] = 0x17eae937;
222  adv_params.binding_value[6] = 0x73008c5a;
223  adv_params.binding_value[5] = 0x181b7a2c;
224  adv_params.binding_value[4] = 0x605c8d2f;
225  adv_params.binding_value[3] = 0x99f93c05;
226  adv_params.binding_value[2] = 0x064b6b7d;
227  adv_params.binding_value[1] = 0x766be38a;
228  adv_params.binding_value[0] = 0xfe7c4f9b;
229  advance(&keymgr_dpe, &adv_params);
230  LOG_INFO("KeymgrDpe derived boot stage 2 key");
231 
232  // Generate SW output from the boot stage 2 key.
233  gen_params.slot_src_sel = 2;
234  gen_params.sideload_key = false; // SW key
235  gen_params.key_dest = kDifKeymgrDpeKeyDestNone;
236  gen_params.version = 0;
237  gen_params.salt[7] = 0xe1b3f29c;
238  gen_params.salt[6] = 0xa3bc4d2a;
239  gen_params.salt[5] = 0x458fdc76;
240  gen_params.salt[4] = 0x1b1c0c2e;
241  gen_params.salt[3] = 0x1a128785;
242  gen_params.salt[2] = 0x69ce2d2f;
243  gen_params.salt[1] = 0x8a60fd60;
244  gen_params.salt[0] = 0x5307745c;
245  generate(&keymgr_dpe, &gen_params);
246  LOG_INFO("KeymgrDpe generated SW output from boot stage 2");
247 
249  CHECK_DIF_OK(dif_keymgr_dpe_read_output(&keymgr_dpe, &key));
250  for (size_t i = 0; i < ARRAYSIZE(key.value); i++) {
251  for (size_t j = 0; j < ARRAYSIZE(key.value[0]); j++) {
252  LOG_INFO("%x ", key.value[i][j]);
253  }
254  }
255 
256  // Generate AES output from the boot stage 2 key.
257  gen_params.slot_src_sel = 2;
258  gen_params.sideload_key = true; // HW key
259  gen_params.key_dest = kDifKeymgrDpeKeyDestAes;
260  gen_params.version = 1;
261  gen_params.salt[7] = 0x0f20f37e;
262  gen_params.salt[6] = 0xb951b619;
263  gen_params.salt[5] = 0xcb815e8d;
264  gen_params.salt[4] = 0x77e17fa4;
265  gen_params.salt[3] = 0x3074e3db;
266  gen_params.salt[2] = 0xe7482b04;
267  gen_params.salt[1] = 0xed12d4ee;
268  gen_params.salt[0] = 0xa34fba3c;
269  generate(&keymgr_dpe, &gen_params);
270  LOG_INFO("KeymgrDpe generated AES output from boot stage 2");
271 
272  // Generate KMAC output from the boot stage 2 key.
273  gen_params.slot_src_sel = 2;
274  gen_params.sideload_key = true; // HW key
275  gen_params.key_dest = kDifKeymgrDpeKeyDestKmac;
276  gen_params.version = 2;
277  gen_params.salt[7] = 0xb31031a3;
278  gen_params.salt[6] = 0x59fe6e8e;
279  gen_params.salt[5] = 0x4171de6b;
280  gen_params.salt[4] = 0xa3f3d397;
281  gen_params.salt[3] = 0x7bb7800b;
282  gen_params.salt[2] = 0x8f8f8cda;
283  gen_params.salt[1] = 0xb697609d;
284  gen_params.salt[0] = 0x122eb3b7;
285  generate(&keymgr_dpe, &gen_params);
286  LOG_INFO("KeymgrDpe generated KMAC output from boot stage 2");
287 
288  // Generate OTBN output from the boot stage 2 key.
289  gen_params.slot_src_sel = 2;
290  gen_params.sideload_key = true; // HW key
291  gen_params.key_dest = kDifKeymgrDpeKeyDestOtbn;
292  gen_params.version = 3;
293  gen_params.salt[7] = 0x3f184f9b;
294  gen_params.salt[6] = 0xd4af6765;
295  gen_params.salt[5] = 0x8abeb221;
296  gen_params.salt[4] = 0xaae3ca52;
297  gen_params.salt[3] = 0x29f7114f;
298  gen_params.salt[2] = 0xf5bf3e01;
299  gen_params.salt[1] = 0x6a961bc2;
300  gen_params.salt[0] = 0xec932d64;
301  generate(&keymgr_dpe, &gen_params);
302  LOG_INFO("KeymgrDpe generated OTBN output from boot stage 2");
303 
304  // Derive a boot stage 3 key from the boot stage 2 key.
305  adv_params.slot_src_sel = 2;
306  adv_params.slot_dst_sel = 3;
307  adv_params.binding_value[7] = 0x952b5a35;
308  adv_params.binding_value[6] = 0x28b4520e;
309  adv_params.binding_value[5] = 0x1f310db2;
310  adv_params.binding_value[4] = 0x832b8477;
311  adv_params.binding_value[3] = 0x75b81191;
312  adv_params.binding_value[2] = 0x0668dc27;
313  adv_params.binding_value[1] = 0xa226160d;
314  adv_params.binding_value[0] = 0x45790409;
315  advance(&keymgr_dpe, &adv_params);
316  LOG_INFO("KeymgrDpe derived boot stage 3 key");
317 
318  // Generate AES output from the boot stage 3 key.
319  gen_params.slot_src_sel = 3;
320  gen_params.sideload_key = true; // HW key
321  gen_params.key_dest = kDifKeymgrDpeKeyDestAes;
322  gen_params.version = 0x10;
323  gen_params.salt[7] = 0x30059d96;
324  gen_params.salt[6] = 0x97436d9c;
325  gen_params.salt[5] = 0xf539a20a;
326  gen_params.salt[4] = 0x6838564e;
327  gen_params.salt[3] = 0x74ad4bb7;
328  gen_params.salt[2] = 0x78000277;
329  gen_params.salt[1] = 0x423025af;
330  gen_params.salt[0] = 0x732e53a9;
331  generate(&keymgr_dpe, &gen_params);
332  LOG_INFO("KeymgrDpe generated AES output from boot stage 3");
333 
334  // Generate OTBN output from the boot stage 3 key.
335  gen_params.slot_src_sel = 3;
336  gen_params.sideload_key = true; // HW key
337  gen_params.key_dest = kDifKeymgrDpeKeyDestOtbn;
338  gen_params.version = 0x20;
339  gen_params.salt[7] = 0x2cd82d66;
340  gen_params.salt[6] = 0x24275e98;
341  gen_params.salt[5] = 0xe0344ab2;
342  gen_params.salt[4] = 0xc048d59e;
343  gen_params.salt[3] = 0x139694c3;
344  gen_params.salt[2] = 0x0043f9b4;
345  gen_params.salt[1] = 0x413a2212;
346  gen_params.salt[0] = 0xc2dcfbc8;
347  generate(&keymgr_dpe, &gen_params);
348  LOG_INFO("KeymgrDpe generated OTBN output from boot stage 3");
349 
350  // Generate SW output from the boot stage 3 key.
351  gen_params.slot_src_sel = 3;
352  gen_params.sideload_key = false; // SW key
353  gen_params.key_dest = kDifKeymgrDpeKeyDestNone;
354  gen_params.version = 0x30;
355  gen_params.salt[7] = 0x23c20696;
356  gen_params.salt[6] = 0xebaf62f0;
357  gen_params.salt[5] = 0xa2ff413f;
358  gen_params.salt[4] = 0x22d65603;
359  gen_params.salt[3] = 0x91155c24;
360  gen_params.salt[2] = 0xda1269fc;
361  gen_params.salt[1] = 0xc8611986;
362  gen_params.salt[0] = 0xf129041f;
363  generate(&keymgr_dpe, &gen_params);
364  LOG_INFO("KeymgrDpe generated SW output from boot stage 3");
365 
366  // Generate KMAC output from the boot stage 3 key.
367  gen_params.slot_src_sel = 3;
368  gen_params.sideload_key = true; // HW key
369  gen_params.key_dest = kDifKeymgrDpeKeyDestKmac;
370  gen_params.version = 0x40;
371  gen_params.salt[7] = 0x06896da3;
372  gen_params.salt[6] = 0x9ce2c0da;
373  gen_params.salt[5] = 0xaa23a965;
374  gen_params.salt[4] = 0x108e57ca;
375  gen_params.salt[3] = 0xd926d474;
376  gen_params.salt[2] = 0xb6ae40fc;
377  gen_params.salt[1] = 0xa65d1375;
378  gen_params.salt[0] = 0x6ee7be64;
379  generate(&keymgr_dpe, &gen_params);
380  LOG_INFO("KeymgrDpe generated KMAC output from boot stage 3");
381 
382  // Generate some additional outputs from the boot stage 1 and 2 keys, which
383  // should still be available.
384  gen_params.slot_src_sel = 1;
385  gen_params.sideload_key = false; // SW key
386  gen_params.key_dest = kDifKeymgrDpeKeyDestNone;
387  gen_params.version = 42;
388  gen_params.salt[7] = 0x2488d617;
389  gen_params.salt[6] = 0x99227306;
390  gen_params.salt[5] = 0xcd789bc0;
391  gen_params.salt[4] = 0x9787039b;
392  gen_params.salt[3] = 0x9869544a;
393  gen_params.salt[2] = 0xb28b9fc7;
394  gen_params.salt[1] = 0x69ab6f9d;
395  gen_params.salt[0] = 0xfb11f188;
396  generate(&keymgr_dpe, &gen_params);
397  LOG_INFO("KeymgrDpe generated SW output from boot stage 1");
398  gen_params.slot_src_sel = 2;
399  gen_params.sideload_key = true; // HW key
400  gen_params.key_dest = kDifKeymgrDpeKeyDestOtbn;
401  gen_params.version = 7;
402  gen_params.salt[7] = 0xfa94162c;
403  gen_params.salt[6] = 0xd039a40f;
404  gen_params.salt[5] = 0xc2b81d98;
405  gen_params.salt[4] = 0x999ce18d;
406  gen_params.salt[3] = 0xbf8fb838;
407  gen_params.salt[2] = 0x589544ce;
408  gen_params.salt[1] = 0xee7790c4;
409  gen_params.salt[0] = 0x0de6bdcf;
410  generate(&keymgr_dpe, &gen_params);
411  LOG_INFO("KeymgrDpe generated OTBN output from boot stage 2");
412 
413  return true;
414 }