[v3.6.4] - 2026-05-16
Compare: v3.6.3...v3.6.4
See CHANGELOG.md
for the full Added / Changed / Fixed / Notes breakdown and
RELEASE-NOTES-3.6.4.md
for the long-form write-up with the security-normalized perf
comparison vs 3.6.3.
Headlines
- Cross-language KDF hardening. PBKDF2 200K → 600K (3×); Argon2id default
3 / 2¹⁵→4 / 2¹⁶(2.67×); short/heavy tiers bumped proportionally. 2–3× more attacker cost per password guess. Per-blob backwards compatible — 3.6.3 blobs decrypt at their original cost. - Zero-copy AES-GCM via JNI. New
nativeAesGcm{Encrypt,Decrypt}OneShotentry points pin heapbyte[]withGetPrimitiveArrayCritical. About +10–11 % on 16 MiB fwxAES encrypt.Crypto.aesGcm{Encrypt,Decrypt}WithIvIntonow actually routes through the native backend when one is active (this was a latent bug —useJNI=truepreviously matched or traileduseJNI=false). - Java + Python KDF defaults aligned with C++. All three runtimes now pay the same security cost — the headline "fwxAES looks slower than 3.6.3" comparison previously came from C++ being hardened while Java/Python silently kept the weaker 3.6.3 cost.
- Python EXDEV fix (
os.replacecross-device-link) inb512/pb512streaming and jmg paths when$TMPDIRis on a different filesystem from the output. - Python jmg master-key fallback. When
master_pq.skis missing (typical non-custodian deployments),decrypt_media/_recover_mask_key_from_blobnow falls back to the user_blob / password path instead of raisingFileNotFoundError. - Documentation.
SECURITY.mdsections on the default password-only crypto stance (already PQ-resistant) vs the opt-in ML-KEM-768 master-key wrap;SECURITY.md"roll-forward" clarification (releases are frozen, maintenance ships as a new release);RELEASE-NOTES-3.6.4.mdlong-form notes.
Fair perf vs 3.6.3 (rescaled to constant security strength)
| runtime | 3.6.3 (rescaled) | 3.6.4 (now) | delta |
|---|---|---|---|
| C++ | 35.08 s | 15.54 s | −55.7 % faster |
| Java | 60.61 s | 24.14 s | −60.2 % faster |
| Python | 81.06 s | 34.39 s | −57.6 % faster |
KDF-heavy paths (fwxAES, b512/pb512, *file, kFMe/kFAe, an7/dean7) all show −60 % to −80 % at constant security. Non-KDF micros flat within ±2 %.
Compatibility
- Forward: 3.6.4 reads every 3.6.x blob.
- Backward: 3.6.3 reads 3.6.4 blobs (PBKDF2 iters + Argon2 params stored inline).
- PQ: ML-KEM-768 opt-in via
useMaster=true/--with-master. Default password-only mode is already PQ-resistant via AES-256 (Grover ≈ 128-bit equivalent) + hardened Argon2id/PBKDF2.
Verifying
Every artifact ships with .sha256 / .md5 / optional .sig. Aggregate SHA256SUMS.txt, MD5SUMS.txt, release-manifest.json are attached. Release pipeline self-tests every binary with --version before publishing.
sha256sum -c basefwx-linux-amd64.sha256
gpg --verify basefwx-linux-amd64.sig basefwx-linux-amd64