Mastodon

Fapico2 — The F**king Authenticator

Fapico2 is a US$5 board, the Raspberry Pi Pico 2, that becomes a multi-applet hardware authenticator: FIDO2 passkeys, OpenPGP, OATH and Nostr, in a single firmware, a single binary, a single composite USB device [1]. No vendor account.

Compartilhar
Fapico2 — The F**king Authenticator

Digital sovereignty doesn't end at the seed phrase.

My first cold wallet was a hardware wallet. I treated the thing like a talisman: a sealed box that held my savings in a way the internet couldn't reach. It slept in a drawer. The seed phrase slept in another safe. The complete liturgy of self-custody, celebrated without a single fault.

Then came the question that breaks the liturgy: what about the rest?

The email account that receives the bank alerts. The 2FA codes for the exchanges. The SSH key that opens my servers. The PGP identity that signs my commits. All of those guardians live on my phone — a permanently connected device, full of apps, full of permissions, full of attack surface. The key that moves my sats sleeps in a safe. The keys that move my entire digital life sleep in an app.

We no longer hold our keys. We rent them.

Fapico2 is a direct answer to that contradiction. A US$5 board — the Raspberry Pi Pico 2 [6] — becomes a multi-applet hardware authenticator: FIDO2 passkeys, OpenPGP, OATH and Nostr, in a single firmware, a single binary, a single composite USB device [1]. No vendor account. No cloud. No subscription. And the cryptography — generation, use and sealing of keys — happens entirely inside the board.

The same logic that took your Bitcoin off exchanges can take your credentials out of the hands of everyone who doesn't need them.


Part I: The Illusion of Security in Your Pocket

The problem isn't authentication apps; it's the model.

1. The app is the attack surface. Your TOTP codes live in a database of the app, on top of your phone's operating system. Your PGP private key, same. A keylogger captures what you type. A screen scraper captures what you see. A cloud-sync leak hands over everything the app "saved for safety." The guardian lives in the same house as the thieves.

2. Trust is inherited, not verified. We trust an app because it's "official," because the logo is familiar, because it has millions of downloads. That's not security; it's marketing. An official app with a bug becomes an official leak. A well-known compromised app becomes a well-known attack channel, aimed at millions of people at once.

3. Compromise is a cascade. A compromised 2FA app doesn't hand over one code. It hands over the email, the email hands over the exchanges, the exchanges hand over the path to your coins — through social engineering, password resets, SIM swaps. Your cold wallet doesn't matter if the identity around it is rented.

I'll concede the obvious: apps are convenient, and most of them work fine for a lifetime. That's exactly how every security model fails — until the day it fails with you inside it.


Part II: What Fapico2 Is

Fapico2 turns a Raspberry Pi Pico 2 into an authenticator that carries on a single board: FIDO2/U2F passkeys, an OpenPGP 3.4 identity, OATH codes (TOTP/HOTP), OTP slots in the YubiKey protocol and Nostr identities [1]. One firmware, one binary, one composite USB device. The ritual of buying four different tokens — one for passkeys, one for PGP, one for 2FA, and a fourth for Nostr, which the market doesn't sell — is replaced by a board that costs less than lunch.

The principle comes straight from the cold wallet: self-custody for credentials. Keys generated inside the board never leave it. At rest, everything is sealed under a root key derived from a chip-unique OTP row [1] — a flash dump lifted off your board is inert anywhere else. The same reasoning that keeps Bitcoin keys off internet-connected machines applies to the keys that guard your email, your code and your accounts.

And the part that sets Fapico2 apart from almost everything on the market: the firmware is Rust, AGPLv3-licensed, and the device build has no network stack at all [1]. It's not "trust us, we're transparent" — it's "compile it yourself." As the repository puts it: if you can read this, you can rebuild the device from source [1].


Part III: The Cryptography That Stays in the Device

Three mechanisms carry the promise of self-custody. None of it is marketing; all of it is in the code.

1. Generation on the board. Keys are born from the RP2350's hardware TRNG — the true-random generator fused into the silicon — and used only there [1]. What leaves the board is signatures and codes; what never leaves is key material. And every operation that touches a private key requires a physical touch [1]. Nothing is signed by accident. The bank that validates your code still mediates the transaction — and never touches the key material that produces the code.

2. Sealing at rest. Every record is AEAD-encrypted under a root key derived from the otp_key_1 OTP row — one-way-fused into the chip — plus the chip's own identity [1]. In shorthand: HKDF(otp_key_1, serial hash ‖ chipid) [1]. The firmware refuses to boot if the OTP row is unavailable; there is no public-constant fallback [1]. Which means the flash dump alone opens nothing — the store key is not in it. Two identical boards from the same batch derive different root keys.

3. Per-record commit. The store is not a monolithic block: each credential is written individually, with integrity verification. A torn write doesn't corrupt the rest [1]. A FIDO reset — what a browser or ykman fido reset triggers — does not take your OATH credentials or your Nostr identities with it [1]. Isolated failure is small failure.

The numbers give the promise its scale: 844 resident passkeys — derived from the current flash layout and verified by a test that enrolls credentials until the store refuses [2] — against 100 on a YubiKey 5 [1]. 68 OATH slots [2]. 8 Nostr identities [2]. A drawer of tokens in a thumb-sized object.


