FIDO Passkey for Raspberry Pico and ESP32
See the codeThis project transforms your Raspberry Pi Pico or ESP32 microcontroller into an integrated FIDO Passkey, functioning like a standard USB Passkey for authentication.
If you are looking for a OpenPGP + Fido, see: https://github.com/polhenarejos/pico-fido2. Available through PicoKey App.
Pico FIDO includes the following features:
The authenticated credential export and import design is described in Pol
Henarejos, Vaulted Passkeys: A Device-Bound Proposal for Authenticated
Credential Export and Import. The proposal
and implementation notes are also available in
docs/vault.
All features comply with the specifications. If you encounter unexpected behavior or deviations from the specifications, please open an issue.
Microcontrollers RP2350 and ESP32-S3 are designed to support secure environments when Secure Boot is enabled, and optionally, Secure Lock. These features allow a master key encryption key (MKEK) to be stored in a one-time programmable (OTP) memory region, which is inaccessible from outside secure code. This master key is then used to encrypt all private and secret keys on the device, protecting sensitive data from potential flash memory dumps.
However, the RP2040 microcontroller lacks this level of security hardware, meaning that it cannot provide the same protection. Data stored on its flash memory, including private or master keys, can be easily accessed or dumped, as encryption of the master key itself is not feasible. Consequently, if an RP2040 device is stolen, any stored private or secret keys may be exposed.
If you own an ESP32-S3 board, go to ESP32 Flasher for flashing your Pico FIDO.
If you own a Raspberry Pico (RP2040 or RP2350), go to Download page, select your vendor and model and download the proper firmware; or go to Release page and download the UF2 file for your board.
UF2 files are shiped with a VID/PID granted by RaspberryPi (2E8A:10FE). If you plan to use it with OpenSC or similar tools, you should modify Info.plist of CCID driver to add these VID/PID or use the PicoKey App.
You can use whatever VID/PID for internal purposes, but remember that you are not authorized to distribute the binary with a VID/PID that you do not own.
Note that the PicoKey App is the most recommended.
Before building, ensure you have installed the toolchain for the Pico and that the Pico SDK is properly located on your drive.
git clone https://github.com/polhenarejos/pico-fido
git submodule update --init --recursive
cd pico-fido
mkdir build
cd build
PICO_SDK_PATH=/path/to/pico-sdk cmake .. -DPICO_BOARD=board_type -DUSB_VID=0x1234 -DUSB_PID=0x5678
make
Note that PICO_BOARD, USB_VID and USB_PID are optional. If not provided, pico board and VID/PID FEFF:FCFD will be used.
Additionally, you can pass the VIDPID=value parameter to build the firmware with a known VID/PID. The supported values are:
NitroHSMNitroFIDO2NitroStartNitroProNitro3Yubikey5YubikeyNeoYubiHSMGnukGnuPGAfter running make, the binary file pico_fido.uf2 will be generated. To load this onto your Pico board:
BOOTSEL button while plugging it in.pico_fido.uf2 file to the new USB mass storage device that appears.Pico FIDO uses the led to indicate the current status. Four states are available:
The Led is almost on all the time. It goes off for 100 miliseconds every second.

In idle mode, the Pico FIDO goes to sleep. It waits for a command and it is awaken by the driver. The Led is almost off all the time. It goes on for 500 milliseconds every second.

In active mode, the Pico FIDO is awaken and ready to receive a command. It blinks four times in a second.

While processing, the Pico FIDO is busy and cannot receive additional commands until the current is processed. In this state, the Led blinks 20 times in a second.

