OneKeyハードウェアウォレットは完全にオープンソースのファームウェアを特徴としています。関連製品のオープンソースファームウェアコードはOneKeyのGitHubリポジトリで閲覧できます。大量生産を目指したファームウェアファイルが正式にリリースされる前に、OneKeyチームはGitHubの自動ビルドツール(GitHub CI)を使用して、各ファームウェアリポジトリからファームウェアソースコードをコンパイルし、パッケージ化します。その後、ファイルは内部のOneKeyスタッフによって署名され、正式にリリースされます。
この記事では、公式チームのMulti-Sigの前後でファイルのチェックサムを比較することにより、ファームウェアファイルとオープンソースコードの一貫性を確認する自己検証方法を提供します。
異なるファイルのソースデータの一貫性をSHA-256暗号ハッシュ関数を使用して確認する方法については、この記事を参照してください。
オープンソースファームウェアリポジトリ
OneKey Pro
⚙ 標準ファームウェア: github.com/OneKeyHQ/firmware-pro
Bluetoothファームウェア: github.com/OneKeyHQ/bluetooth-firmware-pro
OneKey Classic 1S
⚙ 標準ファームウェア: github.com/OneKeyHQ/firmware-classic1s
Bluetoothファームウェア: github.com/OneKeyHQ/bluetooth-firmware-classic
OneKey Classic
⚙ 標準ファームウェア: github.com/OneKeyHQ/firmware/tree/bixin_dev
Bluetoothファームウェア: github.com/OneKeyHQ/bluetooth-firmware-classic
OneKey Touch
⚙ 標準ファームウェア: github.com/OneKeyHQ/firmware (分支:touch)
Bluetoothファームウェア: github.com/OneKeyHQ/bluetooth-firmware-touch
OneKey Mini
⚙ 標準ファームウェア: github.com/OneKeyHQ/firmware/tree/mini
ファームウェアのリリースプロセス
公式の標準ファームウェアまたはBluetoothファームウェアがリリースの準備ができたとき、OneKeyチームは対応するリポジトリのActionを実行してオープンソースコードをコンパイルします。コンパイルが成功すると、ファイルはGitHub Artifactsストレージにアップロードされ、チームが内部のMulti-Sigを完了するのを待ちます。その後、OneKeyのCDNに配置されます。 config.json ファイルを更新した後、OneKeyアプリと OneKeyファームウェア更新ウェブサイト からユーザーにアップデート通知が送られ、ファームウェアのアップグレードを促します。具体的なプロセスについては、以下の図を参照してください。
検証対象
"OneKeyチームが署名したファームウェアファイル"がOneKeyのオープンソースリポジトリの"GitHub CIが事前に署名したファームウェアファイル"から派生したものであることを確認します。
"OneKeyチームが署名したファームウェアファイル"と"OneKey公式CDNに保存されたファームウェアファイル"の一貫性を確認します。
検証の前提条件
標準ファームウェア Bluetoothファームウェア
✔ GitHub CIからの事前署名ファームウェアファイル (署名なし)
公式のOneKeyハードウェアファームウェアGitHubリリースに移動します: https://github.com/OneKeyHQ/firmware/releases
検証したいファームウェアバージョンを見つけて、GitHub Actionリンクをクリックします。
Artifactsの下のファームウェア名をクリックしてダウンロードします(GitHubへのログインが必要です)。
✔ OneKeyチームによって署名されたファームウェアファイル (署名あり)
公式のOneKeyハードウェアファームウェアGitHubリリースに移動します: https://github.com/OneKeyHQ/firmware/releases
検証したいファームウェアバージョンを見つけます。
Assetsの下のbinファイルをクリックしてダウンロードします。
✔ OneKey公式CDNに保存されたファームウェアファイル (署名あり)
OneKey CDNファイルに移動します: https://data.onekey.so/config.json
検証したいファームウェアバージョンを見つけます。
"url"フィールドの下のリンクをコピーします。
新しいブラウザウィンドウで開くと、binファイルが自動的にダウンロードされます。
✔ GitHub CIからの事前署名ファームウェアファイル (署名なし)
公式のOneKey BluetoothファームウェアGitHubリリースに移動します。
OneKey Classic & Classic 1S: https://github.com/OneKeyHQ/bluetooth-firmware-classic/releases
検証したいファームウェアバージョンを見つけ、GitHubアクションリンクをクリックします。
Loginが必要な場合、アーティファクトの下にあるファームウェア名をクリックしてダウンロードします。
✔ OneKeyチームによって署名されたファームウェアファイル (署名あり)
公式のOneKey BluetoothファームウェアGitHubリリースに移動します。
OneKey Classic & Classic 1S: https://github.com/OneKeyHQ/bluetooth-firmware-classic/releases
検証したいファームウェアバージョンを見つけます。
アセットの下にあるbinファイルをクリックしてダウンロードします。
✔ OneKey公式CDNに保存されたファームウェアファイル (署名あり)
OneKey CDNファイルに移動します: https://data.onekey.so/config.json
検証したいファームウェアバージョンを見つけます。
「ble」-「webUpdate」フィールドのリンクをコピーします。
新しいブラウザウィンドウで開き、binファイルを自動ダウンロードします。
✔ Pythonをダウンロードしてインストール
以下に移動します: https://www.python.org/downloads/
最新バージョンのPythonをダウンロードしてインストールします。
検証手順
以下は、先に設定した2つのターゲットの検証手順です:
標準ファームウェア Bluetoothファームウェア
GitHub CI で事前署名されたファームウェアの検証プロセス
ターミナルを開きます。
以下のコマンドを実行します(OneKeyチームによって署名されたファームウェアファイル) :
tail -c +1024 /path/to/(file path) | shasum -a 256
以下のコマンドを実行します(GitHub CIからの事前署名ファームウェアファイル):
tail -c +1024 /path/to/(file path) | shasum -a 256
2つのコマンドによって生成されたチェックサムを比較します。結果が一致した場合、"OneKeyチームが署名したファームウェアファイル"がOneKeyのオープンソースリポジトリの"GitHub CIが事前に署名したファームウェアファイル"から派生したものであることが確認できます。
標準ファームウェアでは、1024バイトの署名結果がCIバージョンのファームウェアに追加され、デバイスの起動時にブートローダーによって検証されます。
OneKey 公式 CDN に保存されたファームウェアファイルの検証プロセス
ターミナルを開きます。
以下のコマンドを実行します(OneKeyチームによって署名されたファームウェアファイル):
shasum -a 256 (file path)
以下のコマンドを実行します(OneKey公式CDNに保存されたファームウェアファイル):
shasum -a 256 (file path)
2つのコマンドによって生成されたチェックサムを比較します。結果が一致した場合、2つのファームウェアファイルのコードの一貫性が確認されます。
GitHub CI で事前署名されたファームウェアの検証プロセス(Bluetooth)
ダウンロードしたGitHub CIで事前署名されたBluetoothファームウェアフォルダに ota.bin ファイルを見つけます。
ota.bin が含まれているフォルダでターミナルを開きます。
以下のコマンドでPythonを起動します:
python3
次のコマンドを実行してGitHub CIで事前署名されたBluetoothファームウェアのチェックサムを取得します。
exec("""\nimport struct, hashlib\nwith open("ota.bin", mode="br") as f:\n f.seek(0x0C)\n codelen = struct.unpack("i", f.read(4))[0] - 512\n f.seek(0x600)\n print("".join(format(x, "02x") for x in hashlib.sha256(f.read(codelen)).digest()))\n""")
同じコマンドをOneKeyチーム署名済みBluetoothファームウェアファイルで実行します。
注:コマンド内のota.binをOneKeyチーム署名済みBluetoothファームウェアファイルの名前に変更してください。
2つのコマンドによって生成されたチェックサムを比較します。結果が一致する場合、"OneKeyチーム署名ファームウェアファイル"が"GitHub CI事前署名ファームウェアファイル"から派生していることが確認できます。
OneKey 公式 CDN に保存されたファームウェアファイルの検証プロセス(Bluetooth)
OneKeyチーム署名済みBluetoothファームウェアファイルが含まれているフォルダでターミナルを開きます。
以下のコマンドでPythonを起動します:
python3
以下のコマンドをコピーします:
exec("""\nimport struct, hashlib\nwith open("ota.bin", mode="br") as f:\n f.seek(0x0C)\n codelen = struct.unpack("i", f.read(4))[0] - 512\n f.seek(0x600)\n print("".join(format(x, "02x") for x in hashlib.sha256(f.read(codelen)).digest()))\n""")
ota.bin をダウンロードしたOneKeyチーム署名済みBluetoothファームウェアファイルの名前に変更します。
コマンドを実行してチェックサムを取得します。
同じ手順を繰り返して、ダウンロードしたOneKey公式CDN保存Bluetoothファームウェアファイルのチェックサムを取得します。
2つのコマンドによって生成されたチェックサムを比較します。結果が一致する場合、2つのファームウェアファイルのコードの一貫性が確認されます。