跳至主要內容

驗證固件檔案與 OneKey 發佈的開源代碼的一致性

今日已更新

OneKey 硬體錢包採用完全開源的固件。您可以在 OneKey 的 GitHub 倉庫中查看相關產品的開源固件代碼。在正式發佈量產用的固件檔案之前,OneKey 團隊會使用 GitHub 的自動化建構工具 (GitHub CI) 從相應的固件倉庫中編譯並建構固件代碼。隨後,這些檔案會經由 OneKey 團隊簽名後才正式發佈。

本文提供了一種自我驗證方法,透過對比團隊多重簽名前後的檔案校驗和(Checksum),以驗證固件檔案與開源代碼之間的一致性。

若需了解如何使用 SHA-256 加密雜湊函數(比較校驗和)驗證不同檔案原始數據一致性的方法,請參閱此文章

開源固件倉庫

OneKey Pro

OneKey Classic 1S

OneKey Classic

OneKey Touch

OneKey Mini

若要重現 OneKey 的固件發佈流程,請參考以下影片教學

固件發佈流程

當官方標準固件或藍牙固件準備發佈時,OneKey 團隊會執行相應倉庫的 Action 來編譯開源代碼。編譯成功後,檔案會上傳至 GitHub Artifacts 儲存空間,等待團隊完成內部多重簽名,隨後部署至 OneKey 的 CDN。更新 config.json 檔案後,更新通知會透過 OneKey App 和 OneKey 固件更新網站推播,提示用戶升級固件。具體流程請參考下圖。

onekey github verifiy.png

驗證目標

  1. 驗證「OneKey 團隊簽名固件檔案」源自 OneKey 開源倉庫中的「GitHub CI 預簽名固件檔案」。

  2. 驗證「OneKey 團隊簽名固件檔案」與「OneKey 官方 CDN 儲存的固件檔案」之間的一致性。

前置準備

系統固件 藍牙固件

✔ 下載 GitHub CI 預簽名固件檔案(未簽名)

github action.png
  • 點擊 Artifacts 下方的固件名稱進行下載(需登入 GitHub)。

2.png

✔ 下載 OneKey 團隊簽名固件檔案(已簽名)

github release bin.png

✔ 下載 OneKey 官方 CDN 儲存的固件檔案(已簽名)

  • 瀏覽 OneKey CDN 檔案:https://data.onekey.so/config.json

  • 找到您要驗證的固件版本。

  • 複製 "url" 欄位下的連結。

  • 在新的瀏覽器視窗中打開該連結,即可自動下載 bin 檔案。

3.png

✔ 下載 GitHub CI 預簽名藍牙固件檔案(未簽名)

pro-bluetooth-firmware-github-ci.png
  • 點擊 Artifacts 下方的固件名稱進行下載(需登入 GitHub)。

pro-bluetooth-firmware-github-ci-bin.png

✔ 下載 OneKey 團隊簽名藍牙固件檔案(已簽名)

pro-bluetooth-firmware-github-release-signed.png

✔ 下載 OneKey 官方 CDN 儲存的藍牙固件檔案(已簽名)

  • 瀏覽 OneKey CDN 檔案:https://data.onekey.so/config.json

  • 找到您要驗證的固件版本。

  • 複製 "ble" - "webUpdate" 欄位下的連結。

  • 在新的瀏覽器視窗中打開該連結,即可自動下載 bin 檔案。

pro-ble-firmware-cdn.png

✔ 下載並安裝 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 預簽名固件檔案」。

7.png

對於系統固件,CI 版本的固件會添加一個 1024 位元組的簽名結果,此簽名在設備啟動時由 Bootloader 進行驗證。

OneKey 官方 CDN 儲存的固件檔案驗證流程(系統)

  • 打開終端機。

  • 運行以下命令(針對 OneKey 團隊簽名固件檔案):

    • shasum -a 256 (檔案路徑)

  • 運行以下命令(針對 OneKey 官方 CDN 儲存的固件檔案):

    • shasum -a 256 (檔案路徑)

  • 比較兩條命令生成的校驗和。如果結果一致,則確認兩個固件檔案的代碼一致性。

6.png

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""")

checksum-github-ci-ble.png
  • 對 OneKey 團隊簽名藍牙固件檔案運行同樣的命令。

    • 注意:請將命令中的 ota.bin 修改為 OneKey 團隊簽名藍牙固件檔案的名稱。

checksum-github-release.png
  • 比較兩條命令生成的校驗和。如果結果一致,即可確認該「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 儲存的藍牙固件檔案重複上述步驟。

  • 比較兩條命令生成的校驗和。如果結果一致,則確認兩個固件檔案的代碼一致性。

compare-ble-checksum.png
是否回答了您的問題?