diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h index f0797a21f40..4e6ac45ef44 100644 --- a/core/embed/rust/librust_qstr.h +++ b/core/embed/rust/librust_qstr.h @@ -185,7 +185,6 @@ static void _librust_qstrs(void) { MP_QSTR_device_name__change_template; MP_QSTR_device_name__title; MP_QSTR_disable_animation; - MP_QSTR_dry_run; MP_QSTR_encode; MP_QSTR_encoded_length; MP_QSTR_entropy__send; diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs index a02ac27f50c..7f2e2690cba 100644 --- a/core/embed/rust/src/translations/generated/translated_string.rs +++ b/core/embed/rust/src/translations/generated/translated_string.rs @@ -1252,7 +1252,7 @@ pub enum TranslatedString { #[cfg(feature = "universal_fw")] cardano__vote_delegation = 852, // "Vote delegation" recovery__title_unlock_repeated_backup = 853, // "Multi-share backup" - recovery__unlock_repeated_backup = 854, // "Do you want to unlock the seed for repeated backup?" + recovery__unlock_repeated_backup = 854, // "Create additional backup?" recovery__unlock_repeated_backup_verb = 855, // "Unlock backup" } @@ -2501,7 +2501,7 @@ impl TranslatedString { #[cfg(feature = "universal_fw")] Self::cardano__vote_delegation => "Vote delegation", Self::recovery__title_unlock_repeated_backup => "Multi-share backup", - Self::recovery__unlock_repeated_backup => "Do you want to unlock the seed for repeated backup?", + Self::recovery__unlock_repeated_backup => "Create additional backup?", Self::recovery__unlock_repeated_backup_verb => "Unlock backup", } } diff --git a/core/embed/rust/src/ui/model_tr/layout.rs b/core/embed/rust/src/ui/model_tr/layout.rs index 659afdba9f7..fde9ac96e12 100644 --- a/core/embed/rust/src/ui/model_tr/layout.rs +++ b/core/embed/rust/src/ui/model_tr/layout.rs @@ -1416,7 +1416,7 @@ extern "C" fn new_confirm_recovery(n_args: usize, args: *const Obj, kwargs: *mut let title = match recovery_type { RECOVERY_TYPE_DRY_RUN => TR::recovery__title_dry_run, - RECOVERY_TYPE_UNLOCK_REPEATED_BACKUP => TR::recovery__title_unlock_repeated_backup, + RECOVERY_TYPE_UNLOCK_REPEATED_BACKUP => TR::recovery__title_dry_run, _ => TR::recovery__title, }; @@ -1974,7 +1974,7 @@ pub static mp_module_trezorui2: Module = obj_module! { /// def select_word_count( /// *, - /// dry_run: bool, # unused on TR + /// recovery_type: int, # unused on TR /// ) -> LayoutObj[int | str]: /// """Select mnemonic word count from (12, 18, 20, 24, 33).""" Qstr::MP_QSTR_select_word_count => obj_fn_kw!(0, new_select_word_count).as_obj(), diff --git a/core/embed/rust/src/ui/model_tt/layout.rs b/core/embed/rust/src/ui/model_tt/layout.rs index b1dc66eefae..b0c2c0ec36c 100644 --- a/core/embed/rust/src/ui/model_tt/layout.rs +++ b/core/embed/rust/src/ui/model_tt/layout.rs @@ -1391,9 +1391,7 @@ extern "C" fn new_confirm_recovery(n_args: usize, args: *const Obj, kwargs: *mut let notification = match recovery_type { RECOVERY_TYPE_DRY_RUN => TR::recovery__title_dry_run.into(), - RECOVERY_TYPE_UNLOCK_REPEATED_BACKUP => { - TR::recovery__title_unlock_repeated_backup.into() - } + RECOVERY_TYPE_UNLOCK_REPEATED_BACKUP => TR::recovery__title_dry_run.into(), _ => TR::recovery__title.into(), }; @@ -1423,11 +1421,11 @@ extern "C" fn new_confirm_recovery(n_args: usize, args: *const Obj, kwargs: *mut extern "C" fn new_select_word_count(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { let block = move |_args: &[Obj], kwargs: &Map| { - let dry_run: bool = kwargs.get(Qstr::MP_QSTR_dry_run)?.try_into()?; - let title: TString = if dry_run { - TR::recovery__title_dry_run.into() - } else { - TR::recovery__title.into() + let recovery_type: u32 = kwargs.get(Qstr::MP_QSTR_recovery_type)?.try_into()?; + let title: TString = match recovery_type { + RECOVERY_TYPE_DRY_RUN => TR::recovery__title_dry_run.into(), + RECOVERY_TYPE_UNLOCK_REPEATED_BACKUP => TR::recovery__title_dry_run.into(), + _ => TR::recovery__title.into(), }; let paragraphs = Paragraphs::new(Paragraph::new( @@ -2055,7 +2053,7 @@ pub static mp_module_trezorui2: Module = obj_module! { /// def select_word_count( /// *, - /// dry_run: bool, + /// recovery_type: int, # RecoveryType enum, passed as an int /// ) -> LayoutObj[int | str]: # TT returns int /// """Select mnemonic word count from (12, 18, 20, 24, 33).""" Qstr::MP_QSTR_select_word_count => obj_fn_kw!(0, new_select_word_count).as_obj(), diff --git a/core/mocks/generated/trezorui2.pyi b/core/mocks/generated/trezorui2.pyi index 06759f37e24..77e3a2dcf22 100644 --- a/core/mocks/generated/trezorui2.pyi +++ b/core/mocks/generated/trezorui2.pyi @@ -383,7 +383,7 @@ def confirm_recovery( # rust/src/ui/model_tr/layout.rs def select_word_count( *, - dry_run: bool, # unused on TR + recovery_type: int, # unused on TR ) -> LayoutObj[int | str]: """Select mnemonic word count from (12, 18, 20, 24, 33).""" @@ -895,7 +895,7 @@ def confirm_recovery( # rust/src/ui/model_tt/layout.rs def select_word_count( *, - dry_run: bool, + recovery_type: int, # RecoveryType enum, passed as an int ) -> LayoutObj[int | str]: # TT returns int """Select mnemonic word count from (12, 18, 20, 24, 33).""" diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi index a2ffe7aa410..e7147c86531 100644 --- a/core/mocks/trezortranslate_keys.pyi +++ b/core/mocks/trezortranslate_keys.pyi @@ -542,7 +542,7 @@ class TR: recovery__title_remaining_shares: str = "Remaining shares" recovery__title_unlock_repeated_backup: str = "Multi-share backup" recovery__type_word_x_of_y_template: str = "Type word {0} of {1}" - recovery__unlock_repeated_backup: str = "Do you want to unlock the seed for repeated backup?" + recovery__unlock_repeated_backup: str = "Create additional backup?" recovery__unlock_repeated_backup_verb: str = "Unlock backup" recovery__wallet_recovered: str = "Wallet recovered successfully" recovery__wanna_cancel_dry_run: str = "Are you sure you want to cancel the backup check?" diff --git a/core/src/apps/management/recovery_device/homescreen.py b/core/src/apps/management/recovery_device/homescreen.py index 52341bbc731..254a84b7a1c 100644 --- a/core/src/apps/management/recovery_device/homescreen.py +++ b/core/src/apps/management/recovery_device/homescreen.py @@ -122,9 +122,7 @@ async def _continue_recovery_process() -> Success: TR.buttons__continue, TR.recovery__num_of_words ) # ask for the number of words - word_count = await layout.request_word_count( - recovery_type == RecoveryType.DryRun - ) + word_count = await layout.request_word_count(recovery_type) # ...and only then show the starting screen with word count. await _request_share_first_screen(word_count, recovery_type) assert word_count is not None diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py index 85915377fc3..bc91f93c134 100644 --- a/core/src/trezor/enums/__init__.py +++ b/core/src/trezor/enums/__init__.py @@ -439,6 +439,11 @@ class HomescreenFormat(IntEnum): Jpeg = 2 ToiG = 3 + class RecoveryType(IntEnum): + NormalRecovery = 0 + DryRun = 1 + UnlockRepeatedBackup = 2 + class BackupAvailability(IntEnum): NotAvailable = 0 Required = 1 @@ -479,11 +484,6 @@ class RecoveryDeviceInputMethod(IntEnum): ScrambledWords = 0 Matrix = 1 - class RecoveryType(IntEnum): - NormalRecovery = 0 - DryRun = 1 - UnlockRepeatedBackup = 2 - class WordRequestType(IntEnum): Plain = 0 Matrix9 = 1 diff --git a/core/src/trezor/ui/layouts/tr/recovery.py b/core/src/trezor/ui/layouts/tr/recovery.py index b6f3e44d7de..90ffe55e187 100644 --- a/core/src/trezor/ui/layouts/tr/recovery.py +++ b/core/src/trezor/ui/layouts/tr/recovery.py @@ -8,9 +8,9 @@ from . import RustLayout, raise_if_not_confirmed, show_warning -async def request_word_count(dry_run: bool) -> int: +async def request_word_count(recovery_type: RecoveryType) -> int: count = await interact( - RustLayout(trezorui2.select_word_count(dry_run=dry_run)), + RustLayout(trezorui2.select_word_count(recovery_type=recovery_type)), "word_count", ButtonRequestType.MnemonicWordCount, ) diff --git a/core/src/trezor/ui/layouts/tt/recovery.py b/core/src/trezor/ui/layouts/tt/recovery.py index 820ea84f345..0e266ab65b3 100644 --- a/core/src/trezor/ui/layouts/tt/recovery.py +++ b/core/src/trezor/ui/layouts/tt/recovery.py @@ -25,8 +25,8 @@ async def _is_confirmed_info( return result is CONFIRMED -async def request_word_count(dry_run: bool) -> int: - selector = RustLayout(trezorui2.select_word_count(dry_run=dry_run)) +async def request_word_count(recovery_type: RecoveryType) -> int: + selector = RustLayout(trezorui2.select_word_count(recovery_type=recovery_type)) count = await interact(selector, "word_count", ButtonRequestType.MnemonicWordCount) return int(count) diff --git a/core/translations/en.json b/core/translations/en.json index d5b50d6aaad..88fe776ebd9 100644 --- a/core/translations/en.json +++ b/core/translations/en.json @@ -544,7 +544,7 @@ "recovery__title_remaining_shares": "Remaining shares", "recovery__title_unlock_repeated_backup": "Multi-share backup", "recovery__type_word_x_of_y_template": "Type word {0} of {1}", - "recovery__unlock_repeated_backup": "Do you want to unlock the seed for repeated backup?", + "recovery__unlock_repeated_backup": "Create additional backup?", "recovery__unlock_repeated_backup_verb": "Unlock backup", "recovery__wallet_recovered": "Wallet recovered successfully", "recovery__wanna_cancel_dry_run": "Are you sure you want to cancel the backup check?", diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py index 7584876726a..07d2a307c29 100644 --- a/python/src/trezorlib/messages.py +++ b/python/src/trezorlib/messages.py @@ -471,6 +471,12 @@ class HomescreenFormat(IntEnum): ToiG = 3 +class RecoveryType(IntEnum): + NormalRecovery = 0 + DryRun = 1 + UnlockRepeatedBackup = 2 + + class BackupAvailability(IntEnum): NotAvailable = 0 Required = 1 @@ -516,12 +522,6 @@ class RecoveryDeviceInputMethod(IntEnum): Matrix = 1 -class RecoveryType(IntEnum): - NormalRecovery = 0 - DryRun = 1 - UnlockRepeatedBackup = 2 - - class WordRequestType(IntEnum): Plain = 0 Matrix9 = 1 diff --git a/rust/trezor-client/src/protos/generated/messages_management.rs b/rust/trezor-client/src/protos/generated/messages_management.rs index e3e8e380bc3..3bef68f400e 100644 --- a/rust/trezor-client/src/protos/generated/messages_management.rs +++ b/rust/trezor-client/src/protos/generated/messages_management.rs @@ -463,7 +463,7 @@ pub struct Features { // @@protoc_insertion_point(field:hw.trezor.messages.management.Features.unit_packaging) pub unit_packaging: ::std::option::Option, // @@protoc_insertion_point(field:hw.trezor.messages.management.Features.recovery_type) - pub recovery_type: ::std::option::Option<::protobuf::EnumOrUnknown>, + pub recovery_type: ::std::option::Option<::protobuf::EnumOrUnknown>, // special fields // @@protoc_insertion_point(special_field:hw.trezor.messages.management.Features.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -1577,12 +1577,12 @@ impl Features { self.unit_packaging = ::std::option::Option::Some(v); } - // optional .hw.trezor.messages.management.RecoveryDevice.RecoveryType recovery_type = 52; + // optional .hw.trezor.messages.management.RecoveryType recovery_type = 52; - pub fn recovery_type(&self) -> recovery_device::RecoveryType { + pub fn recovery_type(&self) -> RecoveryType { match self.recovery_type { - Some(e) => e.enum_value_or(recovery_device::RecoveryType::NormalRecovery), - None => recovery_device::RecoveryType::NormalRecovery, + Some(e) => e.enum_value_or(RecoveryType::NormalRecovery), + None => RecoveryType::NormalRecovery, } } @@ -1595,7 +1595,7 @@ impl Features { } // Param is passed by value, moved - pub fn set_recovery_type(&mut self, v: recovery_device::RecoveryType) { + pub fn set_recovery_type(&mut self, v: RecoveryType) { self.recovery_type = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); } @@ -7863,7 +7863,7 @@ pub struct RecoveryDevice { // @@protoc_insertion_point(field:hw.trezor.messages.management.RecoveryDevice.u2f_counter) pub u2f_counter: ::std::option::Option, // @@protoc_insertion_point(field:hw.trezor.messages.management.RecoveryDevice.type) - pub type_: ::std::option::Option<::protobuf::EnumOrUnknown>, + pub type_: ::std::option::Option<::protobuf::EnumOrUnknown>, // special fields // @@protoc_insertion_point(special_field:hw.trezor.messages.management.RecoveryDevice.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -8069,12 +8069,12 @@ impl RecoveryDevice { self.u2f_counter = ::std::option::Option::Some(v); } - // optional .hw.trezor.messages.management.RecoveryDevice.RecoveryType type = 10; + // optional .hw.trezor.messages.management.RecoveryType type = 10; - pub fn type_(&self) -> recovery_device::RecoveryType { + pub fn type_(&self) -> RecoveryType { match self.type_ { - Some(e) => e.enum_value_or(recovery_device::RecoveryType::NormalRecovery), - None => recovery_device::RecoveryType::NormalRecovery, + Some(e) => e.enum_value_or(RecoveryType::NormalRecovery), + None => RecoveryType::NormalRecovery, } } @@ -8087,7 +8087,7 @@ impl RecoveryDevice { } // Param is passed by value, moved - pub fn set_type(&mut self, v: recovery_device::RecoveryType) { + pub fn set_type(&mut self, v: RecoveryType) { self.type_ = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); } @@ -8382,73 +8382,6 @@ pub mod recovery_device { ::protobuf::reflect::GeneratedEnumDescriptorData::new::("RecoveryDevice.RecoveryDeviceInputMethod") } } - - #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] - // @@protoc_insertion_point(enum:hw.trezor.messages.management.RecoveryDevice.RecoveryType) - pub enum RecoveryType { - // @@protoc_insertion_point(enum_value:hw.trezor.messages.management.RecoveryDevice.RecoveryType.NormalRecovery) - NormalRecovery = 0, - // @@protoc_insertion_point(enum_value:hw.trezor.messages.management.RecoveryDevice.RecoveryType.DryRun) - DryRun = 1, - // @@protoc_insertion_point(enum_value:hw.trezor.messages.management.RecoveryDevice.RecoveryType.UnlockRepeatedBackup) - UnlockRepeatedBackup = 2, - } - - impl ::protobuf::Enum for RecoveryType { - const NAME: &'static str = "RecoveryType"; - - fn value(&self) -> i32 { - *self as i32 - } - - fn from_i32(value: i32) -> ::std::option::Option { - match value { - 0 => ::std::option::Option::Some(RecoveryType::NormalRecovery), - 1 => ::std::option::Option::Some(RecoveryType::DryRun), - 2 => ::std::option::Option::Some(RecoveryType::UnlockRepeatedBackup), - _ => ::std::option::Option::None - } - } - - fn from_str(str: &str) -> ::std::option::Option { - match str { - "NormalRecovery" => ::std::option::Option::Some(RecoveryType::NormalRecovery), - "DryRun" => ::std::option::Option::Some(RecoveryType::DryRun), - "UnlockRepeatedBackup" => ::std::option::Option::Some(RecoveryType::UnlockRepeatedBackup), - _ => ::std::option::Option::None - } - } - - const VALUES: &'static [RecoveryType] = &[ - RecoveryType::NormalRecovery, - RecoveryType::DryRun, - RecoveryType::UnlockRepeatedBackup, - ]; - } - - impl ::protobuf::EnumFull for RecoveryType { - fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { - static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); - descriptor.get(|| super::file_descriptor().enum_by_package_relative_name("RecoveryDevice.RecoveryType").unwrap()).clone() - } - - fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { - let index = *self as usize; - Self::enum_descriptor().value_by_index(index) - } - } - - impl ::std::default::Default for RecoveryType { - fn default() -> Self { - RecoveryType::NormalRecovery - } - } - - impl RecoveryType { - pub(in super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { - ::protobuf::reflect::GeneratedEnumDescriptorData::new::("RecoveryDevice.RecoveryType") - } - } } // @@protoc_insertion_point(message:hw.trezor.messages.management.WordRequest) @@ -10857,12 +10790,79 @@ impl HomescreenFormat { } } +#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] +// @@protoc_insertion_point(enum:hw.trezor.messages.management.RecoveryType) +pub enum RecoveryType { + // @@protoc_insertion_point(enum_value:hw.trezor.messages.management.RecoveryType.NormalRecovery) + NormalRecovery = 0, + // @@protoc_insertion_point(enum_value:hw.trezor.messages.management.RecoveryType.DryRun) + DryRun = 1, + // @@protoc_insertion_point(enum_value:hw.trezor.messages.management.RecoveryType.UnlockRepeatedBackup) + UnlockRepeatedBackup = 2, +} + +impl ::protobuf::Enum for RecoveryType { + const NAME: &'static str = "RecoveryType"; + + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(RecoveryType::NormalRecovery), + 1 => ::std::option::Option::Some(RecoveryType::DryRun), + 2 => ::std::option::Option::Some(RecoveryType::UnlockRepeatedBackup), + _ => ::std::option::Option::None + } + } + + fn from_str(str: &str) -> ::std::option::Option { + match str { + "NormalRecovery" => ::std::option::Option::Some(RecoveryType::NormalRecovery), + "DryRun" => ::std::option::Option::Some(RecoveryType::DryRun), + "UnlockRepeatedBackup" => ::std::option::Option::Some(RecoveryType::UnlockRepeatedBackup), + _ => ::std::option::Option::None + } + } + + const VALUES: &'static [RecoveryType] = &[ + RecoveryType::NormalRecovery, + RecoveryType::DryRun, + RecoveryType::UnlockRepeatedBackup, + ]; +} + +impl ::protobuf::EnumFull for RecoveryType { + fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().enum_by_package_relative_name("RecoveryType").unwrap()).clone() + } + + fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { + let index = *self as usize; + Self::enum_descriptor().value_by_index(index) + } +} + +impl ::std::default::Default for RecoveryType { + fn default() -> Self { + RecoveryType::NormalRecovery + } +} + +impl RecoveryType { + fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { + ::protobuf::reflect::GeneratedEnumDescriptorData::new::("RecoveryType") + } +} + static file_descriptor_proto_data: &'static [u8] = b"\ \n\x19messages-management.proto\x12\x1dhw.trezor.messages.management\x1a\ \x0emessages.proto\"\x80\x01\n\nInitialize\x12\x1d\n\nsession_id\x18\x01\ \x20\x01(\x0cR\tsessionId\x12,\n\x10_skip_passphrase\x18\x02\x20\x01(\ \x08R\x0eSkipPassphraseB\x02\x18\x01\x12%\n\x0ederive_cardano\x18\x03\ - \x20\x01(\x08R\rderiveCardano\"\r\n\x0bGetFeatures\"\xdf\x16\n\x08Featur\ + \x20\x01(\x08R\rderiveCardano\"\r\n\x0bGetFeatures\"\xd0\x16\n\x08Featur\ es\x12\x16\n\x06vendor\x18\x01\x20\x01(\tR\x06vendor\x12#\n\rmajor_versi\ on\x18\x02\x20\x02(\rR\x0cmajorVersion\x12#\n\rminor_version\x18\x03\x20\ \x02(\rR\x0cminorVersion\x12#\n\rpatch_version\x18\x04\x20\x02(\rR\x0cpa\ @@ -10909,71 +10909,71 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x180\x20\x01(\rR\x10homescreenHeight\x12+\n\x11bootloader_locked\x181\ \x20\x01(\x08R\x10bootloaderLocked\x12>\n\x18language_version_matches\ \x182\x20\x01(\x08:\x04trueR\x16languageVersionMatches\x12%\n\x0eunit_pa\ - ckaging\x183\x20\x01(\rR\runitPackaging\x12_\n\rrecovery_type\x184\x20\ - \x01(\x0e2:.hw.trezor.messages.management.RecoveryDevice.RecoveryTypeR\ - \x0crecoveryType\"C\n\x12BackupAvailability\x12\x10\n\x0cNotAvailable\ - \x10\0\x12\x0c\n\x08Required\x10\x01\x12\r\n\tAvailable\x10\x02\"7\n\x0e\ - RecoveryStatus\x12\x0b\n\x07Nothing\x10\0\x12\x0c\n\x08Recovery\x10\x01\ - \x12\n\n\x06Backup\x10\x02\"\x84\x04\n\nCapability\x12\x1c\n\x12Capabili\ - ty_Bitcoin\x10\x01\x1a\x04\x80\xa6\x1d\x01\x12\x1b\n\x17Capability_Bitco\ - in_like\x10\x02\x12\x16\n\x12Capability_Binance\x10\x03\x12\x16\n\x12Cap\ - ability_Cardano\x10\x04\x12\x1b\n\x11Capability_Crypto\x10\x05\x1a\x04\ - \x80\xa6\x1d\x01\x12\x12\n\x0eCapability_EOS\x10\x06\x12\x17\n\x13Capabi\ - lity_Ethereum\x10\x07\x12\x17\n\x0fCapability_Lisk\x10\x08\x1a\x02\x08\ - \x01\x12\x15\n\x11Capability_Monero\x10\t\x12\x12\n\x0eCapability_NEM\ - \x10\n\x12\x15\n\x11Capability_Ripple\x10\x0b\x12\x16\n\x12Capability_St\ - ellar\x10\x0c\x12\x14\n\x10Capability_Tezos\x10\r\x12\x12\n\x0eCapabilit\ - y_U2F\x10\x0e\x12\x1b\n\x11Capability_Shamir\x10\x0f\x1a\x04\x80\xa6\x1d\ - \x01\x12!\n\x17Capability_ShamirGroups\x10\x10\x1a\x04\x80\xa6\x1d\x01\ - \x12$\n\x1aCapability_PassphraseEntry\x10\x11\x1a\x04\x80\xa6\x1d\x01\ - \x12\x15\n\x11Capability_Solana\x10\x12\x12!\n\x17Capability_Translation\ - s\x10\x13\x1a\x04\x80\xa6\x1d\x01\x1a\x04\xc8\xf3\x18\x01\"\x0c\n\nLockD\ - evice\"&\n\x07SetBusy\x12\x1b\n\texpiry_ms\x18\x01\x20\x01(\rR\x08expiry\ - Ms\"\x0c\n\nEndSession\"\x9b\x04\n\rApplySettings\x12\x1e\n\x08language\ - \x18\x01\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x02\ - \x20\x01(\tR\x05label\x12%\n\x0euse_passphrase\x18\x03\x20\x01(\x08R\rus\ - ePassphrase\x12\x1e\n\nhomescreen\x18\x04\x20\x01(\x0cR\nhomescreen\x120\ - \n\x12_passphrase_source\x18\x05\x20\x01(\rR\x10PassphraseSourceB\x02\ - \x18\x01\x12+\n\x12auto_lock_delay_ms\x18\x06\x20\x01(\rR\x0fautoLockDel\ - ayMs\x12)\n\x10display_rotation\x18\x07\x20\x01(\rR\x0fdisplayRotation\ - \x12=\n\x1bpassphrase_always_on_device\x18\x08\x20\x01(\x08R\x18passphra\ - seAlwaysOnDevice\x12T\n\rsafety_checks\x18\t\x20\x01(\x0e2/.hw.trezor.me\ - ssages.management.SafetyCheckLevelR\x0csafetyChecks\x123\n\x15experiment\ - al_features\x18\n\x20\x01(\x08R\x14experimentalFeatures\x129\n\x19hide_p\ - assphrase_from_host\x18\x0b\x20\x01(\x08R\x16hidePassphraseFromHost\"T\n\ - \x0eChangeLanguage\x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLen\ - gth\x12!\n\x0cshow_display\x18\x02\x20\x01(\x08R\x0bshowDisplay\"Z\n\x16\ - TranslationDataRequest\x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndat\ - aLength\x12\x1f\n\x0bdata_offset\x18\x02\x20\x02(\rR\ndataOffset\"3\n\ - \x12TranslationDataAck\x12\x1d\n\ndata_chunk\x18\x01\x20\x02(\x0cR\tdata\ - Chunk\"\"\n\nApplyFlags\x12\x14\n\x05flags\x18\x01\x20\x02(\rR\x05flags\ - \"#\n\tChangePin\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"(\ - \n\x0eChangeWipeCode\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\ - \"\xaa\x01\n\tSdProtect\x12]\n\toperation\x18\x01\x20\x02(\x0e2?.hw.trez\ - or.messages.management.SdProtect.SdProtectOperationTypeR\toperation\">\n\ - \x16SdProtectOperationType\x12\x0b\n\x07DISABLE\x10\0\x12\n\n\x06ENABLE\ - \x10\x01\x12\x0b\n\x07REFRESH\x10\x02\"O\n\x04Ping\x12\x1a\n\x07message\ - \x18\x01\x20\x01(\t:\0R\x07message\x12+\n\x11button_protection\x18\x02\ - \x20\x01(\x08R\x10buttonProtection\"\x08\n\x06Cancel\"\x20\n\nGetEntropy\ - \x12\x12\n\x04size\x18\x01\x20\x02(\rR\x04size\"#\n\x07Entropy\x12\x18\n\ - \x07entropy\x18\x01\x20\x02(\x0cR\x07entropy\"/\n\x0fGetFirmwareHash\x12\ - \x1c\n\tchallenge\x18\x01\x20\x01(\x0cR\tchallenge\"\"\n\x0cFirmwareHash\ - \x12\x12\n\x04hash\x18\x01\x20\x02(\x0cR\x04hash\"2\n\x12AuthenticateDev\ - ice\x12\x1c\n\tchallenge\x18\x01\x20\x02(\x0cR\tchallenge\"U\n\x11Authen\ - ticityProof\x12\"\n\x0ccertificates\x18\x01\x20\x03(\x0cR\x0ccertificate\ - s\x12\x1c\n\tsignature\x18\x02\x20\x02(\x0cR\tsignature\"\x0c\n\nWipeDev\ - ice\"\xad\x02\n\nLoadDevice\x12\x1c\n\tmnemonics\x18\x01\x20\x03(\tR\tmn\ - emonics\x12\x10\n\x03pin\x18\x03\x20\x01(\tR\x03pin\x123\n\x15passphrase\ - _protection\x18\x04\x20\x01(\x08R\x14passphraseProtection\x12\x1e\n\x08l\ - anguage\x18\x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\ - \x18\x06\x20\x01(\tR\x05label\x12#\n\rskip_checksum\x18\x07\x20\x01(\x08\ - R\x0cskipChecksum\x12\x1f\n\x0bu2f_counter\x18\x08\x20\x01(\rR\nu2fCount\ - er\x12!\n\x0cneeds_backup\x18\t\x20\x01(\x08R\x0bneedsBackup\x12\x1b\n\t\ - no_backup\x18\n\x20\x01(\x08R\x08noBackup\"\x99\x03\n\x0bResetDevice\x12\ - %\n\x0edisplay_random\x18\x01\x20\x01(\x08R\rdisplayRandom\x12\x1f\n\x08\ - strength\x18\x02\x20\x01(\r:\x03256R\x08strength\x123\n\x15passphrase_pr\ - otection\x18\x03\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_pro\ - tection\x18\x04\x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\x18\ + ckaging\x183\x20\x01(\rR\runitPackaging\x12P\n\rrecovery_type\x184\x20\ + \x01(\x0e2+.hw.trezor.messages.management.RecoveryTypeR\x0crecoveryType\ + \"C\n\x12BackupAvailability\x12\x10\n\x0cNotAvailable\x10\0\x12\x0c\n\ + \x08Required\x10\x01\x12\r\n\tAvailable\x10\x02\"7\n\x0eRecoveryStatus\ + \x12\x0b\n\x07Nothing\x10\0\x12\x0c\n\x08Recovery\x10\x01\x12\n\n\x06Bac\ + kup\x10\x02\"\x84\x04\n\nCapability\x12\x1c\n\x12Capability_Bitcoin\x10\ + \x01\x1a\x04\x80\xa6\x1d\x01\x12\x1b\n\x17Capability_Bitcoin_like\x10\ + \x02\x12\x16\n\x12Capability_Binance\x10\x03\x12\x16\n\x12Capability_Car\ + dano\x10\x04\x12\x1b\n\x11Capability_Crypto\x10\x05\x1a\x04\x80\xa6\x1d\ + \x01\x12\x12\n\x0eCapability_EOS\x10\x06\x12\x17\n\x13Capability_Ethereu\ + m\x10\x07\x12\x17\n\x0fCapability_Lisk\x10\x08\x1a\x02\x08\x01\x12\x15\n\ + \x11Capability_Monero\x10\t\x12\x12\n\x0eCapability_NEM\x10\n\x12\x15\n\ + \x11Capability_Ripple\x10\x0b\x12\x16\n\x12Capability_Stellar\x10\x0c\ + \x12\x14\n\x10Capability_Tezos\x10\r\x12\x12\n\x0eCapability_U2F\x10\x0e\ + \x12\x1b\n\x11Capability_Shamir\x10\x0f\x1a\x04\x80\xa6\x1d\x01\x12!\n\ + \x17Capability_ShamirGroups\x10\x10\x1a\x04\x80\xa6\x1d\x01\x12$\n\x1aCa\ + pability_PassphraseEntry\x10\x11\x1a\x04\x80\xa6\x1d\x01\x12\x15\n\x11Ca\ + pability_Solana\x10\x12\x12!\n\x17Capability_Translations\x10\x13\x1a\ + \x04\x80\xa6\x1d\x01\x1a\x04\xc8\xf3\x18\x01\"\x0c\n\nLockDevice\"&\n\ + \x07SetBusy\x12\x1b\n\texpiry_ms\x18\x01\x20\x01(\rR\x08expiryMs\"\x0c\n\ + \nEndSession\"\x9b\x04\n\rApplySettings\x12\x1e\n\x08language\x18\x01\ + \x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x02\x20\x01\ + (\tR\x05label\x12%\n\x0euse_passphrase\x18\x03\x20\x01(\x08R\rusePassphr\ + ase\x12\x1e\n\nhomescreen\x18\x04\x20\x01(\x0cR\nhomescreen\x120\n\x12_p\ + assphrase_source\x18\x05\x20\x01(\rR\x10PassphraseSourceB\x02\x18\x01\ + \x12+\n\x12auto_lock_delay_ms\x18\x06\x20\x01(\rR\x0fautoLockDelayMs\x12\ + )\n\x10display_rotation\x18\x07\x20\x01(\rR\x0fdisplayRotation\x12=\n\ + \x1bpassphrase_always_on_device\x18\x08\x20\x01(\x08R\x18passphraseAlway\ + sOnDevice\x12T\n\rsafety_checks\x18\t\x20\x01(\x0e2/.hw.trezor.messages.\ + management.SafetyCheckLevelR\x0csafetyChecks\x123\n\x15experimental_feat\ + ures\x18\n\x20\x01(\x08R\x14experimentalFeatures\x129\n\x19hide_passphra\ + se_from_host\x18\x0b\x20\x01(\x08R\x16hidePassphraseFromHost\"T\n\x0eCha\ + ngeLanguage\x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\x12\ + !\n\x0cshow_display\x18\x02\x20\x01(\x08R\x0bshowDisplay\"Z\n\x16Transla\ + tionDataRequest\x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\ + \x12\x1f\n\x0bdata_offset\x18\x02\x20\x02(\rR\ndataOffset\"3\n\x12Transl\ + ationDataAck\x12\x1d\n\ndata_chunk\x18\x01\x20\x02(\x0cR\tdataChunk\"\"\ + \n\nApplyFlags\x12\x14\n\x05flags\x18\x01\x20\x02(\rR\x05flags\"#\n\tCha\ + ngePin\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"(\n\x0eChang\ + eWipeCode\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"\xaa\x01\ + \n\tSdProtect\x12]\n\toperation\x18\x01\x20\x02(\x0e2?.hw.trezor.message\ + s.management.SdProtect.SdProtectOperationTypeR\toperation\">\n\x16SdProt\ + ectOperationType\x12\x0b\n\x07DISABLE\x10\0\x12\n\n\x06ENABLE\x10\x01\ + \x12\x0b\n\x07REFRESH\x10\x02\"O\n\x04Ping\x12\x1a\n\x07message\x18\x01\ + \x20\x01(\t:\0R\x07message\x12+\n\x11button_protection\x18\x02\x20\x01(\ + \x08R\x10buttonProtection\"\x08\n\x06Cancel\"\x20\n\nGetEntropy\x12\x12\ + \n\x04size\x18\x01\x20\x02(\rR\x04size\"#\n\x07Entropy\x12\x18\n\x07entr\ + opy\x18\x01\x20\x02(\x0cR\x07entropy\"/\n\x0fGetFirmwareHash\x12\x1c\n\t\ + challenge\x18\x01\x20\x01(\x0cR\tchallenge\"\"\n\x0cFirmwareHash\x12\x12\ + \n\x04hash\x18\x01\x20\x02(\x0cR\x04hash\"2\n\x12AuthenticateDevice\x12\ + \x1c\n\tchallenge\x18\x01\x20\x02(\x0cR\tchallenge\"U\n\x11AuthenticityP\ + roof\x12\"\n\x0ccertificates\x18\x01\x20\x03(\x0cR\x0ccertificates\x12\ + \x1c\n\tsignature\x18\x02\x20\x02(\x0cR\tsignature\"\x0c\n\nWipeDevice\"\ + \xad\x02\n\nLoadDevice\x12\x1c\n\tmnemonics\x18\x01\x20\x03(\tR\tmnemoni\ + cs\x12\x10\n\x03pin\x18\x03\x20\x01(\tR\x03pin\x123\n\x15passphrase_prot\ + ection\x18\x04\x20\x01(\x08R\x14passphraseProtection\x12\x1e\n\x08langua\ + ge\x18\x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\ + \x06\x20\x01(\tR\x05label\x12#\n\rskip_checksum\x18\x07\x20\x01(\x08R\ + \x0cskipChecksum\x12\x1f\n\x0bu2f_counter\x18\x08\x20\x01(\rR\nu2fCounte\ + r\x12!\n\x0cneeds_backup\x18\t\x20\x01(\x08R\x0bneedsBackup\x12\x1b\n\tn\ + o_backup\x18\n\x20\x01(\x08R\x08noBackup\"\x99\x03\n\x0bResetDevice\x12%\ + \n\x0edisplay_random\x18\x01\x20\x01(\x08R\rdisplayRandom\x12\x1f\n\x08s\ + trength\x18\x02\x20\x01(\r:\x03256R\x08strength\x123\n\x15passphrase_pro\ + tection\x18\x03\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_prot\ + ection\x18\x04\x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\x18\ \x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x06\x20\ \x01(\tR\x05label\x12\x1f\n\x0bu2f_counter\x18\x07\x20\x01(\rR\nu2fCount\ er\x12\x1f\n\x0bskip_backup\x18\x08\x20\x01(\x08R\nskipBackup\x12\x1b\n\ @@ -10985,7 +10985,7 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x0bSlip39Group\x12)\n\x10member_threshold\x18\x01\x20\x02(\rR\x0fmember\ Threshold\x12!\n\x0cmember_count\x18\x02\x20\x02(\rR\x0bmemberCount\"\ \x10\n\x0eEntropyRequest\"&\n\nEntropyAck\x12\x18\n\x07entropy\x18\x01\ - \x20\x02(\x0cR\x07entropy\"\xe6\x04\n\x0eRecoveryDevice\x12\x1d\n\nword_\ + \x20\x02(\x0cR\x07entropy\"\x8d\x04\n\x0eRecoveryDevice\x12\x1d\n\nword_\ count\x18\x01\x20\x01(\rR\twordCount\x123\n\x15passphrase_protection\x18\ \x02\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_protection\x18\ \x03\x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\x18\x04\x20\x01(\ @@ -10993,12 +10993,10 @@ static file_descriptor_proto_data: &'static [u8] = b"\ abel\x12)\n\x10enforce_wordlist\x18\x06\x20\x01(\x08R\x0fenforceWordlist\ \x12j\n\x0cinput_method\x18\x08\x20\x01(\x0e2G.hw.trezor.messages.manage\ ment.RecoveryDevice.RecoveryDeviceInputMethodR\x0binputMethod\x12\x1f\n\ - \x0bu2f_counter\x18\t\x20\x01(\rR\nu2fCounter\x12^\n\x04type\x18\n\x20\ - \x01(\x0e2:.hw.trezor.messages.management.RecoveryDevice.RecoveryType:\ - \x0eNormalRecoveryR\x04type\";\n\x19RecoveryDeviceInputMethod\x12\x12\n\ - \x0eScrambledWords\x10\0\x12\n\n\x06Matrix\x10\x01\"H\n\x0cRecoveryType\ - \x12\x12\n\x0eNormalRecovery\x10\0\x12\n\n\x06DryRun\x10\x01\x12\x18\n\ - \x14UnlockRepeatedBackup\x10\x02J\x04\x08\x07\x10\x08\"\xc5\x01\n\x0bWor\ + \x0bu2f_counter\x18\t\x20\x01(\rR\nu2fCounter\x12O\n\x04type\x18\n\x20\ + \x01(\x0e2+.hw.trezor.messages.management.RecoveryType:\x0eNormalRecover\ + yR\x04type\";\n\x19RecoveryDeviceInputMethod\x12\x12\n\x0eScrambledWords\ + \x10\0\x12\n\n\x06Matrix\x10\x01J\x04\x08\x07\x10\x08\"\xc5\x01\n\x0bWor\ dRequest\x12N\n\x04type\x18\x01\x20\x02(\x0e2:.hw.trezor.messages.manage\ ment.WordRequest.WordRequestTypeR\x04type\"f\n\x0fWordRequestType\x12\ \x19\n\x15WordRequestType_Plain\x10\0\x12\x1b\n\x17WordRequestType_Matri\ @@ -11025,8 +11023,10 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x05*G\n\x10SafetyCheckLevel\x12\n\n\x06Strict\x10\0\x12\x10\n\x0cPrompt\ Always\x10\x01\x12\x15\n\x11PromptTemporarily\x10\x02*0\n\x10HomescreenF\ ormat\x12\x08\n\x04Toif\x10\x01\x12\x08\n\x04Jpeg\x10\x02\x12\x08\n\x04T\ - oiG\x10\x03BB\n#com.satoshilabs.trezor.lib.protobufB\x17TrezorMessageMan\ - agement\x80\xa6\x1d\x01\ + oiG\x10\x03*H\n\x0cRecoveryType\x12\x12\n\x0eNormalRecovery\x10\0\x12\n\ + \n\x06DryRun\x10\x01\x12\x18\n\x14UnlockRepeatedBackup\x10\x02BB\n#com.s\ + atoshilabs.trezor.lib.protobufB\x17TrezorMessageManagement\x80\xa6\x1d\ + \x01\ "; /// `FileDescriptorProto` object which was a source for this generated file @@ -11095,12 +11095,12 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { enums.push(BackupType::generated_enum_descriptor_data()); enums.push(SafetyCheckLevel::generated_enum_descriptor_data()); enums.push(HomescreenFormat::generated_enum_descriptor_data()); + enums.push(RecoveryType::generated_enum_descriptor_data()); enums.push(features::BackupAvailability::generated_enum_descriptor_data()); enums.push(features::RecoveryStatus::generated_enum_descriptor_data()); enums.push(features::Capability::generated_enum_descriptor_data()); enums.push(sd_protect::SdProtectOperationType::generated_enum_descriptor_data()); enums.push(recovery_device::RecoveryDeviceInputMethod::generated_enum_descriptor_data()); - enums.push(recovery_device::RecoveryType::generated_enum_descriptor_data()); enums.push(word_request::WordRequestType::generated_enum_descriptor_data()); enums.push(reboot_to_bootloader::BootCommand::generated_enum_descriptor_data()); ::protobuf::reflect::GeneratedFileDescriptor::new_generated( diff --git a/tests/click_tests/test_repeated_backup.py b/tests/click_tests/test_repeated_backup.py index 8e8abb20b47..df57739f36b 100644 --- a/tests/click_tests/test_repeated_backup.py +++ b/tests/click_tests/test_repeated_backup.py @@ -185,7 +185,7 @@ def test_repeated_backup( recovery.enter_shares( debug, second_backup_2_of_3[-2:], - "recovery__title_unlock_repeated_backup", + "recovery__title_dry_run", "recovery__enter_backup", "recovery__unlock_repeated_backup", ) diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 40d10926492..4b47c5a9e4f 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -7963,7 +7963,7 @@ "T2T1_en_test_recovery.py::test_recovery_bip39": "65a138f634806c6483c55c6ce5365b8a7a4073a3c0c340b1826042262faa8545", "T2T1_en_test_recovery.py::test_recovery_bip39_previous_word": "a009899ccd3305cb6737c8fa645cc9eedf4e46d6669a621a07d8cd9447d80f2f", "T2T1_en_test_recovery.py::test_recovery_slip39_basic": "9b0f5a7b8d2ab0fed1e5389076bc035e24dce377d275824220f1aa61e9bb4810", -"T2T1_en_test_repeated_backup.py::test_repeated_backup": "4ee56b338d37f74f892ad80e3ad35bb8f9113b4de602b57136899f52711ac0d9", +"T2T1_en_test_repeated_backup.py::test_repeated_backup": "ea7e93523c4b7afd5e3f6debe8b5624acaaa4281edcdaec907b9e4931e74d44f", "T2T1_en_test_reset_bip39.py::test_reset_bip39": "1feb3fcae2c593ea9193bcab23d8e64accd6fdbd2b05e2d2403ff89f8f94e4d8", "T2T1_en_test_reset_slip39_advanced.py::test_reset_slip39_advanced[16of16]": "d1759a29778ca741843817ac5401e09816ec39cbfeea9f3e9e98660777f0ed40", "T2T1_en_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "80956a3a8979a123fb576ac1cbd50a533f31569811afc06eb506e19289b6ef94", @@ -12416,8 +12416,8 @@ "T2T1_en_test_protection_levels.py::test_unlocked": "4488e2b6f06fdff05749ac271d080182f1c95645de37898457ff12f0fb190381", "T2T1_en_test_protection_levels.py::test_verify_message_t2": "cc09f0acf9e48b1355dae0be65a2a97abbe2811808feee08d46ae7146ce6bb6f", "T2T1_en_test_protection_levels.py::test_wipe_device": "7ff017de646b7cf70832605e1750c635d0eb661d51534b56007b49e82b927011", -"T2T1_en_test_repeated_backup.py::test_repeated_backup": "321a6c7a274e20fbddcc0dbdff31181950a613c97a77ad48ce1bb31845ffdc0e", -"T2T1_en_test_repeated_backup.py::test_repeated_backup_cancel": "9ab2f1f9e49582efa1e98c728b38ce1a21c4f09d398b20f616507f67a6a292b2", +"T2T1_en_test_repeated_backup.py::test_repeated_backup": "8aa1b640f7cf43ba0a82fe96f4ced746ec24b6e14fa77e256c35f8dc3bc80899", +"T2T1_en_test_repeated_backup.py::test_repeated_backup_cancel": "3aedb9cb6c0ec41d9f1e762106aa4d5f408b5ff42a401fc657fca5420655c7e2", "T2T1_en_test_sdcard.py::test_sd_format": "83d0d9b4eab3bf0eafc22d7d95e8b70bce477ba9c8b4ba13eeca9380ad5fdafa", "T2T1_en_test_sdcard.py::test_sd_no_format": "14511e3d3ee535d97287d8ade25101e8c16db17c1dc5d3151b91e5e8eba61ba5", "T2T1_en_test_sdcard.py::test_sd_protect_unlock": "1302f9a0835cac621142a17031d2150553e676261a3eeeefd32fcf1e69c7bd1a", @@ -15575,7 +15575,7 @@ "T3T1_en_test_recovery.py::test_recovery_bip39": "62947c5512e7ba33f77af5d67d2063918dcccea5d5530db89f04bffa0c309ae6", "T3T1_en_test_recovery.py::test_recovery_bip39_previous_word": "35c67f93da34ba0f3c72a09076391bbc1ef24661d7ff8102f0394ee50250b29b", "T3T1_en_test_recovery.py::test_recovery_slip39_basic": "a9f1ab4971b614ec67fdaa9602f72ba5eebe54204b3735f8aa2b91ddeee41a19", -"T3T1_en_test_repeated_backup.py::test_repeated_backup": "f1ba364fc2cfa5bf54bd8365f1e7ece27370ef5287803fba568214c5a67be2f4", +"T3T1_en_test_repeated_backup.py::test_repeated_backup": "b576404bb0b65342afec90b775bac3f08d9db210e3e9e118de157ecccc9e187b", "T3T1_en_test_reset_bip39.py::test_reset_bip39": "beab50474b19fedaf4487c64071529e4217288942e4695ed795632559835b20b", "T3T1_en_test_reset_slip39_advanced.py::test_reset_slip39_advanced[16of16]": "483e5a827bb0c2db205e07614cc7cfa52c9e06e4d901f8b5895504b3b739c883", "T3T1_en_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "797c7b4fe2a4f4aa6c0b45f711ed8d1ecf9c49368b6acd9f48f6b747b1a7b2a1", @@ -19848,8 +19848,8 @@ "T3T1_en_test_protection_levels.py::test_unlocked": "835c5327c35866df9acdf1433e75775eb652956b34ab6123595a06764389f61e", "T3T1_en_test_protection_levels.py::test_verify_message_t2": "456368c2e05ef1a743baa467897ddcad4af06b9cc863b809740d145a66dd88cd", "T3T1_en_test_protection_levels.py::test_wipe_device": "79922a132a2567d0a1b9b296b95fe7d1756e8af75681d9a0386fd104c0addf8c", -"T3T1_en_test_repeated_backup.py::test_repeated_backup": "9096887c407c9aa2006cba60b514557543c777515684a277dadd833ba412b6d6", -"T3T1_en_test_repeated_backup.py::test_repeated_backup_cancel": "f124dea461b81b467f5cef9349c9ddea0ba0ecac82131896d695e61a8ed2a05e", +"T3T1_en_test_repeated_backup.py::test_repeated_backup": "4c67db3e705a946aa849cab463ad0334742760569784b9caf2a8dcc592cb17bb", +"T3T1_en_test_repeated_backup.py::test_repeated_backup_cancel": "45466292293fb49e634a4526e5a9605d3d439fb1fe6600ad24bdc5c17f076e7f", "T3T1_en_test_sdcard.py::test_sd_format": "eb00c8c6d53fb2cbb1020f053219babe32ef3accb8ccefa8dbe315c03fb19149", "T3T1_en_test_sdcard.py::test_sd_no_format": "14511e3d3ee535d97287d8ade25101e8c16db17c1dc5d3151b91e5e8eba61ba5", "T3T1_en_test_sdcard.py::test_sd_protect_unlock": "097106b59798ff84733f7c6c4855cd52fbc3c0923e91aa84c0f81ac3ebc651b2",