Skip to content

Clench Wallet 0.3.27

Choose a tag to compare

@github-actions github-actions released this 31 Aug 02:45
· 3 commits to master since this release
Immutable release. Only release title and notes can be modified.
v0.3.27
51b7467

Clench Wallet 0.3.27

Clench Wallet 0.3.27 adds direct TAPSIGNER payment signing, moves wallet
operations to BDK Android 3.0.0, and adds device-level persistence and encrypted
database verification. The release retains the fail-closed, isolated signing
and three-build reproducibility controls introduced in v0.3.26.

TAPSIGNER payments

Clench can now use an imported TAPSIGNER to sign a single-signature BIP-84
native-SegWit payment directly over NFC. The supported boundary is deliberately
narrow:

  • PSBT v0 with native-SegWit P2WPKH inputs;
  • ECDSA SIGHASH_ALL only;
  • unhardened input paths below the card's authenticated BIP-84 account;
  • complete recipient, amount, change, fee, fee-rate, and input review in Clench
    before the PIN and NFC tap;
  • verification of the returned public key, compact low-S signature, and input
    ownership before copying only the verified partial signature into the
    original PSBT; and
  • the existing final-transaction policy checks plus a separate explicit
    broadcast action.

TAPSIGNER is screenless. It cannot display or independently confirm the
transaction, so the payment shown by Clench must be reviewed before entering
the PIN. Taproot, legacy, nested-SegWit, and P2WSH/multisig-cosigner TAPSIGNER
signing remain unsupported. Clench also does not provide a TAPSIGNER PIN-change
command in this version.

Real-card interoperability and PIN handling

The NFC implementation now accepts bounded, valid indefinite-length CBOR while
retaining byte, nesting, item-count, duplicate-key, and single-root limits. It
also verifies the derive-signature profile used by deployed TAPSIGNER firmware,
binds the selected account through an encrypted child-0/0 proof, validates
card/app network agreement, and canonicalizes and preflights the authenticated
account xpub with the same Android BDK parser used during wallet import.

Every TAPSIGNER PIN field uses a masked numeric keypad by default. Current
cards accept numeric PIN changes; an explicit letters-and-symbols fallback is
available for older cards that may retain a legacy alphanumeric PIN. PIN data
remains transient, and Clench dismisses the keyboard before NFC operations and
when leaving the relevant flow.

BDK, database, and build updates

  • BDK Android is upgraded from 2.3.1 to 3.0.0.
  • A dedicated two-version verification fixture creates persisted wallet state
    with BDK 2, opens it with BDK 3, and checks descriptors, addresses,
    transactions, UTXOs, and staged persistence behavior in place.
  • Android instrumentation opens the actual SQLCipher-backed Room database and
    rejects plaintext, wrong-key, and incompatible database states without a
    destructive fallback.
  • The Android Gradle Plugin moves to 9.3.1 and Kotlin to 2.4.10, with updated
    locks and dependency-verification metadata.
  • The Android instrumentation workflow exercises the real BDK parser and
    native database boundary in addition to JVM tests and lint.

BDK's per-wallet files contain public descriptors, scripts, and transaction
metadata. They are not SQLCipher-encrypted and continue to rely on the Android
application sandbox and device encryption. Seeds and extended private keys are
not persisted in those files.

Physical compatibility evidence and its limit

On 2026-08-30 the maintainer exercised the new path on a Pixel 8 Pro with a real
TAPSIGNER using the isolated debug candidate at commit 7a5918a:

  • package/version: net.clench.wallet.debug,
    0.3.26-tapsigner-test (326);
  • APK size: 64,515,556 bytes;
  • APK SHA-256:
    f2b5a2ec0d152798e36bd6b04806ff04db8565dc8ecd7064c307348e270d951a;
  • Mainnet BIP-84 account at m/84'/0'/0';
  • successful status, authenticated derive, encrypted child-0/0 proof, Android
    BDK xpub preflight, and watch-only wallet import; and
  • one-input, one-output payment of 10,067 sats with a 110-sat fee, no change or
    unexpected output, an explicit phone-side broadcast action, and two observed
    confirmations.

No PIN/CVC or wallet material was captured. This is useful real-card
compatibility evidence, but it is not an exact-artifact physical pass for the
final signed v0.3.27 APK. The later keyboard changes and the production build
have automated coverage but were not put through the same funded physical
flow. Multi-input, interruption, wrong-PIN, and the wider card/Android firmware
matrix remain separate acceptance work. The exact boundary is recorded in
docs/qa/physical-hardware-gates-v0.3.27.md.

The source-level threat and control review for this feature is recorded in
docs/security/security-review-v0.3.27.md.

Release verification

The only installable production artifact is clench-0.3.27-release.apk from
the signed GitHub release. clench-0.3.27-unsigned.apk is non-installable
reproducibility evidence. Verify the signed annotated source tag, checksum
manifest, APK signer certificate, package/version, SBOM, provenance, and
independent-build report as described in
docs/release/signed-release-verification.md.

F-Droid follows its own build and publication cadence and may show v0.3.26
briefly after the signed GitHub v0.3.27 release becomes available.