chore(core): adjust core to be compatible with libtropic 3.0.0
What changed, and why it matters
This commit is a routine compatibility update so the Trezor firmware builds and works with version 3.0.0 of an external chip library called libtropic. It renames constants, updates function signatures, swaps some source files in the build lists, and removes a couple of manual mode checks that are no longer needed. There is no indication this fixes a security vulnerability or introduces one.
No security action required. Treat as a normal dependency/API migration commit. If validating, confirm the build succeeds with libtropic 3.0.0 and that Tropic functional tests still pass.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The diff updates Trezor’s Tropic secure-element integration to match libtropic 3.0.0 API changes. Changes are mechanical: renamed macros (LT_ / PAIRING_KEY_ / R_MEM_ / ECC_ / FW_BANK_ / MCOUNTER_ become TR01_*), renamed include (lt_l2.h -> libtropic_l2.h), updated typedefs (pkey_index_t -> lt_pkey_index_t, ecc_slot_t -> lt_ecc_slot_t, etc.), added buffer-size arguments to lt_r_mem_data_read and lt_ecc_key_read calls, replaced lt_get_st_pub’s size argument, changed return-code comparisons (LT_L3_PAIRING_KEY_INVALID -> LT_L3_SLOT_INVALID, LT_L3_PAIRING_KEY_EMPTY -> LT_L3_SLOT_EMPTY), and updated SCons source lists to the new libtropic file layout. Two post-reboot mode checks in prodtest_tropic_update_fw were removed because the new lt_reboot constants (TR01_MAINTENANCE_REBOOT / TR01_REBOOT) make them redundant. No cryptographic logic, access control, or buffer handling semantics appear to change beyond the renamed API surface.
Changed components
core/embed/projects/prodtest/cmd/prodtest_tropic.ccore/embed/sec/tropic/inc/sec/tropic.hcore/embed/sec/tropic/stm32/tropic01.ccore/embed/sec/tropic/tropic.ccore/site_scons/models/T3W1/emulator.pycore/site_scons/models/T3W1/trezor_t3w1_revA.pycore/site_scons/models/T3W1/trezor_t3w1_revB.pycore/site_scons/models/T3W1/trezor_t3w1_revC.pyInspect captured patch +107 / −137
diff --git a/core/embed/projects/prodtest/cmd/prodtest_tropic.c b/core/embed/projects/prodtest/cmd/prodtest_tropic.c
index bea75d515..7a3bf377b 100644
--- a/core/embed/projects/prodtest/cmd/prodtest_tropic.c
+++ b/core/embed/projects/prodtest/cmd/prodtest_tropic.c
@@ -38,7 +38,7 @@
#include "fw_CPU.h"
#include "fw_SPECT.h"
#include "libtropic.h"
-#include "lt_l2.h"
+#include "libtropic_l2.h"
#include <sec/tropic.h>
@@ -485,7 +485,7 @@ static void prodtest_tropic_get_riscv_fw_version(cli_t* cli) {
lt_handle_t* tropic_handle = tropic_get_handle();
- uint8_t version[LT_L2_GET_INFO_RISCV_FW_SIZE] = {0};
+ uint8_t version[TR01_L2_GET_INFO_RISCV_FW_SIZE] = {0};
if (lt_get_info_riscv_fw_ver(tropic_handle, version) != LT_OK) {
cli_error(cli, CLI_ERROR, "Unable to get RISCV FW version");
return;
@@ -503,7 +503,7 @@ static void prodtest_tropic_get_spect_fw_version(cli_t* cli) {
lt_handle_t* tropic_handle = tropic_get_handle();
- uint8_t version[LT_L2_GET_INFO_SPECT_FW_SIZE];
+ uint8_t version[TR01_L2_GET_INFO_SPECT_FW_SIZE];
if (lt_get_info_spect_fw_ver(tropic_handle, version) != LT_OK) {
cli_error(cli, CLI_ERROR, "Unable to get SPECT FW version");
return;
@@ -623,7 +623,7 @@ tropic_locked_status get_tropic_locked_status(cli_t* cli) {
return TROPIC_LOCKED_TRUE;
}
-static lt_ret_t pairing_key_write(lt_handle_t* handle, pkey_index_t slot,
+static lt_ret_t pairing_key_write(lt_handle_t* handle, lt_pkey_index_t slot,
const ed25519_secret_key public_key) {
// If this function returns `LT_OK`, it is ensured that the pairing key
// `public_key` is written in the slot `slot`.
@@ -683,7 +683,7 @@ static bool tropic_is_paired(cli_t* cli) {
curve25519_key public_read = {0};
ret = lt_pairing_key_read(tropic_handle, public_read,
TROPIC_FACTORY_PAIRING_KEY_SLOT);
- if (ret != LT_L3_PAIRING_KEY_INVALID) {
+ if (ret != LT_L3_SLOT_INVALID) {
if (cli != NULL) {
cli_error(cli, CLI_ERROR,
"`lt_pairing_key_read()` for factory pairing key failed with "
@@ -694,9 +694,9 @@ static bool tropic_is_paired(cli_t* cli) {
}
// Read the fourth pairing key to ensure it is empty.
- ret =
- lt_pairing_key_read(tropic_handle, public_read, PAIRING_KEY_SLOT_INDEX_3);
- if (ret != LT_L3_PAIRING_KEY_EMPTY) {
+ ret = lt_pairing_key_read(tropic_handle, public_read,
+ TR01_PAIRING_KEY_SLOT_INDEX_3);
+ if (ret != LT_L3_SLOT_EMPTY) {
if (cli != NULL) {
cli_error(cli, CLI_ERROR,
"`lt_pairing_key_read()` for pairing key slot 3 failed with "
@@ -715,13 +715,13 @@ cleanup:
static void prodtest_tropic_pair(cli_t* cli) {
// If this functions successfully completes, it is ensured that:
// * The public tropic key is written to MCU's flash.
- // * The factory pairing key in tropic's `PAIRING_KEY_SLOT_INDEX_0` is
+ // * The factory pairing key in tropic's `TR01_PAIRING_KEY_SLOT_INDEX_0` is
// invalidated.
// * The unprivileged pairing key is written to tropic's
- // `PAIRING_KEY_SLOT_INDEX_1`.
+ // `TR01_PAIRING_KEY_SLOT_INDEX_1`.
// * The privileged pairing key is written to tropic's
- // `PAIRING_KEY_SLOT_INDEX_2`.
- // * The pairing key in tropic's `PAIRING_KEY_SLOT_INDEX_3` is empty.
+ // `TR01_PAIRING_KEY_SLOT_INDEX_2`.
+ // * The pairing key in tropic's `TR01_PAIRING_KEY_SLOT_INDEX_3` is empty.
// This function is:
// * idempotent (it can be called multiple times without changing the state
// of the device),
@@ -1056,7 +1056,7 @@ static void prodtest_tropic_send_command(cli_t* cli) {
return;
}
- uint8_t input[L2_MAX_FRAME_SIZE] = {0};
+ uint8_t input[TR01_L2_MAX_FRAME_SIZE] = {0};
size_t input_length = 0;
if (!cli_arg_hex(cli, "hex-data", input, sizeof(input), &input_length)) {
if (input_length == sizeof(input)) {
@@ -1094,7 +1094,7 @@ static void prodtest_tropic_send_command(cli_t* cli) {
return;
}
- uint8_t output[L2_MAX_FRAME_SIZE] = {0};
+ uint8_t output[TR01_L2_MAX_FRAME_SIZE] = {0};
ret = lt_l2_recv_encrypted_res(&l2_state, output, sizeof(output));
if (ret != LT_OK) {
cli_error(cli, CLI_ERROR,
@@ -1200,7 +1200,7 @@ static lt_ret_t data_write(lt_handle_t* h, uint16_t first_slot,
uint16_t slots_count, uint8_t* data,
size_t data_length) {
const uint16_t last_data_slot = first_slot + slots_count - 1;
- if (slots_count == 0 || last_data_slot > R_MEM_DATA_SLOT_MAX) {
+ if (slots_count == 0 || last_data_slot > TR01_R_MEM_DATA_SLOT_MAX) {
return LT_PARAM_ERR;
}
@@ -1249,7 +1249,7 @@ static lt_ret_t data_read(lt_handle_t* h, uint16_t first_slot,
uint16_t slots_count, uint8_t* data,
size_t max_data_length, size_t* data_length) {
const uint16_t last_data_slot = first_slot + slots_count - 1;
- if (slots_count == 0 || last_data_slot > R_MEM_DATA_SLOT_MAX) {
+ if (slots_count == 0 || last_data_slot > TR01_R_MEM_DATA_SLOT_MAX) {
return LT_PARAM_ERR;
}
@@ -1264,8 +1264,8 @@ static lt_ret_t data_read(lt_handle_t* h, uint16_t first_slot,
while (slot <= last_data_slot) {
uint16_t slot_length = 0;
- lt_ret_t ret =
- lt_r_mem_data_read(h, slot, prefixed_data + position, &slot_length);
+ lt_ret_t ret = lt_r_mem_data_read(h, slot, prefixed_data + position,
+ R_MEM_DATA_SIZE_MAX, &slot_length);
if (ret != LT_OK) {
return ret;
}
@@ -1414,7 +1414,7 @@ static void prodtest_tropic_certdev_read(cli_t* cli) {
cert_read(cli, TROPIC_DEVICE_CERT_FIRST_SLOT, TROPIC_DEVICE_CERT_SLOT_COUNT);
}
-static void pubkey_read(cli_t* cli, ecc_slot_t slot,
+static void pubkey_read(cli_t* cli, lt_ecc_slot_t slot,
const uint8_t masking_key[ECDSA_PRIVATE_KEY_SIZE]) {
if (cli_arg_count(cli) > 0) {
cli_error_arg_count(cli);
@@ -1434,10 +1434,10 @@ static void pubkey_read(cli_t* cli, ecc_slot_t slot,
uint8_t public_key[ECDSA_PUBLIC_KEY_SIZE] = {0x04};
lt_ecc_curve_type_t curve_type = 0;
- ecc_key_origin_t origin = 0;
- ret = lt_ecc_key_read(tropic_get_handle(), slot, &public_key[1], &curve_type,
- &origin);
- if (ret != LT_OK || curve_type != CURVE_P256) {
+ lt_ecc_key_origin_t origin = 0;
+ ret = lt_ecc_key_read(tropic_get_handle(), slot, &public_key[1],
+ ECDSA_PUBLIC_KEY_SIZE - 1, &curve_type, &origin);
+ if (ret != LT_OK || curve_type != TR01_CURVE_P256) {
cli_error(cli, CLI_ERROR, "lt_ecc_key_read error %d.", ret);
return;
}
@@ -1468,8 +1468,8 @@ static void prodtest_tropic_keyfido_read(cli_t* cli) {
}
static void prodtest_tropic_update_fw(cli_t* cli) {
-#define FW_APP_UPDATE_BANK FW_BANK_FW1
-#define FW_SPECT_UPDATE_BANK FW_BANK_SPECT1
+#define FW_APP_UPDATE_BANK TR01_FW_BANK_FW1
+#define FW_SPECT_UPDATE_BANK TR01_FW_BANK_SPECT1
if (cli_arg_count(cli) > 0) {
cli_error_arg_count(cli);
@@ -1500,18 +1500,13 @@ static void prodtest_tropic_update_fw(cli_t* cli) {
// For firmware update chip must be rebooted into MAINTENANCE mode.
cli_trace(cli, "Rebooting into Maintenance mode");
- lt_ret_t ret = lt_reboot(h, LT_MODE_MAINTENANCE);
+ lt_ret_t ret = lt_reboot(h, TR01_MAINTENANCE_REBOOT);
if (ret != LT_OK) {
cli_error(cli, CLI_ERROR, "lt_reboot() failed, ret=%s",
lt_ret_verbose(ret));
return;
}
- if (h->l2.mode != LT_MODE_MAINTENANCE) {
- cli_error(cli, CLI_ERROR, "Chip couldn't get into MAINTENANCE mode");
- return;
- }
-
cli_trace(cli, "Chip is executing bootloader");
cli_trace(cli, "Updating RISC-V FW");
@@ -1533,23 +1528,16 @@ static void prodtest_tropic_update_fw(cli_t* cli) {
// To read firmware versions chip must be rebooted into application mode.
cli_trace(cli, "Rebooting into Application mode");
- ret = lt_reboot(h, LT_MODE_APP);
+ ret = lt_reboot(h, TR01_REBOOT);
if (ret != LT_OK) {
cli_error(cli, CLI_ERROR, "lt_reboot() failed, ret=%s",
lt_ret_verbose(ret));
goto cleanup;
}
- if (h->l2.mode != LT_MODE_APP) {
- cli_error(cli, CLI_ERROR,
- "Device couldn't get into APP mode, APP and SPECT firmwares in "
- "fw banks are not valid or banks are empty");
- goto cleanup;
- }
-
cli_trace(cli, "Reading RISC-V FW version");
- uint8_t risc_fw_ver[LT_L2_GET_INFO_RISCV_FW_SIZE] = {0};
+ uint8_t risc_fw_ver[TR01_L2_GET_INFO_RISCV_FW_SIZE] = {0};
ret = lt_get_info_riscv_fw_ver(h, risc_fw_ver);
if (ret != LT_OK) {
@@ -1563,7 +1551,7 @@ static void prodtest_tropic_update_fw(cli_t* cli) {
risc_fw_ver[3], risc_fw_ver[2], risc_fw_ver[1], risc_fw_ver[0]);
cli_trace(cli, "Reading SPECT FW version");
- uint8_t spect_fw_ver[LT_L2_GET_INFO_SPECT_FW_SIZE] = {0};
+ uint8_t spect_fw_ver[TR01_L2_GET_INFO_SPECT_FW_SIZE] = {0};
ret = lt_get_info_spect_fw_ver(h, spect_fw_ver);
if (ret != LT_OK) {
diff --git a/core/embed/sec/tropic/inc/sec/tropic.h b/core/embed/sec/tropic/inc/sec/tropic.h
index 6450e96cb..73278ace7 100644
--- a/core/embed/sec/tropic/inc/sec/tropic.h
+++ b/core/embed/sec/tropic/inc/sec/tropic.h
@@ -38,14 +38,14 @@
// Pairing key used by prodtest to inject the privileged and unprivileged
// pairing keys.
-#define TROPIC_FACTORY_PAIRING_KEY_SLOT 0 // PAIRING_KEY_SLOT_INDEX_0
+#define TROPIC_FACTORY_PAIRING_KEY_SLOT 0 // TR01_PAIRING_KEY_SLOT_INDEX_0
// Pairing key used by the HSM to inject the attestation FIDO key and generate
// the device key, and by unofficial firwmare.
-#define TROPIC_UNPRIVILEGED_PAIRING_KEY_SLOT 1 // PAIRING_KEY_SLOT_INDEX_1
+#define TROPIC_UNPRIVILEGED_PAIRING_KEY_SLOT 1 // TR01_PAIRING_KEY_SLOT_INDEX_1
// Pairing key used by official firmware.
-#define TROPIC_PRIVILEGED_PAIRING_KEY_SLOT 2 // PAIRING_KEY_SLOT_INDEX_2
+#define TROPIC_PRIVILEGED_PAIRING_KEY_SLOT 2 // TR01_PAIRING_KEY_SLOT_INDEX_2
#define TROPIC_MAC_AND_DESTROY_SIZE 32
@@ -65,7 +65,7 @@ void tropic_deinit(void);
#include "libtropic.h"
lt_handle_t* tropic_get_handle(void);
-lt_ret_t tropic_custom_session_start(pkey_index_t pairing_key_index);
+lt_ret_t tropic_custom_session_start(lt_pkey_index_t pairing_key_index);
lt_ret_t tropic_session_invalidate(void);
diff --git a/core/embed/sec/tropic/stm32/tropic01.c b/core/embed/sec/tropic/stm32/tropic01.c
index d9c36ddfc..861da2b03 100644
--- a/core/embed/sec/tropic/stm32/tropic01.c
+++ b/core/embed/sec/tropic/stm32/tropic01.c
@@ -171,7 +171,7 @@ lt_ret_t lt_port_spi_transfer(lt_l2_state_t *s2, uint8_t offset,
uint16_t tx_len, uint32_t timeout_ms) {
tropic01_hal_driver_t *drv = &g_tropic01_hal_driver;
- if (offset + tx_len > LT_L1_LEN_MAX) {
+ if (offset + tx_len > TR01_L1_LEN_MAX) {
return LT_L1_DATA_LEN_ERROR;
}
int ret = HAL_SPI_TransmitReceive(&drv->spi, s2->buff + offset,
diff --git a/core/embed/sec/tropic/tropic.c b/core/embed/sec/tropic/tropic.c
index a6b7b87b5..86835f59f 100644
--- a/core/embed/sec/tropic/tropic.c
+++ b/core/embed/sec/tropic/tropic.c
@@ -63,7 +63,7 @@
// Since the counter can only be decremented, its acutal value is
// TROPIC_CHANGE_COUNTER_SLOT_MAX_VALUE minus the number of PIN changes. This
// slot is used both for both privileged and the unprivileged sessions.
-#define TROPIC_CHANGE_COUNTER_SLOT MCOUNTER_INDEX_4
+#define TROPIC_CHANGE_COUNTER_SLOT TR01_MCOUNTER_INDEX_4
#define TROPIC_CHANGE_COUNTER_SLOT_MAX_VALUE 0xfffffffe
#ifdef TREZOR_EMULATOR
@@ -84,7 +84,7 @@ static bool is_retryable(lt_ret_t ret) {
({ \
bool TROPIC_RETRY_COMMAND_session_started = \
g_tropic_driver.session_started; \
- pkey_index_t TROPIC_RETRY_COMMAND_pairing_key_index = \
+ lt_pkey_index_t TROPIC_RETRY_COMMAND_pairing_key_index = \
g_tropic_driver.pairing_key_index; \
lt_ret_t TROPIC_RETRY_COMMAND_res = command; \
for (int TROPIC_RETRY_COMMAND_i = 0; \
@@ -115,8 +115,8 @@ typedef struct {
bool initialized;
bool session_started;
bool chip_ready;
- pkey_index_t pairing_key_index; // This field is valid only if
- // session_started is true.
+ lt_pkey_index_t pairing_key_index; // This field is valid only if
+ // session_started is true.
lt_handle_t handle;
#ifdef TREZOR_EMULATOR
lt_dev_unix_tcp_t device;
@@ -127,7 +127,7 @@ static tropic_driver_t g_tropic_driver = {0};
#if !PRODUCTION || defined(TREZOR_PRODTEST)
static uint8_t tropic_cert_chain[LT_NUM_CERTIFICATES *
- LT_L2_GET_INFO_REQ_CERT_SIZE_SINGLE] = {0};
+ TR01_L2_GET_INFO_REQ_CERT_SIZE_SINGLE] = {0};
static size_t tropic_cert_chain_length = 0;
static curve25519_key tropic_public_cached = {0};
@@ -139,8 +139,8 @@ static bool cache_tropic_cert_chain(void) {
struct lt_cert_store_t cert_store = {0};
for (size_t i = 0; i < LT_NUM_CERTIFICATES; i++) {
cert_store.certs[i] =
- &tropic_cert_chain[i * LT_L2_GET_INFO_REQ_CERT_SIZE_SINGLE];
- cert_store.buf_len[i] = LT_L2_GET_INFO_REQ_CERT_SIZE_SINGLE;
+ &tropic_cert_chain[i * TR01_L2_GET_INFO_REQ_CERT_SIZE_SINGLE];
+ cert_store.buf_len[i] = TR01_L2_GET_INFO_REQ_CERT_SIZE_SINGLE;
}
lt_ret_t ret = LT_FAIL;
@@ -150,8 +150,7 @@ static bool cache_tropic_cert_chain(void) {
return false;
}
- ret = lt_get_st_pub(&cert_store, tropic_public_cached,
- sizeof(tropic_public_cached));
+ ret = lt_get_st_pub(&cert_store, tropic_public_cached);
if (ret != LT_OK) {
return false;
}
@@ -203,7 +202,7 @@ bool tropic_wait_for_ready(void) {
// Wait for Tropic to boot before issuing any session commands.
uint32_t boot_start_ms = hal_ticks_ms();
while (hal_ticks_ms() - boot_start_ms < TROPIC_BOOT_TIMEOUT_MS) {
- uint8_t ver[LT_L2_GET_INFO_RISCV_FW_SIZE] = {0};
+ uint8_t ver[TR01_L2_GET_INFO_RISCV_FW_SIZE] = {0};
if (lt_get_info_riscv_fw_ver(&drv->handle, ver) != LT_L1_CHIP_BUSY) {
drv->chip_ready = true;
return true;
@@ -222,7 +221,7 @@ lt_ret_t tropic_session_invalidate(void) {
return LT_OK;
}
-lt_ret_t tropic_custom_session_start(pkey_index_t pairing_key_index) {
+lt_ret_t tropic_custom_session_start(lt_pkey_index_t pairing_key_index) {
tropic_driver_t *drv = &g_tropic_driver;
if (!drv->initialized) {
@@ -378,11 +377,12 @@ bool tropic_ecc_key_generate(uint16_t slot_index) {
return false;
}
- if (slot_index > ECC_SLOT_31) {
+ if (slot_index > TR01_ECC_SLOT_31) {
return false;
}
- lt_ret_t ret = lt_ecc_key_generate(&drv->handle, slot_index, CURVE_ED25519);
+ lt_ret_t ret =
+ lt_ecc_key_generate(&drv->handle, slot_index, TR01_CURVE_ED25519);
return ret == LT_OK;
}
@@ -394,7 +394,7 @@ bool tropic_ecc_sign(uint16_t key_slot_index, const uint8_t *dig,
return false;
}
- if (key_slot_index > ECC_SLOT_31) {
+ if (key_slot_index > TR01_ECC_SLOT_31) {
return false;
}
@@ -415,11 +415,12 @@ bool tropic_data_read(uint16_t udata_slot, uint8_t *data, uint16_t *size) {
return false;
}
- if (udata_slot > R_MEM_DATA_SLOT_MAX) {
+ if (udata_slot > TR01_R_MEM_DATA_SLOT_MAX) {
return false;
}
- lt_ret_t res = lt_r_mem_data_read(&drv->handle, udata_slot, data, size);
+ lt_ret_t res = lt_r_mem_data_read(&drv->handle, udata_slot, data,
+ R_MEM_DATA_SIZE_MAX, size);
return res == LT_OK;
}
@@ -471,9 +472,9 @@ void tropic_random_buffer_time(uint32_t *time_ms) {
// Defined in tropic01.c
void tropic_set_ui_progress(tropic_ui_progress_t f);
-static mac_and_destroy_slot_t get_mac_and_destroy_slot(
+static lt_mac_and_destroy_slot_t get_mac_and_destroy_slot(
uint16_t pin_index, uint32_t change_pin_counter) {
- mac_and_destroy_slot_t first_slot_index =
+ lt_mac_and_destroy_slot_t first_slot_index =
g_tropic_driver.pairing_key_index == TROPIC_UNPRIVILEGED_PAIRING_KEY_SLOT
? TROPIC_FIRST_MAC_AND_DESTROY_SLOT_UNPRIVILEGED
: TROPIC_FIRST_MAC_AND_DESTROY_SLOT_PRIVILEGED;
@@ -617,7 +618,7 @@ bool tropic_pin_stretch(tropic_ui_progress_t ui_progress, uint16_t pin_index,
goto cleanup;
}
- mac_and_destroy_slot_t slot_index =
+ lt_mac_and_destroy_slot_t slot_index =
get_mac_and_destroy_slot(pin_index, change_pin_counter);
// When `lt_mac_and_destroy()` returns an error and it is unclear whether the
// command was executed or not (for example, it returns LT_L1_CHIP_ALARM_MODE
@@ -742,7 +743,7 @@ bool tropic_pin_set(
uint8_t digest[TROPIC_MAC_AND_DESTROY_SIZE] = {0};
for (int i = 0; i < PIN_MAX_TRIES; i++) {
- mac_and_destroy_slot_t slot_index =
+ lt_mac_and_destroy_slot_t slot_index =
get_mac_and_destroy_slot(i, change_pin_counter);
hmac_sha256(stretched_pins[i], TROPIC_MAC_AND_DESTROY_SIZE, NULL, 0,
@@ -848,7 +849,8 @@ bool tropic_pin_unmask_kek(
uint16_t masked_kek_slot = get_kek_masks_slot(drv);
if (TROPIC_RETRY_COMMAND(lt_r_mem_data_read(&drv->handle, masked_kek_slot,
- masks, &length)) != LT_OK) {
+ masks, R_MEM_DATA_SIZE_MAX,
+ &length)) != LT_OK) {
goto cleanup;
}
@@ -877,7 +879,7 @@ void tropic_pin_unmask_kek_time(uint32_t *time_ms) {
#endif // SECURE_MODE
bool tropic_data_multi_size(uint16_t first_slot, size_t *data_length) {
- if (first_slot > R_MEM_DATA_SLOT_MAX) {
+ if (first_slot > TR01_R_MEM_DATA_SLOT_MAX) {
return false;
}
@@ -901,8 +903,8 @@ static size_t min(size_t x, size_t y) { return (x < y) ? x : y; }
bool tropic_data_multi_read(uint16_t first_slot, uint16_t slot_count,
uint8_t *data, size_t max_data_length,
size_t *data_length) {
- if (first_slot > R_MEM_DATA_SLOT_MAX || slot_count == 0 ||
- slot_count > R_MEM_DATA_SLOT_MAX + 1 - first_slot) {
+ if (first_slot > TR01_R_MEM_DATA_SLOT_MAX || slot_count == 0 ||
+ slot_count > TR01_R_MEM_DATA_SLOT_MAX + 1 - first_slot) {
return false;
}
diff --git a/core/site_scons/models/T3W1/emulator.py b/core/site_scons/models/T3W1/emulator.py
index d2950ec45..e4370a65c 100644
--- a/core/site_scons/models/T3W1/emulator.py
+++ b/core/site_scons/models/T3W1/emulator.py
@@ -68,32 +68,35 @@ def configure(
sources += [
"embed/sec/tropic/tropic.c",
"embed/sec/tropic/unix/tropic01.c",
+ "vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_aesgcm.c",
+ "vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_common.c",
+ "vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_hmac_sha256.c",
+ "vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_sha256.c",
+ "vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_x25519.c",
+ "vendor/libtropic/hal/port/unix/lt_port_unix_tcp.c",
"vendor/libtropic/src/libtropic.c",
+ "vendor/libtropic/src/libtropic_l2.c",
+ "vendor/libtropic/src/libtropic_l3.c",
"vendor/libtropic/src/lt_asn1_der.c",
"vendor/libtropic/src/lt_crc16.c",
"vendor/libtropic/src/lt_hkdf.c",
"vendor/libtropic/src/lt_l1.c",
"vendor/libtropic/src/lt_l1_port_wrap.c",
- "vendor/libtropic/src/lt_l2.c",
"vendor/libtropic/src/lt_l2_frame_check.c",
- "vendor/libtropic/src/lt_l3.c",
"vendor/libtropic/src/lt_l3_process.c",
"vendor/libtropic/src/lt_random.c",
- "vendor/libtropic/hal/port/unix/lt_port_unix_tcp.c",
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_aesgcm.c",
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_ecdsa.c",
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_ed25519.c",
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_sha256.c",
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_x25519.c",
+ "vendor/libtropic/src/lt_secure_memzero.c",
+ "vendor/libtropic/src/lt_tr01_attrs.c",
]
paths += ["embed/sec/tropic/inc"]
paths += ["vendor/libtropic/include"]
paths += ["vendor/libtropic/src"]
defines += ["USE_TREZOR_CRYPTO"]
- defines += [("LT_USE_TREZOR_CRYPTO", "1")]
- defines += [("LT_HELPERS", "1")]
+
features_available.append("tropic")
defines += [("USE_TROPIC", "1")]
+ defines += [("LT_USE_TREZOR_CRYPTO", "1")]
+ defines += [("LT_HELPERS", "1")]
paths += ["vendor/libtropic/TROPIC01_fw_update_files/boot_v_1_0_1/fw_v_1_0_0"]
defines += [("ABAB", "1")]
diff --git a/core/site_scons/models/T3W1/trezor_t3w1_revA.py b/core/site_scons/models/T3W1/trezor_t3w1_revA.py
index f18b4677f..816692f6f 100644
--- a/core/site_scons/models/T3W1/trezor_t3w1_revA.py
+++ b/core/site_scons/models/T3W1/trezor_t3w1_revA.py
@@ -190,32 +190,24 @@ def configure(
if "tropic" in features_wanted:
sources += ["embed/sec/tropic/tropic.c"]
sources += ["embed/sec/tropic/stm32/tropic01.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_aesgcm.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_common.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_hmac_sha256.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_sha256.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_x25519.c"]
sources += ["vendor/libtropic/src/libtropic.c"]
+ sources += ["vendor/libtropic/src/libtropic_l2.c"]
+ sources += ["vendor/libtropic/src/libtropic_l3.c"]
sources += ["vendor/libtropic/src/lt_asn1_der.c"]
sources += ["vendor/libtropic/src/lt_crc16.c"]
- sources += ["vendor/libtropic/src/lt_l1_port_wrap.c"]
+ sources += ["vendor/libtropic/src/lt_hkdf.c"]
sources += ["vendor/libtropic/src/lt_l1.c"]
- sources += ["vendor/libtropic/src/lt_l2.c"]
+ sources += ["vendor/libtropic/src/lt_l1_port_wrap.c"]
sources += ["vendor/libtropic/src/lt_l2_frame_check.c"]
- sources += ["vendor/libtropic/src/lt_l3.c"]
sources += ["vendor/libtropic/src/lt_l3_process.c"]
- sources += ["vendor/libtropic/src/lt_hkdf.c"]
sources += ["vendor/libtropic/src/lt_random.c"]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_aesgcm.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_ecdsa.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_ed25519.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_sha256.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_x25519.c"
- ]
+ sources += ["vendor/libtropic/src/lt_secure_memzero.c"]
+ sources += ["vendor/libtropic/src/lt_tr01_attrs.c"]
paths += ["embed/sec/tropic/inc"]
paths += ["vendor/libtropic/include"]
paths += ["vendor/libtropic/src"]
diff --git a/core/site_scons/models/T3W1/trezor_t3w1_revB.py b/core/site_scons/models/T3W1/trezor_t3w1_revB.py
index 1970beba2..51ab0e644 100644
--- a/core/site_scons/models/T3W1/trezor_t3w1_revB.py
+++ b/core/site_scons/models/T3W1/trezor_t3w1_revB.py
@@ -192,32 +192,25 @@ def configure(
if "tropic" in features_wanted:
sources += ["embed/sec/tropic/tropic.c"]
sources += ["embed/sec/tropic/stm32/tropic01.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_aesgcm.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_common.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_hmac_sha256.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_sha256.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_x25519.c"]
sources += ["vendor/libtropic/src/libtropic.c"]
+ sources += ["vendor/libtropic/src/libtropic_l2.c"]
+ sources += ["vendor/libtropic/src/libtropic_l3.c"]
sources += ["vendor/libtropic/src/lt_asn1_der.c"]
sources += ["vendor/libtropic/src/lt_crc16.c"]
- sources += ["vendor/libtropic/src/lt_l1_port_wrap.c"]
+ sources += ["vendor/libtropic/src/lt_hkdf.c"]
sources += ["vendor/libtropic/src/lt_l1.c"]
- sources += ["vendor/libtropic/src/lt_l2.c"]
+ sources += ["vendor/libtropic/src/lt_l1_port_wrap.c"]
sources += ["vendor/libtropic/src/lt_l2_frame_check.c"]
- sources += ["vendor/libtropic/src/lt_l3.c"]
sources += ["vendor/libtropic/src/lt_l3_process.c"]
- sources += ["vendor/libtropic/src/lt_hkdf.c"]
sources += ["vendor/libtropic/src/lt_random.c"]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_aesgcm.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_ecdsa.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_ed25519.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_sha256.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_x25519.c"
- ]
+ sources += ["vendor/libtropic/src/lt_secure_memzero.c"]
+ sources += ["vendor/libtropic/src/lt_tr01_attrs.c"]
+
paths += ["embed/sec/tropic/inc"]
paths += ["vendor/libtropic/include"]
paths += ["vendor/libtropic/src"]
diff --git a/core/site_scons/models/T3W1/trezor_t3w1_revC.py b/core/site_scons/models/T3W1/trezor_t3w1_revC.py
index dd0bfea58..e317fd37f 100644
--- a/core/site_scons/models/T3W1/trezor_t3w1_revC.py
+++ b/core/site_scons/models/T3W1/trezor_t3w1_revC.py
@@ -191,32 +191,24 @@ def configure(
if "tropic" in features_wanted:
sources += ["embed/sec/tropic/tropic.c"]
sources += ["embed/sec/tropic/stm32/tropic01.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_aesgcm.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_common.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_hmac_sha256.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_sha256.c"]
+ sources += ["vendor/libtropic/cal/trezor_crypto/lt_trezor_crypto_x25519.c"]
sources += ["vendor/libtropic/src/libtropic.c"]
+ sources += ["vendor/libtropic/src/libtropic_l2.c"]
+ sources += ["vendor/libtropic/src/libtropic_l3.c"]
sources += ["vendor/libtropic/src/lt_asn1_der.c"]
sources += ["vendor/libtropic/src/lt_crc16.c"]
- sources += ["vendor/libtropic/src/lt_l1_port_wrap.c"]
+ sources += ["vendor/libtropic/src/lt_hkdf.c"]
sources += ["vendor/libtropic/src/lt_l1.c"]
- sources += ["vendor/libtropic/src/lt_l2.c"]
+ sources += ["vendor/libtropic/src/lt_l1_port_wrap.c"]
sources += ["vendor/libtropic/src/lt_l2_frame_check.c"]
- sources += ["vendor/libtropic/src/lt_l3.c"]
sources += ["vendor/libtropic/src/lt_l3_process.c"]
- sources += ["vendor/libtropic/src/lt_hkdf.c"]
sources += ["vendor/libtropic/src/lt_random.c"]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_aesgcm.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_ecdsa.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_ed25519.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_sha256.c"
- ]
- sources += [
- "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_x25519.c"
- ]
+ sources += ["vendor/libtropic/src/lt_secure_memzero.c"]
+ sources += ["vendor/libtropic/src/lt_tr01_attrs.c"]
paths += ["embed/sec/tropic/inc"]
paths += ["vendor/libtropic/include"]
paths += ["vendor/libtropic/src"]
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.