aboutsummaryrefslogtreecommitdiff
path: root/docs/PERFORMANCE.md
diff options
context:
space:
mode:
authorcirakg <cirakg@cirakg.xyz>2026-10-27 01:01:18 +0100
committercirakg <cirakg@cirakg.xyz>2026-10-27 01:01:18 +0100
commitbc4cc19df5f53519ca1aabd3cf161b6d78ffc16c (patch)
tree3242a63f603882d723bd0d718d043c30a9f11784 /docs/PERFORMANCE.md
parent34daecaa25e5bdd995179a2b4b9d922f8bbb3b54 (diff)
fix(pin): the work after a PIN and the change queue run in steps
After a correct or new PIN, promoting pending entries and applying waiting "Require PIN" changes ran in the event of the last PBKDF2 step; 16 waiting changes tripped the watchdog on the Forerunner 70. ChangeQueue.LockJob now does it in steps while the PIN screen shows "Checking...", saves what it did to the results and refreshes the glance after Set PIN too. The list title decrypted every waiting change at each start. Queue items are now [action, box] (aad OTPW-Q-2 + action code), so they are counted without decrypting; 0.9.0 items are still read. A replacement is checked when it arrives and its material is sealed apart (qm.<n>). Large buffers are wiped and UTF-8-checked in pieces (Jobs.Wiper, Bytes.utf8Prefix, SealedBox.openKeep/sealKeep). "Phone changes" reads behind "Reading...", and Confirm all / Reject all act only on the changes shown. Storage full no longer stops the app at the PIN. Found by the review of b8addc8/096b5a4 and a new make watchdog test; the diff was reviewed again and its findings fixed. fr70: make lint, make test (176), make watchdog (19 cases at two steps per event), make screenshots pass; list_locked and list_reset goldens show "Results ready (menu)". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'docs/PERFORMANCE.md')
-rw-r--r--docs/PERFORMANCE.md16
1 files changed, 16 insertions, 0 deletions
diff --git a/docs/PERFORMANCE.md b/docs/PERFORMANCE.md
index 0433457..d261125 100644
--- a/docs/PERFORMANCE.md
+++ b/docs/PERFORMANCE.md
@@ -44,6 +44,22 @@ Other timings reported from the same session: settings saved on the phone reach
What this means: unlocking stays at about 1 s because 2,000 iterations is also the minimum the app accepts. An attacker who copies the watch's storage still has to run those 2,000 iterations per guess, but on a PC that is microseconds, so the PIN protects mainly against someone holding the watch (lockout and the optional erase after 10 wrong PINs), not against an offline attack on a copied file system (docs/SECURITY.md).
+### Review of 0.9.0, 2026-10-26 (unreleased)
+
+`make watchdog` on the Forerunner 70 (240,000 bytecodes per event), two steps of work per event:
+
+| Case | 0.9.0 | Now |
+| --- | --- | --- |
+| After the PIN: 16 waiting "Require PIN" | trips even at one pass | passes, 70 steps |
+| After the PIN: 134 pending entries and 16 "Require PIN" | trips | passes, 159 steps |
+| Counting the queue with a 1 KB replacement waiting (list title) | trips at two passes | passes (no decryption) |
+| Reading 16 changes with the longest names ("Phone changes") | trips at two passes | passes, as a job behind "Reading…" |
+| Replacing a code with 4 KB of contents, queued / direct | not tested | passes, 735 / 727 steps |
+| A 4 KB replacement queued by 0.9.0, read, kept at the PIN and confirmed | not tested | passes, 757 steps |
+| A 1,024-character secret replacement / 4,096 spaces as code contents | not tested | passes, 10 / 12 steps |
+
+Not covered yet: opening a 4 KB code (`toUtf8` in one event, about 100,000 bytecodes) and the Add OTP form's secret decoding without a length limit; both are near the Forerunner 255S's limit, not the 70's.
+
### M8, 2026-10-21 (polish and release candidate, version 0.8.0)
- **Memory, Forerunner 255S (512 KB):**