OneKeyハードウェアウォレットは完全にオープンソースのファームウェアを特徴としています。関連製品のオープンソースファームウェアコードはOneKeyのGitHubリポジトリで閲覧できます。大量生産を目指したファームウェアファイルが正式にリリースされる前に、OneKeyチームはGitHubの自動ビルドツール(GitHub CI)を使用して、各ファームウェアリポジトリからファームウェアソースコードをコンパイルし、パッケージ化します。その後、ファイルは内部のOneKeyスタッフによって署名され、正式にリリースされます。
この記事では、公式チームのMulti-Sigの前後でファイルのチェックサムを比較することにより、ファームウェアファイルとオープンソースコードの一貫性を確認する自己検証方法を提供します。
異なるファイルのソースデータの一貫性をSHA-256暗号ハッシュ関数を使用して確認する方法については、この記事を参照してください。
オープンソースファームウェアリポジトリ
- Bluetoothファームウェア: github.com/OneKeyHQ/bluetooth-firmware-pro
- Bluetoothファームウェア: github.com/OneKeyHQ/bluetooth-firmware-classic1s
- ⚙ 標準ファームウェア: github.com/OneKeyHQ/firmware/tree/bixin_dev
- Bluetoothファームウェア: github.com/OneKeyHQ/bluetooth-firmware-classic
- ⚙ 標準ファームウェア: github.com/OneKeyHQ/firmware (分支:touch)
- Bluetoothファームウェア: github.com/OneKeyHQ/bluetooth-firmware-touch
- ⚙ 標準ファームウェア: 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に保存されたファームウェアファイル"の一貫性を確認します。
検証の前提条件
- 公式のOneKeyハードウェアファームウェアGitHubリリースに移動します: https://github.com/OneKeyHQ/firmware/releases
- 検証したいファームウェアバージョンを見つけて、GitHub Actionリンクをクリックします。
- Artifactsの下のファームウェア名をクリックしてダウンロードします(GitHubへのログインが必要です)。
- 公式のOneKeyハードウェアファームウェアGitHubリリースに移動します: https://github.com/OneKeyHQ/firmware/releases
- 検証したいファームウェアバージョンを見つけます。
- Assetsの下のbinファイルをクリックしてダウンロードします。
-
OneKey CDNファイルに移動します: https://data.onekey.so/config.json
- 検証したいファームウェアバージョンを見つけます。
- "url"フィールドの下のリンクをコピーします。
- 新しいブラウザウィンドウで開くと、binファイルが自動的にダウンロードされます。
- 公式のOneKey BluetoothファームウェアGitHubリリースに移動します。
- OneKey Classic & Classic 1S: https://github.com/OneKeyHQ/bluetooth-firmware-classic/releases
- OneKey Pro: https://github.com/OneKeyHQ/bluetooth-firmware-pro/releases
- OneKey Touch: https://github.com/OneKeyHQ/bluetooth-firmware-touch/releases
- 検証したいファームウェアバージョンを見つけ、GitHubアクションリンクをクリックします。
- Loginが必要な場合、アーティファクトの下にあるファームウェア名をクリックしてダウンロードします。
- 公式のOneKey BluetoothファームウェアGitHubリリースに移動します。
- OneKey Classic & Classic 1S: https://github.com/OneKeyHQ/bluetooth-firmware-classic/releases
- OneKey Pro: https://github.com/OneKeyHQ/bluetooth-firmware-pro/releases
- OneKey Touch: https://github.com/OneKeyHQ/bluetooth-firmware-touch/releases
- 検証したいファームウェアバージョンを見つけます。
- アセットの下にあるbinファイルをクリックしてダウンロードします。
- OneKey CDNファイルに移動します: https://data.onekey.so/config.json
- 検証したいファームウェアバージョンを見つけます。
- 「ble」-「webUpdate」フィールドのリンクをコピーします。
- 新しいブラウザウィンドウで開き、binファイルを自動ダウンロードします。
- 以下に移動します: https://www.python.org/downloads/
- 最新バージョンのPythonをダウンロードしてインストールします。
検証手順
以下は、先に設定した2つのターゲットの検証手順です:
- ターミナルを開きます。
- 以下のコマンドを実行します(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チームによって署名されたファームウェアファイル):
shasum -a 256 (file path)
- 以下のコマンドを実行します(OneKey公式CDNに保存されたファームウェアファイル):
shasum -a 256 (file path)
- 2つのコマンドによって生成されたチェックサムを比較します。結果が一致した場合、2つのファームウェアファイルのコードの一貫性が確認されます。
- ダウンロードした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チーム署名済み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つのファームウェアファイルのコードの一貫性が確認されます。