Software APIs
keymgr_dpe_testutils.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 "sw/device/lib/testing/keymgr_dpe_testutils.h"
6 
7 #include "dt/dt_keymgr_dpe.h"
8 #include "dt/dt_otp_ctrl.h"
9 #include "dt/dt_rstmgr.h"
15 #include "sw/device/lib/testing/otp_ctrl_testutils.h"
16 #include "sw/device/lib/testing/rstmgr_testutils.h"
17 #include "sw/device/lib/testing/test_framework/check.h"
19 
20 status_t keymgr_dpe_testutils_startup(dif_keymgr_dpe_t *keymgr_dpe,
21  uint32_t slot_dst_sel) {
22  dif_rstmgr_t rstmgr;
24 
25  TRY(dif_rstmgr_init_from_dt(kDtRstmgrAon, &rstmgr));
26  info = rstmgr_testutils_reason_get();
27 
28  // POR reset.
29  if (info == kDifRstmgrResetInfoPor) {
30  LOG_INFO(
31  "Powered up for the first time, lock SECRET2 and SECRET3 partitions");
32  dif_otp_ctrl_t otp;
33  TRY(dif_otp_ctrl_init_from_dt(kDtOtpCtrl, &otp));
34  TRY(otp_ctrl_testutils_lock_partition(&otp, kDifOtpCtrlPartitionSecret2,
35  0));
36  TRY(otp_ctrl_testutils_lock_partition(&otp, kDifOtpCtrlPartitionSecret3,
37  0));
38 
39  // Reboot device.
40  rstmgr_testutils_reason_clear();
41  LOG_INFO("Triggering software reset");
43 
44  // Wait here until device reset.
46 
47  } else {
48  TRY_CHECK(info == kDifRstmgrResetInfoSw, "Unexpected reset reason: %08x",
49  info);
50  LOG_INFO(
51  "Powered up for the second time, actuate keymgr_dpe and perform test.");
52 
53  // Initialize keymgr_dpe context.
54  TRY(dif_keymgr_dpe_init_from_dt(kDtKeymgrDpe, keymgr_dpe));
55 
56  // Advance to Initialized state.
57  TRY(keymgr_dpe_testutils_check_state(keymgr_dpe, kDifKeymgrDpeStateReset));
58  TRY(dif_keymgr_dpe_initialize(keymgr_dpe, slot_dst_sel));
59  TRY(keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe));
60  TRY(keymgr_dpe_testutils_check_state(keymgr_dpe,
61  kDifKeymgrDpeStateAvailable));
62  LOG_INFO("UDS is latched.");
63  }
64  return OK_STATUS();
65 }
66 
67 status_t keymgr_dpe_testutils_advance_state(
68  const dif_keymgr_dpe_t *keymgr_dpe,
69  const dif_keymgr_dpe_advance_params_t *params) {
70  TRY(dif_keymgr_dpe_advance_state(keymgr_dpe, params));
71  return keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe);
72 }
73 
74 status_t keymgr_dpe_testutils_erase_slot(
75  const dif_keymgr_dpe_t *keymgr_dpe,
76  const dif_keymgr_dpe_erase_params_t *params) {
77  TRY(dif_keymgr_dpe_erase_slot(keymgr_dpe, params));
78  return keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe);
79 }
80 
81 status_t keymgr_dpe_testutils_generate(
82  const dif_keymgr_dpe_t *keymgr_dpe,
85  TRY(dif_keymgr_dpe_generate(keymgr_dpe, params));
86  TRY(keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe));
87  TRY(dif_keymgr_dpe_read_output(keymgr_dpe, key));
88  return OK_STATUS();
89 }
90 
91 status_t keymgr_dpe_testutils_check_state(
92  const dif_keymgr_dpe_t *keymgr_dpe,
93  const dif_keymgr_dpe_state_t exp_state) {
94  dif_keymgr_dpe_state_t act_state;
95  TRY(dif_keymgr_dpe_get_state(keymgr_dpe, &act_state));
96  TRY_CHECK(act_state == exp_state,
97  "KeymgrDPE in unexpected state: %x, expected to be %x", act_state,
98  exp_state);
99  return OK_STATUS();
100 }
101 
102 status_t keymgr_dpe_testutils_wait_for_operation_done(
103  const dif_keymgr_dpe_t *keymgr_dpe) {
105  do {
106  TRY(dif_keymgr_dpe_get_status_codes(keymgr_dpe, &status));
107  } while (status == 0);
108  TRY_CHECK(status == kDifKeymgrDpeStatusCodeIdle, "Unexpected status: %x",
109  status);
110  return OK_STATUS();
111 }