前言
看到了这篇文章 想搞 PGP 智能卡玩,但是 yubikey 死贵 还涉及到某些傻逼政治问题 于是就想找找有无开源实现什么的。
然后就看见了 smartcard 的制作教程,可惜能找到的便宜 javacard 都是需要读卡器的。
本来死心了,但是看见 ST-link v2 刷 GNUK 教程 突然就想折腾了,不得不说,还是 GNU 牛逼。项目由 $stackrel{textsf{Free Software Initiative of Japan}}{textsf{FSIJ}}$ 维护。
这玩意比 yubikey 牛逼,支持最新的 x448 椭圆曲线加密算法(但是已经弃用 RSA 了)
材料准备
一般 ST-Link v2 及其仿品都只提供 SWDIO SWCLK 而无 RXD TXD 这种直接串口就能刷的口,所以最好再买个 ST-Link v2 当烧录器(买别的也行,主要是这个便宜),我买的是 PowerWriter Lite 2。服务器托管网本来想刷这个的,结果外壳都拆不开
所以:
- 一个烧录器(ST-Link v2)
- 待烧录的 ST-Link v2(确保主控是 STM32F103C8T6 或 STM32F103CBT6,GD32F103 一般不会在仿品里出现,网上有关于这款主控的刷写教程),购买踩坑这里有[1]。
- 四根杜邦线,有一端是公头用于连接待烧录的 ST-Link,另一端连接烧录器,公母视情况而定
- 一台电脑
我采用了 Arch Linux,其他系统编译固件的教程在这里有[2]
为啥主控要求是这两个版本
首先 GNUK 支持 STM32F103 系列。
然后 GNUK 需要 128KB 闪存容量。
最后 STM32F103C8T6 和 STM32F103CBT6 用了一套东西,后者官方给定容量 128KB,前者虽然标了 64KB 但是实际上有 128KB 的空间可用。恰好,ST-Link 2 官方使用的主控就是前者。仿品中可能出现后者。
GD32F103 能 pin2pin 替换 STM32F103 自然也能用。但是需要换烧录方式。
编译固件
安装依赖
pacman -S arm-none-eabi-gcc
官网:In 2.5, we added GD32VF103 support. Please note that default libc is now picolibc (instead of newlib).
老教程会教你安装 newlib,但是现在需要安装 picolibc。但是这个东西不仅只在 aur 里,而且过期了。实测直接更改 pkgver 也可以正常构建新版本。
所以:
git clone https://aur.archlinux.org/arm-none-eabi-picolibc.git
cd arm-none-eabi-picolibc.git
vim PKGBUILD # 将 pkgver 改成最新版本号,可以在上面 picolibc 项目 release 页面看
makepkg -sif
编译固件
git clone --recursive https://salsa.debian.org/gnuk-team/gnuk/gnuk.git gnuk
cd gnuk/src
./configure --vidpid=234b:0000 --target=ST_DONGLE
make build/gnuk-vidpid.bin
然后 build/gnuk-vidpid.b服务器托管网in
就是待烧录的固件文件,我们把它单独取出来待用。
烧写
安装软件
pacman -S openocd inetutils
inetutils
用来提供 telnet
支持。putty
用不了,不知道是不是不兼容 XWayland 的问题。
连接设备
ST-Link v2 连接系统板教程挺多的,直接搜就行。这个里面也有[2:1]。
PW Lite 2 的话官方文档有接线教程。
我的是这样
如果像[2:2]里面这样是非常好的,直接插进去随便固定一下就行。但是我不是这种情况。我买的 ST-Link 只提供了四个焊盘!!!
这意味着你需要用调试排针凑合连接一下,连接刷写过程中需要用手按住!调试排针…就是四根杜邦线粘成一排
连接失败了好几次,刷写完了之后杜邦线的头都让我按歪了!
图待补
配置 openocd
随便新建一个 xxx.cfg
,内容:
telnet_port 4444
source [find interface/stlink-v2.cfg]
source [find target/stm32f1x.cfg]
set WORKAREASIZE 0x10000
STM32F103C8T6 需要这句 set WORKAREASIZE 0x10000
,这句使得程序可以刷写到额外的 64KB 空间中。如果存储足够 128KB 就不用这句。
如果你像我一样用 PWLink 2,需要把 source [find interface/stlink-v2.cfg]
换成 source [find interface/cmsis-dap.cfg]
(在一个求助帖看见的,地址找不到了)
连接好设备后 openocd -f ./xxx.cfg
,如果跑起来之后没报错没退出就说明你搞对了。
刷写固件
telnet 127.0.0.1:4444
然后输入以下指令
stm32f1x unlock 0
reset halt
flash write_bank 0 ./src/build/gnuk-vidpid.bin 0
stm32f1x lock 0
reset halt
./src/build/gnuk-vidpid.bin
这个是你刚才编译出来的固件
然后就没了,退出 telnet 和 openocd,断开设备连接就行。
测试
插入你刷好的 GNUK 智能卡,输入
gpg --card-status
此时应该输出你的智能卡的详细信息。
刷坏了/想重刷
看[2:3]
以下文章我或多或少参考了一些,推荐阅读 [2:4][1:1][3][4]
这篇文章 讲述了 64KB 主控如何刷支持 64KB 的旧版 GNUK
-
https://blog.dylanwu.space/2020/01/24/stm32-gnuk.html ↩︎ ↩︎
-
https://nx3d.org/gnuk-st-link-v2/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://kgame.tw/gnupg/stm32-gnuk/ ↩︎
-
https://techie-s.work/posts/2021/04/homemade-gnuk/ ↩︎
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: #yyds干货盘点# LeetCode程序员面试金典:最长回文串
1.简述: 给定一个包含大写字母和小写字母的字符串,返回通过这些字母构造成的最长的回文串。s 在构造过程中,请注意区分大小写。比如不能当做一个回文字符串。”Aa” 示例 1: 输入:s = “abccccdd” 输出:7 解释: 我们可以构造的最长的回文串是”…