Pavona 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
8#include "hw/top/dt/otp_ctrl.h"
9#include "hw/top/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, kOtpPartitionSecret2, 0));
35 TRY(otp_ctrl_testutils_lock_partition(&otp, kOtpPartitionSecret3, 0));
36
37 // Reboot device.
38 rstmgr_testutils_reason_clear();
39 LOG_INFO("Triggering software reset");
40 TRY(dif_rstmgr_software_device_reset(&rstmgr));
41
42 // Wait here until device reset.
43 wait_for_interrupt();
44
45 } else {
46 TRY_CHECK(info == kDifRstmgrResetInfoSw, "Unexpected reset reason: %08x",
47 info);
49 "Powered up for the second time, actuate keymgr_dpe and perform test.");
50
51 // Initialize keymgr_dpe context.
52 TRY(dif_keymgr_dpe_init_from_dt(kDtKeymgrDpe, keymgr_dpe));
53
54 // Advance to Initialized state.
55 TRY(keymgr_dpe_testutils_check_state(keymgr_dpe, kDifKeymgrDpeStateReset));
56 TRY(dif_keymgr_dpe_initialize(keymgr_dpe, slot_dst_sel));
57 TRY(keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe));
58 TRY(keymgr_dpe_testutils_check_state(keymgr_dpe,
59 kDifKeymgrDpeStateAvailable));
60 LOG_INFO("UDS is latched.");
61 }
62 return OK_STATUS();
63}
64
65status_t keymgr_dpe_testutils_advance_state(
66 const dif_keymgr_dpe_t *keymgr_dpe,
67 const dif_keymgr_dpe_advance_params_t *params) {
68 TRY(dif_keymgr_dpe_advance_state(keymgr_dpe, params));
69 return keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe);
70}
71
72status_t keymgr_dpe_testutils_erase_slot(
73 const dif_keymgr_dpe_t *keymgr_dpe,
74 const dif_keymgr_dpe_erase_params_t *params) {
75 TRY(dif_keymgr_dpe_erase_slot(keymgr_dpe, params));
76 return keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe);
77}
78
79status_t keymgr_dpe_testutils_generate(
80 const dif_keymgr_dpe_t *keymgr_dpe,
83 TRY(dif_keymgr_dpe_generate(keymgr_dpe, params));
84 TRY(keymgr_dpe_testutils_wait_for_operation_done(keymgr_dpe));
85 TRY(dif_keymgr_dpe_read_output(keymgr_dpe, key));
86 return OK_STATUS();
87}
88
89status_t keymgr_dpe_testutils_check_state(
90 const dif_keymgr_dpe_t *keymgr_dpe,
91 const dif_keymgr_dpe_state_t exp_state) {
92 dif_keymgr_dpe_state_t act_state;
93 TRY(dif_keymgr_dpe_get_state(keymgr_dpe, &act_state));
94 TRY_CHECK(act_state == exp_state,
95 "KeymgrDPE in unexpected state: %x, expected to be %x", act_state,
96 exp_state);
97 return OK_STATUS();
98}
99
100status_t keymgr_dpe_testutils_wait_for_operation_done(
101 const dif_keymgr_dpe_t *keymgr_dpe) {
103 do {
104 TRY(dif_keymgr_dpe_get_status_codes(keymgr_dpe, &status));
105 } while (status == 0);
106 TRY_CHECK(status == kDifKeymgrDpeStatusCodeIdle, "Unexpected status: %x",
107 status);
108 return OK_STATUS();
109}