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…
Reject backup data whose declared seed length exceeds the fixed 32-byte seed field. This prevents malformed SD-card backups from triggering an out-of-bounds panic while listing backups.
Add a regression test with an otherwise valid protobuf and recomputed checksum.
Tests: - `cargo test --manifest-path src/rust/Cargo.toml --all-features -- --test-threads 1` - `./scripts/dev_exec.sh make run-unit-tests`
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
Why it was queued
defensive validationfuzzing or regression evidencesecond-pass: broader security terminology
Reject schemas and values whose recursive struct or array traversal exceeds a bounded depth. Validate type roots before callbacks and cover the boundaries with tests.
78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
defensive validationsigning or wallet pathsecond-pass: near security thresholdsecond-pass: security-sensitive path
Replace the unbounded concurrent queue with a fixed-capacity ring buffer storing 16 Runnable slots inline. Scheduling no longer allocates, including when wakers run in interrupt context.
Limit active tasks to the queue capacity so exhaustion is reported from spawn rather than from a waker. Protect queue access with critical sections because wakers and the main loop may access it concurrently.
The executor currently has three normally serialized root-task sources, so 16 slots leave room for future concurrency and consume 64 bytes on the 32-bit firmware target.
Cover repeated slot reuse and enforcement of the task limit. Remove the now-unused concurrent-queue dependency.
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
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
Why it was queued
second-pass: broader security terminology
AI review queuedEnable blake2 size_optby Marko Bencun · 7c20eb38 · Apr 22, 2026 · 1 fileMessage 61 · AdequateTriage 5Details
Commit message · Marko Bencun
Enable blake2 size_opt
The blake2 crate exposes a size_opt feature that trades aggressive inlining for a smaller implementation. In this firmware build the Blake2b compression path was still one of the largest Rust code contributors, so this is a direct ROM for speed trade that matches the current goal.
Enable size_opt for the existing optional dependency. The algorithm, test vectors, and call sites stay the same; only the crate internal code generation strategy changes.
In the resulting image, the large Blake2b compression routine is split into much smaller outlined helpers instead of one heavily inlined body. That is where the ROM reduction comes from.
Saves 11576 bytes in firmware.bin.
61/100 · AdequateMessage clarity
✓ Subject identifies a change✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidencesecond-pass: broader security terminology
AI review queuedtighten typesby Marko Bencun · a89b258d · Apr 21, 2026 · 4 filesMessage 18 · OpaqueTriage 0Details
Commit message · Marko Bencun
tighten types
18/100 · OpaqueMessage clarity
✓ Subject identifies a change! Too few words to establish purpose! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedbump versionby Marko Bencun · 9f557715 · Apr 16, 2026 · 2 filesMessage 18 · OpaqueTriage 0Details
Commit message · Marko Bencun
bump version
18/100 · OpaqueMessage clarity
✓ Subject identifies a change! Too few words to establish purpose! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedeth/sign: add missing mock_unlock in testsby Marko Bencun · 0d7cabab · Apr 14, 2026 · 1 fileMessage 55 · ThinTriage 12Details
Commit message · Marko Bencun
eth/sign: add missing mock_unlock in tests
55/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedapi/payment_request: serialize ETH value as little endianby Marko Bencun · be2d62c8 · Apr 14, 2026 · 2 filesMessage 73 · AdequateTriage 12Details
Commit message · Marko Bencun
api/payment_request: serialize ETH value as little endian
SLIP-24:
> amount (coinType-dependent length): fixed-length encoding of the amount of the requested output in little-endian byte order, expressed in the smallest unit of the given cryptocurrency (satoshis, wei, etc.). The length of the encoding is equal to the length used natively for the given coinType to encode amounts, e.g. 8 bytes for Bitcoin-like coins and 32 bytes for EVM assets.
73/100 · AdequateMessage clarity
✓ Specific, 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 review queuedCHANGELOG: add swapsby Marko Bencun · a200c9bf · Apr 13, 2026 · 1 fileMessage 28 · OpaqueTriage 0Details
Commit message · Marko Bencun
CHANGELOG: add swaps
28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body