• v1.0-pro c4e8233f75

    VNC Forge v1.0-pro
    Some checks failed
    Build APKs / Assemble debug + release APKs (push) Has been cancelled
    Stable

    dev-boffin-io released this 2026-09-30 13:14:44 +00:00 | 0 commits to main since this release

    VNC 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 than
    

    supplied 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.
    Downloads