Skip to content

v1.52: decryption cleanup, RS repair, keyfile header MAC fix + headless tests - #28

Merged
TheZeekA merged 3 commits into
mainfrom
release-1.52
Sep 24, 2026
Merged

TheZeekA merged 3 commits into
mainfrom
release-1.52

Conversation

@TheZeekA

Copy link
Copy Markdown
Owner
  • Fix decryption cleanup, Reed-Solomon repair, and keyfile-volume header MAC (format break for keyfile volumes only); bump to v1.52
  • Add headless end-to-end tests (go test . in src/) with v1.51 fixtures
  • Mark test fixtures as binary so autocrlf can't alter them

TheZeekA and others added 3 commits September 24, 2026 17:23
Security:
- Derive the header-MAC subkey after the keyfile key is mixed in. For
  keyfile-only volumes it depended only on argon2id("", salt), so the
  header could be forged; since the data MAC doesn't cover the nonce,
  a forged nonce decrypted "successfully" to garbage. Breaking change
  for keyfile volumes from v1.50/1.51, which are recognized (never
  accepted) and pointed at v1.51. Password-only volumes are unaffected.
- broken() deleted outputFile instead of outputFile.incomplete, leaving
  unauthenticated plaintext behind and deleting a file the user chose
  to overwrite.
- Failed/cancelled deniable decrypts left the unwrapped .tmp (which has
  a readable header) next to the volume. Temp inputs are now tracked
  and removed by removeTempInput(), which only deletes files work()
  created and refuses to clobber an existing *.tmp.

Fixes:
- RS repair pass re-ran recombine/unwrap: crashed on deniable volumes,
  always failed on split ones. work(prepared bool) skips preparation.
- Crashes on an invalid PKCS#7 byte, a <136-byte RS tail, a too-short
  deniable file, and a deniable keyfile volume opened without keyfiles.
- Split cleanup used the wrong chunk names and globbed with
  metacharacter-unsafe paths.
- Enter could start a second work() mid-operation; the update modal
  and applyUpdate could exit mid-operation.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Drive onDrop()/work() the way the UI does, without a window: round
trips across every option, tampering and corruption, RS repair on
deniable/split volumes, temp-file cleanup on failure and cancel, the
keyfile header forgery, and compatibility with v1.51 volumes checked
in under testdata/legacy-v1.51. Each bug test was confirmed to fail
against v1.51.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@TheZeekA
TheZeekA merged commit ae45100 into main Sep 24, 2026
3 checks passed
@TheZeekA
TheZeekA deleted the release-1.52 branch September 24, 2026 05:29
@TheZeekA TheZeekA mentioned this pull request Sep 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant