chore(core/eckhart): add SA and UAE to Regulatory
What changed, and why it matters
This commit simply adds two new countries, South Africa and the United Arab Emirates, to the regulatory information screen on Trezor's Eckhart hardware wallet layout. It includes new flag icons, updates the list of regulatory zones, and refreshes automated test snapshots. There is no security-relevant change.
No security action required. This is a routine UI/content update.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change increases the regulatory screen count from 12 to 14 and inserts RegulatoryZone entries for South Africa and United Arab Emirates in core/embed/rust/src/ui/layout_eckhart/firmware/regulatory_screen.rs. It adds corresponding PNG/TOIF icon assets and include_icon! macro calls in the theme module. Test fixtures in tests/click_tests/device_menu/common.py and tests/ui_tests/fixtures.json are updated to reflect the new menu items and expected UI hashes. No cryptographic, authentication, or firmware logic is modified.
Changed components
core/embed/rust/src/ui/layout_eckhart/firmware/regulatory_screen.rscore/embed/rust/src/ui/layout_eckhart/theme/mod.rscore/embed/rust/src/ui/layout_eckhart/res/regulatory/south_africa.pngcore/embed/rust/src/ui/layout_eckhart/res/regulatory/south_africa.toifcore/embed/rust/src/ui/layout_eckhart/res/regulatory/uae.pngcore/embed/rust/src/ui/layout_eckhart/res/regulatory/uae.toiftests/click_tests/device_menu/common.pytests/ui_tests/fixtures.jsonInspect captured patch +43 / −19
diff --git a/core/embed/rust/src/ui/layout_eckhart/firmware/regulatory_screen.rs b/core/embed/rust/src/ui/layout_eckhart/firmware/regulatory_screen.rs
index a653aafc..b2e253d7 100644
--- a/core/embed/rust/src/ui/layout_eckhart/firmware/regulatory_screen.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/firmware/regulatory_screen.rs
@@ -157,7 +157,7 @@ struct RegulatoryContent {
}
impl RegulatoryContent {
- const SCREENS: usize = 12;
+ const SCREENS: usize = 14;
/// Regulatory zones data. EU, US, CA first, then alphabetical order.
const ZONES: [RegulatoryZone; Self::SCREENS] = [
RegulatoryZone {
@@ -216,6 +216,13 @@ impl RegulatoryContent {
icon2: None,
production_year: false,
},
+ RegulatoryZone {
+ name: Some("South Africa"),
+ content: "",
+ icon1: Some(theme::ICON_SOUTH_AFRICA),
+ icon2: None,
+ production_year: false,
+ },
RegulatoryZone {
name: Some("South Korea"),
content: "",
@@ -244,6 +251,13 @@ impl RegulatoryContent {
icon2: None,
production_year: false,
},
+ RegulatoryZone {
+ name: Some("United Arab Emirates"),
+ content: "",
+ icon1: Some(theme::ICON_UNITED_ARAB_EMIRATES),
+ icon2: None,
+ production_year: false,
+ },
];
pub fn new(production_year: Option<TString<'static>>) -> Self {
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/regulatory/south_africa.png b/core/embed/rust/src/ui/layout_eckhart/res/regulatory/south_africa.png
new file mode 100644
index 00000000..287219b4
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/regulatory/south_africa.png differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/regulatory/south_africa.toif b/core/embed/rust/src/ui/layout_eckhart/res/regulatory/south_africa.toif
new file mode 100644
index 00000000..8d5c5e0c
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/regulatory/south_africa.toif differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/regulatory/uae.png b/core/embed/rust/src/ui/layout_eckhart/res/regulatory/uae.png
new file mode 100644
index 00000000..231f1be1
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/regulatory/uae.png differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/regulatory/uae.toif b/core/embed/rust/src/ui/layout_eckhart/res/regulatory/uae.toif
new file mode 100644
index 00000000..e932f31b
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/regulatory/uae.toif differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs b/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs
index 51b33c6e..91c99b53 100644
--- a/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs
@@ -205,8 +205,16 @@ include_icon!(
ICON_SINGAPORE,
"layout_eckhart/res/regulatory/singapore.toif"
);
+include_icon!(
+ ICON_SOUTH_AFRICA,
+ "layout_eckhart/res/regulatory/south_africa.toif"
+);
include_icon!(ICON_TAIWAN, "layout_eckhart/res/regulatory/taiwan.toif");
include_icon!(ICON_UKRAINE, "layout_eckhart/res/regulatory/ukraine.toif");
+include_icon!(
+ ICON_UNITED_ARAB_EMIRATES,
+ "layout_eckhart/res/regulatory/uae.toif"
+);
// Square icon for BLE connection items
include_icon!(ICON_SQUARE, "layout_eckhart/res/square.toif");
diff --git a/tests/click_tests/device_menu/common.py b/tests/click_tests/device_menu/common.py
index 5ff1a87c..d071f9d1 100644
--- a/tests/click_tests/device_menu/common.py
+++ b/tests/click_tests/device_menu/common.py
@@ -38,10 +38,12 @@ REGULATORY_AREAS = [
"Australia",
"Japan",
"Singapore",
+ "South Africa",
"South Korea",
"South Korea", # additional page for South Korea
"Taiwan",
"Ukraine",
+ "United Arab Emirates",
]
AUTOLOCK_DELAY_USB_DEFAULT_MS = 10 * 60 * 1000 # 10 minutes
diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json
index cd8ae09a..05d740cf 100644
--- a/tests/ui_tests/fixtures.json
+++ b/tests/ui_tests/fixtures.json
@@ -30354,9 +30354,9 @@
"T3W1_cs_device_menu-test_pin.py::test_pin_remove": "812048eb272e5e3dc478318e3fb64834a12b101abc1665c7956d095d457c2914",
"T3W1_cs_device_menu-test_pin.py::test_pin_setup": "eb84b4b3f96cc6ffd8b9a65940b4801179f7ec9320a760a8b801c675719465cb",
"T3W1_cs_device_menu-test_pin.py::test_pin_uninitialized": "9ed3462f56542da1b63575819a3294f03c135bd64815e1767eadb2859192ce06",
-"T3W1_cs_device_menu-test_traverse_menu.py::test_traverse_initialized": "8a4d49bba7e2fe86db9e6390af6386db429effa7db45f23d3562d3ee7df3e1bf",
-"T3W1_cs_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "3ec40fc0a2d89289212829b857b6f2505654b0b11e37f18c0d95718a08dae702",
-"T3W1_cs_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "b7296b47cacadc5096d018ae09dbe39ade9895b4b70ef38e044ffb0e8d023978",
+"T3W1_cs_device_menu-test_traverse_menu.py::test_traverse_initialized": "a0e372c606589b9aa3928c630b0d4d20cdde871eee4c7061aff30da1ac5b430c",
+"T3W1_cs_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "b5b568226bee276ec6688d660c2ac59eb56c7cca615a808d80e93bbe7d65a342",
+"T3W1_cs_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "909142d3cef93d0f11b94ac2d820505bc04f92e84a46caae0760c45089746e06",
"T3W1_cs_device_menu-test_wipe_code.py::test_remove_pin_without_removing_wipe_code": "e7638933a513f477a1d2e5a6397bb6ea5cc51bcf0ed53942f196507ed33f9f78",
"T3W1_cs_device_menu-test_wipe_code.py::test_wipe_code_cancel_intro": "98ade702cd4d4ddb34a0006cff56d6e6ff0fab5c2b72082fabfbf720bbe39b4c",
"T3W1_cs_device_menu-test_wipe_code.py::test_wipe_code_cancel_keyboard": "a0b28dadff8295a6fb79f2158f53daf15b67817aaa2cd7dd407628fd0c8f202b",
@@ -30459,9 +30459,9 @@
"T3W1_de_device_menu-test_pin.py::test_pin_remove": "cce95202a8a23f6a3d0f0dfbbd400e73edb28a6efe73149d2cd6f2058ec10ac0",
"T3W1_de_device_menu-test_pin.py::test_pin_setup": "d67da792f90b4eddb7f2ace5552e412362a1937897e12ab7f0e7bd812583570f",
"T3W1_de_device_menu-test_pin.py::test_pin_uninitialized": "9ed3462f56542da1b63575819a3294f03c135bd64815e1767eadb2859192ce06",
-"T3W1_de_device_menu-test_traverse_menu.py::test_traverse_initialized": "ee7ff690bbeb5153273ce2bb8015e9f9d60b037fe1bcfe2abd0410f3362a18e6",
-"T3W1_de_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "131434648a1e435045ae177e2d3eee4272e4724633e9f471968d49383a952dcd",
-"T3W1_de_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "e42f885c0fe8020ecb3318608543157e6a0161ccb8b4a3965cdce41505db6500",
+"T3W1_de_device_menu-test_traverse_menu.py::test_traverse_initialized": "08a10f52d70ef2c5045ef20edf499ce22bb28b59ffbabf84dda816851049f9b3",
+"T3W1_de_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "aa943860c8c466b03c4fa65a61d91d440e4730e8fff6822d712b3a55ce37d3a8",
+"T3W1_de_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "fbf504044e8f96af3431c90647c733a01abf40b6a6eb2f15c92786e661a67edd",
"T3W1_de_device_menu-test_wipe_code.py::test_remove_pin_without_removing_wipe_code": "553a88660b069f828d365d7b030e0fa18f2a571edb108c23d64fa4c3ddc6488c",
"T3W1_de_device_menu-test_wipe_code.py::test_wipe_code_cancel_intro": "91322877ed16c0ba3dee4208f12409a5a5e53b0414dd2fff86e1f2242d2c1588",
"T3W1_de_device_menu-test_wipe_code.py::test_wipe_code_cancel_keyboard": "434568bc4d1f4a5b3a7d9338aeb3ea5165108b4c59522a63b00489a5f89337e3",
@@ -30564,9 +30564,9 @@
"T3W1_en_device_menu-test_pin.py::test_pin_remove": "a601cc0421b5cf4dd4c4363a5b7f2f643d298bc824887114ce854ff0cbfec6f3",
"T3W1_en_device_menu-test_pin.py::test_pin_setup": "accea7504a5c9194afdf63292b8baa3c55d2be39461fdee1d0842ff247a3d634",
"T3W1_en_device_menu-test_pin.py::test_pin_uninitialized": "9ed3462f56542da1b63575819a3294f03c135bd64815e1767eadb2859192ce06",
-"T3W1_en_device_menu-test_traverse_menu.py::test_traverse_initialized": "60e9da1e52a3efd3ea45026024d8ce76d7fd34eb0542a1b03281d9623672131b",
-"T3W1_en_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "b720fea333d7cd1c886757842782edb5977cfa5fccbd0bb7c44d5746c1d90651",
-"T3W1_en_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "21b31b1eec9688d81e09bc8b7d106957cb82f31005b52c15fb29cd83bc13f805",
+"T3W1_en_device_menu-test_traverse_menu.py::test_traverse_initialized": "8a9ae453bea3d8e98717c340503adbc182ae9d31947cb34d55a7edcc0dc5294a",
+"T3W1_en_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "d338746312ef26e9591f8b07b9e2fdb0e7765840aaf18e6857f1abe838c69280",
+"T3W1_en_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "61f6aff97d3465dc93f0b36ef33c44f6789f51be6e3e5bc536550502d79bfe99",
"T3W1_en_device_menu-test_wipe_code.py::test_remove_pin_without_removing_wipe_code": "6f52a29d44c5abf4e780c75d99b1f4fdadc6095773a292be27b8a36416fdc259",
"T3W1_en_device_menu-test_wipe_code.py::test_wipe_code_cancel_intro": "f1030abc49ac2e3d781e118e68f28b50bfe51e43db66c80e0c40eca7228dbcef",
"T3W1_en_device_menu-test_wipe_code.py::test_wipe_code_cancel_keyboard": "344a450225797a665d85bea5c2c48d7e9787f783d7576173b8e54c0a2f06970e",
@@ -30669,9 +30669,9 @@
"T3W1_es_device_menu-test_pin.py::test_pin_remove": "fc0becf728c01a1f42901929d91707e8ad77282f5f92cc5186c22e8b8144638b",
"T3W1_es_device_menu-test_pin.py::test_pin_setup": "f57f03b94091db00418cae044998abc58060546728143d50af46f477e73334df",
"T3W1_es_device_menu-test_pin.py::test_pin_uninitialized": "9ed3462f56542da1b63575819a3294f03c135bd64815e1767eadb2859192ce06",
-"T3W1_es_device_menu-test_traverse_menu.py::test_traverse_initialized": "7cda8bba596354cb0f15a41654d0d3619e7feccd54951aec4442a98e1043d69d",
-"T3W1_es_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "bb0779dc25c921d64dc7960a801063d0a945378e2b80fec759f0a5eed7ee5c7d",
-"T3W1_es_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "700636d4785669bd8f4e67796a2cc24ec8b3a147ff1a4fe49f3f38cece6922d4",
+"T3W1_es_device_menu-test_traverse_menu.py::test_traverse_initialized": "7b3a917150f0a50cea475b19e10283b64f85021dca1c57244a05f8fc7327f917",
+"T3W1_es_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "236ddf75c32c659a64d3765280431183e9b61efca09a8be525a61bfcb7ed73cc",
+"T3W1_es_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "58da9af5ac12d26c624ef786721af246102502bb693904915bd546712e987db9",
"T3W1_es_device_menu-test_wipe_code.py::test_remove_pin_without_removing_wipe_code": "62731062a9a657585f60fd32719f69c407f1019b7eaccc3780d29192b3c29dfe",
"T3W1_es_device_menu-test_wipe_code.py::test_wipe_code_cancel_intro": "ce62fd80a9e3b0004f1332e905d13953a17bceb2e0c02f37e6bd83e9cca3dc2d",
"T3W1_es_device_menu-test_wipe_code.py::test_wipe_code_cancel_keyboard": "110a9357d3646cfac82bc028de0b6b70293ac7a549ab531e36b240ff5eb4ded9",
@@ -30774,9 +30774,9 @@
"T3W1_fr_device_menu-test_pin.py::test_pin_remove": "47720b835f821f699f9df72990eff9e9a93ccc6812f71dd2f4dbf188880ea7da",
"T3W1_fr_device_menu-test_pin.py::test_pin_setup": "53fb8c692503891b3f864751416ce6462cafcb911134fa94ce64450a1bd712f6",
"T3W1_fr_device_menu-test_pin.py::test_pin_uninitialized": "9ed3462f56542da1b63575819a3294f03c135bd64815e1767eadb2859192ce06",
-"T3W1_fr_device_menu-test_traverse_menu.py::test_traverse_initialized": "14583f621f86fbcb9d2ff9ed8255c66d53a6f5f91fc9191c87538026c418dcd5",
-"T3W1_fr_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "140016e9096ffef64a834eb49ba2630420bba19c155d0fa2008afd24c3da9caa",
-"T3W1_fr_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "c5c152b2108f5af413a1a3b1830f7f6a8da78b8fa3f0b44c4c8fb386173f9770",
+"T3W1_fr_device_menu-test_traverse_menu.py::test_traverse_initialized": "e62bdcf2cd8ed7be52b56fdc4a7760588e8c1494d859a320d212c305a9e23fe5",
+"T3W1_fr_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "8263f7f0e343a4f844cf94b4c707f25900c945f3586b1af3efff83b0d7274b02",
+"T3W1_fr_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "1a883feb7a434c94a281db103dffb31b809e55b3a3f2cf28165ce31881ec7a6b",
"T3W1_fr_device_menu-test_wipe_code.py::test_remove_pin_without_removing_wipe_code": "94351996728ed1ede791e30e2b3b5658418c246734c8ac331c5db497df56b8d6",
"T3W1_fr_device_menu-test_wipe_code.py::test_wipe_code_cancel_intro": "3b2b68d920359daa6914570f0a1d29d977cb34e774e75b998851acf48db24003",
"T3W1_fr_device_menu-test_wipe_code.py::test_wipe_code_cancel_keyboard": "5554f1f7075725ad526169cf065bf2721554d1149352ce0d891743711c579ca1",
@@ -30879,9 +30879,9 @@
"T3W1_pt_device_menu-test_pin.py::test_pin_remove": "a4249329f844f41b556cd2af04d665099f2d8930b48bfed16e21cee0fa88f821",
"T3W1_pt_device_menu-test_pin.py::test_pin_setup": "916c788a7535e413695113e82e86ae0fb6c15a42663c687f38ddabf1bc474a7a",
"T3W1_pt_device_menu-test_pin.py::test_pin_uninitialized": "9ed3462f56542da1b63575819a3294f03c135bd64815e1767eadb2859192ce06",
-"T3W1_pt_device_menu-test_traverse_menu.py::test_traverse_initialized": "e9e3c5dc83de34aefc985ffaa2e71b9c2cb5ba868a07ef7b20a12c03d5c88d15",
-"T3W1_pt_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "9a6ee70bb1dbbe243cb64ab96d986dfbe44f1031dae02b4fd291a89ab6ea1c4c",
-"T3W1_pt_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "5a024b43b49b480bf235bafe0d90ecc46635ee82bc0ef1daba194bf86649c061",
+"T3W1_pt_device_menu-test_traverse_menu.py::test_traverse_initialized": "bbbe1c06cf8fd255b8d7bffe00f687846582a4c9a4e9a8417d98477035a83206",
+"T3W1_pt_device_menu-test_traverse_menu.py::test_traverse_initialized_no_pin": "0d5560ca9c04870d388fa27273854e3c1bf43a88ddf2b6f9d55e80edf4a01d70",
+"T3W1_pt_device_menu-test_traverse_menu.py::test_traverse_uninitialized": "b95129fca8d09bbba98396786e719695337f6acce33d0475ec19bc6dd1f9916d",
"T3W1_pt_device_menu-test_wipe_code.py::test_remove_pin_without_removing_wipe_code": "bc49b685586789c2c4789962d2e5002a1641587079e01aad69944ab07fd8797a",
"T3W1_pt_device_menu-test_wipe_code.py::test_wipe_code_cancel_intro": "83046274aeca225c5aac2578f6d0af7a099baa4b75fced94001c657e95534bfb",
"T3W1_pt_device_menu-test_wipe_code.py::test_wipe_code_cancel_keyboard": "a7fadec3de428aa0565f8c8a2352223aadfcaf2f08c6f09fdebbf437a5006852",
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.