polhenarejos/pico-fido
GitHub: polhenarejos/pico-fido
将 Raspberry Pi Pico 或 ESP32 微控制器转变为符合 FIDO 标准的 USB 硬件认证密钥,支持无密码登录、双因素认证和一次性密码生成。
Stars: 1339 | Forks: 210
# Pico FIDO
本项目可将您的 Raspberry Pi Pico 或 ESP32 微控制器转变为一个集成的 FIDO Passkey,其功能类似于标准的 USB Passkey,用于身份验证。
如果您正在寻找 OpenPGP + Fido,请参见:https://github.com/polhenarejos/pico-fido2。可通过 [PicoKey App](https://www.picokeys.com/picokeyapp/ "PicoKey App") 获取。
## 功能
Pico FIDO 包含以下功能:
- CTAP 2.1 / CTAP 1
- WebAuthn
- U2F
- HMAC-Secret extension
- CredProtect extension
- 通过物理按键强制执行用户存在性检查
- 通过 PIN 进行用户验证
- 可发现凭证(常驻密钥)
- 凭证管理
- ECDSA 和 EDDSA 身份验证
- 支持 SECP256R1、SECP384R1、SECP521R1、SECP256K1 和 Ed25519 曲线
- 应用注册和登录
- 设备选择
- 支持厂商配置
- 24 个单词的备份
- 安全锁,保护设备免受闪存转储
- 权限支持(MC、GA、CM、ACFG、LBW)
- 认证器配置
- minPinLength extension
- 自证明
- 企业证明
- credBlobs extension
- largeBlobKey extension
- 支持 Large blobs(最大 2048 字节)
- OATH(基于 YKOATH 协议规范)
- TOTP / HOTP
- Yubikey One Time Password
- 挑战-响应生成
- 模拟键盘接口
- 按下按键会生成并直接输入 OTP
- 兼容 Yubico Authenticator 应用
- 兼容 Yubico YKMAN
- 兼容 Nitrokey nitropy 和 nitroapp
- RP2350 和 ESP32-S3 MCU 中的 Secure Boot 和 Secure Lock
- 一次性编程,用于存储加密所有常驻密钥和种子的主密钥。
- 恢复界面,允许在设备无响应或无法检测时进行恢复。
- 通过 PicoKey App 自定义 LED。
所有功能均符合规范。如果您遇到意外行为或与规范的偏差,请提交 issue。
## 安全考量
微控制器 RP2350 和 ESP32-S3 旨在启用 Secure Boot 以及可选的 Secure Lock 时支持安全环境。这些功能允许将主密钥加密密钥(MKEK)存储在一次性编程(OTP)内存区域中,外部安全代码无法访问该区域。然后,该主密钥用于加密设备上的所有私钥和秘密密钥,从而保护敏感数据免受潜在的闪存转储。
**但是**,RP2040 微控制器缺乏这种级别的安全硬件,这意味着它无法提供相同的保护。存储在其闪存中的数据(包括私钥或主密钥)可以很容易地被访问或转储,因为对主密钥本身进行加密是不可行的。因此,如果 RP2040 设备被盗,任何存储的私钥或秘密密钥都可能被泄露。
## 下载
**如果您拥有 ESP32-S3 开发板,请前往 [ESP32 Flasher](https://www.picokeys.com/esp32-flasher/) 为您的 Pico FIDO 刷入固件。**
如果您拥有 Raspberry Pico(RP2040 或 RP2350),请前往 [下载页面](https://www.picokeys.com/getting-started/),选择您的厂商和型号并下载相应的固件;或者前往 [发布页面](https://www.github.com/polhenarejos/pico-fido/releases/) 下载适用于您开发板的 UF2 文件。
UF2 文件附带了由 RaspberryPi 授权的 VID/PID (2E8A:10FE)。如果您计划将其与 OpenSC 或类似工具一起使用,您应该修改 CCID 驱动程序的 Info.plist 以添加这些 VID/PID,或者使用 [PicoKey App](https://www.picokeys.com/picokeyapp/ "PicoKey App")。
您可以将任何 VID/PID 用于内部目的,但请记住,您无权使用不属于您的 VID/PID 分发二进制文件。
请注意,最推荐使用的是 [PicoKey App](https://www.picokeys.com/picokeyapp/ "PicoKey App")。
## 为 Raspberry Pico 构建
在构建之前,请确保您已安装适用于 Pico 的工具链,并且 Pico SDK 已正确放置在您的驱动器上。
```
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
```
请注意,`PICO_BOARD`、`USB_VID` 和 `USB_PID` 是可选的。如果未提供,将使用 `pico` 开发板和 VID/PID `FEFF:FCFD`。
此外,您可以传递 `VIDPID=value` 参数,以使用已知的 VID/PID 构建固件。支持的值包括:
- `NitroHSM`
- `NitroFIDO2`
- `NitroStart`
- `NitroPro`
- `Nitro3`
- `Yubikey5`
- `YubikeyNeo`
- `YubiHSM`
- `Gnuk`
- `GnuPG`
运行 `make` 后,将生成二进制文件 `pico_fido.uf2`。要将其加载到您的 Pico 开发板上:
1. 在插入开发板的同时按住 `BOOTSEL` 按钮,使 Pico 开发板进入加载模式。
2. 将 `pico_fido.uf2` 文件复制到新出现的 USB 大容量存储设备中。
3. 文件复制完成后,Pico 大容量存储设备将自动断开连接,并且 Pico 开发板将使用新固件重置。
4. 闪烁的 LED 将指示设备已准备好工作。
## LED 闪烁
Pico FIDO 使用 LED 指示当前状态。共有四种可用状态:
### 按下确认
LED 几乎一直亮着。它每秒熄灭 100 毫秒。

### 空闲模式
在空闲模式下,Pico FIDO 进入睡眠状态。它等待命令并由驱动程序唤醒。LED 几乎一直熄灭。它每秒点亮 500 毫秒。

### 激活模式
在激活模式下,Pico FIDO 已被唤醒并准备好接收命令。它在一秒内闪烁四次。

### 处理中
在处理过程中,Pico FIDO 处于忙碌状态,在当前命令处理完成之前无法接收其他命令。在此状态下,LED 每秒闪烁 20 次。

## 驱动程序
Pico FIDO 使用所有操作系统中都存在的 `HID` 驱动程序。所有操作系统和浏览器/应用程序都应该像检测普通的 USB FIDO 密钥一样检测到它。
## 测试
测试可以在 `tests` 文件夹中找到。它们基于 Solokeys 的 [FIDO2 测试](https://github.com/solokeys/fido2-tests "FIDO2 tests"),但适配了 [python-fido2](https://github.com/Yubico/python-fido2 "python-fido2") v1.0 软件包,这是对先前 0.8 版本的重大重构,并包含了 CTAP 2.1 的最新改进。
要运行所有测试,请使用:
```
pytest
```
要运行一部分测试,请使用 `-k ` 标志:
```
pytest -k test_credprotect
```
## 许可证与商业用途
本项目提供两个版本:
**社区版 (FOSS)**
- 基于 GNU Affero General Public License v3 (AGPLv3) 发布。
- 您可以自由地学习、修改和运行代码,包括用于内部评估。
- 如果您分发修改后的二进制文件/固件,或者您将本项目的修改版本作为可网络访问的服务运行,您必须根据 AGPLv3 的要求,向该二进制文件或服务的用户提供相应的源代码。
- 不提供任何担保。不提供 SLA。不提供保证支持。
**企业 / 商业版**
- 针对希望满足以下条件的组织的专有许可:
- 在具有多个用户/设备的生产环境中运行此项目,
- 将其集成到他们自己的产品/设备中,
- 执行企业策略(PIN 策略、管理员/用户角色、撤销),
- 将其部署为内部虚拟化/云风格服务,
- 并且*不需要*发布衍生源代码。
- 基础包包括:
- 商业许可证(您的修改/集成无需承担 AGPLv3 的披露义务)
- 入门引导会议
- 访问官方签名的构建版本
- 可按需添加的可选企业组件:
- 在多用户/多设备环境中运行的能力
- 设备清单、可追溯性和安全撤销/离职管理
- 自定义证明、基于组织的设备身份/防克隆
- 为多个团队或租户提供虚拟化/内部“HSM 或身份验证后端”服务
- 后量子 (PQC) 密钥材料处理和安全的 PQC 凭证存储
- 分层确定性密钥派生(HD 钱包样式的密钥树,用于每个用户/每个租户的密钥、固件签名树等)
- 加密签名的审计跟踪/防篡改日志记录
- 高风险操作的双重控制/双人审批
- 安全的密钥托管/灾难恢复策略
- 发布签名/供应链强化工具链
- 策略锁定的强化模式(“FIPS 风格配置文件”)
- 优先的安全响应 SLA
- 白标演示/售前捆绑包
典型的许可模式:
- 内部使用(单一法人实体,包括内部私有云/虚拟化部署)。
- OEM / 重新分发 / 服务(在您的产品中发布或将其作为服务提供给第三方)。
这些选项的范围和定价单独确定,具体取决于您实际需要哪些组件。
如需商业许可和企业功能,请发送电子邮件至 pol@henarejos.me
主题:`ENTERPRISE LICENSE <您的公司名称>`
有关详细信息,请参阅 `ENTERPRISE.md`。
## 鸣谢
Pico FIDO 使用了以下库或部分代码:
- 用于加密操作的 MbedTLS。
- 用于底层 USB 程序的 TinyUSB。
- 用于 CBOR 解析和格式化的 TinyCBOR。
标签:FIDO, UML, 多因素认证, 客户端加密, 嵌入式系统, 物联网开发, 硬件安全密钥