OneKey 的硬體錢包系列產品的韌體是全開源的,您可以在 OneKey 的 GitHub 倉庫中查看相關產品的韌體開源程式碼。在正式發布用於批量生產的韌體檔案之前,OneKey 團隊會通過 GitHub 自動化建置工具(GitHub CI)從相應的韌體倉庫中編譯和打包韌體原始碼。再由 OneKey 內部人員進行簽名後發布正式的韌體檔案。這篇文章提供給您一種自我驗證的方法,透過比較正式簽名發布前後檔案的 Checksum 來驗證韌體檔案與開源程式碼的一致性。
關於如何透過 SHA-256 加密雜湊函數(比對 Checksum)驗證不同檔案的源數據一致性的方法,可以參考這篇文章。
韌體程式碼開源倉庫
OneKey Pro
OneKey Classic 1S
OneKey Classic
OneKey Touch
⚙ 系統韌體:github.com/OneKeyHQ/firmware (分支:touch)
OneKey Mini
驗證硬體驗證程式碼影片教學如下
韌體發布流程
當有正式的韌體或藍牙韌體準備發布時,OneKey 團隊會透過執行對應倉庫的 Action 對開源的程式碼進行編譯簽名,編譯成功後會上傳到 GitHub Artifacts 儲存,等待團隊完成內部簽名後,放置到 OneKey 的 CDN 上。更新設定 config.json 完成後,在 OneKey App 和 OneKey 韌體更新網站 推送更新通知,提示用戶進行對應的韌體升級。具體流程參考下圖:
校驗目標
驗證「OneKey 團隊簽名的韌體檔案」是經過 OneKey 團隊多簽「OneKey 開源倉庫中 GitHub CI 簽名前的韌體檔案」後得來。
驗證「OneKey 團隊簽名的韌體檔案」和「OneKey 官方 CDN 儲存的韌體檔案」的一致性。
校驗前準備
系統韌體 藍牙韌體
✔ 下載「OneKey 開源倉庫中 GitHub CI 簽名前的韌體檔案」(未簽名)
訪問 OneKey 正式硬體韌體發布頁:https://github.com/OneKeyHQ/firmware/releases
找到您要驗證的韌體版本,點擊 GitHub Action 連結。
點擊 Artifacts 下的韌體名稱進行下載(需要登錄 GitHub)。
✔ 下載「OneKey 團隊簽名的韌體檔案」(已簽名)
訪問 OneKey 正式硬體韌體發布頁:https://github.com/OneKeyHQ/firmware/releases
找到您要驗證的韌體版本。
點擊下載 Assets 下的 bin 檔案。
✔ 下載 「OneKey 官方 CDN 儲存的韌體檔案」(已簽名)
訪問 OneKey CDN 檔案:https://data.onekey.so/config.json
找到您要驗證的韌體版本。
複製「url」欄位下的連結。
在瀏覽器新視窗打開,將自動為您下載 bin 檔案。
✔ 下載「OneKey 開源倉庫中 GitHub CI 簽名前的韌體檔案」(未簽名)
訪問 OneKey GitHub 的 Release 頁面(選擇對應的硬體錢包型號):
OneKey Classic & Classic 1S: https://github.com/OneKeyHQ/bluetooth-firmware-classic/releases
找到您想要驗證的韌體版本號,並點擊「github action」下的連結。
點擊「Artifacts」下的韌體檔名啟動下載(需要提前登錄您的 GitHub 帳號)。
✔ 下載「OneKey 團隊簽名的藍牙韌體檔案」(已簽名)
訪問 OneKey GitHub 的 Release 頁面(選擇對應的硬體錢包型號):
OneKey Classic & Classic 1S: https://github.com/OneKeyHQ/bluetooth-firmware-classic/releases
找到您想要驗證的藍牙韌體版本。
點擊下載「Assets」下的韌體 bin 檔案。
✔ 下載 「OneKey 官方 CDN 儲存的藍牙韌體檔案」(已簽名)
訪問 OneKey CDN:https://data.onekey.so/config.json
找到您想要驗證的版本號。例如:「pro」-「ble」-「version」:[2, 3, 1]。
複製「webUpdate」下的韌體下載連結。
在新的瀏覽器視窗訪問該連結,韌體檔案將自動下載。
✔ 下載並安裝 Python
下載並安裝最新的 Python(例如:3.x.x)。
校驗步驟
下面提供了兩個目標對應的驗證步驟:
系統韌體 藍牙韌體
使用「OneKey 開源倉庫中 GitHub CI 簽名前的韌體檔案」驗證
打開 Terminal。
運行指令(OneKey 團隊簽名的韌體):
tail -c +1024 /path/to/(檔案路徑) | shasum -a 256
運行指令(OneKey 開源倉庫中 GitHub CI 簽名前的韌體):
tail -c +1024 /path/to/(檔案路徑) | shasum -a 256
比對兩個指令生成的 Checksum。若結果相同,則可以確定兩個韌體檔案的程式碼一致性。
對於系統韌體來說(Classic、Mini 和 Touch 均適用),多簽後會在 CI 版本的韌體前增加 1024 位元組的簽名結果,在設備啟動時 bootloader 進行驗證。
使用「 OneKey 團隊簽名的韌體」驗證
打開 Terminal。
運行指令(OneKey 團隊簽名的韌體):
shasum -a 256 (檔案路徑)
運行指令(OneKey 官方 CDN 儲存的韌體):
shasum -a 256 (檔案路徑)
比對兩個指令生成的 Checksum。若結果相同,則可以確定兩個韌體檔案的程式碼一致性。
驗證目標一(藍牙)
使用「OneKey 開源倉庫中 GitHub CI 簽名前的韌體檔案」驗證(藍牙)
在您下載的「OneKey 開源倉庫中 GitHub CI 簽名前的韌體檔案」中找到 ota.bin 檔案。
在和 ota.bin 檔案同一個資料夾中打開一個 Terminal。
在命令列中輸入
python3
指令喚起 Python。然後運行下面的命令來得到「OneKey 開源倉庫中 GitHub CI 簽名前的韌體檔案」的 Checksum 驗證和。
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 團隊簽名的韌體檔案」的 Checksum 驗證和。
⚠️ 注意:需要將命令中的 ota.bin 換成您下載的「OneKey 團隊簽名的韌體檔案」的名字,例如:bluetooth-firmware-pro-2.3.1-20240729-96bb143.bin
比對兩個指令生成的 Checksum。若結果相同,則可以確定兩個韌體檔案的程式碼一致性。
使用「 OneKey 團隊簽名的韌體」驗證(藍牙)
在您下載的「OneKey 團隊簽名的韌體檔案」的相同資料夾下,打開一個 Terminal。
在命令列中輸入
python3
指令喚起 Python。複製下面的命令。
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-firmware-pro-2.3.1-20240729-96bb143.bin
運行修改後的命令獲取「OneKey 團隊簽名的韌體檔案」的 Checksum 驗證和。
重複上面相同的步驟來獲取「OneKey 官方 CDN 儲存的韌體檔案」的 Checksum 驗證和。
比對兩個指令生成的 Checksum。若結果相同,則可以確定兩個韌體檔案的程式碼一致性。