|
1 | 1 | # VMAnyware — current state |
2 | 2 |
|
3 | | -Updated: 2026-10-21. Historical evidence and decisions are in Git and docs. |
| 3 | +Updated: 2026-10-22. Historical evidence and decisions are in Git and docs. |
4 | 4 |
|
5 | 5 | Naming note: historical lab resource identifiers below are normalized to the |
6 | 6 | current VMAnyware name. External resources were not renamed; use VMIDs and |
7 | 7 | ignored local lab records to verify actual identifiers before operations. |
8 | 8 |
|
9 | 9 | ## Latest resume point |
10 | 10 |
|
11 | | -ADR 0087 adds optional Linux Secret Service storage of the application SSH unlock |
12 | | -passphrase: explicit save/unlock/forget, scoped lookup and SSH source selection. |
13 | | -The private SSH key stays encrypted in the existing app file. Eighteen affected |
14 | | -native SSH checks, a focused namespace check, two isolated real-daemon/vault/SSH |
15 | | -cases, React/browser journeys and joined Linux WebView/production IPC/vault/terminal |
16 | | -acceptance pass. No personal vault is accessed. |
17 | | -Clippy strict exposes one pre-existing unrelated argument-count lint; the client |
18 | | -check passes with only that lint allowed. New GUI evidence is isolated Linux |
19 | | -acceptance; device/normal-deployment gates stay open. |
20 | | -Next: Android Keystore implementation using the existing native platform bridge, |
21 | | -with source/compilation/device evidence distinguished. Current server/Android |
22 | | -delivery artifacts include ADR 0086 progress |
23 | | -but predate this new vault IPC/UI. Android runtime, real Proxmox, other OS stores, |
24 | | -Windows/iOS parity, host deployment and local-provider acceptance remain open. |
25 | | -The previous source/delivery checkpoint is retained in the dated entries below. |
| 11 | +User-requested session checkpoint: finish this slice, commit/push and stop here. |
| 12 | +ADR 0088 implements Android Keystore wrapping for the optional application SSH |
| 13 | +unlock secret. ARM64/x86_64 Rust, Kotlin/JNI and both signed debug APKs compile/package; |
| 14 | +helper presence, native hashes, descriptors, initializer exports and existing |
| 15 | +manifest constraints pass. A focused scope test and affected browser journey pass. |
| 16 | +This is compiled/packaged implementation, not actual Android runtime acceptance. |
| 17 | +The SSH private key stays in its passphrase-encrypted app file. Linux Secret Service |
| 18 | +already has joined native UI/vault/SSH acceptance (ADR 0087). macOS Keychain, |
| 19 | +Windows/iOS parity, exact APK/device/Keystore behavior, real Proxmox and deployment |
| 20 | +acceptance remain open. No full-roadmap completion or audited percentage is claimed. |
| 21 | + |
| 22 | +Resume next with an explicitly approved owned Android runtime: save/read/restart, |
| 23 | +tamper/wrong-scope and missing/invalidated wrapping-key refusal, forget/read refusal, |
| 24 | +then host-trust-first SSH/PTY using the system source. Do not start a VM, AVD or |
| 25 | +personal credential operation just because source/build checks pass. All task |
| 26 | +processes are terminal; no pending build or test needs restarting. |
26 | 27 |
|
27 | 28 |
|
28 | 29 | Latest source slice: production HTTP admission now has a global burst-120, |
@@ -6839,3 +6840,65 @@ and initializes the platform verifier before Tauri starts. Add a narrowly scoped |
6839 | 6840 | keystore bridge alongside that path without altering TLS verification or |
6840 | 6841 | regenerating the reviewed Android project. Use the existing owned build toolchain; |
6841 | 6842 | source/compilation never substitutes for explicit device/AVD runtime acceptance. |
| 6843 | + |
| 6844 | + |
| 6845 | +## 2026-10-22 — Android Keystore identity unlock, session checkpoint (ADR 0088) |
| 6846 | + |
| 6847 | +Scope/acceptance: Android implementation for the same explicit save/use/forget |
| 6848 | +identity commands, key/directory scope binding, fixed failures/no silent fallback, |
| 6849 | +source/native/Kotlin compilation and package checks. Implemented a narrow JNI |
| 6850 | +helper retained via application context and initialized alongside unchanged TLS |
| 6851 | +verification. Startup does not open a vault. Rust computes a purpose/directory/ |
| 6852 | +fingerprint SHA-256 scope, verifies the existing encrypted key/passphrase before |
| 6853 | +save, confirms readback and retains shared busy/host/owner/session gates. Kotlin |
| 6854 | +accepts only scoped aliases, wraps with AndroidKeyStore AES-256-GCM, binds scope as |
| 6855 | +AAD and stores only bounded versioned ciphertext in private SharedPreferences. |
| 6856 | +Existing backup/device-transfer exclusions cover that data. Missing/invalidated |
| 6857 | +keys behind ciphertext cannot be silently regenerated. Explicit forget removes |
| 6858 | +only the scoped key/ciphertext, preserving the SSH key. Fixed native exceptions |
| 6859 | +never return Java/provider errors or plaintext to the renderer. UI labels now |
| 6860 | +support Linux/Android and preserve separate unchecked consent. No new dependency, |
| 6861 | +IPC command (82 total), network permission or automatic migration is added. |
| 6862 | + |
| 6863 | +Verification: `make package-android` passes with the existing owned SDK/JDK/NDK |
| 6864 | +(`.lab/android-toolchain/keystore-package.log`): frontend/typecheck, ARM64/x86_64 |
| 6865 | +native compilation, Kotlin/Gradle, both signed debug APKs and signature/version/ |
| 6866 | +ABI/manifest/exact native-library checks. Initial compile errors (inner doc position |
| 6867 | +and typed JNI byte-array signatures) were corrected; final compile/package handles |
| 6868 | +exited successfully. An additional package check requires IdentityVault in DEX |
| 6869 | +(`keystore-content-check.log` in that directory). Compiled Kotlin JNI descriptors |
| 6870 | +match save/read/forget, and both new vault and unchanged TLS initializer symbols |
| 6871 | +are exported (`keystore-jni-descriptors.log`, `keystore-jni-exports.log`). |
| 6872 | + |
| 6873 | +The focused Linux-host Android-scope test passes |
| 6874 | +(`.lab/native-deps/android-keystore-scope-test.log`): stable lowercase 64-hex scope, |
| 6875 | +changed directory and changed public identity produce independent scopes. It does |
| 6876 | +not emulate Android cryptography. The affected React/Firefox simulated-IPC journey |
| 6877 | +passes (`.lab/android-keystore-ui-check.log`), including explicit vault operations, |
| 6878 | +input/consent clearing, scoped SSH selection, no automatic connection and private |
| 6879 | +error suppression. Scoped rustfmt, Python syntax, IPC-manifest consistency and diff |
| 6880 | +review pass. No unrelated server/Linux native suite or Clippy reran for Android |
| 6881 | +conditional branches/UI copy changes. |
| 6882 | + |
| 6883 | +Current local test artifacts (`.lab/packages/android/`): |
| 6884 | +- ARM64 SHA-256 `5a6554b8e32c54d39321fb99c1d2b274be73ca0c6a75397c067793d7277d2166`, 485011736 bytes. |
| 6885 | +- x86_64 SHA-256 `0aa58facc6a8d659e76f64cdcc738c44ac2072ddac55c3429c9643d3a072ab47`, 492984213 bytes. |
| 6886 | +- `releaseCandidate=false`, `runtimeValidatedForTheseApks=false`; updated INSTALL |
| 6887 | + instructions match repository documentation. No device/AVD was started/installed, |
| 6888 | + personal credential/key store touched, real VM contacted or host service changed. |
| 6889 | + |
| 6890 | +Limits: no actual Keystore save/decrypt, process/activity restart, ciphertext tamper, |
| 6891 | +wrapping-key invalidation/loss, OEM transfer behavior, physical security-level or |
| 6892 | +Android system-source SSH/PTY runtime evidence yet. No biometric/StrongBox claim: |
| 6893 | +the wrapping key has no user-authentication requirement, and a compromised app can |
| 6894 | +use it. The SSH key remains encrypted application storage. Forgetting saved unlock |
| 6895 | +does not revoke an already selected key/session. Source compilation cannot close |
| 6896 | +platform/phase acceptance. Existing Linux acceptance remains independently recorded. |
| 6897 | + |
| 6898 | +Next task after resuming: use an approved owned Android target and current exact APK |
| 6899 | +for the acceptance sequence above; keep package provenance and no silent fallback. |
| 6900 | +If no runtime target is authorized, prepare its opt-in fixture without launching it, |
| 6901 | +then continue other source/platform work. User asked to stop at this checkpoint; |
| 6902 | +do not start another slice in this session. Website remains at the accepted Linux |
| 6903 | +checkpoint `11dcb6c`; Android source/package evidence is now in this repo and should |
| 6904 | +be synchronized on the next publication pass, without claiming device validation. |
0 commit comments