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 毫秒。 ![按下确认](https://static.pigsec.cn/wp-content/uploads/repos/cas/26/268ca5c17c5d5355d3330d6c968ac50863c19c0541bea422318043c61d1a28ec.gif) ### 空闲模式 在空闲模式下,Pico FIDO 进入睡眠状态。它等待命令并由驱动程序唤醒。LED 几乎一直熄灭。它每秒点亮 500 毫秒。 ![空闲模式](https://static.pigsec.cn/wp-content/uploads/repos/cas/d3/d3efa02b9a320364c227c7cf0a059b1c818903a2c3e0dfb354d6ca261ab403c9.gif) ### 激活模式 在激活模式下,Pico FIDO 已被唤醒并准备好接收命令。它在一秒内闪烁四次。 ![激活](https://static.pigsec.cn/wp-content/uploads/repos/cas/16/16e9fe0a445cd14515565f78093bcfa7cf994234fe524af40597b93894ecc782.gif) ### 处理中 在处理过程中,Pico FIDO 处于忙碌状态,在当前命令处理完成之前无法接收其他命令。在此状态下,LED 每秒闪烁 20 次。 ![处理中](https://static.pigsec.cn/wp-content/uploads/repos/cas/3f/3f26ea2ff8221e4bc6f7105f14877eb3623a44ae45f5f32b9a51b99fc56f4418.gif) ## 驱动程序 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, 多因素认证, 客户端加密, 嵌入式系统, 物联网开发, 硬件安全密钥