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
20status_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) {
31 "Powered up for the first time, lock SECRET2 and SECRET3 partitions");
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");
42 TRY(dif_rstmgr_software_device_reset(&rstmgr));
43
44 // Wait here until device reset.
45 wait_for_interrupt();
46
47 } else {
48 TRY_CHECK(info == kDifRstmgrResetInfoSw, "Unexpected reset reason: %08x",
49 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
67status_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
74status_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
81status_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
91status_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
102status_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}