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.
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
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)
This commit fixes a bug in how the BitBox02 hardware wallet wipes files from its SD card. Before erasing a file, the device now checks the file's reported size against a safe maximum. Without this check, a tampered SD card could claim a fi…
CVE-2026-6682 referenced in commit messageMalformed FAT directory entry could cause excessive overwrite loopDenial-of-service via SD card tampering
This update adds a safety check when the BitBox02 hardware wallet mounts a microSD card. A malicious or deliberately malformed FAT filesystem could trick the device's file-system library into placing user data inside attacker-controlled bo…
Fixes integer-wrap / geometry confusion in FAT mount logicAdds explicit post-mount validation of filesystem metadataPrevents data area from landing inside attacker-controlled FAT sectors
This commit simply swaps in newer pre-built bootloader stage1 binary files (version 1.2.2 replacing 1.2.1) for four BitBox02 hardware variants and updates the corresponding checksum list. The actual code inside the new binary files is not …
This update fixes the BitBox02 bootloader's firmware-erase routine. Previously, when erasing leftover padding after a firmware update, the bootloader started erasing at the exact page where the firmware ended. Because flash memory can only…
Bootloader firmware erase routine could erase a flash block containing both firmware and paddingFix aligns erase start to erase-block boundary and re-checks erased state before erasingChangelog describes the change as a fix for 'partially erased flash blocks'
This commit adds production bootloader upgrade files for the BitBox02 hardware wallet and updates build scripts to use them. It is a routine asset-management change: replacing placeholder development hashes with real signed production bina…
This commit fixes a build script used only for development/testing versions of the BitBox02 bootloader upgrade. It makes the development-stage1 bootloader images unsigned again, while keeping production images fully signature-verified. The…
Signature verification relaxed only for development buildsProduction payload validation still requires signaturesDevelopment stage0 already skipped stage1 signature verification per commit message
This BitBox02 firmware update is a broad security patch that fixes several independent bugs: it prevents a maliciously oversized USB report from overflowing memory, stops a corrupted Bluetooth pairing database from being read or written wi…
Bounds check added to USB HID Set Report input lengthBLE bond DB length validation hardened against negative and oversized valuesBootloader firmware image size limit relaxed to intended maximum
This commit fixes a bootloader bug where the device rejected firmware updates that used the maximum allowed size. The off-by-one check meant legitimate full-sized firmware images could not be installed, potentially blocking updates. The fi…
Off-by-one input validation in firmware-update pathBootloader change affecting firmware chunk count acceptanceCHANGELOG labels the change as a bugfix for full-sized firmware upgrades
This is a large firmware commit that adds a new two-stage bootloader update mechanism for the BitBox02 hardware wallet. It replaces the old single bootloader with a small, fixed 'stage0' plus a separately signed 'stage1', and ships a speci…
Bootloader architecture changed from monolithic to two-stage (stage0 + signed stage1).Firmware signature hash now includes a 16-bit product_id, binding firmware to product variant.Root public keys were rotated/replaced with a single set across all products.
This commit is a routine maintenance update for the BitBox02 hardware wallet firmware. It upgrades the pinned Rust compiler toolchain from an older version to Rust 1.96.0, updates the project's Docker build container and related developer …
Routine toolchain and dependency upgradeVendored libc updated across many platform bindingsNo first-party security-relevant code changes
This commit removes the use of the standard snprintf formatting function from the BitBox02 bootloader's developer menu and replaces it with a small, fixed-format helper. The main goal is to reduce the bootloader's binary size and make the …
Removes snprintf/printf usage from bootloader code, reducing binary bloat and eliminating a complex formatting library from a privileged execution contextExtends automated CI check to detect stdio/Rust formatting symbols in regular development and production bootloader outputs, not just production buildsAdds unit test coverage for the new fixed-format helper
This commit removes the use of standard string-formatting functions (like snprintf and Rust's format!) from the bootloader and related low-level code, replacing them with smaller, fixed-size string builders. The stated goal is to reduce bi…
Removal of stdio formatting (snprintf family) from bootloader codeRemoval of Rust format!/write! formatting from bootloader-linked codeAddition of CI gate rejecting stdio and Rust formatting symbols in production bootloader ELFs
This commit is a simple code cleanup: it moves a handful of string-formatting helpers (for pairing codes, progress percentages, hash display, timers, and unknown-command messages) out of the main bootloader file into a new dedicated file, …
This commit removes a 100-character stack buffer and passes bootloader messages straight to the screen-drawing function. The old code used snprintf to copy the message into a fixed-size buffer, which could silently truncate very long strin…
Removal of fixed-size stack buffer in bootloader display pathElimination of snprintf with potentially attacker-influenced format string argumentBootloader code touched, which is a security-sensitive component
This commit replaces floating-point progress calculations with integer math to save firmware space. It removes the use of f32 arithmetic for progress bars in Bitcoin transaction signing and Bluetooth firmware upgrades. There is no direct s…
Removal of floating-point arithmetic reduces attack surface related to soft-float emulation bugsNew integer fraction API introduces denominator-non-zero and numerator-bound assumptionsCall sites use checked arithmetic to prevent overflow in progress computation
This commit changes the build system to enable Link-Time Optimization (LTO), a compiler technique that shrinks the final firmware size. It also adds safeguards to keep the stack protector security feature working under LTO and deliberately…
Build-system change enabling LTO with explicit stack-protector symbol retentionDeliberate exclusion of bootloader, factory-setup, ASF4, samd51a-ds, and embedded-swd from LTO due to audit complexityToolchain switch to LTO-aware archive utilities to avoid invalid tiny images from missing live objects
This update fixes a crash in the BitBox02 hardware wallet when a user lists many backups over a Bluetooth connection. Previously, the device could run out of temporary buffer space while sending a large response, causing it to panic and st…
Denial-of-service via buffer overflow/panic on Bluetooth pathMissing backpressure leading to unbounded queue growth and crashAtomic all-or-nothing enqueue to preserve serial frame boundaries
This commit is a code refactoring that moves the device attestation signing function from C code into Rust code. It converts the function to be asynchronous (async/await) and rewrites the parsing of the secure chip's DER-encoded signature …
Removal of C synchronous secure chip signing wrapperAddition of async Rust secure chip ECDSA signing operationRelocation of DER signature parsing from C-API Rust crate into securechip crate
This commit is purely a code-style and build-maintenance change. It makes the Rust code generated from protocol-buffer definitions be formatted by rustfmt automatically and included in style checks. No security-sensitive behavior is change…
This commit removes the use of standard string-formatting functions (like snprintf and Rust's format!) from the bootloader and related low-level code, replacing them with smaller, fixed-size string builders. The stated goal is to reduce binary size ('bloat') in the production bootloader, not to fix a known security bug. The change also adds a CI check that rejects any future use of these formatting symbols in production bootloader builds. While removing complex formatting libraries from a bootloader is generally good defensive practice, the commit itself does not describe or demonstrate any exploitable vulnerability.
Security candidatebootloader: extract formatting helpersby Marko Bencun · 1a1de3b5 · May 30, 2026 · 6 filesMessage 35 · OpaqueInformational 15Details
Commit message · Marko Bencun
bootloader: extract formatting helpers
35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body! Opaque security-relevant change
Why it was queued
update trustboot or update path
AI analysis · Informational 15/100
This commit is a simple code cleanup: it moves a handful of string-formatting helpers (for pairing codes, progress percentages, hash display, timers, and unknown-command messages) out of the main bootloader file into a new dedicated file, and adds unit tests for them. The actual formatting logic is unchanged, and there is no indication of any security fix or behavior change.
Security candidatebootloader: render messages directlyby Marko Bencun · c0bc7b92 · May 30, 2026 · 1 fileMessage 58 · ThinInformational 17Details
Commit message · Marko Bencun
bootloader: render messages directly
Pass bootloader messages directly to UG_PutString instead of copying them through a fixed-size stack buffer first. UG_PutString consumes the string synchronously while drawing to the screen buffer.
This commit removes a 100-character stack buffer and passes bootloader messages straight to the screen-drawing function. The old code used snprintf to copy the message into a fixed-size buffer, which could silently truncate very long strings. There is no direct evidence in the commit that this fixed a security vulnerability; it appears to be a cleanup or robustness improvement. The change does not introduce obvious new risks because the drawing function consumes the string immediately.
The bootloader selects the 9x9 font before rendering text, and Abort does the same. Use that font as the bootloader UG_Init default so the 11x10 font table is not linked into bootloader images.
bb02p-bl-multi-production.bin shrinks from 50572 to 48556 bytes.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
update trust
Lower-priorityci: exclude asf4 headers from clang-tidyby Marko Bencun · eac2ebcb · May 30, 2026 · 1 fileMessage 72 · AdequateTriage 0Details
Commit message · Marko Bencun
ci: exclude asf4 headers from clang-tidy
asf4 is excluded already at source level, but headers could still be linted through includes from other sources.
72/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides an explanatory body
Lower-priorityCheck firmware for float helpersby Marko Bencun · 6f196229 · May 29, 2026 · 1 fileMessage 80 · StrongTriage 0Details
Commit message · Marko Bencun
Check firmware for float helpers
Extend .ci/check-unwanted-symbols with additional checks for linked floating-point helpers in build/bin/firmware.elf.
Keep the existing float formatting, strftime, and sha2::Sha512 checks, and add floating-point helper checks for the helpers removed by the integer fee and progress commits. The f64 check is intentionally scoped to comparison/conversion helpers because this branch still has some double arithmetic helpers pulled in by the existing C snprintf/newlib path.
80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Security candidateUse integer progress fractionsby Marko Bencun · 17c4947f · May 29, 2026 · 12 filesMessage 58 · ThinInformational 19Details
Commit message · Marko Bencun
Use integer progress fractions
Add an integer `set_fraction()` progress path through the HAL and UI layers, and switch the live Bitcoin-signing and Bluetooth-upgrade progress updates to use it.
The progress bar ultimately renders whole pixels, so the C progress component now stores the filled pixel width directly and computes it with integer math. This keeps the visible behavior intact while removing the Rust-side soft-float `f32` arithmetic path that was only used for progress updates.
In the final firmware image this drops the live `compiler_builtins::float::{add,div,mul}::<f32>` helpers together with the associated `__aeabi_fadd`, `__aeabi_fdiv`, and `__aeabi_fmul` wrappers.
This commit replaces floating-point progress calculations with integer math to save firmware space. It removes the use of f32 arithmetic for progress bars in Bitcoin transaction signing and Bluetooth firmware upgrades. There is no direct security vulnerability in the change itself; it is a code-quality and size-reduction refactor. However, it introduces new integer arithmetic paths that must keep numerator/denominator assumptions valid to avoid incorrect progress display.
Lower-priorityInitialize ugui in component testsby Niklas Dusenlund · 83cce2d2 · May 18, 2026 · 1 fileMessage 90 · StrongTriage 0Details
Commit message · Niklas Dusenlund
Initialize ugui in component tests
Set up a minimal ugui instance for UI component tests that create labels. Label sizing now relies on ugui being initialized because ugui null guards are debug assertions instead of release-time early returns.
90/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification
Lower-priorityReuse rotated render for logoby Niklas Dusenlund · e3087d04 · May 18, 2026 · 2 filesMessage 68 · AdequateTriage 0Details
Commit message · Niklas Dusenlund
Reuse rotated render for logo
Render the orientation screen's reverse logo state by rotating the existing logo component 180 degrees instead of keeping a second reversed bitmap and component.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Lower-priorityUse debug asserts in uguiby Niklas Dusenlund · c63cd971 · May 18, 2026 · 1 fileMessage 68 · AdequateTriage 0Details
Commit message · Niklas Dusenlund
Use debug asserts in ugui
Replace defensive null-check returns in ugui.c with ASSERT() calls. ASSERT is already compiled as a no-op outside DEBUG builds, so release behavior no longer carries the extra null-check branches.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Replace the text-specific inverted flag with a temporary 180-degree UG rendering transform. Use the component helper to rotate the orientation screen top button while keeping normal text drawing APIs.
Update C and Rust call sites and add coverage for pixel and component rotation.
78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
boot or update path
Security candidateEnable scope C LTO for firmwareby Marko Bencun · 0b102fb7 · May 17, 2026 · 6 filesMessage 80 · StrongInformational 12Details
Commit message · Marko Bencun
Enable scope C LTO for firmware
Enable scoped GCC LTO for firmware C code to reduce ROM size while preserving section GC and stack protector support. Build firmware C objects plus the optiga and cryptoauthlib static libraries with -flto -ffat-lto-objects, and link only firmware images with -flto, since useful size savings require LTO IR in the linked static libraries.
Switch the ARM toolchain to the LTO-aware archive utilities (arm-none-eabi-gcc-ar, arm-none-eabi-gcc-nm, arm-none-eabi-gcc-ranlib); plain ar/ranlib can archive LTO objects without the plugin and produce invalid tiny images by failing to extract live objects.
Keep bootloaders, factory-setup, ASF4, samd51a-ds, and embedded-swd off the LTO path because startup, interrupt, MMIO, vector-table, linker-script, assembly, callback-table, and section-name interactions are not cheaply auditable for LTO safety. Mark local stack protector symbols as kept/visible so late LTO-generated references to __stack_chk_fail and __stack_chk_guard are retained; no_stack_protector is intentionally not needed.
80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Why it was queued
update trustboot or update path
AI analysis · Informational 12/100
This commit changes the build system to enable Link-Time Optimization (LTO), a compiler technique that shrinks the final firmware size. It also adds safeguards to keep the stack protector security feature working under LTO and deliberately excludes sensitive low-level code (bootloader, factory setup, hardware drivers) from LTO to avoid subtle bugs. There is no direct evidence in the commit of a security vulnerability being fixed or introduced.
Build LVGL directly with cc from an explicit source list and drop the cmake crate dependency. Use the shared bitbox-lvgl-sys lv_conf.h for the BB03 graphical simulator and remove the simulator-specific duplicate config.
Remove cross compilation support in lvgl-sys for now.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
second-pass: broader security terminology
Lower-prioritytooling: Move rust tools out of dockerfileby Niklas Dusenlund · b47b3145 · May 4, 2026 · 3 filesMessage 60 · AdequateTriage 0Details
Commit message · Niklas Dusenlund
tooling: Move rust tools out of dockerfile
It is easier to install the right tools if you aren't using docker.
60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Lower-prioritybuild: run vendoring script from src/rustby Niklas Dusenlund · bd3d0f14 · May 4, 2026 · 2 filesMessage 84 · StrongTriage 0Details
Commit message · Niklas Dusenlund
build: run vendoring script from src/rust
Run rust vendorings script from src/rust so that the correct rust toolchain is picked up.
84/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides an explanatory body✓ Explains rationale or failure mode
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Mentions testing or verification! No meaningful explanatory body
ListBackups returns one protobuf containing all SD card backups. With many backups, the response spans many 64-byte HWW/U2FHID reports. USB sends those reports directly over HID, but BLE first serial-frames each report for the DA14531 and queues the escaped bytes in the fixed-size UART ByteQueue.
The Rust ByteQueue port kept the panicking single-byte put() API and the BLE poller used it for every framed byte. That removed the previous v9.25 backpressure behavior: da14531_protocol_poll() consumed the pending HWW report before knowing whether the whole framed BLE packet fit in the 2048-byte UART queue. If ListBackups produced data faster than UART drained it, put() eventually hit capacity and panicked with bytequeue overflow. USB does not use this UART queue, which is why the same request worked there.
Add ByteQueue::try_put_slice() plus an extern C wrapper that takes util::Bytes and performs an all-or-nothing enqueue. The BLE HWW path now formats the 64-byte report into a temporary serial frame and only clears hww_data after try_put_slice() succeeds. If the queue is full, it returns without writing any bytes, preserving frame boundaries and leaving the same report pending for the next poll after UART has drained.
Keep the existing panicking put() behavior for the other bytequeue callers so the change stays scoped to the actual backpressure boundary. The separate Rust and extern-wrapper tests cover successful writes and failed overflow attempts being atomic.
95/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification✓ Names security-relevant behavior explicitly
Why it was queued
memory safetyparser or protocol path
AI analysis · Moderate 60/100
This update fixes a crash in the BitBox02 hardware wallet when a user lists many backups over a Bluetooth connection. Previously, the device could run out of temporary buffer space while sending a large response, causing it to panic and stop working. The fix makes the Bluetooth sender check whether the whole next chunk fits before writing it, and if not, wait until space becomes available. USB connections were not affected because they use a different path.
Lower-priorityAGENTS: run make commands seriallyby Marko Bencun · 8730c1c6 · Apr 28, 2026 · 1 fileMessage 72 · AdequateTriage 0Details
Commit message · Marko Bencun
AGENTS: run make commands serially
Otherwise the dev-machine can easily lock up.
72/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Explains rationale or failure mode
The Optiga C API keeps raw pointers to the Rust wrapper's static buffers until the asynchronous callback completes. The Rust wrapper has a Detached state for futures that were dropped after launching a command, but the individual wrappers initialized their per-operation static buffers before calling begin_async_op().
That meant a repeated call to the same wrapper could clear or overwrite the exact static storage still owned by the detached C command before begin_async_op() noticed the Detached state and waited for the old callback.
Move begin_async_op().await before every static buffer or length-cell mutation. Detached operations are now reclaimed before any static storage is reused, and live concurrent operations still panic before their buffers can be corrupted.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Lower-priorityclippy: warn for large futuresby Niklas Dusenlund · c9c522f0 · Apr 23, 2026 · 2 filesMessage 76 · AdequateTriage 0Details
Commit message · Niklas Dusenlund
clippy: warn for large futures
Large async state machines keep their captured data alive across await points. That can silently bloat task allocations and stack usage, which is especially risky on memory-constrained embedded targets and makes regressions harder to spot in review.
Add the Clippy lint so oversized futures are flagged early instead of only showing up later as memory pressure or failures.