refactor(core): raise `NotInitialized` from a common function
What changed, and why it matters
This commit is a simple code cleanup: it replaces many copies of the same 'if device not initialized, raise an error' check with a single shared helper function. There is no change to when or how the error is raised, so it does not fix or introduce any security vulnerability.
No security action needed; treat as a normal refactoring review.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The refactor introduces raise_if_not_initialized() in core/src/apps/common/seed.py and calls it from 15 files instead of inlining if not storage_device.is_initialized(): raise wire.NotInitialized(...). The logic, error type, and error message remain identical. No functional or security behavior changes.
Changed components
core/src/apps/base.pycore/src/apps/cardano/seed.pycore/src/apps/common/seed.pycore/src/apps/evolu/get_node.pycore/src/apps/management/apply_flags.pycore/src/apps/management/apply_settings.pycore/src/apps/management/backup_device.pycore/src/apps/management/change_wipe_code.pycore/src/apps/management/get_next_u2f_counter.pycore/src/apps/management/recovery_device/__init__.pycore/src/apps/management/sd_protect.pycore/src/apps/management/set_brightness.pycore/src/apps/management/set_u2f_counter.pycore/src/apps/webauthn/add_resident_credential.pycore/src/apps/webauthn/remove_resident_credential.pyInspect captured patch +56 / −54
diff --git a/core/src/apps/base.py b/core/src/apps/base.py
index ac4e0c80..a144d469 100644
--- a/core/src/apps/base.py
+++ b/core/src/apps/base.py
@@ -422,8 +422,9 @@ async def handle_LockDevice(msg: LockDevice) -> Success:
async def handle_SetBusy(msg: SetBusy) -> Success:
- if not storage_device.is_initialized():
- raise wire.NotInitialized("Device is not initialized")
+ from apps.common.seed import raise_if_not_initialized
+
+ raise_if_not_initialized()
if msg.expiry_ms:
import utime
diff --git a/core/src/apps/cardano/seed.py b/core/src/apps/cardano/seed.py
index 4fc02ca6..a937c3af 100644
--- a/core/src/apps/cardano/seed.py
+++ b/core/src/apps/cardano/seed.py
@@ -151,8 +151,9 @@ async def _get_keychain_bip39(derivation_type: CardanoDerivationType) -> Keychai
from trezor.enums import CardanoDerivationType
from trezor.wire import context
- if not device.is_initialized():
- raise wire.NotInitialized("Device is not initialized")
+ from apps.common.seed import raise_if_not_initialized
+
+ raise_if_not_initialized()
if derivation_type == CardanoDerivationType.LEDGER:
seed = await get_seed()
diff --git a/core/src/apps/common/seed.py b/core/src/apps/common/seed.py
index 83a30756..835d508b 100644
--- a/core/src/apps/common/seed.py
+++ b/core/src/apps/common/seed.py
@@ -30,6 +30,13 @@ if not utils.USE_THP:
from .passphrase import get as get_passphrase_legacy
+def raise_if_not_initialized() -> None:
+ if not storage_device.is_initialized():
+ from trezor.wire import NotInitialized
+
+ raise NotInitialized("Device is not initialized")
+
+
class Slip21Node:
"""
This class implements the SLIP-0021 hierarchical derivation of symmetric keys, see
@@ -82,10 +89,7 @@ if utils.USE_THP:
if ctx.cache.is_set(APP_COMMON_SEED):
raise Exception("Seed is already set!")
- from trezor import wire
-
- if not storage_device.is_initialized():
- raise wire.NotInitialized("Device is not initialized")
+ raise_if_not_initialized()
passphrase = await get_passphrase(msg)
common_seed = mnemonic.get_seed(passphrase)
@@ -101,10 +105,7 @@ if utils.USE_THP:
if msg.passphrase is not None and msg.on_device:
raise DataError("Passphrase provided when it shouldn't be!")
- from trezor import wire
-
- if not storage_device.is_initialized():
- raise wire.NotInitialized("Device is not initialized")
+ raise_if_not_initialized()
if ctx.cache.is_set(APP_CARDANO_ICARUS_SECRET):
raise Exception("Cardano icarus secret is already set!")
@@ -142,10 +143,7 @@ else:
return common_seed
async def derive_and_store_roots_legacy() -> None:
- from trezor import wire
-
- if not storage_device.is_initialized():
- raise wire.NotInitialized("Device is not initialized")
+ raise_if_not_initialized()
ctx = get_context()
need_seed = not ctx.cache.is_set(APP_COMMON_SEED)
diff --git a/core/src/apps/evolu/get_node.py b/core/src/apps/evolu/get_node.py
index 072a1b17..2c95bd7e 100644
--- a/core/src/apps/evolu/get_node.py
+++ b/core/src/apps/evolu/get_node.py
@@ -23,14 +23,13 @@ async def get_node(msg: EvoluGetNode) -> EvoluNode:
NotInitialized: If the device is not initialized.
ValueError: If the proof of delegated identity is missing or invalid.
"""
- from storage.device import is_initialized
from trezor.messages import EvoluNode
- from trezor.wire import NotInitialized
+
+ from apps.common.seed import raise_if_not_initialized
from .common import check_delegated_identity_proof
- if not is_initialized():
- raise NotInitialized("Device is not initialized")
+ raise_if_not_initialized()
if not check_delegated_identity_proof(
bytes(msg.proof_of_delegated_identity),
diff --git a/core/src/apps/management/apply_flags.py b/core/src/apps/management/apply_flags.py
index c33d9596..a2925107 100644
--- a/core/src/apps/management/apply_flags.py
+++ b/core/src/apps/management/apply_flags.py
@@ -5,12 +5,12 @@ if TYPE_CHECKING:
async def apply_flags(msg: ApplyFlags) -> Success:
- import storage.device
from storage.device import set_flags
from trezor.messages import Success
- from trezor.wire import NotInitialized
- if not storage.device.is_initialized():
- raise NotInitialized("Device is not initialized")
+ from apps.common.seed import raise_if_not_initialized
+
+ raise_if_not_initialized()
+
set_flags(msg.flags)
return Success(message="Flags applied")
diff --git a/core/src/apps/management/apply_settings.py b/core/src/apps/management/apply_settings.py
index 7072637e..81b71324 100644
--- a/core/src/apps/management/apply_settings.py
+++ b/core/src/apps/management/apply_settings.py
@@ -50,13 +50,13 @@ def _validate_homescreen(homescreen: AnyBytes) -> None:
async def apply_settings(msg: ApplySettings) -> Success:
from trezor.messages import Success
- from trezor.wire import NotInitialized, ProcessError
+ from trezor.wire import ProcessError
from apps.common import safety_checks
from apps.common.lock_manager import reload_settings_from_storage
+ from apps.common.seed import raise_if_not_initialized
- if not storage_device.is_initialized():
- raise NotInitialized("Device is not initialized")
+ raise_if_not_initialized()
homescreen = msg.homescreen # local_cache_attribute
homescreen_length = msg.homescreen_length # local_cache_attribute
diff --git a/core/src/apps/management/backup_device.py b/core/src/apps/management/backup_device.py
index fd8b567c..70659dee 100644
--- a/core/src/apps/management/backup_device.py
+++ b/core/src/apps/management/backup_device.py
@@ -92,14 +92,15 @@ async def backup_device(msg: BackupDevice) -> Success:
from trezor.messages import Success
from apps.common import backup, mnemonic
+ from apps.common.seed import raise_if_not_initialized
# do this early before we show any UI
# the homescreen will clear the flag right after its own UI is gone
repeated_backup_enabled = backup.repeated_backup_enabled()
is_repeated_backup = repeated_backup_enabled and not storage_device.needs_backup()
- if not storage_device.is_initialized():
- raise wire.NotInitialized("Device is not initialized")
+ raise_if_not_initialized()
+
if not storage_device.needs_backup() and not repeated_backup_enabled:
raise wire.ProcessError("Seed already backed up")
diff --git a/core/src/apps/management/change_wipe_code.py b/core/src/apps/management/change_wipe_code.py
index 6ee678f2..9fa1db15 100644
--- a/core/src/apps/management/change_wipe_code.py
+++ b/core/src/apps/management/change_wipe_code.py
@@ -9,16 +9,14 @@ if TYPE_CHECKING:
async def change_wipe_code(msg: ChangeWipeCode) -> Success:
- from storage.device import is_initialized
from trezor import config
from trezor.messages import Success
from trezor.ui.layouts import show_success, wipe_code_pin_not_set_popup
- from trezor.wire import NotInitialized
from apps.common.request_pin import error_pin_invalid, request_pin_and_sd_salt
+ from apps.common.seed import raise_if_not_initialized
- if not is_initialized():
- raise NotInitialized("Device is not initialized")
+ raise_if_not_initialized()
# Confirm that user wants to set or remove the wipe code.
has_wipe_code = config.has_wipe_code()
diff --git a/core/src/apps/management/get_next_u2f_counter.py b/core/src/apps/management/get_next_u2f_counter.py
index 90035d4a..d7a3e2c2 100644
--- a/core/src/apps/management/get_next_u2f_counter.py
+++ b/core/src/apps/management/get_next_u2f_counter.py
@@ -10,10 +10,10 @@ async def get_next_u2f_counter(msg: GetNextU2FCounter) -> NextU2FCounter:
from trezor.enums import ButtonRequestType
from trezor.messages import NextU2FCounter
from trezor.ui.layouts import confirm_action
- from trezor.wire import NotInitialized
- if not storage_device.is_initialized():
- raise NotInitialized("Device is not initialized")
+ from apps.common.seed import raise_if_not_initialized
+
+ raise_if_not_initialized()
await confirm_action(
"get_u2f_counter",
diff --git a/core/src/apps/management/recovery_device/__init__.py b/core/src/apps/management/recovery_device/__init__.py
index d5a5a48e..c19c809f 100644
--- a/core/src/apps/management/recovery_device/__init__.py
+++ b/core/src/apps/management/recovery_device/__init__.py
@@ -50,9 +50,11 @@ async def recovery_device(msg: RecoveryDevice) -> Success:
if storage_device.is_initialized():
raise wire.UnexpectedMessage("Already initialized")
elif recovery_type in (RecoveryType.DryRun, RecoveryType.UnlockRepeatedBackup):
- if not storage_device.is_initialized():
- raise wire.NotInitialized("Device is not initialized")
- elif recovery_type is RecoveryType.DryRun:
+ from apps.common.seed import raise_if_not_initialized
+
+ raise_if_not_initialized()
+
+ if recovery_type is RecoveryType.DryRun:
if storage_device.no_backup():
raise wire.ProcessError("Dry-run not available for seedless devices")
elif storage_device.needs_backup() or storage_device.unfinished_backup():
diff --git a/core/src/apps/management/sd_protect.py b/core/src/apps/management/sd_protect.py
index cceaad0f..55329a55 100644
--- a/core/src/apps/management/sd_protect.py
+++ b/core/src/apps/management/sd_protect.py
@@ -38,10 +38,9 @@ async def _set_salt(salt: bytes, salt_tag: bytes, stage: bool = False) -> None:
async def sd_protect(msg: SdProtect) -> Success:
- from trezor.wire import NotInitialized
+ from apps.common.seed import raise_if_not_initialized
- if not storage_device.is_initialized():
- raise NotInitialized("Device is not initialized")
+ raise_if_not_initialized()
if msg.operation == SdProtectOperationType.ENABLE:
return await _sd_protect_enable(msg)
diff --git a/core/src/apps/management/set_brightness.py b/core/src/apps/management/set_brightness.py
index 93dbe6e3..4d11abf8 100644
--- a/core/src/apps/management/set_brightness.py
+++ b/core/src/apps/management/set_brightness.py
@@ -5,13 +5,12 @@ if TYPE_CHECKING:
async def set_brightness(msg: SetBrightness) -> Success:
- import storage.device as storage_device
from trezor.messages import Success
from trezor.ui.layouts import set_brightness
- from trezor.wire import NotInitialized
- if not storage_device.is_initialized():
- raise NotInitialized("Device is not initialized")
+ from apps.common.seed import raise_if_not_initialized
+
+ raise_if_not_initialized()
await set_brightness(msg.value)
return Success(message="Settings applied")
diff --git a/core/src/apps/management/set_u2f_counter.py b/core/src/apps/management/set_u2f_counter.py
index 85d32085..6a036a9f 100644
--- a/core/src/apps/management/set_u2f_counter.py
+++ b/core/src/apps/management/set_u2f_counter.py
@@ -11,8 +11,10 @@ async def set_u2f_counter(msg: SetU2FCounter) -> Success:
from trezor.messages import Success
from trezor.ui.layouts import confirm_action
- if not storage_device.is_initialized():
- raise wire.NotInitialized("Device is not initialized")
+ from apps.common.seed import raise_if_not_initialized
+
+ raise_if_not_initialized()
+
if msg.u2f_counter is None:
raise wire.ProcessError("No value provided")
diff --git a/core/src/apps/webauthn/add_resident_credential.py b/core/src/apps/webauthn/add_resident_credential.py
index 88dc7060..fe878a44 100644
--- a/core/src/apps/webauthn/add_resident_credential.py
+++ b/core/src/apps/webauthn/add_resident_credential.py
@@ -5,16 +5,17 @@ if TYPE_CHECKING:
async def add_resident_credential(msg: WebAuthnAddResidentCredential) -> Success:
- import storage.device as storage_device
from trezor import TR, wire
from trezor.messages import Success
from trezor.ui.layouts.fido import confirm_fido, credential_warning
+ from apps.common.seed import raise_if_not_initialized
+
from .credential import Fido2Credential
from .resident_credentials import store_resident_credential
- if not storage_device.is_initialized():
- raise wire.NotInitialized("Device is not initialized")
+ raise_if_not_initialized()
+
if not msg.credential_id:
raise wire.ProcessError("Missing credential ID parameter.")
diff --git a/core/src/apps/webauthn/remove_resident_credential.py b/core/src/apps/webauthn/remove_resident_credential.py
index efe07ca6..0d0c8a56 100644
--- a/core/src/apps/webauthn/remove_resident_credential.py
+++ b/core/src/apps/webauthn/remove_resident_credential.py
@@ -5,16 +5,17 @@ if TYPE_CHECKING:
async def remove_resident_credential(msg: WebAuthnRemoveResidentCredential) -> Success:
- import storage.device
import storage.resident_credentials
from trezor import TR, wire
from trezor.messages import Success
from trezor.ui.layouts.fido import confirm_fido
+ from apps.common.seed import raise_if_not_initialized
+
from .resident_credentials import get_resident_credential
- if not storage.device.is_initialized():
- raise wire.NotInitialized("Device is not initialized")
+ raise_if_not_initialized()
+
if msg.index is None:
raise wire.ProcessError("Missing credential index parameter.")
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.