Skip to content

Commit e273675

Browse files
authored
fix(fingerprint): correct fingerprint list data management. (#344)
1 parent 627c6fe commit e273675

File tree

4 files changed

+103
-81
lines changed

4 files changed

+103
-81
lines changed

core/embed/fp_sensor_wrapper/fpsensor_platform.c

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -520,42 +520,42 @@ bool fpsensor_data_init_start(void)
520520
}
521521
}
522522

523-
if ( counter > 0 && fp_data_version == FINGER_DATA_VERSION_NEW )
524-
{
525-
ensure(se_fp_read(4, group, 8, 0, 0), "se_fp_read failed");
526-
if ( memcmp(group, "\xff\xff\xff\xff\xff\xff\xff\xff", 8) == 0 )
527-
{
528-
fp_data_version = FINGER_DATA_VERSION_OLD;
529-
}
530-
// invalid state, force to old version
531-
if ( counter == 2 || counter == 5 )
532-
{
533-
fp_data_version = FINGER_DATA_VERSION_OLD;
534-
}
535-
}
536-
537523
if ( counter == 0 && fp_data_version == FINGER_DATA_VERSION_OLD )
538524
{
539525
fp_data_version = FINGER_DATA_VERSION_NEW;
540526
fp_data_inited = true;
541527
return true;
542528
}
543529

544-
if ( fp_data_version == FINGER_DATA_VERSION_NEW )
530+
if ( fp_data_version == FINGER_DATA_VERSION_NEW && counter > 0 )
545531
{
546532
ensure(se_fp_read(4, group, 8, 0, 0), "se_fp_read failed");
547533
uint8_t index1 = 0xff, index2 = 0xff, temp_counter = 0, new_counter = 0;
548534
uint8_t temp_list[2] = {0};
549-
if ( group[0] < 2 )
535+
if ( group[0] < 2 && group[1] < fp_max_template_count )
550536
{
551537
index1 = group[1];
552-
temp_list[temp_counter++] = index1;
538+
for ( uint8_t i = 0; i < counter; i++ )
539+
{
540+
if ( list[i] == index1 )
541+
{
542+
temp_list[temp_counter++] = index1;
543+
break;
544+
}
545+
}
553546
}
554547

555-
if ( group[4] < 2 )
548+
if ( group[4] < 2 && group[5] < fp_max_template_count )
556549
{
557550
index2 = group[5];
558-
temp_list[temp_counter++] = index2;
551+
for ( uint8_t i = 0; i < counter; i++ )
552+
{
553+
if ( list[i] == index2 )
554+
{
555+
temp_list[temp_counter++] = index2;
556+
break;
557+
}
558+
}
559559
}
560560

561561
for ( uint8_t i = 0; i < counter; i++ )
@@ -724,6 +724,17 @@ bool fpsensor_data_save(uint8_t index)
724724
}
725725
}
726726

727+
if ( counter )
728+
{
729+
ensure(se_fp_read(0, &fp_data_version, 4, 0, 0), "se_fp_read failed");
730+
731+
if ( fp_data_version != FINGER_DATA_VERSION_NEW )
732+
{
733+
fp_data_version = FINGER_DATA_VERSION_NEW;
734+
ensure(se_fp_write(0, &fp_data_version, 4, 0, 0), "se_fp_write failed");
735+
}
736+
}
737+
727738
ensure(se_fp_write(4 + index * sizeof(id_group), id_group, sizeof(id_group), 0, 0), "se_fp_write failed");
728739

729740
for ( uint8_t i = 0; i < counter; i++ )
@@ -738,17 +749,6 @@ bool fpsensor_data_save(uint8_t index)
738749
);
739750
}
740751

741-
if ( counter )
742-
{
743-
ensure(se_fp_read(0, &fp_data_version, 4, 0, 0), "se_fp_read failed");
744-
745-
if ( fp_data_version != FINGER_DATA_VERSION_NEW )
746-
{
747-
fp_data_version = FINGER_DATA_VERSION_NEW;
748-
ensure(se_fp_write(0, &fp_data_version, 4, 0, 0), "se_fp_write failed");
749-
}
750-
}
751-
752752
return true;
753753
}
754754

