OneKey 硬體錢包採用完全開源的固件。您可以在 OneKey 的 GitHub 倉庫中查看相關產品的開源固件代碼。在正式發佈量產用的固件檔案之前,OneKey 團隊會使用 GitHub 的自動化建構工具 (GitHub CI) 從相應的固件倉庫中編譯並建構固件代碼。隨後,這些檔案會經由 OneKey 團隊簽名後才正式發佈。
本文提供了一種自我驗證方法,透過對比團隊多重簽名前後的檔案校驗和(Checksum),以驗證固件檔案與開源代碼之間的一致性。
若需了解如何使用 SHA-256 加密雜湊函數(比較校驗和)驗證不同檔案原始數據一致性的方法,請參閱此文章。
開源固件倉庫
OneKey Pro
OneKey Classic 1S
OneKey Classic
OneKey Touch
⚙ 系統固件:github.com/OneKeyHQ/firmware (分支:touch)
OneKey Mini
若要重現 OneKey 的固件發佈流程,請參考以下影片教學
固件發佈流程
當官方標準固件或藍牙固件準備發佈時,OneKey 團隊會執行相應倉庫的 Action 來編譯開源代碼。編譯成功後,檔案會上傳至 GitHub Artifacts 儲存空間,等待團隊完成內部多重簽名,隨後部署至 OneKey 的 CDN。更新 config.json 檔案後,更新通知會透過 OneKey App 和 OneKey 固件更新網站推播,提示用戶升級固件。具體流程請參考下圖。
驗證目標
驗證「OneKey 團隊簽名固件檔案」源自 OneKey 開源倉庫中的「GitHub CI 預簽名固件檔案」。
驗證「OneKey 團隊簽名固件檔案」與「OneKey 官方 CDN 儲存的固件檔案」之間的一致性。
前置準備
系統固件 藍牙固件
✔ 下載 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 藍牙固件官方 GitHub 發佈頁面
OneKey Classic & Classic 1S: https://github.com/OneKeyHQ/bluetooth-firmware-classic/releases
找到您要驗證的固件版本,並點擊 GitHub Action 連結。
點擊 Artifacts 下方的固件名稱進行下載(需登入 GitHub)。
✔ 下載 OneKey 團隊簽名藍牙固件檔案(已簽名)
前往 OneKey 藍牙固件官方 GitHub 發佈頁面
OneKey Classic & Classic 1S: https://github.com/OneKeyHQ/bluetooth-firmware-classic/releases
找到您要驗證的固件版本。
點擊 Assets 下方的 bin 檔案進行下載。
✔ 下載 OneKey 官方 CDN 儲存的藍牙固件檔案(已簽名)
瀏覽 OneKey CDN 檔案:https://data.onekey.so/config.json
找到您要驗證的固件版本。
複製 "ble" - "webUpdate" 欄位下的連結。
在新的瀏覽器視窗中打開該連結,即可自動下載 bin 檔案。
✔ 下載並安裝 Python
下載並安裝最新版本的 Python。
驗證步驟
以下是前述兩個目標的驗證步驟:
系統固件 藍牙固件
GitHub CI 預簽名固件驗證流程(系統)
打開終端機 (Terminal)。
運行以下命令(針對 OneKey 團隊簽名固件檔案):
tail -c +1024 /path/to/(檔案路徑) | shasum -a 256
運行以下命令(針對 GitHub CI 預簽名固件檔案):
tail -c +1024 /path/to/(檔案路徑) | shasum -a 256
比較兩條命令生成的校驗和。如果結果一致,即可確認該「OneKey 團隊簽名固件檔案」源自 OneKey 開源倉庫中的「GitHub CI 預簽名固件檔案」。
對於系統固件,CI 版本的固件會添加一個 1024 位元組的簽名結果,此簽名在設備啟動時由 Bootloader 進行驗證。
OneKey 官方 CDN 儲存的固件檔案驗證流程(系統)
打開終端機。
運行以下命令(針對 OneKey 團隊簽名固件檔案):
shasum -a 256 (檔案路徑)
運行以下命令(針對 OneKey 官方 CDN 儲存的固件檔案):
shasum -a 256 (檔案路徑)
比較兩條命令生成的校驗和。如果結果一致,則確認兩個固件檔案的代碼一致性。
GitHub CI 預簽名固件驗證流程(藍牙)
在您下載的 GitHub CI 預簽名藍牙固件資料夾中找到 ota.bin 檔案。
在包含 ota.bin 的資料夾中打開終端機。
執行 Python 指令:python3
運行以下命令以獲取 GitHub CI 預簽名藍牙固件的校驗和:
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 團隊簽名藍牙固件檔案運行同樣的命令。
注意:請將命令中的 ota.bin 修改為 OneKey 團隊簽名藍牙固件檔案的名稱。
比較兩條命令生成的校驗和。如果結果一致,即可確認該「OneKey 團隊簽名固件檔案」源自 OneKey 開源倉庫中的「GitHub CI 預簽名固件檔案」。
OneKey 官方 CDN 儲存的固件檔案驗證流程(藍牙)
在包含 OneKey 團隊簽名藍牙固件檔案的資料夾中打開終端機。
執行 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 團隊簽名藍牙固件檔案名稱。.
運行命令以獲取校驗和。
對您下載的 OneKey 官方 CDN 儲存的藍牙固件檔案重複上述步驟。
比較兩條命令生成的校驗和。如果結果一致,則確認兩個固件檔案的代碼一致性。
