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"
35 OTTF_DEFINE_TEST_CONFIG();
42 kEcc384NumBytes = 384 / 8,
52 kEcc384NumWords = kEcc384NumBytes /
sizeof(uint32_t),
64 uint32_t ecc384_secret_k[2 * kEcc384NumWords] = {
65 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
66 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
67 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
68 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
81 uint32_t ecc384_private_key_d[2 * kEcc384NumWords] = {
82 0xAD3D9D6B, 0x1C8C1B2E, 0x7598B105, 0x4D9F65B6, 0x663B3CE2, 0xBA97F27B,
83 0x4077A49A, 0xD8377178, 0x4E72D596, 0x25A8704C, 0xEAC972F8, 0xF5EDD260,
84 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
85 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
93 uint32_t ecc384_msg[kEcc384NumWords] = {
115 static const otbn_addr_t kOtbnVarMode =
OTBN_ADDR_T_INIT(p384_ecdsa_sca, mode);
116 static const otbn_addr_t kOtbnVarMsg =
OTBN_ADDR_T_INIT(p384_ecdsa_sca, msg);
141 static void ecc384_set_secret_key_k(
const uint8_t *secret_k,
142 size_t secret_k_len) {
143 SS_CHECK(secret_k_len == 2 * kEcc384NumBytes);
144 memcpy(ecc384_secret_k, secret_k, secret_k_len);
162 static void ecc_384_set_private_key_d(
const uint8_t *key_d,
size_t key_d_len) {
163 SS_CHECK(key_d_len == 2 * kEcc384NumBytes);
164 memcpy(ecc384_private_key_d, key_d, key_d_len);
177 static void ecc384_set_msg(
const uint8_t *msg,
size_t msg_len) {
178 SS_CHECK(msg_len <= kEcc384NumBytes);
180 memset(ecc384_msg, 0, kEcc384NumBytes);
181 memcpy(ecc384_msg, msg, msg_len);
191 static void p384_dmem_write(
const uint32_t src[kEcc384NumWords],
192 const otbn_addr_t dest) {
193 static const uint32_t zero[kEcc384NumWords % kOtbnWideWordNumWords] = {0};
214 static void p384_ecdsa_sign(
const uint32_t *msg,
const uint32_t *private_key_d,
215 uint32_t *signature_r, uint32_t *signature_s,
220 p384_dmem_write(msg, kOtbnVarMsg);
221 p384_dmem_write(private_key_d, kOtbnVarD0);
222 p384_dmem_write(private_key_d + kEcc384NumWords, kOtbnVarD1);
226 otbn_dmem_write(kEcc384NumWords, k + kEcc384NumWords, kOtbnVarK1));
248 static void ecc384_ecdsa(
const uint8_t *ecc384_secret_k_bytes,
249 size_t secret_k_len) {
253 OTBN_STATUS_REG_OFFSET));
255 uint32_t ecc384_signature_r[kEcc384NumWords];
256 uint32_t ecc384_signature_s[kEcc384NumWords];
259 pentest_set_trigger_high();
260 p384_ecdsa_sign(ecc384_msg, ecc384_private_key_d, ecc384_signature_r,
261 ecc384_signature_s, ecc384_secret_k);
262 pentest_set_trigger_low();
265 uint8_t ecc384_signature_r_bytes[kEcc384NumBytes];
266 memcpy(ecc384_signature_r_bytes, ecc384_signature_r,
267 sizeof(ecc384_signature_r));
268 uint8_t ecc384_signature_s_bytes[kEcc384NumBytes];
269 memcpy(ecc384_signature_s_bytes, ecc384_signature_s,
270 sizeof(ecc384_signature_s));
289 static void simple_serial_main(
void) {
292 pentest_init(kPentestTriggerSourceOtbn,
293 kPentestPeripheralEntropy | kPentestPeripheralIoDiv4 |
294 kPentestPeripheralOtbn | kPentestPeripheralCsrng |
295 kPentestPeripheralEdn | kPentestPeripheralHmac);
298 LOG_INFO(
"Initializing simple serial interface to capture board.");
310 LOG_INFO(
"Starting simple serial packet handling.");
320 simple_serial_main();