前言

看到了这篇文章 想搞 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.bin 就是待烧录的固件文件,我们把它单独取出来待用。

烧写

安装软件

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


  1. https://blog.dylanwu.space/2020/01/24/stm32-gnuk.html

  2. https://nx3d.org/gnuk-st-link-v2/

  3. https://kgame.tw/gnupg/stm32-gnuk/

  4. https://techie-s.work/posts/2021/04/homemade-gnuk/

ST-Link v2 刷写 GNUK,年轻人的第一个 OpenPGP 智能卡!的更多相关文章

  1. 使用st link v2向stm32下载和调试程序

    st官网 正版ST-link/V2引脚定义和注意事项 分为ST-LINK/V2和ST-LINK/V2-ISOL两种型号 是STM8和STM32微控制器(MCU)系列的在线调试器和编程器(还是下载器.仿 ...

  2. keil5配置ST Link v2 for STM32F10x

    请务必先安装MDKCM525.EXE,否则会找不到闪存编程算法

  3. 6.ST LINK 下调试异常

    ☆1.无法进入main函数(printf的影响)***为什么有时候可以进入main函数,有什么进入不了main函数?    <1> 因为C语言默认使用显示器作为标准输出的设备,所以如果想利 ...

  4. ST Link 调试问题总结

    用过ST Link调试工具的同事都应该知道,ST Link是一个很不错的调试工具,它具有小并且功能齐全,价格便宜等特点,现在市场上普遍是下面这两种ST Link, 但如果用的比较多,会发现有时候会存在 ...

  5. st link 连接问题ST LINK is not in the DFU mode plesse restart it

    原因:插上st link后做了一些操作才点击升级.如点击了连接stlink,如下图等: 解决办法: 1. 拔掉stlink 2. 插上stlink 3. 不要点其他的,直接点击ST-LINK-> ...

  6. STM32Cube填坑,ST link 下载一次以后无法下载

    ST link 下载一次以后无法下载, 原因是工程设置忘记设置Debug模式

  7. 每周开源项目分享-年轻人的第一个OAuth2.0 Server:hydra

    年轻人的第一个OAuth2.0 Server:hydra hydra 是什么呢? OpenID Connect certified OAuth2 Server - cloud native, secu ...

  8. 年轻人的第一个 Spring Boot 应用,太爽了!

    Spring Boot 大家都知道是啥吧? 还有不知道的来看这篇扫下盲:告诉你,Spring Boot 真是个牛逼货!. 顺便再往下看,栈长给你带来年轻人的第一个 Spring Boot 应用,撸码史 ...

  9. 年轻人的第一个 Docker 应用,大大提高生产力!

    上一篇:年轻人的第一个 Spring Boot 应用! 哈哈,标题我抄了雷总的,不重要哦,重要的是 Docker 真的很年轻,虽然现在才不到 8 岁,但却是个冉冉升起的巨星,火得一塌糊涂. 这几年 D ...

  10. 超级MINI STLINK V2 官方固件自动升级 ST-Link 【worldsing 笔记】

    简介: 支持所有带SWIM接口的STM8系列单片机 支持所有带SWD接口的STM32系列单片机 完全兼容Keil,STVP,STVD,IAR,COSMIC,STM32 ST-LINK Utility! ...

随机推荐

  1. win10使用Docker Desktop启动mysql报错:Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306:

    问题描述 今天上班用wind10电脑启动Docker Desktop使用MySQL,突然间报了一个错,错误如下: Error response from daemon: Ports are not a ...

  2. React Native集成CodePush热更新遇到的坑,以及折腾过程。"CFBundleShortVersionString" key needs to specify a valid semver string

    最近开始一个React Native的新项目.按惯例,在创建完项目后,先集成CodePush热更新功能. 这种活已经干过不止一两次了,当然没啥问题,直接上手开干. 可问题恰恰出在了本以为应该很顺利的地 ...

  3. 【高并发】SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏)

    大家好,我是冰河~~ 首先问下大家:你使用的SimpleDateFormat类还安全吗?为什么说SimpleDateFormat类不是线程安全的?带着问题从本文中寻求答案. 提起SimpleDateF ...

  4. 渗透-02:HTTPS主干-分支和HTTPS传输过程

    一.HTTPS主干-分支 第一层 第一层,是主干的主干,加密通信就是双方都持有一个对称加密的秘钥,然后就可以安全通信了. 问题就是,无论这个最初的秘钥是由客户端传给服务端,还是服务端传给客户端,都是明 ...

  5. 熟悉又陌生的package.json

    前言 随着前端的不断发展,package.json可谓是在前端项目中无处不在,它不仅在项目根目录会有,而且在 node_modules 中也存在.那么这个文件到底是干嘛的,又有什么作用?很多人对它的认 ...

  6. 【go笔记】标准库-strings

    标准库-strings 前言 标准库strings用于处理utf-8编码的字符串. 字符串比较-Compare func Compare(a,b string) int 若 a==b ,则返回0:若 ...

  7. Nginx深入:nginx功能模块、目录结构及配置文件详解

    Nginx功能模块说明 1.Nginx 核心功能模块(Core functionality) Nginx核心功能模块负责Nginx的全局应用,主要对应主配置文件的核心层(Main层)和事件(Event ...

  8. python语法笔记

    最近抽时间恶补了一下python语法,做个笔记. 比较运算符的结果为bool类型,示例:a=10,b=20   print("a>b吗?",a>b)     运行结果: ...

  9. 1.创建一个类,类A中定义了一个方法,该方法能接受3个参数根据参数判断是做加法还是减法并返回计算结果;

    class A: def cal(self,x,y,z): if z=='+': return x+y if z=='-': return x-y else: print('error') a=A() ...

  10. [MAUI]在.NET MAUI中实现可拖拽排序列表

    .NET MAUI 中提供了拖放(drag-drop)手势识别器,允许用户通过拖动手势来移动控件.在这篇文章中,我们将学习如何使用拖放手势识别器来实现可拖拽排序列表.在本例中,列表中显示不同大小的磁贴 ...