OpenPGP Card を格安で手に入れる

mopemope
14 min readMay 2, 2018

--

皆さん、 PGP 利用していますか?
多くの方は GnuPG(GPG) を使用しているかと思いますが、鍵の管理、気になりますよね?
今回は紛失、盗難などに備え、 GPG の秘密鍵を格納できる Open PGP を格安で手に入れる方法を紹介したいと思います。

あとついでにお知らせですが弊社では社員を募集していますので興味のある方は連絡お待ちしております。

何故格安にできるのか?

格安な理由は自作するからです。
自作するものは正確には OpenPGP Card 互換の USB トークンです。
自作する場合でよく気になる点はケース問題ですが、今回はケース込みで簡単に作成できる方法を紹介したいと思います。
私の環境は Linux ですが、 Mac などでもほぼ同じで問題ないはずです。

必要なもの

必要なものは大きく分けてハードとソフトウェアとに分かれます。

ハードウェア

ハードウェアは STM32 をプログラミングにする際に使う ST-LINK が必要になります。正確には ST-LINK の格安 clone 品です。

ST-LINK/V2 x2

ソフトウェア

まずハードが ARM なのでまず各環境で ARM のツールチェインをインストールする必要があります。各自環境に合わせて ARM のツールチェインをインストールしてください。

肝心のソフトウェアは以下です。

gnuk http://www.fsij.org/category/gnuk.html

openocd http://openocd.org/

stlink https://github.com/texane/stlink

その他に必要なもの

その他工具的なものとして以下が必要です。

・はんだごて (ピンを外すのに使用)
・ジャンパーワイヤ (メス-メス メス-オスそれぞれ2本ずつ)

ジャンパーワイヤのメス−メスに関しては ST-LINK についてくるのでメス-オスのみ調達するだけでもいいと思います。

では順に説明していきます。

1. ST-LINK/V2 の購入

まずは ST-LINK/V2 の clone を調達します。USB で接続できる小さなスティック状のタイプで AliExpress などで 200 円ほどで購入可能です。もちろんその他で購入しても構いませんが、AliExpress が最安値でしょう。AliExpress で購入する場合には色などが指定できないのでその辺は注意です。
ST-LINK は2つ必要になります。1 台は書き込み用、 1 台は USB トークン本体になります。既に ST-LINK を持っているのであれば 1 台、USB トークン本体になるものを購入すればよいと思います。 AliExpress で送料無料であれば約 1 ヶ月ぐらいで届くと思います。何故 ST-LINK を買うかというと実は ST-LINK の clone 品の中には STM32F101CBT6 が入っており、flash size が 128k あるので gnuk をインストールすることが可能なのです。今回は ST-LINK 自体をケース付き STM32 の開発ボードとして扱ってしまおうという話です。

AliExpressで購入したもの。中国語記載のあるハズレだ…

2. gnuk のビルド

核になる部分である gnuk のビルドです。この部分がファームウェアになります。
まず git clone してきます。

$ git clone git://anonscm.debian.org/gnuk/gnuk/gnuk.git

次に clone ができたらビルドします。

$ cd gnuk/
$ git submodule update — init
$ cd src/
$ ./configure — vidpid=234b:0000 — target=ST_DONGLE
$ make

これでファームウェアの完成です。このバイナリを ST-LINK を使ってもう片方の ST-LINK にプログラミングします。

3. 書き込み保護の解除

ST-LINK で ST-LINK に書き込むわけですが、書き込むためにこの2つを接続しないといけません。(当たり前ですが)

特に書き込み先の ST-LINK のどこに接続すれば書き込めるかがわからないことには始まりません。
まずは ST-LINK のケースを外し基板を見えるようにします。すると USB 端子側に小さなホールが4つあるのが見えると思います。このホールと ST-LINK を接続します。

STM32 の書き込みなので使用するのは以下の 4 ピンです。

  1. SWDIO
  2. GND
  3. SWCLK
  4. 3V

ケースを外した ST-LINK の USB の端子側に一番近い方が SWDIO 、 ひとつあけて SWCLK 、この2つをメス-オスのジャンパーワイヤーでつなぎます。あとの 3V と GND は普通に ST-LINK の先のピンにメス−メスのワイヤーで接続します。ST-LINK を USB に接続して LED が点灯すれば OK です。

まずケースを外す
4つのホールの2つにワイヤーを接続する
USB の端子側に一番近い方が SWDIO, ひとつあけて SWCLK

ST-LINK 自体のファームウェアを勝手に書き換えられないよう、 ST-LINK には書き込み保護がかかっています。そのため、まずファームウェアを書き込む前にこの書き込み保護を解除する必要があります。
openocd を使って USB トークン側の ST-LINK の書き込み保護を解除します。
まず openocd を clone、ビルド します。

