-
VNC Forge v1.0-pro
StableSome checks failedBuild APKs / Assemble debug + release APKs (push) Has been cancelledreleased this
2026-09-30 13:14:44 +00:00 | 0 commits to main since this releaseVNC Forge v1.0-pro
First release with saved connection passwords encrypted at rest. Security - Saved VNC and SSH passwords are encrypted with AES-256-GCM using a non-exportable 256-bit key generated in the Android Keystore, replacing plaintext JSON in an app-private XML file. A fresh IV is generated by the Keystore for every write, and additional authenticated data binds each value to the preference key it belongs to, so a ciphertext cannot be moved between keys and still be accepted. - Encryption failure no longer falls back to writing cleartext. If the Keystore is present but a write fails, the attempt is retried once and then abandoned, leaving the previous ciphertext intact. - The IV is generated by the Android Keystore for every write, rather thansupplied by the app. An earlier build of this work passed a caller-supplied
IV, which the Keystore refuses outright when randomized encryption is
required, so saving any connection failed on a real device. The regression
test is a device test on purpose: a plain JVM key accepts a caller-supplied
IV without complaint, so no JVM test can catch it.-
Losing the master key (a restore from backup carries the preferences file over
but not the Keystore entries) yields an empty list and clears the unreadable
value, instead of failing every read forever. A transient Keystore outage
keeps the value instead, so it is readable once the Keystore recovers.- Devices with no usable Keystore fall back to a plaintext store and report it,
rather than crashing.
Build
- R8 was deleting VncEngine, whose methods are only called from C++, while still
packaging libvnc_engine.so for all four ABIs. The JNI bridge is now kept. - Dropped androidx.security:security-crypto and its Tink dependency, which added
541 KB and whose key managers R8 removed, breaking the release build at
runtime. Release APK is 1,081,696 bytes, down from 1,622,838.
Tests
- 68 JVM tests: Hextile and ZRLE decoder coverage, plus 32 for ConnectionStore's
JSON handling, the four decryption-recovery branches, and the
encryption-failure path. - 29 further tests cover the Android Keystore itself and require a device.
Known issues
- The Keystore tests have not been run on hardware. The encryption path was
verified by source review and a JVM harness only, so the device suite should
be run before relying on it. - This build is signed with the debug certificate, because no release keystore
was supplied. Set RELEASE_KEYSTORE_PATH and the related variables to sign a
distributable build; the fallback exists so assembleRelease always produces
something installable.
- Devices with no usable Keystore fall back to a plaintext store and report it,
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-