README.md

4.8 KB · raw

rendered · source

1# peach-android23The Android companion app for [Peach Password Manager](https://peachpasswords.com). Free, open source, local-first. Vault stays on the device, encrypted with AES-256-GCM, protected by Argon2id.45**Current version:** v2.9.206**Source:** [kepr.uk/peach-android](https://kepr.uk/peach-android)7**License:** GPL v389---1011## What this repo is1213Production Android app for Peach. Kotlin + Jetpack Compose + Hilt, single `:app` module. Holds the vault on-device, syncs to other paired devices over a Noise NK/KK channel through a cloud relay, and provides inline autofill, Quick Settings tile, passkey support, Codex paper backup, and updates-from-Kepr.1415Not a fork and not a port — every byte-level decision (Argon2id parameters, per-entry sync envelope, Codex RS/Deflate/Aztec envelope, Noise NK/KK wire format, vault slots, recovery escrow) is verified against the browser implementation in `peach-browser`. See [`docs/browser-parity-map.md`](./docs/browser-parity-map.md) for the per-primitive parity contract.1617---1819## Repository layout2021```22app/src/main/java/com/peachpasswords/23  sync/          Pairing, Noise handshakes, relay dialer, mesh manifest24  autofill/      Inline + Accessibility autofill providers25  codex/         Aztec encoder, RS erasure, deflate codec26  passkeys/      WebAuthn / passkey storage and assertion27  ui/            Compose screens (Lock, Vault, Settings, Trash, etc.)28  qs/            Quick Settings tile29  di/            Hilt modules30  shared/        Cross-screen utilities3132docs/            Cryptographic vector provenance, browser parity map, audit33app/drafts/      One-off integration drafts (often retired)34```3536The canonical Noise core (`NK` and `KK` patterns, X25519, ChaCha20-Poly1305, BLAKE2s, nonce state) lives in **`../peach-browser/crypto-core`** as a Rust crate. Android drives it via JNI; see [`docs/NOISE-CORE-PROVENANCE.md`](./docs/NOISE-CORE-PROVENANCE.md).3738---3940## Building4142Requires JDK 17, Android SDK 34, NDK r26+, Rust toolchain.4344```bash45# 1. Build the shared Noise core (one time, or whenever the crate changes)46(cd ../peach-browser/crypto-core && cargo build --locked --release)4748# 2. Build the app49./gradlew assembleRelease       # signed release APK50./gradlew assembleDebug         # debug APK with com.peachpasswords.debug id51./gradlew testDebugUnitTest     # sync + vault + crypto unit tests52```5354Outputs land in `app/build/outputs/apk/{release,debug}/`. CI uses [`scripts/kepr-build-apk.sh`](./scripts/kepr-build-apk.sh) which signs and uploads to Kepr under a platform allowlist (currently `android-arm64`).5556The single source of truth for the version is the repository-root [`VERSION`](./VERSION) file. `versionName` in `app/build.gradle` reads it directly; `versionCode` is derived deterministically from the version string.5758---5960## Sync model6162- **Pairing** — invitation over the cloud relay; Noise NK handshake establishes the rendezvous secret.63- **Adoption** — one device (source) commits its encrypted vault to another (receiver) via an authenticated Noise KK channel. The source ships a snapshot; the receiver reconstructs entries + tombstone state + duress slot, then exchanges a signed device-manifest for the mesh.64- **Mesh propagation** — every device advertises a `deviceManifestVersion` in `SYNC_HELLO`. When both peers advertise the same version, signed device graphs are exchanged even on equal entry versions so introductions and revocations converge across multi-hop edges.65- **Revocations are terminal** — once a device's id or long-term key lands in the revocation list, no manifest re-admits it. `isDeviceRevoked(deviceId, longTermPublicKeyHex)` checks both, keyed on the key as well as the id so a revoked key can't walk back in under a fresh id.6667See [`docs/CRYPTOGRAPHIC-TEST-VECTORS.md`](./docs/CRYPTOGRAPHIC-TEST-VECTORS.md) for the byte-level vectors that pin this implementation to RFC 9106 Argon2id, NIST CAVP AES-GCM, BLAKE3 reference input, and the Cacophony Noise NK/KK test catalog.6869---7071## Audits7273[`peach-android-audit-report.md`](./peach-android-audit-report.md) records the most recent read-only adversarial review against `peach-browser`. Cryptographic primitives are clean and byte-equivalent; lifecycle and parity findings are tracked against the version that received them and resolved in subsequent saves.7475---7677## Version control7879This repo uses Koh, not git. Snapshots live locally and are offered to [kepr.uk](https://kepr.uk) for review and distribution.8081```bash82koh status                        # current working tree83koh save "feat: ..."              # atomic save84koh checkpoint                    # pre-anything-risky restore point85koh offer peach-android           # push to kepr.uk86koh offer peach-android --builds  # build + publish APKs87```8889`.agent/CONTINUITY.md` is the live handoff file for any session that has to stop mid-campaign.9091---9293## License9495GPL v3 — see [`LICENSE`](./LICENSE).