7 #include "sw/device/lib/crypto/drivers/otbn.h"
10 #include "sw/device/lib/testing/entropy_testutils.h"
12 #include "sw/device/lib/testing/test_framework/ottf_test_config.h"
14 #include "sw/device/tests/penetrationtests/firmware/lib/pentest_lib.h"
17 #include "otbn_regs.h"
40 OTTF_DEFINE_TEST_CONFIG();
47 kEcc256NumBytes = 256 / 8,
52 kEcc256NumWords = kEcc256NumBytes /
sizeof(uint32_t),
64 uint32_t ecc256_secret_k[2 * kEcc256NumWords] = {
65 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
66 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
67 0x00000000, 0x00000000, 0x00000000, 0x00000000,
80 uint32_t ecc256_private_key_d[2 * kEcc256NumWords] = {
81 0xaf57b4cd, 0x744c9f1c, 0x8b7e0c02, 0x283e93e9, 0x0d18f00c, 0xda0b6cf4,
82 0x8fe6bb7a, 0x5545a0b7, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
83 0x00000000, 0x00000000, 0x00000000, 0x00000000,
92 uint32_t ecc256_msg[kEcc256NumWords] = {
115 static const otbn_addr_t kOtbnVarMode =
OTBN_ADDR_T_INIT(p256_ecdsa_sca, mode);
116 static const otbn_addr_t kOtbnVarMsg =
OTBN_ADDR_T_INIT(p256_ecdsa_sca, msg);
123 static const otbn_addr_t kOtbnVarXR =
OTBN_ADDR_T_INIT(p256_ecdsa_sca, x_r);
142 static void ecc256_set_secret_key_k(
const uint8_t *secret_k,
143 size_t secret_k_len) {
144 SS_CHECK(secret_k_len == 2 * kEcc256NumBytes);
145 memcpy(ecc256_secret_k, secret_k, secret_k_len);
163 static void ecc256_set_private_key_d(
const uint8_t *key_d,
size_t key_d_len) {
164 SS_CHECK(key_d_len == 2 * kEcc256NumBytes);
165 memcpy(ecc256_private_key_d, key_d, key_d_len);
178 static void ecc256_set_msg(
const uint8_t *msg,
size_t msg_len) {
179 SS_CHECK(msg_len <= kEcc256NumBytes);
181 memset(ecc256_msg, 0, kEcc256NumBytes);
182 memcpy(ecc256_msg, msg, msg_len);
201 static void p256_ecdsa_sign(
const uint32_t *msg,
const uint32_t *private_key_d,
202 uint32_t *signature_r, uint32_t *signature_s,
211 otbn_dmem_write(kEcc256NumWords, private_key_d, kOtbnVarD0));
213 kEcc256NumWords, private_key_d + kEcc256NumWords, kOtbnVarD1));
217 otbn_dmem_write(kEcc256NumWords, k + kEcc256NumWords, kOtbnVarK1));
234 static void ecc256_ecdsa(
const uint8_t *arg,
size_t len) {
238 OTBN_STATUS_REG_OFFSET));
240 uint32_t ecc256_signature_r[kEcc256NumWords];
241 uint32_t ecc256_signature_s[kEcc256NumWords];
244 pentest_set_trigger_high();
245 p256_ecdsa_sign(ecc256_msg, ecc256_private_key_d, ecc256_signature_r,
246 ecc256_signature_s, ecc256_secret_k);
247 pentest_set_trigger_low();
250 uint8_t ecc256_signature_r_bytes[kEcc256NumBytes];
251 memcpy(ecc256_signature_r_bytes, ecc256_signature_r,
252 sizeof(ecc256_signature_r));
253 uint8_t ecc256_signature_s_bytes[kEcc256NumBytes];
254 memcpy(ecc256_signature_s_bytes, ecc256_signature_s,
255 sizeof(ecc256_signature_s));
270 static void simple_serial_main(
void) {
273 pentest_init(kPentestTriggerSourceOtbn,
274 kPentestPeripheralEntropy | kPentestPeripheralIoDiv4 |
275 kPentestPeripheralOtbn | kPentestPeripheralCsrng |
276 kPentestPeripheralEdn | kPentestPeripheralHmac);
279 LOG_INFO(
"Initializing simple serial interface to capture board.");
291 LOG_INFO(
"Starting simple serial packet handling.");
302 simple_serial_main();