BB
← All projectsBitBox

BitBox02 firmware

Firmware and bootloader for BitBox02 signing devices.

BitcoinHardware walletsNormal
Repository coverage

647 commits in the local evidence base

Every captured commit receives deterministic security triage and a separate communication-quality score. Security candidates and broader second-pass signals receive full-patch Ollama analysis.

193security candidates127second-pass queue338AI analyses
25commits · 30 days
47commits · 60 days
312commits · 180 days
647commits · 365 days
Backfill bands
Aug 5 → Feb 6335 seen28 candidatesComplete
Feb 6 → Jun 6265 seen19 candidatesComplete
Jun 6 → Jul 619 seen5 candidatesComplete
Jul 6 → Aug 526 seen3 candidatesComplete
Commit communication

Does the history explain itself?

Message quality measures whether a commit identifies its scope, purpose, rationale, testing, and supporting references. It does not change the security-severity score.

59/100 average clarity
65Strong · 80–100
281Adequate · 60–79
230Thin · 40–59
71Opaque · 0–39
23security candidates with opaque commit messaging
Read the scoring rubric →
Developer activity

Who is changing the project?

Public Git author strings; identities are not independently verified.

DeveloperCommitsCandidatesAnalyzedHigh riskMessage avg.
Marko Bencun390117194258
benma's agent892855162
Niklas Dusenlund1112955059
cedwies1257063
Tomas Vrba947074
Cedric Wiese1239049
Jad814062
thisconnect211072
benma211074
Niklas111035
Yasser Aziza111070
Patrick Steiger111045
Analysis record

Published AI watches

Last scanned 47 minutes ago

Moderate 59 AI analysisMessage 50 · Thin
BB BitBoxBitBox02 firmware BitcoinHardware wallets

Merge remote-tracking branch 'agent/benma-agent/validate-backup-seed-length'

This commit adds a safety check to the BitBox02 hardware wallet's backup loading code. It now rejects backup files that claim to contain a 'seed' longer than 32 bytes. Without this check, a tampered or malformed backup could potentially ca…

Added input validation on deserialized seed_length fieldBounds check prevents oversized seed length (>32 bytes) from being acceptedNew unit test covers malformed backup with seed_length mismatch
f6d2942cby Marko Bencun+34−01 file
No security note in commit
Low 44 AI analysisMessage 50 · Thin
BB BitBoxBitBox02 firmware BitcoinHardware wallets

Merge remote-tracking branch 'agent/benma-agent/reject-oversized-policy-keys'

This commit adds a length check before showing a Bitcoin policy key on the BitBox02 device screen. Previously, an extremely long key string could be displayed or processed without a size limit. The fix rejects keys whose on-screen text exc…

Input size limit added before UI confirmationNew unit test for boundary condition (MAX_CONFIRM_BODY_SIZE and MAX_CONFIRM_BODY_SIZE + 1)Potential UI truncation or buffer issue mitigated for policy key display
1e674dfcby Marko Bencun+43−01 file
No security note in commit
Moderate 60 AI analysisMessage 90 · Strong
BB BitBoxBitBox02 firmware BitcoinHardware wallets

backup: validate decoded seed length

This update fixes a bug in how the BitBox02 hardware wallet reads backup files from an SD card. A tampered backup file could claim to contain a seed longer than the 32-byte limit, which previously caused the device to panic (crash) when li…

Out-of-bounds/panic condition in backup parsingMissing input validation on decoded protobuf fieldSD-card backup file could be attacker-controlled
80baf1eeby benma's agent+34−01 file
Vendor flagged security relevance
Low 44 AI analysisMessage 78 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

btc: reject oversized policy keys

This commit fixes a user-interface safety issue in the BitBox02 hardware wallet's Bitcoin multi-signature policy registration. Previously, a very long policy key could be approved by the user even though the device could not display the fu…

Input validation added to enforce UI display limitPrevents registration of keys that cannot be fully displayedBoundary test added at MAX_CONFIRM_BODY_SIZE and MAX_CONFIRM_BODY_SIZE+1
203bb0aaby benma's agent+43−01 file
Vendor flagged security relevance
Informational 15 AI analysisMessage 60 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

bb03 ui: replace long touch with slide to confirm

This commit changes how users confirm sensitive actions on the BitBox03 hardware wallet. It replaces a 'hold/long-press to confirm' button with a 'slide to confirm' gesture, similar to the swipe gestures used on many smartphone lock screen…