Part IV: Fapico2 vs. the Rest of the Market

Fapico2YubiKey 5Apps (Authy, Google Auth.)
FirmwareAGPLv3, rebuildableProprietary, sealedProprietary
Where keys liveOn the board (TRNG)In the secure elementIn the app, on the phone
Who holds custodyYouYou + Yubico (firmware)The app operator
Network on the deviceNoneNoneAlways
Resident passkeys844 (derived)100—
Nostr (NIP-07)Yes, signing on the boardNoNo
NFCNoYes—
Independent auditNo (internal red-team published)YesVaries

Let's be clear: the YubiKey is the mature choice. It has independent audits, certifications, years in battle. This article is not an attack on it. The difference is the trust model: with a YubiKey, you trust that Yubico did and will do the right thing — and the firmware is sealed, so "verify it yourself" isn't an option that exists. With Fapico2, the code is all on the table. If you don't trust the build, verify it. If you find a bug, fix it. If you want to fork it, fork it. Sealed trust versus inspectable trust.

Authenticator apps aren't competitors — they're the problem described in Part I. The TOTP code lives on the same device where the keyloggers live. Convenience is the product; the warehouse of your credentials is the price.

The Nostr applet deserves the spotlight because it has no equivalent on the market. The browser extension exposes the NIP-07 standard (window.nostr) [5]; the event is hashed in the browser and only the 32-byte sighash reaches the board; the NIP-44 nonce is generated on the device [1]. Every operation that touches the private key requires a physical touch, and custody can include a PIN with a three-attempt budget — exhausted, the board locks, and only a factory reset destroys the identities [4]. Custody is import-only: there is no export command in any dialect, by design [4] — a key imported from software keeps its paper copy; a key generated on the board never leaves it.


Part V: Under US$10 and Open Source

The shopping list is one board: a Raspberry Pi Pico 2, between US$5 and US$7 [6]. That's it. No proprietary secure element to trust, no sealed hardware to return to a vendor.

The shortest path: download the fapico2.uf2 image from the alpha release (sha256 in the release notes) or build from source with ./build.sh, which produces firmware/fapico2.uf2 [1]. To flash it: hold the BOOTSEL button, plug the board in and copy the file to the RP2350 drive that appears. Re-enumeration can take up to a minute — that's normal [1].

On Linux, two one-time edits, and both matter: the libccid allowlist for OpenPGP and OATH — without it your system sees no smartcard reader at all, which looks like broken hardware and isn't [3] — and the udev rule for the Nostr HID interface (platform/udev/70-fapico2-nostr.rules) [1]. The board enumerates as fa20:0002, a composite CCID + CTAP-HID device [3]. FIDO2 works immediately everywhere — Chrome, ykman and Yubico Authenticator verified against real hardware [1].

The complete manual, with every screen and every procedure: https://eddieoz.github.io/fapico2/ [7].


Part VI: What This Device Is Not

Here's the part no security announcement ever writes. Fapico2 is alpha, and honesty about that is part of the design.

The SWD debug port is open on every published image — on purpose, so alpha boards stay recoverable [1]. Which means: with brief physical access and a debug probe, someone extracts every key the device holds. Until the first vX.Y.Z-release tag, this is evaluation hardware: don't make it the only key to anything you can't afford to lose [1].

It is not independently audited — the published red-team assessment is of an earlier build; some findings addressed — not all [1]. It has no FIPS/Common Criteria certification and no NFC — a Pico 2 has no radio [1]. PIV is deferred. A known RSA timing advisory remains without an upstream fix [1].

Why publish your own weaknesses? Because they aren't critical and the alternative is worse. The repository says out loud what the entire industry avoids: its failures are public — and published findings are more useful than the reassurance that silences them [1].


Conclusion: Custody Is a Closed Package

Self-custody isn't a product; it's a package. The cold wallet guards the sats. The authenticator guards the keys that guard everything else — email, code, servers, identity. One without the other is a door with two locks and one key.

The math is implacable: US$5 and one afternoon, against the cost of a single credential cascade. You already paid the tuition on Bitcoin — "not your keys, not your coins" cost the industry too much to forget. The same math applies to your digital identity: if the keys that define you live in an app you don't control, sovereignty is borrowed.

The question isn't whether you'll protect your keys. The point is who holds the keys that protect you.


References

  1. fapico2 README — https://github.com/eddieoz/fapico2 (sections "What it does", "Security model, in plain terms", "What this is not", "Getting started")
  2. fapico2 docs/capacity.md — derivation of the storage ceilings (844 / 68 / 8)
  3. fapico2 docs/identity.md — VID/PID fa20:0002 and the libccid allowlist
  4. fapico2 docs/adr/0006-nostr-pin-custody.md — PIN custody for the Nostr applet (import-only)
  5. fapico2-nostr-extension — https://github.com/eddieoz/fapico2-nostr-extension (NIP-07 via WebHID)
  6. Raspberry Pi Pico 2 — https://s.click.aliexpress.com/e/_c37D3YYz
  7. User manual (mdBook) — https://eddieoz.github.io/fapico2/

Send sats if you liked.

⚡️eddieoz@sats4.life