Skip to content

fix(windows): authenticate every SQLCipher page before decryption - #11

Merged
freanocank merged 1 commit into
freanocank:mainfrom
Lee-Juntong:fix/authenticate-db-pages
Oct 13, 2026
Merged

freanocank merged 1 commit into
freanocank:mainfrom
Lee-Juntong:fix/authenticate-db-pages

Conversation

@Lee-Juntong

Copy link
Copy Markdown
Contributor

The native Windows decryptor checks a few decrypted header bytes on page 1 but does not authenticate pages. Altered ciphertext in a later page can therefore be accepted and atomically replace a previously good snapshot.

Derive the SQLCipher v4 MAC key and verify every stored page's HMAC-SHA512, including the page number and IV, before producing plaintext or replacing the destination. Reject mismatched authentication without modifying existing output. Preserve the existing 4096-byte page / 80-byte reserve profile.

Validation: nine synthetic encrypted-page tests cover a correct key, wrong key, truncation, ciphertext/IV/MAC corruption, page-number mismatch, and preservation of previous output. The corruption/page-number/output-preservation regressions fail on main; all added tests pass with this change. Live account-wide native key extraction is still unverified.

Local validation uses Windows/Python 3.12 and synthetic fixtures. The consistency-checker file and two fingerprint-dependent existing tests were excluded by the local execution policy; no account databases, chat contents or keys are included.

Local branch suite: 90 passed, two tests deselected, consistency-checker file excluded.

@freanocank
freanocank merged commit f512720 into freanocank:main Oct 13, 2026
1 check passed
@freanocank

Copy link
Copy Markdown
Owner

Thanks for the fix and regression tests. Adopted through #15 with your original commits preserved. The combined WAL regression also proves that valid WAL checksums cannot bypass page authentication, and rejection preserves the previous output.

The combined suite passes all four macOS/Windows × Python 3.10/3.13 CI jobs; Windows reports 209 passed, and macOS reports 208 passed with the Windows-only test skipped.

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.

2 participants