cc6ae75dby Jad+40−781 file
No security note in commit
Low 28 AI analysisMessage 68 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

bb03 UI: slide to confirm

This commit adds a new 'slide to confirm' user-interface control to the BitBox03 hardware wallet. It is a deliberate UX/security feature for high-risk actions (like approving transactions), replacing a simple tap with a drag gesture. The c…

New high-stakes confirmation gesture (slide instead of tap)Input hardening: per-sample advance cap, off-track rejection, non-pointer rejectionSnap-back behavior on incomplete slides to prevent accidental confirmation
30a68c8dby Jad+3076−111 files
No security note in commit
Informational 11 AI analysisMessage 28 · Opaque
BB BitBoxBitBox02 firmware BitcoinHardware wallets

u2f: fix refresh screen

This commit fixes a UI cleanup bug in the BitBox02 hardware wallet's U2F (Universal 2nd Factor) feature. Previously, a 'Refresh webpage' screen could be destroyed without clearing the pointer that tracked it, potentially leaving a dangling…

dangling-pointer mitigationuse-after-free preventionfirmware UI state cleanup
890f4ce3by benma's agent+17−11 file
No security note in commit
Low 27 AI analysisMessage 28 · Opaque
BB BitBoxBitBox02 firmware BitcoinHardware wallets

u2f: fix nudge screen

This commit fixes how a small on-screen reminder (the 'nudge screen') for U2F is created, tracked, and cleaned up. Before the fix, the code could lose track of the reminder screen or mishandle its removal, which might cause display glitche…

Use-after-free / dangling-pointer risk: global _nudge_label pointer could outlive the component it referencesUI state inconsistency: previous callback set _nudge_label = NULL on screen pop, but component cleanup may occur later or not at allMemory management fix: custom cleanup wrapper now synchronizes global pointer with component lifetime
931e75d6by benma's agent+22−71 file
No security note in commit
Low 42 AI analysisMessage 58 · Thin
BB BitBoxBitBox02 firmware BitcoinHardware wallets

Fix GroundedCell result lifetime

This commit fixes a bug in the U2F confirmation workflow where the firmware could read a result from memory that had already been cleared, potentially giving an incorrect success/failure answer. The fix simply reads the result before wipin…

use-after-clear / stale reference in task stateincorrect result lifetime orderingU2F confirmation workflow
dcd408f9by benma's agent+1−11 file
No security note in commit
Low 39 AI analysisMessage 73 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

rust: initialize C output buffers

This commit fixes a class of low-level memory-safety bugs where Rust code was given buffers containing uninitialized bytes. Rust's rules require every byte of a slice to be initialized, even if the function will overwrite them. Passing uni…

Undefined behavior at C/Rust FFI due to uninitialized buffers being treated as Rust slicesPotential optimizer-dependent behavior from violating Rust slice initialization rulesHardening of cryptographic output paths (SHA-256, HMAC-SHA256, HMAC-SHA512)
511018eaby benma's agent+52−2713 files
Vendor flagged security relevance
Moderate 60 AI analysisMessage 68 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

factorysetup: validate RTT message length

This commit fixes a bug in the BitBox02 factory setup tool that receives debug messages over SEGGER RTT. Previously, if a message said it contained more bytes than were actually received, the code would copy whatever leftover data happened…

Copy of uninitialized stack data into command buffer (information disclosure / undefined behavior)Missing length validation against actual bytes receivedFactory-only code path (factorysetup), not normal user firmware operation
bb882fc0by benma's agent+5−01 file
Vendor flagged security relevance
Low 42 AI analysisMessage 50 · Thin
BB BitBoxBitBox02 firmware BitcoinHardware wallets

memory: initialize BLE random buffer

This commit fixes a minor but real security hygiene issue in the BitBox02 Plus hardware wallet. Before the patch, a 32-byte buffer meant to hold freshly generated random bytes for Bluetooth Low Energy (BLE) pairing security was not initial…

Uninitialized cryptographic buffer in security-critical reset routineBLE identity key (IRK) and identity address derivation contextDefense-in-depth initialization of random material
135bb8baby benma's agent+1−11 file
No security note in commit
High 74 AI analysisMessage 78 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

eth: limit EIP-712 recursion depth

This commit adds a hard limit on how deeply nested Ethereum typed-message (EIP-712) structures can be when the BitBox02 hardware wallet signs them. Without the limit, an attacker could craft a message type that refers to itself over and ov…

Adds explicit recursion-depth cap to attacker-controlled input parsingPre-validates schema roots before host callbacks or user confirmationProtects against stack exhaustion / denial-of-service from deeply nested EIP-712 types
4ccadcc0by benma's agent+196−451 file
No security note in commit
Moderate 59 AI analysisMessage 78 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

btc: limit Miniscript encoding depth

This commit adds a safety limit to how deeply nested a Bitcoin policy (a set of spending rules) can be before the BitBox02 hardware wallet will reject it. Without such a limit, an attacker could craft an unusually deep policy that causes t…

Adds explicit depth bound to prevent recursive stack exhaustionApplies to both WSH and Taproot (TR) policy parsing pathsIncludes boundary and regression-style tests for deep policies
82346eebby benma's agent+109−01 file
No security note in commit
Informational 15 AI analysisMessage 50 · Thin
BB BitBoxBitBox02 firmware BitcoinHardware wallets

py: extract bootloader connection

This commit is a minor code cleanup in a Python helper script. It moves existing bootloader connection logic into a small nested helper function to satisfy a style checker (pylint's limit on the number of return statements). No behavior ch…

886113d0by benma's agent+10−61 file
No security note in commit
Informational 15 AI analysisMessage 43 · Thin
BB BitBoxBitBox02 firmware BitcoinHardware wallets

prepare v9.26.5

This commit is a routine release bookkeeping change. It updates the version number from v9.27.0 to v9.26.5 and reorganizes the changelog so that two bug fixes are listed under the new v9.26.5 release section instead of 'Unreleased'. The ac…

51ce24e6by benma's agent+5−22 files
No security note in commit
Low 30 AI analysisMessage 68 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

api: disable BitBoxSync by default

This commit turns off a feature called BitBoxSync by default. Unless a developer explicitly enables it during build, any request to use BitBoxSync will now receive a standard 'disabled' error. The change is framed as temporary while API ch…

Feature-gates an API that was previously reachable by defaultReturns Error::Disabled for requests to the gated APICommit message describes the change as temporary pending API changes
93d36fc8by benma's agent+7−02 files
No security note in commit
Low 42 AI analysisMessage 70 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

rust: bound executor queue

This commit replaces an unbounded task queue inside the BitBox02 firmware's Rust executor with a fixed 16-slot ring buffer. It also adds a hard limit of 16 active tasks and protects queue access with critical sections so interrupt-driven c…

Replaced unbounded queue with fixed-capacity ring buffer to prevent memory exhaustionRemoved allocation from scheduling/wake path, including interrupt contextAdded critical-section synchronization between wakers and main-loop executor
b99e200aby benma's agent+186−285 files
No security note in commit
Moderate 57 AI analysisMessage 68 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

rust: use static no-op waker

This commit replaces a custom-built notification helper (a 'waker') inside the BitBox02 firmware's Rust code with a built-in, memory-safe no-op version. The old helper used heap memory and reference counting (Arc), which could be freed by …

Eliminates heap-allocated Arc in waker constructionRemoves custom RawWakerVTable with unsafe clone/wake/drop operationsPrevents ISR callbacks from freeing Arc while heap allocator is active
5be42f61by benma's agent+2−523 files
Vendor flagged security relevance
Moderate 59 AI analysisMessage 68 · Adequate
BB BitBoxBitBox02 firmware BitcoinHardware wallets

usb: block HWW during U2F workflows

This commit fixes a concurrency bug in the BitBox02 hardware wallet's USB handling. When a U2F (two-factor authentication) workflow is still running on the device's screen, a new hardware wallet request could previously start and reset or …

Concurrency/lifetime bug between HWW and U2F USB endpointsUse-after-free or invalidation risk for live U2F UI objectsSession reset/cancellation path could corrupt shared UI state
0014300bby benma's agent+114−05 files
No security note in commit
Repository ledger

Explore captured commits

Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.

AI review queuedrust/keystore: wrap lock() in bitbox02-rustby Marko Bencun · 2358be85 · Oct 30, 2025 · 16 filesMessage 68 · AdequateInformational 15Details
Commit message · Marko Bencun

rust/keystore: wrap lock() in bitbox02-rust

Original is renamed so the compiler can error if we missed one.

By moving all keystore calls to bitbox02_rust::keystore, we can more
easily replace the function bodies with native Rust
implementations (without wrapping C).

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This commit is a routine internal code reorganization. It moves the keystore lock() function call from a low-level C wrapper into a higher-level Rust module and renames the original function so the compiler can catch any missed references. There is no change to what the function does or to any security behavior of the device.

Lower-priorityreleases: Use firmware/vX for all firmwaresby Niklas Dusenlund · 011c8aa8 · Oct 29, 2025 · 2 filesMessage 68 · AdequateTriage 0Details
Commit message · Niklas Dusenlund

releases: Use firmware/vX for all firmwares

Previously `firmware-btc-only` was used as prefix for btconly firmwares.
Going forward `firmware` will be used as prefix for all firmwares.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Lower-priorityfactorysetup: Let BLE chip store bond dbby Niklas Dusenlund · 220a0b1b · Oct 29, 2025 · 4 filesMessage 60 · AdequateTriage 0Details
Commit message · Niklas Dusenlund

factorysetup: Let BLE chip store bond db

Let the BLE chip store the bond db during execution of the factory setup
firmware.

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Security candidatefactorysetup: update comment about auto_enter/upside_downby Marko Bencun · 2ee1f2e5 · Oct 29, 2025 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Marko Bencun

factorysetup: update comment about auto_enter/upside_down

The old comment was from a time where jlink was already locked when we
flashed this image, so it was required to be able to get into the
bootloader again. Now this is not the case anymore, but we still need
these two flags to be set properly like this regardless.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
update trust
AI analysis · Informational 15/100

This commit only rewrites comments in the factory setup code to explain why two bootloader flags are set the way they are. No code behavior is changed, so it has no security impact on its own.

Lower-prioritykeystore: port stretch_retained_seed_encryption_key to Rustby benma's agent · ed7c021b · Oct 19, 2025 · 5 filesMessage 85 · StrongTriage 0Details
Commit message · benma's agent

keystore: port stretch_retained_seed_encryption_key to Rust

- Replace function body by Rust impl, removing the original C function
and Rust wrapper
- Expose to C using extern "C" and use that in keystore.c

The function now returns bool instead of keystore_error_t for simpler
code. Among all the callsites, only one propagates keystore_error_t
instead of bool, and there we simply return a new error. We don't lose
much info, if it fails in the wild it is surely because of the
securechip and not the hashing.

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Lower-prioritykeystore: wrap and unit test _stretch_retained_seed_encryption_key in Rustby benma's agent · 6c344756 · Oct 19, 2025 · 5 filesMessage 75 · AdequateTriage 0Details
Commit message · benma's agent

keystore: wrap and unit test _stretch_retained_seed_encryption_key in Rust

Afterwards we can easily replace the body with a Rust implementation
and know it's correct based on the tests.

75/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Mentions testing or verification
Lower-prioritysecurechip: add safe wrapper of securechip_kdf in Rustby benma's agent · d41a49ba · Oct 19, 2025 · 3 filesMessage 50 · ThinTriage 0Details
Commit message · benma's agent

securechip: add safe wrapper of securechip_kdf in Rust

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Lower-prioritytest: remove unused mock_memory.cby Marko Bencun · cfa4c4d0 · Oct 18, 2025 · 2 filesMessage 67 · AdequateTriage 0Details
Commit message · Marko Bencun

test: remove unused mock_memory.c

67/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Mentions testing or verification! No meaningful explanatory body
Lower-priorityRemove C salt unit test now covered by Rustby benma's agent · 76079fba · Oct 18, 2025 · 2 filesMessage 55 · ThinTriage 0Details
Commit message · benma's agent

Remove C salt unit test now covered by Rust

55/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
Lower-priorityport salt.c to Rustby benma's agent · c3aad65b · Oct 18, 2025 · 3 filesMessage 71 · AdequateTriage 0Details
Commit message · benma's agent

port salt.c to Rust

test_salt.c unit tests is replicated in Rust. The C function body
calls the Rust function so we can also verify the C unit tests still
pass (to be removed in the next commit).

71/100 · AdequateMessage clarity
✓ Subject identifies a change✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Lower-priorityrust: expose memory_get_salt_root to Rustby benma's agent · 00cf5233 · Oct 18, 2025 · 4 filesMessage 45 · ThinTriage 0Details
Commit message · benma's agent

rust: expose memory_get_salt_root to Rust

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Lower-prioritytest: remove unused fake_memory_set_salt_rootby Marko Bencun · d240d725 · Oct 17, 2025 · 2 filesMessage 57 · ThinTriage 0Details
Commit message · Marko Bencun

test: remove unused fake_memory_set_salt_root

57/100 · ThinMessage clarity
✓ Descriptive subject✓ Uses a recognizable type or scope✓ Mentions testing or verification! No meaningful explanatory body
Lower-priorityfixup! u2f: Do not turn off BLE when U2F is used over USBby Niklas Dusenlund · 471dc30a · Oct 16, 2025 · 1 fileMessage 50 · ThinTriage 0Details
Commit message · Niklas Dusenlund

fixup! u2f: Do not turn off BLE when U2F is used over USB

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Lower-priorityU2F: remove option to cancel u2f flowsby Niklas Dusenlund · a5fb700a · Oct 16, 2025 · 1 fileMessage 80 · StrongTriage 0Details
Commit message · Niklas Dusenlund

U2F: remove option to cancel u2f flows

In the U2F architecture it isn't possible for the device to "cancel" a
user presence check because the browser can always just ask again. The
only way to cancel it is from the OS/browser.

80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Security candidateu2f: Do not turn off BLE when U2F is used over USBby Niklas Dusenlund · d6f22d77 · Oct 16, 2025 · 4 filesMessage 85 · StrongInformational 21Details
Commit message · Niklas Dusenlund

u2f: Do not turn off BLE when U2F is used over USB

iOS devices support u2f over USB, so no need to disable BLE when only
u2f is used.

iOS devices also send one packet of garbage when waking up, 64 null
bytes, which also is ignored, so that the bitbox still can connect to
the iOS device when it is awakened.

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Why it was queued
boot or update path
AI analysis · Informational 21/100

This firmware update fixes a bug where using U2F security-key features over USB accidentally turned off Bluetooth Low Energy (BLE). Because iPhones and iPads can use U2F over USB, disabling BLE meant the device could not reconnect wirelessly after the iOS device woke up. The patch also makes the firmware ignore a harmless 64-byte 'wake-up' packet sent by iOS. There is no direct evidence this is an exploitable security vulnerability; it appears to be a connectivity/availability bug.

Security candidatereleases: add v9.24.0by Marko Bencun · cf9db97e · Oct 15, 2025 · 4 filesMessage 38 · OpaqueInformational 15Details
Commit message · Marko Bencun

releases: add v9.24.0

38/100 · OpaqueMessage clarity
✓ Subject identifies a change✓ Names a concrete action or component! No meaningful explanatory body! Opaque security-relevant change
Why it was queued
boot or update path
AI analysis · Informational 15/100

This commit adds release artifacts for BitBox02 firmware version 9.24.0. It contains two signed statements (assertions) confirming that building the source code at a specific git tag produces a firmware binary with a known SHA-256 hash. There is no code change, no bug fix, and no security-related content in the commit itself.

Lower-prioritygestures: Simplify some repetitive codeby Niklas Dusenlund · ffd238b0 · Oct 14, 2025 · 2 filesMessage 45 · ThinTriage 0Details
Commit message · Niklas Dusenlund

gestures: Simplify some repetitive code

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Security candidatereleases: add v9.23.3by Marko Bencun · 4ab640b9 · Oct 13, 2025 · 4 filesMessage 38 · OpaqueInformational 15Details
Commit message · Marko Bencun

releases: add v9.23.3

38/100 · OpaqueMessage clarity
✓ Subject identifies a change✓ Names a concrete action or component! No meaningful explanatory body! Opaque security-relevant change
Why it was queued
boot or update path
AI analysis · Informational 15/100

This commit adds release artifacts for firmware version 9.23.3 of the BitBox02 hardware wallet. It contains two signed text files (assertions) confirming the expected SHA-256 hash of the compiled firmware binary for both the standard and Bitcoin-only editions. There is no code change and no security issue visible in the diff.

Lower-priorityui/waiting: start with logo, not lockscreenby Marko Bencun · 3d5ed1f2 · Oct 13, 2025 · 5 filesMessage 68 · AdequateTriage 0Details
Commit message · Marko Bencun

ui/waiting: start with logo, not lockscreen

40d150132797a2c5185fbbb9bf1926b24571780d refactored and introduced a
bug:

old behavior (before above commit)

logo -> lockscreen -> host connects -> logo

above commit changed to this by accident, skipping the logo at the start:

lockscreen -> host connects -> logo

This commit restores the original behavior.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI review queuedCHANGELOG: mark v9.24.0by Marko Bencun · 6b9aed4f · Oct 13, 2025 · 1 fileMessage 38 · OpaqueInformational 15Details
Commit message · Marko Bencun

CHANGELOG: mark v9.24.0

38/100 · OpaqueMessage clarity
✓ Subject identifies a change✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
documentation-only discountsecond-pass: opaque commit message
AI analysis · Informational 15/100

This commit only updates the CHANGELOG.md file to add a new version heading (v9.24.0). It contains no code changes, no bug fixes, and no security-related content. It is a routine documentation/release-management edit.

Lower-prioritybump version vo v9.23.3 and add CHANGELOG entryby Marko Bencun · 3554c267 · Oct 13, 2025 · 1 fileMessage 45 · ThinTriage 0Details
Commit message · Marko Bencun

bump version vo v9.23.3 and add CHANGELOG entry

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
documentation-only discount
Security candidatemake unlock-animation slower again like it used to beby Marko Bencun · a5811a57 · Oct 13, 2025 · 3 filesMessage 78 · AdequateLow 25Details
Commit message · Marko Bencun

make unlock-animation slower again like it used to be

When we switched from libwally to rust-bip39, bip39 unlock became
twice as fast. It feels too fast now.

The animation speed is based on the frame render rate, which is
not fixed. If the animation goes longer than the actual bip39 unlock
computation, the animation afterwards is significantly faster as there
is less work performed per mainloop iteration. In absence of fixed
render frame rates, we just perform the bip39 unlock twice to maintain
the same frame rate. Conincidentally, this results in an unlock speed
which is basically the same as before with libwally, and we get a
security check for free (repeat and double check the bip39 seed).

78/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Why it was queued
secret or key material
AI analysis · Low 25/100

This commit deliberately runs the wallet-unlock calculation twice instead of once, purely to keep the on-screen unlock animation from finishing too quickly after a performance improvement. The second run is used as a consistency check: if the two results don't match, the device reports a memory error. The change is framed as a user-experience fix that happens to add a safety double-check, not as a response to a known security bug.

Lower-priorityconfirm-gesture: extend active durationby Niklas Dusenlund · b586290f · Oct 13, 2025 · 1 fileMessage 80 · StrongTriage 0Details
Commit message · Niklas Dusenlund

confirm-gesture: extend active duration

Extend the duration for when the confirm gesture is active so that
involuntary bottom taps are not triggered and so that the confirm
gesture triangle isn't rendered blended into the keyboard.

80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Lower-priorityavoid flicker when changing from lockscreen to waiting screenby Marko Bencun · 40d15013 · Oct 13, 2025 · 9 filesMessage 73 · AdequateTriage 0Details
Commit message · Marko Bencun

avoid flicker when changing from lockscreen to waiting screen

The BitBox shows the lockscreen ("See the BitBoxApp") first, and when
the noise connection is initiazed, switches to the BitBox logo, which
stays there as the waiting/default screen until reconnected.

The noise connection is initiated by the host after unlock finishes,
so in between, "See the BitBoxApp" flashes for a split second.

This commit solves this by

1) not pushing the lockscreen as an extra component to be popped, but
folding it into the top/default component

2) updating that screen when the app initiates the connection if the
device is not initialized

3) if initialized, updating the screen on OP_UNLOCK (see comment in code)

This prevents flashing/flickering if the device is initialized. There
is still a small flicker when the device is uninitialized, as the
screen is updated before the pairing confirmation appears. This was
the case before this commit too.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Lower-prioritykeystore: reduce secure chip operations when unlockingby Marko Bencun · e6d8560b · Oct 13, 2025 · 6 filesMessage 78 · AdequateTriage 0Details
Commit message · Marko Bencun

keystore: reduce secure chip operations when unlocking

Every call to `keystore::unlock` is followed by `copy_seed()`. The latter
uses a secure chip operation. We can remove that by returning the seed
from unlock and re-using it.

This reduces the number of securechip operations by 1 when:

- when unlocking the device
- showing mnemonic on initialized device
- creating backu on initialized device

This is to reduce the risk of running into Optiga's throttling
security mechanism.

78/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly