OneKey 硬件钱包采用完全开源的固件。您可以在 OneKey 的 GitHub 仓库中查看相关产品的开源固件代码。在正式发布量产固件文件之前,OneKey 团队会使用 GitHub 的构建自动化工具(GitHub CI)从相应的固件仓库编译和构建固件源代码。随后,这些文件会由 OneKey 团队进行签名,然后才正式发布。
本文提供了一种自验证方法,通过比较官方团队多重签名(Multi-sig)前后的文件校验和(Checksums),以验证固件文件与开源代码的一致性。
有关如何使用 SHA-256 加密哈希函数校验不同文件源代码一致性(比较 Checksums)的方法,请参阅此文章。
开源固件仓库
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 Release 页面:https://github.com/OneKeyHQ/firmware/releases
找到您要验证的固件版本,然后点击 GitHub Action 链接。
点击 Artifacts 下方的固件名称进行下载(需要登录 GitHub)。
✔ 下载 OneKey 团队签名固件(已签名)
进入 OneKey 硬件固件官方 GitHub Release 页面:https://github.com/OneKeyHQ/firmware/releases
找到您要验证的固件版本。
点击 Assets 下方的 bin 文件进行下载。
✔ 下载 OneKey 官方 CDN 存储固件(已签名)
访问 OneKey CDN 文件地址:https://data.onekey.so/config.json
找到您要验证的固件版本。
复制 "url" 字段下的链接。
在新浏览器窗口中打开链接,即可自动下载 bin 文件。
✔ 下载 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
找到您要验证的固件版本。
复制 "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
比较这两个命令生成的 Checksums。如果结果一致,则可确认“OneKey 团队签名固件文件”源自 OneKey 开源仓库中的“GitHub CI 预签名固件文件”。
对于系统固件,CI 版本的固件通过在文件前添加 1024 字节的签名,设备启动时引导加载程序(Bootloader)会对该签名进行验证。
通过 OneKey 官方 CDN 存储固件进行验证(系统固件)
打开终端(Terminal)。
运行下方的命令(执行 OneKey 团队签名固件文件):
shasum -a 256 (文件路径)
运行下方的命令(执行 OneKey 官方 CDN 存储固件文件):
shasum -a 256 (文件路径)
比较这两个命令生成的 Checksums。如果结果一致,则确认了两个固件文件的代码一致性。
通过 GitHub CI 预签名固件进行验证(蓝牙固件)
在下载的 GitHub CI 预签名蓝牙固件文件夹中找到 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 团队签名蓝牙固件文件的名称。
比较这两个命令生成的 Checksums。如果结果一致,则可确认“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 存储蓝牙固件文件重复上述步骤。
比较这两个命令生成的 Checksums。如果结果一致,则确认了两个固件文件的代码一致性。