core/embed/trezorhal/se_thd89.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2198,6 +2198,11 @@ secbool se_fp_read(uint32_t offset, void *val_dest, uint32_t len, uint8_t index,
21982198
ui_callback(0, percent * 10, "read fp data");
21992199
}
22002200
}
2201+
2202+
if (ui_callback && show_progress && index == total - 1 && percent != 100) {
2203+
ui_callback(0, 100 * 10, NULL);
2204+
}
2205+
22012206
return sectrue;
22022207
}
22032208

core/src/trezor/lvglui/scrs/homescreen.py

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4928,65 +4928,67 @@ def fresh_show(self):
49284928
if hasattr(self, "container_fun"):
49294929
self.container_fun.delete()
49304930

4931-
from trezorio import fingerprint
49324931
from . import fingerprints
49334932

49344933
self.fingerprint_list = fingerprints.get_fingerprint_list()
49354934
counter = fingerprints.get_fingerprint_count()
49364935
group_data = fingerprints.get_fingerprint_group()
49374936
self.data_new_version = fingerprints.data_version_is_new()
49384937

4939-
group1 = self._parse_group_data(group_data[0:4])
4940-
group2 = self._parse_group_data(group_data[4:8])
4941-
49424938
valid_fps = [fp for fp in self.fingerprint_list if fp is not None]
49434939

49444940
if __debug__:
49454941
print(f"fingerprint_list: {self.fingerprint_list}")
49464942
print(f"group_data: {group_data}")
4947-
print(f"group1: {group1}")
4948-
print(f"group2: {group2}")
49494943
print(f"valid_fps: {valid_fps}")
49504944
print(f"counter: {counter}")
49514945

4952-
self.groups = []
4953-
try:
4954-
if counter == 1:
4955-
self.groups = [
4956-
{
4957-
"group_id": valid_fps[0],
4958-
"indexes": bytes([valid_fps[0], 0xFF, 0xFF]),
4959-
}
4960-
]
4961-
elif self.data_new_version:
4962-
if counter == 3:
4963-
self.groups = [group1 if group1 else group2]
4964-
elif counter == 4:
4965-
excluded_indexes = (
4966-
group1["indexes"] if group1 else group2["indexes"] # type: ignore [Object of type "None" is not subscriptable]
4967-
)
4968-
legacy_fp = [fp for fp in valid_fps if fp not in excluded_indexes]
4969-
self.groups = [
4970-
{
4971-
"group_id": legacy_fp[0],
4972-
"indexes": bytes([legacy_fp[0], 0xFF, 0xFF]),
4973-
},
4974-
group2 if group2 else group1,
4975-
]
4976-
self.groups.sort(key=lambda g: g["group_id"])
4977-
else:
4978-
self.groups = [g for g in [group1, group2] if g]
4979-
if self.groups:
4980-
self.groups.sort(key=lambda g: g["group_id"])
4981-
counter = (counter + 2) // 3
4946+
def _filter_and_pad_group(grp, valid_fps):
4947+
if not grp:
4948+
return None
4949+
filtered = [idx for idx in grp["indexes"] if idx in valid_fps]
4950+
if not filtered:
4951+
return None
4952+
while len(filtered) < 3:
4953+
filtered.append(0xFF)
4954+
return {"group_id": grp["group_id"], "indexes": filtered}
49824955

4983-
except Exception:
4984-
if __debug__:
4985-
print("fingerprint group error")
4986-
fingerprint.clear()
4987-
self.fingerprint_list = fingerprints.get_fingerprint_list()
4988-
counter = fingerprints.get_fingerprint_count()
4989-
self.groups = []
4956+
groups = []
4957+
if self.data_new_version:
4958+
g1 = self._parse_group_data(group_data[0:4])
4959+
g2 = self._parse_group_data(group_data[4:8])
4960+
4961+
g1 = _filter_and_pad_group(g1, valid_fps)
4962+
g2 = _filter_and_pad_group(g2, valid_fps)
4963+
4964+
for g in (g1, g2):
4965+
if g is not None:
4966+
groups.append(g)
4967+
4968+
in_group = {idx for g in groups for idx in g["indexes"] if idx != 0xFF}
4969+
not_in_group = [idx for idx in valid_fps if idx not in in_group]
4970+
4971+
if len(groups) < 2 and not_in_group:
4972+
new_idx = not_in_group[:]
4973+
while len(new_idx) < 3:
4974+
new_idx.append(0xFF)
4975+
groups.append({"group_id": not_in_group[0], "indexes": new_idx})
4976+
4977+
counter = len(groups)
4978+
self.groups = groups
4979+
4980+
else:
4981+
if len(valid_fps) == 1:
4982+
idx = valid_fps[0]
4983+
indexes = [idx]
4984+
while len(indexes) < 3:
4985+
indexes.append(0xFF)
4986+
self.groups = [{"group_id": idx, "indexes": indexes}]
4987+
else:
4988+
self.groups = []
4989+
4990+
if __debug__:
4991+
print(f"groups: {self.groups}")
49904992

