5 #include "sw/device/sca/otbn_vertical/ecc256_modinv_serial.h"
11 #include "sw/device/lib/testing/entropy_testutils.h"
13 #include "sw/device/lib/testing/test_framework/ottf_test_config.h"
16 #include "sw/device/tests/penetrationtests/firmware/lib/pentest_lib.h"
19 #include "otbn_regs.h"
28 kIbexOtbnSleepCycles = 50000,
32 kEcc256ModInvInputShareNumBytes = 320 / 8,
36 kEcc256ModInvInputShareNumWords =
37 kEcc256ModInvInputShareNumBytes /
sizeof(uint32_t),
42 kEcc256ModInvOutputKAlphaInvNumBytes = 256 / 8,
47 kEcc256ModInvOutputKAlphaInvNumWords =
48 kEcc256ModInvOutputKAlphaInvNumBytes /
sizeof(uint32_t),
52 kEcc256ModInvOutputAlphaNumBytes = 128 / 8,
56 kEcc256ModInvOutputAlphaNumWords =
57 kEcc256ModInvOutputAlphaNumBytes /
sizeof(uint32_t),
65 static const otbn_addr_t kOtbnVarModInvK0 =
67 static const otbn_addr_t kOtbnVarModInvK1 =
69 static const otbn_addr_t kOtbnVarModInvKAplhaInv =
71 static const otbn_addr_t kOtbnVarModInvAlpha =
86 static void p256_run_modinv(uint32_t *k0, uint32_t *k1) {
89 otbn_dmem_write(kEcc256ModInvInputShareNumWords, k0, kOtbnVarModInvK0));
91 otbn_dmem_write(kEcc256ModInvInputShareNumWords, k1, kOtbnVarModInvK1));
94 pentest_set_trigger_high();
95 pentest_call_and_sleep(otbn_manual_trigger, kIbexOtbnSleepCycles,
false,
97 otbn_busy_wait_for_done();
98 pentest_set_trigger_low();
101 void ecc256_modinv(
const uint8_t *k0_k1,
size_t k0_k1_len) {
102 if (k0_k1_len != 2 * kEcc256ModInvInputShareNumBytes) {
103 LOG_ERROR(
"Invalid input length %hu", (uint8_t)k0_k1_len);
108 uint32_t modinv_k0[kEcc256ModInvInputShareNumWords];
109 uint32_t modinv_k1[kEcc256ModInvInputShareNumWords];
110 memcpy(modinv_k0, k0_k1, kEcc256ModInvInputShareNumBytes);
111 memcpy(modinv_k1, (k0_k1 + kEcc256ModInvInputShareNumBytes),
112 kEcc256ModInvInputShareNumBytes);
115 p256_run_modinv(modinv_k0, modinv_k1);
118 uint32_t modinv_kalpha_inv[kEcc256ModInvOutputKAlphaInvNumWords];
119 uint32_t modinv_alpha[kEcc256ModInvOutputAlphaNumWords];
121 kOtbnVarModInvKAplhaInv,
124 kOtbnVarModInvAlpha, modinv_alpha));
127 kEcc256ModInvOutputKAlphaInvNumBytes);
129 kEcc256ModInvOutputAlphaNumBytes);