chore(core/eckhart): update BLE pairing action
What changed, and why it matters
This commit is a routine user-interface tweak for an upcoming Trezor hardware wallet model (codename Eckhart). It changes the Bluetooth pairing limit from 4 to 8 devices, disconnects any active Bluetooth connection before starting pairing, and updates the on-screen warning text and button label shown when the device limit is reached. There is no security-relevant change visible in the code.
No security action required; treat as normal product/UI maintenance.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch updates BLE pairing behavior in core/src/apps/homescreen/device_menu.py: MAX_PAIRED_DEVICES is renamed to BLE_MAX_BONDS and raised from 4 to 8; before pairing it checks ble.is_connected() and disconnects; the limit-reached warning now uses a translated string (TR.ble__limit_reached) and a confirm button instead of a hard-coded English string with a continue button. The remaining files are generated translation/microPython qstr artifacts and the translations signature metadata, updated to match the new string.
Changed components
core/src/apps/homescreen/device_menu.pycore/embed/rust/librust_qstr.hcore/embed/rust/src/translations/generated/translated_string.rscore/mocks/trezortranslate_keys.pyicore/translations/en.jsoncore/translations/order.jsoncore/translations/signatures.jsonInspect captured patch +19 / −9
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index 30ea27ad..5ed67e3b 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -178,6 +178,7 @@ static void _librust_qstrs(void) {
MP_QSTR_ble__disable;
MP_QSTR_ble__enable;
MP_QSTR_ble__forget_all;
+ MP_QSTR_ble__limit_reached;
MP_QSTR_ble__manage_paired;
MP_QSTR_ble__pair_new;
MP_QSTR_ble__pair_title;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index 469d1740..5bb44f1c 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1516,6 +1516,7 @@ pub enum TranslatedString {
words__connect = 1125, // "Connect"
words__forget = 1126, // "Forget"
words__power = 1127, // "Power"
+ ble__limit_reached = 1128, // "Limit of paired devices reached"
}
impl TranslatedString {
@@ -3358,6 +3359,7 @@ impl TranslatedString {
(Self::words__connect, "Connect"),
(Self::words__forget, "Forget"),
(Self::words__power, "Power"),
+ (Self::ble__limit_reached, "Limit of paired devices reached"),
];
#[cfg(feature = "micropython")]
@@ -3438,6 +3440,7 @@ impl TranslatedString {
(Qstr::MP_QSTR_ble__disable, Self::ble__disable),
(Qstr::MP_QSTR_ble__enable, Self::ble__enable),
(Qstr::MP_QSTR_ble__forget_all, Self::ble__forget_all),
+ (Qstr::MP_QSTR_ble__limit_reached, Self::ble__limit_reached),
(Qstr::MP_QSTR_ble__manage_paired, Self::ble__manage_paired),
(Qstr::MP_QSTR_ble__pair_new, Self::ble__pair_new),
(Qstr::MP_QSTR_ble__pair_title, Self::ble__pair_title),
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index cd331809..c83c0296 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -78,6 +78,7 @@ class TR:
ble__disable: str = "Turn Bluetooth off?"
ble__enable: str = "Turn Bluetooth on?"
ble__forget_all: str = "Forget all"
+ ble__limit_reached: str = "Limit of paired devices reached"
ble__manage_paired: str = "Manage paired devices"
ble__pair_new: str = "Pair new device"
ble__pair_title: str = "Pair & connect"
diff --git a/core/src/apps/homescreen/device_menu.py b/core/src/apps/homescreen/device_menu.py
index 1ae009b2..f6dee09a 100644
--- a/core/src/apps/homescreen/device_menu.py
+++ b/core/src/apps/homescreen/device_menu.py
@@ -5,7 +5,7 @@ from trezor import TR, config, log, utils
from trezor.ui.layouts import interact
from trezorui_api import DeviceMenuResult
-MAX_PAIRED_DEVICES = 4
+BLE_MAX_BONDS = 8
def _format_mac(ble_addr: bytes) -> str:
@@ -107,17 +107,20 @@ async def handle_device_menu() -> None:
ble.disconnect()
elif menu_result is DeviceMenuResult.DevicePair:
- from trezor.ui.layouts import show_warning
+ from trezor.ui.layouts import raise_if_cancelled, show_warning
from apps.management.ble.pair_new_device import pair_new_device
- if len(paired_devices) < MAX_PAIRED_DEVICES:
+ if ble.is_connected():
+ ble.disconnect()
+
+ if len(paired_devices) < BLE_MAX_BONDS:
await pair_new_device()
else:
await show_warning(
"device_pair",
- "Limit of paired devices reached.",
- button=TR.buttons__continue,
+ TR.ble__limit_reached,
+ button=TR.buttons__confirm,
)
elif menu_result is DeviceMenuResult.DeviceUnpairAll:
from trezor.messages import BleUnpair
diff --git a/core/translations/en.json b/core/translations/en.json
index e2abb568..340dd6f1 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -110,6 +110,7 @@
"ble__disable": "Turn Bluetooth off?",
"ble__enable": "Turn Bluetooth on?",
"ble__forget_all": "Forget all",
+ "ble__limit_reached": "Limit of paired devices reached",
"ble__manage_paired": "Manage paired devices",
"ble__pair_new": "Pair new device",
"ble__pair_title": "Pair & connect",
diff --git a/core/translations/order.json b/core/translations/order.json
index 657eabc0..6dd23cb9 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1126,5 +1126,6 @@
"1124": "ble__forget_all",
"1125": "words__connect",
"1126": "words__forget",
- "1127": "words__power"
+ "1127": "words__power",
+ "1128": "ble__limit_reached"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index 9b5740ad..9e0e2f14 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "e3766059df9be721b1496be806e72af7049c6c693a7f93f2219a3036843c472f",
- "datetime": "2025-09-01T07:40:50.006760+00:00",
- "commit": "bb3eb7cc5b0af90a979683bb828aff5344e3d57b"
+ "merkle_root": "06c9698d72cb5ebd00fdfcd6526ebc952ad6066b04cd809856802180bf4fa2c1",
+ "datetime": "2025-09-02T12:43:55.064463+00:00",
+ "commit": "2b89842ade26577663651df3573467ca2ccfd202"
},
"history": [
{
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.