49914993
self.added_fingerprints = []
49924994
if not self.data_new_version:
@@ -5006,7 +5008,7 @@ def fresh_show(self):
50065008
self.added_fingerprints.append(
50075009
ListItemBtn(
50085010
self.container,
5009-
_(i18n_keys.FORM__FINGER_STR).format(group["group_id"] + 1), # type: ignore [Object of type "None" is not subscriptable]
5011+
_(i18n_keys.FORM__FINGER_STR).format(group["group_id"] + 1),
50105012
left_img_src="A:/res/settings-fingerprint.png",
50115013
has_next=False,
50125014
)
@@ -5047,7 +5049,7 @@ async def on_remove(self, fp_id):
50475049
async def on_remove_group(self, group):
50485050
from trezorio import fingerprint
50495051

5050-
group_bytes = bytes([group["group_id"]]) + group["indexes"]
5052+
group_bytes = bytes([group["group_id"]]) + bytes(group["indexes"])
50515053
fingerprint.remove_group(group_bytes)
50525054
self.fresh_show()
50535055

@@ -5061,7 +5063,7 @@ def on_click(self, event_obj):
50615063
if not self.groups:
50625064
group_id = 0
50635065
else:
5064-
current_group_id = self.groups[0]["group_id"] # type: ignore [Object of type "None" is not subscriptable]
5066+
current_group_id = self.groups[0]["group_id"]
50655067
if current_group_id not in (0, 1):
50665068
group_id = 0
50675069
else:
@@ -5078,7 +5080,7 @@ def on_click(self, event_obj):
50785080
if self.data_new_version:
50795081
group = self.groups[i]
50805082
prompt = _(i18n_keys.FORM__FINGER_STR).format(
5081-
group["group_id"] + 1 # type: ignore [Object of type "None" is not subscriptable]
5083+
group["group_id"] + 1
50825084
)
50835085
workflow.spawn(
50845086
fingerprints.request_delete_fingerprint(

core/src/trezor/pin.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ def show_pin_timeout(seconds: int, progress: int, message: str) -> bool:
3636
if progress != 0:
3737
lv.refr_now(None)
3838

39+
else:
40+
if _scr is not None:
41+
try:
42+
_scr.delete()
43+
_scr = None
44+
except Exception:
45+
_scr = None
46+
3947
if progress == 0:
4048
if progress != _previous_progress:
4149
# avoid overdraw in case of repeated progress calls
@@ -44,8 +52,12 @@ def show_pin_timeout(seconds: int, progress: int, message: str) -> bool:
4452
_previous_seconds = None
4553
# ui.display.text_center(ui.WIDTH // 2, 37, message, ui.BOLD, ui.FG, ui.BG)
4654
if _scr is not None:
47-
_scr.invalidate()
48-
lv.refr_now(None)
55+
try:
56+
_scr.invalidate()
57+
lv.refr_now(None)
58+
except Exception:
59+
_scr = None
60+
4961
# if not utils.DISABLE_ANIMATION:
5062
else:
5163
ui.display.loader(progress, False, 0, ui.FG, ui.BG)
@@ -67,8 +79,11 @@ def show_pin_timeout(seconds: int, progress: int, message: str) -> bool:
6779
if progress == 1000:
6880
ui.display.clear()
6981
if _scr is not None:
70-
_scr.delete()
71-
_scr = None
82+
try:
83+
_scr.delete()
84+
_scr = None
85+
except Exception:
86+
_scr = None
7287

7388
ui.refresh()
7489
_previous_progress = progress

0 commit comments

Comments
 (0)