Software APIs
otbn_vertical_serial.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 
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"
13 #include "sw/device/sca/lib/prng.h"
15 #include "sw/device/sca/otbn_vertical/ecc256_keygen_serial.h"
16 #include "sw/device/sca/otbn_vertical/ecc256_modinv_serial.h"
17 #include "sw/device/tests/penetrationtests/firmware/lib/pentest_lib.h"
18 
20 #include "otbn_regs.h"
21 
22 /**
23  * OpenTitan program for OTBN vertical side-channel analysis.
24  *
25  * This program implements the following simple serial commands:
26  * - Select the required OTBN app (currently keygen/modinv) ('a')
27  * - Set seed for ecc256 keygen ('x'),
28  * - Secret ecc256 keygen key generation ('k'),
29  * - Ecc256 keygen keypair generation ('p'),
30  * - Ecc256 keygen key generation batch mode ('b')
31  * - Ecc256 keygen enable/disable masks ('m')
32  * - Masked modular inverse computation ('q')
33  * - Get version ('v') (implemented in simpleserial library),
34  * - Seed PRNG ('s') (implemented in simpleserial library),
35  * See https://wiki.newae.com/SimpleSerial for details on the protocol.
36  */
37 
38 OTTF_DEFINE_TEST_CONFIG();
39 
40 /**
41  * Simple serial 'a' (app select) command handler.
42  *
43  * This handler has to be called to load a new app to otbn.
44  *
45  * @param app_cmd 0 => ecc256 keygen, 1 => ecc256 modular inverse.
46  * @param app_cmd_len Length of sent command value.
47  */
48 static void ecc256_app_select(const uint8_t *app_cmd, size_t app_cmd_len) {
49  SS_CHECK(app_cmd_len == 1);
50  if (*app_cmd == 0) {
51  // load keygen app
52  SS_CHECK_STATUS_OK(otbn_load_app(kOtbnAppP256KeyFromSeed));
53  } else if (*app_cmd == 1) {
54  // load mod inv app
55  SS_CHECK_STATUS_OK(otbn_load_app(kOtbnAppP256ModInv));
56  } else {
57  LOG_ERROR("Wrong app select command.");
58  }
59 }
60 
61 /**
62  * Initializes peripherals and processes simple serial packets received over
63  * UART.
64  */
65 static void simple_serial_main(void) {
66  SS_CHECK_STATUS_OK(entropy_testutils_auto_mode_init());
67 
68  pentest_init(kPentestTriggerSourceOtbn,
69  kPentestPeripheralEntropy | kPentestPeripheralIoDiv4 |
70  kPentestPeripheralOtbn | kPentestPeripheralCsrng |
71  kPentestPeripheralEdn | kPentestPeripheralHmac);
72 
73  LOG_INFO("Running ECC serial");
74  LOG_INFO("Initializing simple serial interface to capture board.");
75 
76  simple_serial_init(pentest_get_uart());
78  'b', ecc256_ecdsa_keygen_fvsr_seed_batch) == kSimpleSerialOk);
80  'e', ecc256_ecdsa_keygen_fvsr_key_batch) == kSimpleSerialOk);
81  SS_CHECK(simple_serial_register_handler('k', ecc256_ecdsa_secret_keygen) ==
82  kSimpleSerialOk);
83  SS_CHECK(simple_serial_register_handler('p', ecc256_ecdsa_gen_keypair) ==
84  kSimpleSerialOk);
85  SS_CHECK(simple_serial_register_handler('x', ecc256_set_seed) ==
86  kSimpleSerialOk);
87  SS_CHECK(simple_serial_register_handler('c', ecc256_set_c) ==
88  kSimpleSerialOk);
89  SS_CHECK(simple_serial_register_handler('m', ecc256_en_masks) ==
90  kSimpleSerialOk);
91  SS_CHECK(simple_serial_register_handler('a', ecc256_app_select) ==
92  kSimpleSerialOk);
93  SS_CHECK(simple_serial_register_handler('q', ecc256_modinv) ==
94  kSimpleSerialOk);
95 
96  // load keygen app as default
97  LOG_INFO("Load p256 keygen from seed app into OTBN");
98  SS_CHECK_STATUS_OK(otbn_load_app(kOtbnAppP256KeyFromSeed));
99 
100  LOG_INFO("Starting simple serial packet handling.");
101  while (true) {
103  }
104 }
105 
106 bool test_main(void) {
107  simple_serial_main();
108  return true;
109 }