chore(core/eckhart): update regulatory screen
What changed, and why it matters
This commit updates the legal/regulatory information screen shown on a Trezor hardware wallet. It adds Taiwan and an extra Japan certification icon, and restructures the code that decides which labels and icons appear. There is no security-relevant change—only on-screen text and images.
No security action required; treat as routine UI/assets update.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change refactors RegulatoryContent::ZONES from a tuple array to a RegulatoryZone struct supporting a second optional icon (icon2). It adds ICON_JAPAN_2 and ICON_TAIWAN assets and a ninth regulatory screen for Taiwan. The render logic now optionally draws two stacked icons. No cryptographic, input-validation, memory-safety, or authentication 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/japan_2.pngcore/embed/rust/src/ui/layout_eckhart/res/japan_2.toifcore/embed/rust/src/ui/layout_eckhart/res/taiwan.pngcore/embed/rust/src/ui/layout_eckhart/res/taiwan.toifInspect captured patch +81 / −31
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 2f7cfdef..bf6c6836 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
@@ -34,6 +34,13 @@ pub enum RegulatoryMsg {
Cancelled,
}
+struct RegulatoryZone {
+ name: Option<&'static str>,
+ content: &'static str,
+ icon1: Option<Icon>,
+ icon2: Option<Icon>,
+}
+
impl RegulatoryScreen {
pub fn new() -> Self {
let content = RegulatoryContent::new();
@@ -140,32 +147,62 @@ struct RegulatoryContent {
}
impl RegulatoryContent {
- const SCREENS: usize = 8;
- const ZONES: [(Option<&'static str>, &'static str, Option<Icon>); RegulatoryContent::SCREENS] = [
- (
- Some("United States"),
- "FCC ID: VUI-TS7A01",
- Some(theme::ICON_FCC),
- ),
- (
- None,
- "This device complies with Part 15 of the FCC Rules. Operation is subject to two conditions: (1) it may not cause harmful interference, and (2) it must accept any interference, including that which causes undesired operation.",
- None,
- ),
- (
- Some("Canada"),
- "IC: 7582A-TS7A01\nCAN ICES-003(B) /\nNMB-003(B)",
- None,
- ),
- (
- Some("Europe / UK"),
- "Trezor Company s.r.o.\nKundratka 2359/17a\nPrague 8, Czech Republic",
- Some(theme::ICON_EUROPE),
- ),
- (Some("Australia /\nNew Zealand"), "", Some(theme::ICON_RCM)),
- (Some("Ukraine"), "", Some(theme::ICON_UKRAINE)),
- (Some("Japan"), "", Some(theme::ICON_JAPAN)),
- (Some("South Korea"), "", Some(theme::ICON_KOREA)),
+ const SCREENS: usize = 9;
+ const ZONES: [RegulatoryZone; RegulatoryContent::SCREENS] = [
+ RegulatoryZone {
+ name: Some("United States"),
+ content: "FCC ID: VUI-TS7A01",
+ icon1: Some(theme::ICON_FCC),
+ icon2: None,
+ },
+ RegulatoryZone {
+ name: None,
+ content: "This device complies with Part 15 of the FCC Rules. Operation is subject to two conditions: (1) it may not cause harmful interference, and (2) it must accept any interference, including that which causes undesired operation.",
+ icon1: None,
+ icon2: None,
+ },
+ RegulatoryZone {
+ name: Some("Canada"),
+ content: "IC: 7582A-TS7A01\nCAN ICES-003(B) /\nNMB-003(B)",
+ icon1: None,
+ icon2: None,
+ },
+ RegulatoryZone {
+ name: Some("Europe / UK"),
+ content: "Trezor Company s.r.o.\nKundratka 2359/17a\nPrague 8, Czech Republic",
+ icon1: Some(theme::ICON_EUROPE),
+ icon2: None,
+ },
+ RegulatoryZone {
+ name: Some("Australia /\nNew Zealand"),
+ content: "",
+ icon1: Some(theme::ICON_RCM),
+ icon2: None,
+ },
+ RegulatoryZone {
+ name: Some("Ukraine"),
+ content: "",
+ icon1: Some(theme::ICON_UKRAINE),
+ icon2: None,
+ },
+ RegulatoryZone {
+ name: Some("Japan"),
+ content: "",
+ icon1: Some(theme::ICON_JAPAN),
+ icon2: Some(theme::ICON_JAPAN_2),
+ },
+ RegulatoryZone {
+ name: Some("South Korea"),
+ content: "",
+ icon1: Some(theme::ICON_KOREA),
+ icon2: None,
+ },
+ RegulatoryZone {
+ name: Some("Taiwan"),
+ content: "",
+ icon1: Some(theme::ICON_TAIWAN),
+ icon2: None,
+ },
];
pub fn new() -> Self {
@@ -232,8 +269,8 @@ impl Component for RegulatoryContent {
}
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
- let (title, content, icon) = Self::ZONES[self.pager.current() as usize];
- let rest = if let Some(title) = title {
+ let zone = &Self::ZONES[self.pager.current() as usize];
+ let rest = if let Some(title) = zone.name {
self.render_from_top(
self.area,
theme::TEXT_REGULAR,
@@ -250,13 +287,24 @@ impl Component for RegulatoryContent {
rest,
theme::TEXT_MEDIUM,
Alignment::Start,
- content,
+ zone.content,
theme::TEXT_VERTICAL_SPACING,
target,
);
- if let Some(icon) = icon {
- ToifImage::new(rest.top_left(), icon.toif)
+ let rest = if let Some(icon1) = zone.icon1 {
+ ToifImage::new(rest.top_left(), icon1.toif)
+ .with_align(Alignment2D::TOP_LEFT)
+ .with_fg(theme::GREY_LIGHT)
+ .render(target);
+ rest.split_top(icon1.toif.height() + theme::TEXT_VERTICAL_SPACING)
+ .1
+ } else {
+ rest
+ };
+
+ if let Some(icon2) = zone.icon2 {
+ ToifImage::new(rest.top_left(), icon2.toif)
.with_align(Alignment2D::TOP_LEFT)
.with_fg(theme::GREY_LIGHT)
.render(target);
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/japan_2.png b/core/embed/rust/src/ui/layout_eckhart/res/japan_2.png
new file mode 100644
index 00000000..ce942ed7
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/japan_2.png differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/japan_2.toif b/core/embed/rust/src/ui/layout_eckhart/res/japan_2.toif
new file mode 100644
index 00000000..5c51c609
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/japan_2.toif differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/taiwan.png b/core/embed/rust/src/ui/layout_eckhart/res/taiwan.png
new file mode 100644
index 00000000..0c97eb3d
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/taiwan.png differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/taiwan.toif b/core/embed/rust/src/ui/layout_eckhart/res/taiwan.toif
new file mode 100644
index 00000000..f033928d
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/taiwan.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 56ae9299..1bf304e2 100644
--- a/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs
@@ -164,10 +164,12 @@ include_icon!(ICON_SECURED, "layout_eckhart/res/secured.toif");
// Regulatory screen icons
include_icon!(ICON_UKRAINE, "layout_eckhart/res/ukraine.toif");
include_icon!(ICON_JAPAN, "layout_eckhart/res/japan.toif");
+include_icon!(ICON_JAPAN_2, "layout_eckhart/res/japan_2.toif");
include_icon!(ICON_KOREA, "layout_eckhart/res/korea_full.toif");
include_icon!(ICON_EUROPE, "layout_eckhart/res/europe.toif");
include_icon!(ICON_RCM, "layout_eckhart/res/rcm.toif");
include_icon!(ICON_FCC, "layout_eckhart/res/fcc.toif");
+include_icon!(ICON_TAIWAN, "layout_eckhart/res/taiwan.toif");
// Square icon for BLE connection items
include_icon!(ICON_SQUARE, "layout_eckhart/res/square.toif");
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.