ST-LINK V2 刷 Gnuk

1 分鐘閱讀

OpenPGP 智慧卡不好買,又覺得 YubiKey 很貴的話,可以使用 Gnuk 搭配 STM32 MCU 方案自製 USB OpenPGP 智慧卡,其中 STM32F103C8T6 是可以刷 Gnuk 最便宜的 STM32 方案,STM32 的燒錄器 ST-LINK V2 本身就是用 STM32F103C8T6 MCU 而且已經是 USB Dongle 外型,不如就是直把 ST-LINK V2 刷成 OpenPGP 智慧卡吧,淘寶上一個 ST-LINK V2 只要約12rmb上下。

Gnuk 的韌體大小約 110kb,STM32F103C8T6 在硬體規格上的 64KB flash 空間其實是不符合 Gnuk 的需求規格的,但因為意法半導體直接用 128kb 充當 64kb,所以讓 STM32F103C8T6 有機會成功刷入 Gnuk 韌體。

硬體準備

兩隻 ST-LINK V2 或是一台 J-Link + ST-LINK V2,以下教學使用 J-Link + ST-LINK V2,想使用 ST-LINK V2 燒錄 ST-LINK V2 可以看最下面的參考資料。 st_link_v2 USB 頭端開始往後算燒錄用的針腳,每一個版本硬體的 layout 不太一樣,最好先用電表確認 VCC 和 GND 的腳,在交叉測試 SWDIO 和 SWCLK 腳。

  • VCC
  • SWDIO
  • SWCLK
  • GND

ST-LINK V2 接線

J-LINK 接線

編譯韌體&燒錄

使用 WSL 的 Ubuntu 環境編譯韌體

git clone https://salsa.debian.org/gnuk-team/gnuk/gnuk.git
cd gnuk/
git submodule update --init
cd src/
./configure --vidpid=234b:0000 --target=ST_DONGLE
make build/gnuk-vidpid.bin

下載OpenOCD,配置設定檔 openocd.cfg 如下

#daemon configuration
telnet_port 4444
gdb_port 3333

#interface
interface jlink
transport select swd

# The chip has 64KB sram
set WORKAREASIZE 0x10000

source [find target/stm32f1x.cfg]
#adapter_khz 100
gdb_breakpoint_override hard

執行 openocd.exe

使用 telnet 連線 4444 port 輸入以下指令

stm32f1x unlock 0
reset halt
flash write_bank 0 ./src/build/gnuk-vidpid.bin 0
stm32f1x lock 0
reset halt

成果

移除尾端針腳

比起只能選擇 RSA 的 YubkiKey,Gnuk 可以選擇 Ed25519 橢圓曲線密碼作為金鑰的演算法。

如何寫入 GPG 私鑰參考使用 Yubikey 儲存 OpenPGP 私鑰

參考資料

留言