keep the real and duress slot records the same length on every write (v2.14.83) PAI-2026-004: a real decoy cannot be re-sealed without the duress passphrase — which is never retained — so its blob stayed at the length it had when duress was configured while slot A kept growing through the padding buckets. An at-rest observer comparing the two stored record lengths could read out both that duress was configured and how far the real vault had grown. VaultStore now aligns the pair on every write: writing either slot record re-pads both with trailing NULs to the longer of the two, in a single commit so the pair can never be caught misaligned. NUL cannot occur inside the JSON, for the same reason the plaintext padding uses it, so decodeSlot only has to trim it. The target is the longer TRUE record rather than the longer stored one, so the pair tracks the current vault instead of ratcheting up to a high-water mark whenever the vault temporarily grows. Duress configuration itself is untouched: a fake decoy is still regenerated at slot A's size when duress is not configured, which keeps the blobs equal too, not just the records. Verification: four new cases covering growth through every padding bucket with a frozen decoy, shrink below the decoy's frozen size, a fake decoy following the vault back down with no ratchet, and an unsibled record staying unpadded; full JVM suite 1038 tests / 0 failures / 0 errors / 2 skipped, up from 1034; lintDebug 0 errors and 90 warnings, unchanged; assembleDebug and debug androidTest sources compile.

dev · 1 week ago · 2026-09-01 · 6.7 MB

session: resolve independent audit findings · agent: hy4-preview

$ koh steal kepr.uk/peach-android@93837a48a6ee
·
← 0dd507815d8b 8d576bb50c88 →
⇓ download .face