ハードウェアウォレットをM5Stackで作ってみる
こんにちは。AndGoのハードウェア担当の片山です。毎週水曜日はAndGoのエンジニアが交代で技術に関するマニアックな記事を皆様にお送りしています。技術を理解することがセキュリティを高めるための早道です。コメント欄でご意見やご質問を受け付けていますので遠慮なく投稿ください。
これまでハードウェア担当として様々なハードウェアウォレットの分解をしてきました。そろそろ,皆様も破壊することに飽きてしまったと思います。今回はいよいよお待ちかねの企画として,ハードウェアウォレットを作ってみたいと思います!
・・・とはいっても,電子回路から作るのは非常に時間がかかりますので,ハードウェアはM5Stackという出来合いのマイコンモジュールを使用してファームウェア(マイコンに書き込むソフトウェア)を書き込む方式をとっていきます。
お手軽に電子工作(IoT開発といったほうがカッコいい?)をするためにはArduinoやRaspberry Piなどが有名です。これらは開発する上での情報は多いものの,実際に使用するためにはディスプレイやキーボードなどの周辺機器を別途準備して接続しなければならず若干不便です。また,Raspberry Piではフルノードを動かせるほどの性能があるのでスペックオーバーです。
本記事ではM5Stackという中国深センのスタートアップが開発したマイコンモジュールを使います。M5StackシリーズはArduino IDEやUIFlowというブロックプログラミングで比較的簡単にファームウェアが作成できてしまうので,教育用途やアマチュアのホビー用途で使われることが多いです。しかし様々なインターフェイスやセンサが搭載されているので,プロトタイピングには非常に便利です。
M5StackシリーズはESP32というマイコンを搭載しており,買ってきた状態でWiFiやBluetoothが使えます。今回使用するM5Stack Core2という製品は静電容量式のタッチスクリーン,マイク,スピーカー,振動モーター,SDカードスロット,加速度センサー,ジャイロセンサーが内蔵されているので,手軽に様々なものを作ることができます。
※本記事で制作するハードウェアウォレットは実験用でセキュリティのことは一切考えておりません。また,会員の皆様の環境での動作保証やサポートはいたしかねます。予めご了承ください。
※本記事で使用しているm5stack_hardware_walletはデフォルトでTestnet用になっています。もし正規のBitcoinネットワークで試したい方はご自身の責任でファームウェアの変更をお願いします。
必要なものの入手
まず,M5Stack Core2を通販サイトで入手します。2021年11月現在,世界的な半導体不足が深刻化していますが,手に入れることができそうです。実際にはM5Stack Basicという以前のバージョンのものでも十分だったのですが,1000円程度の追加予算でタッチスクリーンや各種センサーなどのデバイスが使えるようになる誘惑に負けて,Core2を選択しました。
ファームウェアの開発・書き込みには,Arduino IDE(https://www.arduino.cc/en/software)を使用します。Arduinoのための総合開発環境(IDE)ですがM5Stackにも使えます。ダウンロードしM5Stack Core2のためのライブラリ等々をM5Stack公式サイト(https://docs.m5stack.com/en/quick_start/core2/arduino)のドキュメントをみながらインストールしていきます。
続いてビットコイン周りの準備に入っていきます。m5stack_hardware_wallet(https://github.com/stepansnigirev/m5stack_hardware_wallet)というM5Stack Basic用のハードウェアウォレットのファームウェアを開発している方がいらっしゃいましたので,それを使わせていただきます。このm5stack_hardware_walletを動作させるためには32bitマイコンのためのBitcoinライブラリ(https://github.com/micro-bitcoin/uBitcoin)が必要だとのことなのでREADME.mdにしたがって,Arduino IDEにインポートしておきます。
m5stack_hardware_walletは本来M5Stack Basic用ですのでM5Stack Core2に動かすためには,コードに若干の変更が必要です。まずは#include <M5Stack.h> を #include <M5Core2.h>に,M5.powerOFF();の行をM5.Axp.powerOFF(); に変更します。これによって,M5Stack Basic用のプログラムがM5Stack Core2に対応します。
そして,uBitcoinライブラリ内のhmac_sha256を全て異なる名前に(例えばhmac_sha256_uBitcoinなどに)リプレースします。(ESP32のライブラリとuBitcoinでhmac_sha256名前がたまたま衝突してしまっているためです・・・。)
動作確認
作成したプログラムをM5Stack Core2に書き込むと,Fig. 1のようにニモニックが出てきます。実際にM5Stack Core2内で秘密鍵生成をしてフラッシュメモリに保存しています。秘密鍵生成にはESP32に搭載されている乱数生成器を使用しているようです。

もちろんフラッシュメモリを読み出すこともできてしまいますし,保存されている秘密鍵もPIN等で暗号化されていないので,本体が盗まれたら非常に簡単に秘密鍵が盗まれてしまいますので注意が必要です。またM5Stack Core2はWiFiでの通信も可能なので,ファームウェアにWiFi経由で秘密鍵を発信するようなプログラムを仕込まれれば(コードを見れば一発でわかりますが・・・)遠隔で秘密鍵を盗み出すことも可能です。
静電容量式のボタンを押していくと,Fig. 2, 3のように公開鍵が表示されます。シンプルですね。スマートフォンのウォレット等経由でQRコードを読み込むことができます。


そして,トランザクションはPCなどからBluetooth経由で送ることになります。実際にテキトウなトランザクションを送ってみるとFig. 4のようになり,トランザクション内容を確認することができます。きちんとしたトランザクションを生成すれば送金先のビットコインアドレスなどが表示される(・・・はずですがまだ試していません。)

もしM5Stack Core2にカメラが内蔵されていれば,BlockstreamのJadeのように物理的にPCと接続することなくair-gappedな送金も可能となります。
最後に
ビットコインの魅力は,仕組みが完全にオープンかつ分散型であるのに,高いセキュリティが担保されている点です。組織への信用なしに自分の財産を守ることができることができます。その分,セキュリティを検証するための知識が必要になってきます。そして知識を得るためにはインターネットなど信頼性の高い情報源から情報を仕入れることも重要ですが,自身の手で仕組みを動かしてみて実体験をベースに理解することも良い方法です。この記事が皆様の理解の助けになると嬉しいです。
次の記事
読者になる
一緒に新しい世界を探求していきましょう。
ディスカッション