$ git clone git://git.code.sf.net/p/openocd/code openocd
$ cd openocd
$ ./configure
$ make

openocd の設定ファイルを作成します。設定ファイル openocd.cfg は以下のようにします。

telnet_port 4444source [find interface/stlink.cfg]set WORKAREASIZE 0x1000source [find target/stm32f1x.cfg]reset_config none

先程作成した設定ファイルを指定し openocd を実行します。

$ ./src/openocd -s tcl -f openocd.cfg
Open On-Chip Debugger 0.10.0+dev-00348-g6f700d2b (2018–03–14–20:29)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport “hla_swd”. To override use ‘transport select <transport>’.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
none separate
none separate
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v29 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.224704
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections

実行すると上記のようなログが出力されると思います。ログ出力に従いtelnet で接続します。
そしてコマンドを送信し、書き込み保護を解除します。

$ telnet localhost 4444> reset halt
> stm32f1x mass_erase 0
> flash protect 0 0 127 off
> reset

これで解除できました。 telnet と openocd を終了させ、 ST-LINK を差し込み直します。(ワイヤーはそのまま)
このまま flash してもいいのですが、以前にうまく書き込めなかったことがあるため、書き込みは st-flash を使用します。

4. st-flash による書き込み

STM32 の書き込みユーティリティである stlink のツールをインストールします。
st-link, st-flash はバイナリで配布がされているためそちらを使った方が早いと思います。
st-flash をインストールしたらいよいよ gnuk を書き込みます。
gnuk のディレクトリに移動し、バイナリを指定して書き込みます。

$ sudo st-flash write build/gnuk-vidpid.bin 0x8000000
st-flash 1.4.0–14-gfbd55d9
2018–04–23T17:13:54 INFO common.c: Loading device parameters….
2018–04–23T17:13:54 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
2018–04–23T17:13:54 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2018–04–23T17:13:54 INFO common.c: Ignoring 2044 bytes of 0xff at end of file
2018–04–23T17:13:54 INFO common.c: Attempting to write 109572 (0x1ac04) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x0801ac00 erased
2018–04–23T17:13:56 INFO common.c: Finished erasing 108 pages of 1024 (0x400) bytes
2018–04–23T17:13:56 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id
2018–04–23T17:13:56 INFO flash_loader.c: Successfully loaded flash loader in sram
108/108 pages written
2018–04–23T17:14:01 INFO common.c: Starting verification of write complete
2018–04–23T17:14:02 INFO common.c: Flash written and verified! jolly good!

verify まで成功するのが確認できれば書き込みは成功です。
これで USB トークンとして機能するようになりました。

5. 書き込みの確認

USB ト ークン側の ST-LINK を差し込み確認します。

usb-devices を実行すると以下のエントリが確認できるはずです。

$ usb-devices...T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 15 Spd=12 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=234b ProdID=0000 Rev=02.00
S: Manufacturer=Free Software Initiative of Japan
S: Product=Gnuk Token
S: SerialNumber=FSIJ-1.2.8–87041630
C: #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
I: If#=0x0 Alt= 0 #EPs= 3 Cls=0b(scard) Sub=00 Prot=00 Driver=(none)
...

gpg コマンドでカードとして機能しているか確認します。

$ gpg — card-status
Reader ………..: 234B:0000:FSIJ-1.2.8–43086355:0
Application ID …: D276000124010200FFFE430863550000
Version ……….: 2.0
Manufacturer …..: unmanaged S/N range
Serial number ….: 43086355
Name of cardholder: [not set]
Language prefs …: [not set]
Sex …………..: unspecified
URL of public key : [not set]
Login data …….: [not set]
Signature PIN ….: forced
Key attributes …: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 3 3
Signature counter : 0
Signature key ….: [none]
Encryption key….: [none]
Authentication key: [none]
General key info..: [none]

無事認識されていますね。
あとは体裁を整えれば完成です。

6. 体裁を整える

最後に体裁整えます。USB トークン化した ST-LINK はもうピンがいらないので後ろのピンをはんだごてではずしていきます。
そして最後にケースを再度とりつければ完成です。
お疲れ様でした。

ピンを外すためカバーと引き抜く
はんだごてではんだを溶かしつつピンを取り除く
ケースをつけて完成。以前作ったものは中国語の記載がない

初回だけ少し手間取るかも知れませんが 2 台目以降は15分もかからずに作れるようになると思います。最新の gpg はカードの切り替え時時の煩わしさも改善されているため、複数アカウント分作成してもよいでしょう。また YubiKey のバックアップにも使うのもよいかも知れません。

というわけで今回は OpenPGP Card を格安で手に入れるという話でした。

参考

https://blog.danman.eu/2-usb-crypto-token-for-use-with-gpg-and-ssh/

--

--