Files
pico-fido/COMPILING.md
2025-12-09 13:26:01 +01:00

188 lines
4.9 KiB
Markdown

# Compiling Pico-FIDO with Custom VID, PID, and AAGUID for RP2350
This guide walks you through compiling the pico-fido firmware from the token2 repository for RP2350 with your custom USB identifiers and AAGUID.
## Prerequisites
Before starting, ensure you have:
- ARM GCC toolchain installed (for Pico development)
- CMake 3.13 or higher
- Pico SDK properly installed
- Git
- Make
### Install on Ubuntu 22.04/24.04
```bash
# Update package lists
sudo apt-get update
# Install required packages
sudo apt-get install -y cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential git python3-pip
# Install additional dependencies for Pico SDK
sudo apt-get install -y libstdc++-arm-none-eabi-newlib
```
### Download and Setup Pico SDK
```bash
# Create a directory for Pico development
mkdir -p ~/pico
cd ~/pico
# Clone the Pico SDK
git clone https://github.com/raspberrypi/pico-sdk.git --branch master
cd pico-sdk
git submodule update --init
# Verify installation
cd ~
echo "Pico SDK path: $HOME/pico/pico-sdk"
```
**The PICO_SDK_PATH will be:** `$HOME/pico/pico-sdk`
## Step 1: Clone the pico-fido Repository
```bash
cd ~/pico
git clone https://github.com/token2/pico-fido
cd pico-fido
git submodule update --init --recursive
```
After this step, your working directory will be: `~/pico/pico-fido`
## Step 2: Modify AAGUID
The AAGUID is defined in `pico-keys-sdk/src/cbor.c`. Open the file and find the line:
```bash
nano ~/pico/pico-fido/pico-keys-sdk/src/cbor.c
```
Locate the AAGUID definition (search for `const uint8_t aaguid`):
**Find this:**
```c
const uint8_t aaguid[16] = { 0x89, 0xFB, 0x94, 0xB7, 0x06, 0xC9, 0x36, 0x73, 0x9B, 0x7E, 0x30, 0x52, 0x6D, 0x96, 0x81, 0x45 };
```
**Replace with:**
```c
const uint8_t aaguid[16] = { 0xab, 0x32, 0xf0, 0xc6, 0x22, 0x39, 0xaf, 0xbb, 0xc4, 0x70, 0xd2, 0xef, 0x4e, 0x25, 0x4d, 0xb7 };
```
Save the file (Ctrl+O, Enter, Ctrl+X in nano) or use your preferred editor.
## Step 3: Create Build Directory
```bash
cd ~/pico/pico-fido
mkdir build
cd build
```
## Step 4: Configure with CMake
Run CMake with your custom VID/PID and board type:
```bash
cmake .. -DPICO_SDK_PATH=$HOME/pico/pico-sdk -DPICO_BOARD=pico2 -DUSB_VID=0x349E -DUSB_PID=0x0099
```
## Step 5: Compile the Firmware
```bash
make -j$(nproc)
```
The `-j$(nproc)` flag uses all available CPU cores to speed up compilation.
If compilation succeeds, you'll see:
```
[100%] Built target pico_fido
```
The compiled firmware will be located at:
```
build/pico_fido.uf2
```
## Step 6: Flash to RP2350
1. **Put your RP2350 board into bootloader mode:**
- Hold the BOOTSEL button while plugging in USB, or
- Hold BOOTSEL and press the RESET button
2. **Find the mount point** - A USB mass storage device will appear:
```bash
lsblk
# Look for a device like sda1 or sdb1 that appeared recently
# Or check: ls /media/$USER/
```
3. **Mount it manually if needed:**
```bash
mkdir -p ~/pico/rp2350-mount
sudo mount /dev/sdX1 ~/pico/rp2350-mount
# Replace sdX1 with the actual device from lsblk
```
4. **Copy the UF2 file:**
```bash
cp ~/pico/pico-fido/build/pico_fido.uf2 ~/pico/rp2350-mount/
```
Or if the device auto-mounted:
```bash
cp ~/pico/pico-fido/build/pico_fido.uf2 /media/$USER/RP2350/
```
5. **Unmount and verify:**
```bash
sync
sudo umount ~/pico/rp2350-mount
# The device will automatically disconnect and reboot
```
The firmware is now installed. The LED should blink periodically after a few seconds.
## Verification
Once flashed:
1. The LED should blink periodically (idle mode)
2. When you connect the device, it should appear as a USB HID device with your custom VID/PID (0x349E:0x0099)
Verify with:
```bash
lsusb | grep 349E
# Should show: "Bus XXX Device YYY: ID 349e:0099"
```
## Troubleshooting
**CMake configuration fails:**
- Ensure `PICO_SDK_PATH=$HOME/pico/pico-sdk` is set correctly
- Run `cmake --version` to verify CMake 3.13+
- If SDK not found, verify it exists: `ls -la $HOME/pico/pico-sdk`
**Compilation fails with cryptography errors:**
- Ensure submodules are fully initialized: `git submodule update --init --recursive`
**AAGUID not applying:**
- Check if it's defined as a constant in a header file that was included during compilation
- Some builds may require a clean rebuild: `rm -rf build && mkdir build && cd build`
**Device doesn't appear after flashing:**
- Try flashing again, ensure BOOTSEL was held during USB connection
- Check for any error messages in dmesg: `dmesg | tail -20`
## Notes
- The dummy VID/PID (0xFEFF:0xFCFD) is used by default to avoid licensing issues
- VID/PID (0x349E:0x0099) can be used only on devices provided by Token2
- This firmware is released under AGPLv3 - if you distribute modified binaries, you must provide source code
- The AAGUID identifies your authenticator type in the FIDO ecosystem; however, there is currently no certificate provided, therefore no attestation