Pico-Fido2折腾记录

First Post:

Last Update:

Word Count:
946

Read Time:
3 min

本文记载了博主折腾开源项目Pico-Fido2的经历,该项目集成了Fido和OpenPGP智能卡的功能,本人对嵌入式并没有过多了解,如有谬误,欢迎指教修正。

硬件选择

原项目支持RP2350和ESP32-S3(不推荐使用RP2040),这里就挑了个便宜的RP2350, 具体型号是无名科技(nologo)的RP2350-USB (4M).

RP2350

固件编译与刷入

由于树莓派官方不支持nologo的固件,为了使用led功能,需要自行编译固件,为了维持电脑环境干净,使用docker作为编译环境。使用项目pico-docker-sdk作为raspberry固件编译环境。具体命令可参考项目内Readme,此处不具体说明,需要注意,记得bind pico-fido2的源代码到容器内的工作路径!

启动并进入container后,可以在路径/usr/local/picosdk/src/boards/include/boards下看到官方支持的所有引脚定义,为了添加对nologo的支持,可以在该路径下创建文件(或修改已有文件)。

有关的参考资料有无名科技官方的RP2350-USB Wiki
原理图如下schematic

笔者此处创建了文件nologo_rp2350_usb.h,内容是参考waveshare_rp2350_one.h写的,再次强调,博主并不擅长嵌入式,内容可能存在问题,内容见下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// pico_cmake_set PICO_PLATFORM=rp2350

#ifndef _BOARDS_NOLOGO_RP2350_USB_H
#define _BOARDS_NOLOGO_RP2350_USB_H

// For board detection
#define NOLOGO_RP2350_USB

// --- RP2350 VARIANT ---
#define PICO_RP2350A 1

// --- UART ---
#ifndef PICO_DEFAULT_UART
#define PICO_DEFAULT_UART 0
#endif
#ifndef PICO_DEFAULT_UART_TX_PIN
#define PICO_DEFAULT_UART_TX_PIN 0
#endif
#ifndef PICO_DEFAULT_UART_RX_PIN
#define PICO_DEFAULT_UART_RX_PIN 1
#endif

// --- WS2812 (NEOPIXEL RGB LED) ---
// 此处修复led引脚定义
#ifndef PICO_DEFAULT_WS2812_PIN
#define PICO_DEFAULT_WS2812_PIN 22
#endif


#endif

// --- I2C ---
#ifndef PICO_DEFAULT_I2C
#define PICO_DEFAULT_I2C 1
#endif
#ifndef PICO_DEFAULT_I2C_SDA_PIN
#define PICO_DEFAULT_I2C_SDA_PIN 6
#endif
#ifndef PICO_DEFAULT_I2C_SCL_PIN
#define PICO_DEFAULT_I2C_SCL_PIN 7
#endif

// --- SPI ---
#ifndef PICO_DEFAULT_SPI
#define PICO_DEFAULT_SPI 1
#endif
#ifndef PICO_DEFAULT_SPI_SCK_PIN
#define PICO_DEFAULT_SPI_SCK_PIN 10
#endif
#ifndef PICO_DEFAULT_SPI_TX_PIN
#define PICO_DEFAULT_SPI_TX_PIN 11
#endif
#ifndef PICO_DEFAULT_SPI_RX_PIN
#define PICO_DEFAULT_SPI_RX_PIN 12
#endif
#ifndef PICO_DEFAULT_SPI_CSN_PIN
#define PICO_DEFAULT_SPI_CSN_PIN 13
#endif

// --- FLASH (W25Q128, but configured for 4MB user space) ---
#define PICO_BOOT_STAGE2_CHOOSE_W25Q128 1

#ifndef PICO_FLASH_SPI_CLKDIV
#define PICO_FLASH_SPI_CLKDIV 2
#endif

#ifndef PICO_FLASH_SIZE_BYTES
#define PICO_FLASH_SIZE_BYTES (4 * 1024 * 1024)
#endif


#define PICO_SMPS_MODE_PIN 23

// pico_cmake_set_default PICO_RP2350_A2_SUPPORTED = 1
#ifndef PICO_RP2350_A2_SUPPORTED
#define PICO_RP2350_A2_SUPPORTED 1
#endif

#endif

添加了以上定义后,即可根据Pico-fido2的构建说明编译固件

笔者使用的命令如下

1
2
3
4
5
6
7
git clone https://github.com/youruser/pico-fido2
git submodule update --init --recursive
cd pico-fido2
mkdir build
cd build
cmake .. -DPICO_BOARD=nologo_rp2350_usb -DVIDPID=Yubikey5 # DPICO_BOARD的值应当是前面创建/修改的头文件名
make

构建完成后,build/pico_fido2.uf2即为所需的固件,然后正常刷入即可,按住BOOT键插入电脑,此时会被识别为U盘,将uf2文件传入即可,等待几秒led亮起即为刷入完毕。此次完成全部工作,可以正常使用。

当然,你可以在该网站额外开启Secure Lock和Secure Boot功能,可以进一步增加安全性。不过后果好像是不能刷入其他签名的固件,在正式投入使用前可以考虑开启。

使用

至此你相当于拥有了一个平替Yubikey,推荐参考此项目来完成密钥生成,备份等后续工作。

可以安装yubioath-flutter来提供Yubikey的GUI管理工具,更多其他的命令行工具和配置方法可以参考以下Wiki:

博主在测试时,发现无法导入Curve 25519的密钥到RP2350中,会出现报错,但是根据Pico-fido2的项目说明,应该是支持的,不确定是什么原因,欢迎交流。

外壳

直接拿着个电路板到处跑也不太好,可以自行3D打印外壳,博主参考此处分享的stl文件,基于模型进行了少量修改。
以下为成品图:

USB Case

Reference

以下为其他关于Pico-fido项目的博客,在我研究该项目时提供了帮助,其中也包括本文没有进一步展开的内容,推荐读者进一步阅读: