Repository navigation
Releases: dangerousplay/passkey-tpm
Release list
v0.1.0-beta.2
0.1.0-beta.2 - 2026-10-14
Second beta — for testing, not daily use yet. Please report problems with the bug report form and include the output of
passkey-tpm info.
passkey-tpm turns your laptop into a FIDO2 security key: passkeys live in the TPM 2.0 chip and are unlocked with your fingerprint (fprintd) or a PIN. It works with browsers, fido2-token, pam_u2f and systemd-cryptenroll through a virtual USB security key.
New in this beta
- Tray icon (
passkey-tpm-tray, starts with your desktop session): shows whether the fingerprint reader, the background service and the virtual security key work, enrolls a new fingerprint in one click, and sets or changes the security-key PIN. Needs a StatusNotifierItem tray (KDE, Xfce, Cinnamon, waybar…; GNOME with the AppIndicator extension) and zenity or kdialog for PIN entry. - Passkeys without a fingerprint reader: users with no enrolled fingerprint can set a PIN and register/sign in with it, confirming each use by clicking Allow on a desktop notification. Users with a fingerprint keep the fingerprint touch.
What to test
- Register and sign in on webauthn.io in Firefox and Chromium with your fingerprint.
- Set a PIN (tray, browser or
fido2-token -S), discoverable passkeys,hmac-secret/PRF. - On a machine without a reader (or with no finger enrolled): set a PIN from the tray, then register on webauthn.io and click Allow.
- The tray on your desktop: status lines, Enroll new fingerprint, Set PIN… / Change PIN….
- Fast user switching: the key is only available to the user in front of the screen.
- Install, upgrade and removal of the package on your distribution.
Packages
| File | For |
|---|---|
passkey-tpm_0.1.0-beta.2_amd64.deb |
Ubuntu 24.04+, Debian 13+ |
passkey-tpm_0.1.0-beta.2_amd64.rpm |
Fedora and other RPM distributions with tpm2-tss |
passkey-tpm_0.1.0-beta.2_amd64.pkg.tar.zst |
Arch Linux |
passkey-tpm-0.1.0-beta.2.tar.gz |
source tree layout (cargo xtask dist) |
Only x86_64 for now. Requirements: TPM 2.0 (/dev/tpmrm0), systemd, and fprintd for fingerprint use.
Verifying the packages
Every package and checksums.txt is signed with Sigstore by this repository's release workflow (*.sigstore.json), and GitHub keeps build provenance for each file:
cosign verify-blob --bundle passkey-tpm_0.1.0-beta.2_amd64.deb.sigstore.json \
--certificate-identity-regexp '^https://github.com/dangerousplay/passkey-tpm/\.github/workflows/release\.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
passkey-tpm_0.1.0-beta.2_amd64.deb
gh attestation verify passkey-tpm_0.1.0-beta.2_amd64.deb --repo dangerousplay/passkey-tpmKnown issues
- Any user in front of the screen can use
/dev/uhid, which can create any kind of HID device, not only security keys. A dedicated helper is planned. - A silent credential probe (
up=false) can reveal whether a credential exists for a site, before any verification. authenticatorResetis accepted at any time, not only within 10 s of the device appearing.- Wrong PINs are budgeted per user so one user can't lock the TPM for everyone; a correct PIN does not clear that budget before the TPM's recovery interval.
- Without a fingerprint, presence is a desktop notification: malware running as you that learned your PIN could click or fake it (especially on X11). A trusted on-screen prompt is planned.
- The tray and the presence notification were tested with automated tests, not yet on every desktop; please report how they behave on yours.
- The
.debuses Ubuntu 24.04 / Debian 13 library names and glibc 2.39 or newer.
Features
- uv: enroll fingerprints through fprintd by @dangerousplay (1eec08b)
- tray: add passkey-tpm-tray status icon with fingerprint enrollment by @dangerousplay (aa677f5)
- core: let users without a fingerprint confirm presence by @dangerousplay (059e951)
- uvd: ask the Ctap caller to confirm presence over D-Bus by @dangerousplay (c5e793e)
- agent: Allow/Deny notification for presence requests by @dangerousplay (59a321e)
- tray: set or change the security-key PIN by @dangerousplay (3654882)
Bug fixes
- uv: don't activate a running fprintd when describing the device by @dangerousplay (66195b4)
Documentation
- specs: record the signed v0.1.0-beta.1 build and its verification by @dangerousplay (5193f90)
- specs: record the published v0.1.0-beta.1 pre-release by @dangerousplay (632adc3)
- document the tray icon and record its spec and decision by @dangerousplay (5caac4e)
- record PIN + presence for users without a fingerprint by @dangerousplay (2120cd7)
Build and CI
- release: publish git-cliff release notes after GoReleaser by @dangerousplay (5fbc108)
- packaging: install passkey-tpm-tray with XDG autostart by @dangerousplay (e61fb6a)
v0.1.0-beta.1
0.1.0-beta.1 - 2026-10-04
First public beta — for testing, not daily use yet. Please report problems with the bug report form and include the output of
passkey-tpm info.
passkey-tpm turns your laptop into a FIDO2 security key: passkeys live in the TPM 2.0 chip and are unlocked with your fingerprint (fprintd) or a PIN. It works with browsers, fido2-token, pam_u2f and systemd-cryptenroll through a virtual USB security key.
What to test
- Register and sign in on webauthn.io in Firefox and Chromium with your fingerprint.
- Set a PIN (
fido2-token -S), discoverable passkeys,hmac-secret/PRF. - Fast user switching: the key is only available to the user in front of the screen.
- Install, upgrade and removal of the package on your distribution.
Packages
| File | For |
|---|---|
passkey-tpm_0.1.0-beta.1_amd64.deb |
Ubuntu 24.04+, Debian 13+ |
passkey-tpm_0.1.0-beta.1_amd64.rpm |
Fedora and other RPM distributions with tpm2-tss |
passkey-tpm_0.1.0-beta.1_amd64.pkg.tar.zst |
Arch Linux |
passkey-tpm-0.1.0-beta.1.tar.gz |
source tree layout (cargo xtask dist) |
Only x86_64 for now. Requirements: TPM 2.0 (/dev/tpmrm0), systemd, and fprintd for fingerprint use.
Verifying the packages
Every package and checksums.txt is signed with Sigstore by this repository's release workflow (*.sigstore.json), and GitHub keeps build provenance for each file:
cosign verify-blob --bundle passkey-tpm_0.1.0-beta.1_amd64.deb.sigstore.json \
--certificate-identity-regexp '^https://github.com/dangerousplay/passkey-tpm/\.github/workflows/release\.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
passkey-tpm_0.1.0-beta.1_amd64.deb
gh attestation verify passkey-tpm_0.1.0-beta.1_amd64.deb --repo dangerousplay/passkey-tpmKnown issues
- Any user in front of the screen can use
/dev/uhid, which can create any kind of HID device, not only security keys. A dedicated helper is planned. - A silent credential probe (
up=false) can reveal whether a credential exists for a site, before any verification. authenticatorResetis accepted at any time, not only within 10 s of the device appearing.- Wrong PINs are budgeted per user so one user can't lock the TPM for everyone; a correct PIN does not clear that budget before the TPM's recovery interval.
- Users without a fingerprint reader can use a PIN for verification but can't confirm presence yet (needs a trusted on-screen prompt).
- The
.debuses Ubuntu 24.04 / Debian 13 library names and glibc 2.39 or newer.
Features
- wire: panic-free wire formats for untrusted input by @dangerousplay (9931967)
- core: verified CTAP 2.1 authenticator core by @dangerousplay (14e9b58)
- tpm: policy-bound credentials behind per-user TPM gates by @dangerousplay (7185664)
- uv: fprintd verification client and mock by @dangerousplay (953b3d3)
- uhid: virtual FIDO HID device without unsafe code by @dangerousplay (dc824d8)
- broker, session agent and admin CLI by @dangerousplay (beccadd)
- uvd: log the calling uid and CTAP command of each request by @dangerousplay (7cbdb4f)
- cli: add
versionandinfodiagnostics commands by @dangerousplay (ccc0972) - cli: [breaking] install the command line tool as
passkey-tpmby @dangerousplay (6e8c077)
Bug fixes
- packaging: load uhid at boot and install the binaries cargo built by @dangerousplay (951cfd3)
- uvd: serve only users with an active seat session by @dangerousplay (1821259)
- agent: remove the virtual key while the session is in the background by @dangerousplay (8f47348)
- core: restore PIN retries when the TPM never checked the PIN by @dangerousplay (8ad6255)
- core: enforce UV and PIN blocks in the fingerprint gesture path by @dangerousplay (fa0495d)
- uv: activate fprintd before resolving its owner by @dangerousplay (ecc2496)
- uvd: keep advertising no built-in UV when fprintd is unreachable by @dangerousplay (61dcb13)
- core: authenticate credMgmt delete/update before the lookup by @dangerousplay (315bccc)
- core: zeroize hmac-secret outputs and PIN hashes by @dangerousplay (cb1e553)
- core: MAC credMgmt subCommandParams over the received bytes by @dangerousplay (4f7fcf6)
- agent: CTAPHID INIT aborts the channel's request, rejects unknown CIDs by @dangerousplay (a0c3576)
- uvd: register the cancel token before the request's first await by @dangerousplay (883df37)
- uvd: exit non-zero when the TPM worker thread dies by @dangerousplay (16318cf)
- cli: refuse
user removewhile passkey-tpm-uvd is running by @dangerousplay (9728472) - core: omit hmac-secret output for credentials created without it by @dangerousplay (3412e96)
- tpm: provision gates only on makeCredential and setPIN by @dangerousplay (afa2a49)
- tpm: make PIN rotation crash-safe with a pending-change marker by @dangerousplay (d7c68b1)
- tpm: cap each uid's wrong PINs on the shared DA counter by @dangerousplay (8899b1f)
- tpm: don't delete a temp file write_atomic didn't create by @dangerousplay (f151e62)
Refactoring
- drop the passkey-tpm- prefix from crate directories by @dangerousplay (a81da2f)
Documentation
- specs, threat model and ADRs 0001-0003 by @dangerousplay (ac2508d)
- record the VM test bed, BSD portability policy and lessons by @dangerousplay (818526a)
- write an end-user README and move developer docs to CONTRIBUTING by @dangerousplay (895794d)
- add issue forms for problem reports and missing support by @dangerousplay (6a9ce6a)
- specs: drop a local path from the legacy codebase map by @dangerousplay (8932cc0)
- specs: plan the beta release, review hardening and CTAP crates by @dangerousplay (ff0d6ca)
- specs: record hardening P1 results and the seat-binding decision by @dangerousplay (992c015)
- specs: record hardening phase 3 results by @dangerousplay (a1c489b)
- specs: record hardening TPM batch results and the H8 budget design by @dangerousplay (b7086da)
Testing
- e2e: make the libfido2 checks portable across versions by @dang...