From 9e87cf6b6eb91df41d134c2f8734d34330a702d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ioan=20Biz=C4=83u?= Date: Wed, 11 Sep 2024 16:14:01 +0200 Subject: [PATCH] feat(core): add libtropic to unix build --- .gitmodules | 4 +- core/SConscript.firmware | 1 + core/SConscript.unix | 18 +- .../modtrezorcrypto/modtrezorcrypto-tropic.h | 282 ++++++++++++++++++ .../extmod/modtrezorcrypto/modtrezorcrypto.c | 6 + .../extmod/modtrezorutils/modtrezorutils.c | 7 + core/embed/rust/Cargo.toml | 1 + core/mocks/generated/trezorcrypto/tropic.pyi | 38 +++ core/mocks/generated/trezorutils.pyi | 2 + core/site_scons/models/T3T1/emulator.py | 21 ++ .../site_tools/micropython/__init__.py | 2 + core/src/trezor/crypto/__init__.py | 3 + core/src/trezor/utils.py | 1 + core/vendor/libtropic | 1 + legacy/firmware/Makefile | 1 + 15 files changed, 385 insertions(+), 3 deletions(-) create mode 100644 core/embed/extmod/modtrezorcrypto/modtrezorcrypto-tropic.h create mode 100644 core/mocks/generated/trezorcrypto/tropic.pyi create mode 120000 core/vendor/libtropic diff --git a/.gitmodules b/.gitmodules index 3412a6b589..ce8a1a98ef 100644 --- a/.gitmodules +++ b/.gitmodules @@ -27,7 +27,9 @@ [submodule "vendor/cmsis_5"] path = vendor/cmsis_5 url = https://github.com/ARM-software/CMSIS_5.git - [submodule "vendor/stm32u5xx_hal_driver"] path = vendor/stm32u5xx_hal_driver url = https://github.com/trezor/stm32u5xx_hal_driver.git +[submodule "vendor/libtropic"] + path = vendor/libtropic + url = https://github.com/tropicsquare/libtropic.git diff --git a/core/SConscript.firmware b/core/SConscript.firmware index 27a2d0dd4e..3cda98efba 100644 --- a/core/SConscript.firmware +++ b/core/SConscript.firmware @@ -685,6 +685,7 @@ if FROZEN: backlight='backlight' in FEATURES_AVAILABLE, optiga='optiga' in FEATURES_AVAILABLE, ui_layout=ui.get_ui_layout(TREZOR_MODEL), + tropic='tropic' in FEATURES_AVAILABLE, thp=THP, ) diff --git a/core/SConscript.unix b/core/SConscript.unix index 05b89f2079..46069a4630 100644 --- a/core/SConscript.unix +++ b/core/SConscript.unix @@ -21,7 +21,7 @@ if BENCHMARK and PYOPT != '0': print("BENCHMARK=1 works only with PYOPT=0.") exit(1) -FEATURES_WANTED = ["input", "sd_card", "dma2d", "optiga", "sbu"] +FEATURES_WANTED = ["input", "sd_card", "dma2d", "optiga", "sbu", "tropic"] if NEW_RENDERING: FEATURES_WANTED.append("new_rendering") @@ -50,6 +50,7 @@ SOURCE_MOD = [ 'vendor/micropython/extmod/vfs_posix_file.c', ] SOURCE_MOD_CRYPTO = [] +SOURCE_MOD_TROPIC = [] RUST_UI_FEATURES = [] # modtrezorconfig @@ -264,6 +265,14 @@ SOURCE_MOD += [ 'embed/extmod/modutime.c', ] +SOURCE_MOD_TROPIC += [ + 'vendor/libtropic/src/libtropic.c', +] + +CPPDEFINES_MOD += ['USE_TREZOR_CRYPTO'] + +CPPPATH_MOD += ['vendor/libtropic/src/', 'vendor/libtropic/include/'] + SOURCE_MICROPYTHON = [ 'vendor/micropython/extmod/modubinascii.c', 'vendor/micropython/extmod/moductypes.c', @@ -454,6 +463,10 @@ if 'optiga' in FEATURES_AVAILABLE: else: OPTIGA = False +if 'tropic' in FEATURES_AVAILABLE: + TROPIC = True +else: + TROPIC = False env.Tool('micropython') @@ -763,6 +776,7 @@ if FROZEN: bitcoin_only=BITCOIN_ONLY, backlight='backlight' in FEATURES_AVAILABLE, optiga=OPTIGA, + tropic=TROPIC, ui_layout=ui.get_ui_layout(TREZOR_MODEL), thp=THP, ) @@ -778,7 +792,7 @@ if FROZEN: # obj_program = [] -source_files = SOURCE_MOD + SOURCE_MOD_CRYPTO + SOURCE_MICROPYTHON + SOURCE_UNIX +source_files = SOURCE_MOD + SOURCE_MOD_CRYPTO + SOURCE_MOD_TROPIC + SOURCE_MICROPYTHON + SOURCE_UNIX obj_program.extend(env.Object(source=SOURCE_MOD)) obj_program.extend(env.Object(source=SOURCE_MOD_CRYPTO, CCFLAGS='$CCFLAGS -ftrivial-auto-var-init=zero')) if FEATURE_FLAGS["SECP256K1_ZKP"]: diff --git a/core/embed/extmod/modtrezorcrypto/modtrezorcrypto-tropic.h b/core/embed/extmod/modtrezorcrypto/modtrezorcrypto-tropic.h new file mode 100644 index 0000000000..3bdb12a0e7 --- /dev/null +++ b/core/embed/extmod/modtrezorcrypto/modtrezorcrypto-tropic.h @@ -0,0 +1,282 @@ +/* + * This file is part of the Trezor project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#if USE_TROPIC + +// Default initial Tropic handshake keys +#define PKEY_INDEX_BYTE PAIRING_KEY_SLOT_INDEX_0 +#define SHiPRIV_BYTES \ + {0xf0, 0xc4, 0xaa, 0x04, 0x8f, 0x00, 0x13, 0xa0, 0x96, 0x84, 0xdf, \ + 0x05, 0xe8, 0xa2, 0x2e, 0xf7, 0x21, 0x38, 0x98, 0x28, 0x2b, 0xa9, \ + 0x43, 0x12, 0xf3, 0x13, 0xdf, 0x2d, 0xce, 0x8d, 0x41, 0x64}; +#define SHiPUB_BYTES \ + {0x84, 0x2f, 0xe3, 0x21, 0xa8, 0x24, 0x74, 0x08, 0x37, 0x37, 0xff, \ + 0x2b, 0x9b, 0x88, 0xa2, 0xaf, 0x42, 0x44, 0x2d, 0xb0, 0xd8, 0xaa, \ + 0xcc, 0x6d, 0xc6, 0x9e, 0x99, 0x53, 0x33, 0x44, 0xb2, 0x46}; + +#include "libtropic.h" + +/// package: trezorcrypto.tropic + +/// class TropicError(Exception): +/// """Error returned by the Tropic Square chip.""" +MP_DEFINE_EXCEPTION(TropicError, Exception) + +#define PING_MSG_MAX_LEN 64 +#define ECC_SLOT_COUNT 32 +#define SIG_SIZE 64 + +STATIC void tropic_deinit(lt_handle_t *handle) { + if (lt_deinit(handle) != LT_OK) { + mp_raise_msg(&mp_type_TropicError, "lt_deinit failed."); + } +} + +STATIC void tropic_init(lt_handle_t *handle) { + lt_ret_t ret = LT_FAIL; + + ret = lt_init(handle); + if (ret != LT_OK) { + mp_raise_msg(&mp_type_TropicError, "lt_init failed."); + } + + uint8_t X509_cert[LT_L2_GET_INFO_REQ_CERT_SIZE] = {0}; + + ret = lt_get_info_cert(handle, X509_cert, LT_L2_GET_INFO_REQ_CERT_SIZE); + if (ret != LT_OK) { + tropic_deinit(handle); + mp_raise_msg(&mp_type_TropicError, "lt_get_info_cert failed."); + } + + uint8_t stpub[32] = {0}; + ret = lt_cert_verify_and_parse(X509_cert, 512, stpub); + if (ret != LT_OK) { + tropic_deinit(handle); + mp_raise_msg(&mp_type_TropicError, "lt_cert_verify_and_parse failed."); + } + + uint8_t pkey_index = PKEY_INDEX_BYTE; + uint8_t shipriv[] = SHiPRIV_BYTES; + uint8_t shipub[] = SHiPUB_BYTES; + + ret = lt_handshake(handle, stpub, pkey_index, shipriv, shipub); + if (ret != LT_OK) { + tropic_deinit(handle); + mp_raise_msg(&mp_type_TropicError, "lt_handshake failed."); + } +} + +/// def ping(message: str) -> str: +/// """ +/// Test the session by pinging the chip. +/// """ +STATIC mp_obj_t mod_trezorcrypto_tropic_ping(mp_obj_t message) { + lt_handle_t handle = {0}; + lt_ret_t ret = LT_FAIL; + + tropic_init(&handle); + + uint8_t msg_in[PING_MSG_MAX_LEN] = {0}; + + mp_buffer_info_t message_b = {0}; + mp_get_buffer_raise(message, &message_b, MP_BUFFER_READ); + if (message_b.len > 0) { + ret = lt_ping(&handle, (uint8_t *)message_b.buf, (uint8_t *)msg_in, + message_b.len); + if (ret != LT_OK) { + tropic_deinit(&handle); + mp_raise_msg(&mp_type_TropicError, "lt_ping failed."); + } + } else { + tropic_deinit(&handle); + return mp_const_none; + } + + tropic_deinit(&handle); + + vstr_t result = {0}; + vstr_init_len(&result, message_b.len); + + memcpy(result.buf, msg_in, message_b.len); + result.len = strlen(result.buf); + + return mp_obj_new_str_from_vstr(&mp_type_str, &result); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_trezorcrypto_tropic_ping_obj, + mod_trezorcrypto_tropic_ping); + +/// def get_certificate() -> bytes: +/// """ +/// Return the chip's certificate. +/// """ +STATIC mp_obj_t mod_trezorcrypto_tropic_get_certificate() { + lt_handle_t handle = {0}; + lt_ret_t ret = LT_FAIL; + + tropic_init(&handle); + + uint8_t X509_cert[512] = {0}; + ret = lt_get_info_cert(&handle, X509_cert, 512); + if (ret != LT_OK) { + tropic_deinit(&handle); + mp_raise_msg(&mp_type_TropicError, "lt_get_info_cert failed."); + } + + tropic_deinit(&handle); + + vstr_t vstr = {0}; + vstr_init_len(&vstr, 512); + + memcpy(vstr.buf, X509_cert, 512); + + return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_trezorcrypto_tropic_get_certificate_obj, + mod_trezorcrypto_tropic_get_certificate); + +/// def key_generate( +/// key_index: int, +/// ) -> None: +/// """ +/// Generate ECC key in the device's ECC key slot. +/// """ +STATIC mp_obj_t mod_trezorcrypto_tropic_key_generate(mp_obj_t key_index) { + mp_int_t idx = mp_obj_get_int(key_index); + if (idx < 0 || idx >= ECC_SLOT_COUNT) { + mp_raise_ValueError("Invalid index."); + } + + lt_handle_t handle = {0}; + lt_ret_t ret = LT_FAIL; + + tropic_init(&handle); + + ret = lt_ecc_key_generate(&handle, idx, CURVE_ED25519); + if (ret != LT_OK) { + tropic_deinit(&handle); + mp_raise_msg(&mp_type_TropicError, "lt_ecc_key_generate failed."); + } + + tropic_deinit(&handle); + + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_trezorcrypto_tropic_key_generate_obj, + mod_trezorcrypto_tropic_key_generate); + +/// def random_get( +/// len: int, +/// ) -> bytes: +/// """ +/// Get number of random bytes. +/// """ +STATIC mp_obj_t mod_trezorcrypto_tropic_random_get(mp_obj_t len) { + mp_int_t len_rand = mp_obj_get_int(len); + if (len_rand < 0 || len_rand > RANDOM_VALUE_GET_LEN_MAX) { + mp_raise_ValueError("Invalid length."); + } + + lt_handle_t handle = {0}; + lt_ret_t ret = LT_FAIL; + + tropic_init(&handle); + + uint8_t buff[RANDOM_VALUE_GET_LEN_MAX] = {0}; + ret = lt_random_get(&handle, buff, len_rand); + if (ret != LT_OK) { + tropic_deinit(&handle); + mp_raise_msg(&mp_type_TropicError, "lt_random_get failed."); + } + + tropic_deinit(&handle); + + vstr_t vstr = {0}; + vstr_init_len(&vstr, len_rand); + + memcpy(vstr.buf, buff, len_rand); + + return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_trezorcrypto_tropic_random_get_obj, + mod_trezorcrypto_tropic_random_get); + +/// def sign( +/// key_index: int, +/// digest: bytes, +/// ) -> bytes: +/// """ +/// Uses the private key at key_index to produce a signature of the digest. +/// """ +STATIC mp_obj_t mod_trezorcrypto_tropic_sign(mp_obj_t key_index, + mp_obj_t digest) { + mp_int_t idx = mp_obj_get_int(key_index); + if (idx < 0 || idx >= ECC_SLOT_COUNT) { + mp_raise_ValueError("Invalid index."); + } + + mp_buffer_info_t dig = {0}; + mp_get_buffer_raise(digest, &dig, MP_BUFFER_READ); + if (dig.len != 32) { + mp_raise_ValueError("Invalid length of digest."); + } + + lt_handle_t handle = {0}; + lt_ret_t ret = LT_FAIL; + + tropic_init(&handle); + + vstr_t sig = {0}; + vstr_init_len(&sig, SIG_SIZE); + + ret = lt_ecc_eddsa_sign(&handle, idx, (const uint8_t *)dig.buf, dig.len, + ((uint8_t *)sig.buf), SIG_SIZE); + if (ret != LT_OK) { + vstr_clear(&sig); + tropic_deinit(&handle); + mp_raise_msg(&mp_type_TropicError, "lt_ecc_eddsa_sign failed."); + } + + tropic_deinit(&handle); + + sig.len = SIG_SIZE; + return mp_obj_new_str_from_vstr(&mp_type_bytes, &sig); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_trezorcrypto_tropic_sign_obj, + mod_trezorcrypto_tropic_sign); + +STATIC const mp_rom_map_elem_t mod_trezorcrypto_tropic_globals_table[] = { + {MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_tropic)}, + {MP_ROM_QSTR(MP_QSTR_ping), MP_ROM_PTR(&mod_trezorcrypto_tropic_ping_obj)}, + {MP_ROM_QSTR(MP_QSTR_get_certificate), + MP_ROM_PTR(&mod_trezorcrypto_tropic_get_certificate_obj)}, + {MP_ROM_QSTR(MP_QSTR_key_generate), + MP_ROM_PTR(&mod_trezorcrypto_tropic_key_generate_obj)}, + {MP_ROM_QSTR(MP_QSTR_random_get), + MP_ROM_PTR(&mod_trezorcrypto_tropic_random_get_obj)}, + {MP_ROM_QSTR(MP_QSTR_sign), MP_ROM_PTR(&mod_trezorcrypto_tropic_sign_obj)}, + {MP_ROM_QSTR(MP_QSTR_TropicError), MP_ROM_PTR(&mp_type_TropicError)}}; +STATIC MP_DEFINE_CONST_DICT(mod_trezorcrypto_tropic_globals, + mod_trezorcrypto_tropic_globals_table); + +STATIC const mp_obj_module_t mod_trezorcrypto_tropic_module = { + .base = {&mp_type_module}, + .globals = (mp_obj_dict_t *)&mod_trezorcrypto_tropic_globals, +}; + +#endif diff --git a/core/embed/extmod/modtrezorcrypto/modtrezorcrypto.c b/core/embed/extmod/modtrezorcrypto/modtrezorcrypto.c index 13282bd93a..6319b57fd1 100644 --- a/core/embed/extmod/modtrezorcrypto/modtrezorcrypto.c +++ b/core/embed/extmod/modtrezorcrypto/modtrezorcrypto.c @@ -75,6 +75,9 @@ static void wrapped_ui_wait_callback(uint32_t current, uint32_t total) { #ifdef USE_OPTIGA #include "modtrezorcrypto-optiga.h" #endif +#ifdef USE_TROPIC +#include "modtrezorcrypto-tropic.h" +#endif #if !BITCOIN_ONLY #include "modtrezorcrypto-cardano.h" #include "modtrezorcrypto-monero.h" @@ -141,6 +144,9 @@ STATIC const mp_rom_map_elem_t mp_module_trezorcrypto_globals_table[] = { #if USE_OPTIGA {MP_ROM_QSTR(MP_QSTR_optiga), MP_ROM_PTR(&mod_trezorcrypto_optiga_module)}, #endif +#if USE_TROPIC + {MP_ROM_QSTR(MP_QSTR_tropic), MP_ROM_PTR(&mod_trezorcrypto_tropic_module)}, +#endif }; STATIC MP_DEFINE_CONST_DICT(mp_module_trezorcrypto_globals, mp_module_trezorcrypto_globals_table); diff --git a/core/embed/extmod/modtrezorutils/modtrezorutils.c b/core/embed/extmod/modtrezorutils/modtrezorutils.c index ca04f00b41..59e87ef2da 100644 --- a/core/embed/extmod/modtrezorutils/modtrezorutils.c +++ b/core/embed/extmod/modtrezorutils/modtrezorutils.c @@ -389,6 +389,8 @@ STATIC mp_obj_tuple_t mod_trezorutils_version_obj = { /// """Whether the hardware supports haptic feedback.""" /// USE_OPTIGA: bool /// """Whether the hardware supports Optiga secure element.""" +/// USE_TROPIC: bool +/// """Whether the hardware supports Tropic Square secure element.""" /// MODEL: str /// """Model name.""" /// MODEL_FULL_NAME: str @@ -454,6 +456,11 @@ STATIC const mp_rom_map_elem_t mp_module_trezorutils_globals_table[] = { {MP_ROM_QSTR(MP_QSTR_USE_OPTIGA), mp_const_true}, #else {MP_ROM_QSTR(MP_QSTR_USE_OPTIGA), mp_const_false}, +#endif +#ifdef USE_TROPIC + {MP_ROM_QSTR(MP_QSTR_USE_TROPIC), mp_const_true}, +#else + {MP_ROM_QSTR(MP_QSTR_USE_TROPIC), mp_const_false}, #endif {MP_ROM_QSTR(MP_QSTR_MODEL), MP_ROM_PTR(&mod_trezorutils_model_name_obj)}, {MP_ROM_QSTR(MP_QSTR_MODEL_FULL_NAME), diff --git a/core/embed/rust/Cargo.toml b/core/embed/rust/Cargo.toml index 77091f4326..c9f921bb7b 100644 --- a/core/embed/rust/Cargo.toml +++ b/core/embed/rust/Cargo.toml @@ -45,6 +45,7 @@ rgb_led = [] backlight = [] usb = [] optiga = [] +tropic = [] translations = ["crypto"] test = [ "backlight", diff --git a/core/mocks/generated/trezorcrypto/tropic.pyi b/core/mocks/generated/trezorcrypto/tropic.pyi new file mode 100644 index 0000000000..fda58b8501 --- /dev/null +++ b/core/mocks/generated/trezorcrypto/tropic.pyi @@ -0,0 +1,38 @@ +from typing import * + + +# extmod/modtrezorcrypto/modtrezorcrypto-tropic.h +class TropicError(Exception): + """Error returned by the Tropic Square chip.""" + + def ping(message: str) -> str: + """ + Test the session by pinging the chip. + """ + + def get_certificate() -> bytes: + """ + Return the chip's certificate. + """ + + def key_generate( + key_index: int, + ) -> None: + """ + Generate ECC key in the device's ECC key slot. + """ + + def random_get( + len: int, + ) -> bytes: + """ + Get number of random bytes. + """ + + def sign( + key_index: int, + digest: bytes, + ) -> bytes: + """ + Uses the private key at key_index to produce a signature of the digest. + """ diff --git a/core/mocks/generated/trezorutils.pyi b/core/mocks/generated/trezorutils.pyi index 5c497046ba..077da52ed2 100644 --- a/core/mocks/generated/trezorutils.pyi +++ b/core/mocks/generated/trezorutils.pyi @@ -130,6 +130,8 @@ USE_HAPTIC: bool """Whether the hardware supports haptic feedback.""" USE_OPTIGA: bool """Whether the hardware supports Optiga secure element.""" +USE_TROPIC: bool +"""Whether the hardware supports Tropic Square secure element.""" MODEL: str """Model name.""" MODEL_FULL_NAME: str diff --git a/core/site_scons/models/T3T1/emulator.py b/core/site_scons/models/T3T1/emulator.py index 38a2a1277e..05b305958f 100644 --- a/core/site_scons/models/T3T1/emulator.py +++ b/core/site_scons/models/T3T1/emulator.py @@ -61,6 +61,27 @@ def configure( features_available.append("optiga") defines += ["USE_OPTIGA=1"] + if "tropic" in features_wanted: + sources += [ + "vendor/libtropic/src/libtropic.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_random.c", + "vendor/libtropic/hal/port/unix/lt_port_unix.c", + "vendor/libtropic/hal/crypto/trezor_crypto/lt_crypto_trezor_aesgcm.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", + ] + defines += ["USE_TREZOR_CRYPTO"] + features_available.append("tropic") + defines += ["USE_TROPIC=1"] + if "input" in features_wanted: sources += ["embed/trezorhal/unix/touch.c"] features_available.append("touch") diff --git a/core/site_scons/site_tools/micropython/__init__.py b/core/site_scons/site_tools/micropython/__init__.py index 22e9feac91..536df9c5ba 100644 --- a/core/site_scons/site_tools/micropython/__init__.py +++ b/core/site_scons/site_tools/micropython/__init__.py @@ -44,6 +44,7 @@ def generate(env): btc_only = env["bitcoin_only"] == "1" backlight = env["backlight"] optiga = env["optiga"] + tropic = env["tropic"] layout_tt = env["ui_layout"] == "UI_LAYOUT_TT" layout_tr = env["ui_layout"] == "UI_LAYOUT_TR" layout_mercury = env["ui_layout"] == "UI_LAYOUT_MERCURY" @@ -53,6 +54,7 @@ def generate(env): rf"-e 's/utils\.BITCOIN_ONLY/{btc_only}/g'", rf"-e 's/utils\.USE_BACKLIGHT/{backlight}/g'", rf"-e 's/utils\.USE_OPTIGA/{optiga}/g'", + rf"-e 's/utils\.USE_TROPIC/{tropic}/g'", rf"-e 's/utils\.UI_LAYOUT == \"TT\"/{layout_tt}/g'", rf"-e 's/utils\.UI_LAYOUT == \"TR\"/{layout_tr}/g'", rf"-e 's/utils\.UI_LAYOUT == \"MERCURY\"/{layout_mercury}/g'", diff --git a/core/src/trezor/crypto/__init__.py b/core/src/trezor/crypto/__init__.py index 51c159fe16..5386743565 100644 --- a/core/src/trezor/crypto/__init__.py +++ b/core/src/trezor/crypto/__init__.py @@ -22,5 +22,8 @@ if not utils.BITCOIN_ONLY: if utils.USE_OPTIGA: from trezorcrypto import optiga # noqa: F401 +if utils.USE_TROPIC: + from trezorcrypto import tropic # noqa: F401 + if utils.USE_THP: from trezorcrypto import elligator2 # noqa: F401 diff --git a/core/src/trezor/utils.py b/core/src/trezor/utils.py index 134274db6c..c24db79920 100644 --- a/core/src/trezor/utils.py +++ b/core/src/trezor/utils.py @@ -15,6 +15,7 @@ from trezorutils import ( # noqa: F401 USE_OPTIGA, USE_SD_CARD, USE_THP, + USE_TROPIC, VERSION, bootloader_locked, check_firmware_header, diff --git a/core/vendor/libtropic b/core/vendor/libtropic new file mode 120000 index 0000000000..18958f10fc --- /dev/null +++ b/core/vendor/libtropic @@ -0,0 +1 @@ +../../vendor/libtropic/ \ No newline at end of file diff --git a/legacy/firmware/Makefile b/legacy/firmware/Makefile index f85ba1ab76..f475965a4d 100644 --- a/legacy/firmware/Makefile +++ b/legacy/firmware/Makefile @@ -165,6 +165,7 @@ CFLAGS += -I../vendor/nanopb -Iprotob -DPB_FIELD_16BIT=1 -DPB_ENCODE_ARRAYS_UNPA CFLAGS += -DSCM_REVISION='"$(shell git rev-parse HEAD | sed 's:\(..\):\\x\1:g')"' CFLAGS += -DUSE_MONERO=0 CFLAGS += -DUSE_OPTIGA=0 +CFLAGS += -DUSE_TROPIC=0 ifneq ($(BITCOIN_ONLY),1) CFLAGS += -DUSE_ETHEREUM=1 CFLAGS += -DUSE_NEM=1