Pico FIDO uses the HID driver, which is present in all operating systems. It should be detected by all OS and browser/applications just like normal USB FIDO keys.
Tests can be found in the tests folder. They are based on FIDO2 tests from Solokeys but adapted to the python-fido2 v1.0 package, which is a major refactor from the previous 0.8 version and includes the latest improvements from CTAP 2.1.
To run all tests, use:
pytest
To run a subset of tests, use the -k <test> flag:
pytest -k test_credprotect
This project is available under two editions:
Community Edition (FOSS)
Enterprise / Commercial Edition
Typical licensing models:
These options are scoped and priced individually depending on which components you actually need.
For commercial licensing and enterprise features, email pol@henarejos.me
Subject: ENTERPRISE LICENSE <your company name>
See ENTERPRISE.md for details.
Pico FIDO uses the following libraries or portion of code:
175 followers · starred May 2024
158 followers · starred May 2026
156 followers · starred Jul 2025
366 followers · starred Jun 2026
FIDO Passkey for Raspberry Pico and ESP32
See the codeThis project transforms your Raspberry Pi Pico or ESP32 microcontroller into an integrated FIDO Passkey, functioning like a standard USB Passkey for authentication.
If you are looking for a OpenPGP + Fido, see: https://github.com/polhenarejos/pico-fido2. Available through PicoKey App.
Pico FIDO includes the following features:
The authenticated credential export and import design is described in Pol
Henarejos, Vaulted Passkeys: A Device-Bound Proposal for Authenticated
Credential Export and Import. The proposal
and implementation notes are also available in
docs/vault.
All features comply with the specifications. If you encounter unexpected behavior or deviations from the specifications, please open an issue.
Microcontrollers RP2350 and ESP32-S3 are designed to support secure environments when Secure Boot is enabled, and optionally, Secure Lock. These features allow a master key encryption key (MKEK) to be stored in a one-time programmable (OTP) memory region, which is inaccessible from outside secure code. This master key is then used to encrypt all private and secret keys on the device, protecting sensitive data from potential flash memory dumps.
However, the RP2040 microcontroller lacks this level of security hardware, meaning that it cannot provide the same protection. Data stored on its flash memory, including private or master keys, can be easily accessed or dumped, as encryption of the master key itself is not feasible. Consequently, if an RP2040 device is stolen, any stored private or secret keys may be exposed.
If you own an ESP32-S3 board, go to ESP32 Flasher for flashing your Pico FIDO.
If you own a Raspberry Pico (RP2040 or RP2350), go to Download page, select your vendor and model and download the proper firmware; or go to Release page and download the UF2 file for your board.
UF2 files are shiped with a VID/PID granted by RaspberryPi (2E8A:10FE). If you plan to use it with OpenSC or similar tools, you should modify Info.plist of CCID driver to add these VID/PID or use the PicoKey App.
You can use whatever VID/PID for internal purposes, but remember that you are not authorized to distribute the binary with a VID/PID that you do not own.
Note that the PicoKey App is the most recommended.
Before building, ensure you have installed the toolchain for the Pico and that the Pico SDK is properly located on your drive.
git clone https://github.com/polhenarejos/pico-fido
git submodule update --init --recursive
cd pico-fido
mkdir build
cd build
PICO_SDK_PATH=/path/to/pico-sdk cmake .. -DPICO_BOARD=board_type -DUSB_VID=0x1234 -DUSB_PID=0x5678
make
Note that PICO_BOARD, USB_VID and USB_PID are optional. If not provided, pico board and VID/PID FEFF:FCFD will be used.
Additionally, you can pass the VIDPID=value parameter to build the firmware with a known VID/PID. The supported values are:
NitroHSMNitroFIDO2NitroStartNitroProNitro3Yubikey5YubikeyNeoYubiHSMGnukGnuPGAfter running make, the binary file pico_fido.uf2 will be generated. To load this onto your Pico board:
BOOTSEL button while plugging it in.pico_fido.uf2 file to the new USB mass storage device that appears.Pico FIDO uses the led to indicate the current status. Four states are available:
The Led is almost on all the time. It goes off for 100 miliseconds every second.

In idle mode, the Pico FIDO goes to sleep. It waits for a command and it is awaken by the driver. The Led is almost off all the time. It goes on for 500 milliseconds every second.

In active mode, the Pico FIDO is awaken and ready to receive a command. It blinks four times in a second.

While processing, the Pico FIDO is busy and cannot receive additional commands until the current is processed. In this state, the Led blinks 20 times in a second.

Pico FIDO uses the HID driver, which is present in all operating systems. It should be detected by all OS and browser/applications just like normal USB FIDO keys.
Tests can be found in the tests folder. They are based on FIDO2 tests from Solokeys but adapted to the python-fido2 v1.0 package, which is a major refactor from the previous 0.8 version and includes the latest improvements from CTAP 2.1.
To run all tests, use:
pytest
To run a subset of tests, use the -k <test> flag:
pytest -k test_credprotect
This project is available under two editions:
Community Edition (FOSS)
Enterprise / Commercial Edition
Typical licensing models:
These options are scoped and priced individually depending on which components you actually need.
For commercial licensing and enterprise features, email pol@henarejos.me
Subject: ENTERPRISE LICENSE <your company name>
See ENTERPRISE.md for details.
Pico FIDO uses the following libraries or portion of code:
175 followers · starred May 2024
158 followers · starred May 2026
156 followers · starred Jul 2025
366 followers · starred Jun 2026