The v1 action (org.openintents.openpgp.IOpenPgpService) resolves in Keychain 6.0.4 but its binder does not implement the IOpenPgpService2 AIDL descriptor that OpenPgpApi calls through, so every call died with SecurityException: Binder invocation to an incorrect interface. Bind the IOpenPgpService2 service first (v1 and the very old api.OpenPgpService actions remain as fallbacks). Android 11+ package visibility also hid Keychain's services entirely: resolveService/bindService found nothing from the app even with MANAGE_EXTERNAL_STORAGE granted, so the build now injects a <queries> element (package + intent) into the decoded manifest. |
||
|---|---|---|
| cmd | ||
| scripts | ||
| .gitignore | ||
| go.mod | ||
| go.sum | ||
| impl_android.go | ||
| impl_darwin.go | ||
| impl_linux.go | ||
| impl_shared.go | ||
| jni_android.c | ||
| jni_android.go | ||
| jni_android.h | ||
| main.go | ||
| openpgp-api.jar | ||
| Permissions.jar | ||
| Permissions.java | ||
| PgpConnect.jar | ||
| PgpConnect.java | ||
| README.md | ||
passgo
This repository includes Go code to interact with pass, the Unix password
manager. Library code is provided to open a password store, list
saved passwords, and decrypt specified passwords. The library provides
a simple passphrase input function, or, if gpg-agent is running (on MacOS),
it will connect automatically to request your GPG passphrase. On Android,
passgo connects to OpenKeychain. MacOS and Android users can also ask passgo
to copy a password directly to the clipboard.
store := passgo.Store{}
// directory defaults to ~/.password-store, or set it manually here:
// store.Dir = "/home/me/.pw-store"
err := passgo.GetStore(&store)
if err != nil { ... }
passlist := store.List()
for _,x := range passlist {
if x.Pathname == "myPass" {
p, err := store.Decrypt(x.Pathname)
if err == nil {
passgo.Clip(p) // put on the clipboard
} else {
log.Fatal("Cannot decrypt ", x.Pathname)
}
}
}
/// or just do:
p, err := store.Decrypt("myPass")
...
Also included is a simple GUI front-end using Gio
that works on MacOS and Android. See cmd/passgo-gui.
Building the Android APK
Use scripts/build.sh — do not build by hand:
./scripts/build.sh phone # build + install on the phone
./scripts/build.sh phone --no-install
./scripts/build.sh emu # emulator build (amd64)
It outputs cmd/passgo-gui/passgo-gui.apk (APKs are git-ignored and
regenerated by the script). The script, in order:
gogio -target android -targetsdk 34(from~/go/bin; packages the Go code plus the*.jarJNI classes found incmd/passgo-gui/),- apktool decode → inject
MANAGE_EXTERNAL_STORAGEinto the manifest (gogio's hardcoded permission table lacks it, and without it the system "All files access" toggle is grayed out on Android 11+) → apktool rebuild, - sign with the debug keystore (
~/.android/debug.keystore), adb install -r.
Prereqs: JDK, Go + gogio, Android SDK at ~/android-sdk
(platform-tools + build-tools 35.0.0). apktool v3.0.3 is auto-downloaded
to ~/android-sdk/tools/apktool.jar if missing. The script checks each
prereq and says what is missing. The phone is reached via adb over the
WireGuard address (see the global AGENTS.md).