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)
- 蓝牙固件:github.com/OneKeyHQ/bluetooth-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
- OneKey Pro: https://github.com/OneKeyHQ/bluetooth-firmware-pro/releases
- OneKey Touch: https://github.com/OneKeyHQ/bluetooth-firmware-touch/releases
- 找到您想要验证的固件版本号,并点击「github action」下的链接。
- 点击「Artifacts」下的固件文件名启动下载(需要提前登陆您的 GitHub 账号)。
✔ 下载「OneKey 团队签名后的蓝牙固件文件」(已签名)
- 访问 OneKey GitHub 的 Release 页面(选择对应的硬件钱包型号):
- 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
- 找到您想要验证的蓝牙固件版本。
- 点击下载「Assets」下的固件 bin 文件。
✔ 下载 「OneKey 官方 CDN 存储的蓝牙固件文件」(已签名)
- 访问 OneKey CDN:https://data.onekey.so/config.json
- 找到您想要验证的版本号。例如:"pro" - "ble" - "version": [2, 3, 1]。
- 复制「webUpdate」下的固件下载链接。
- 在新的浏览器窗口访问该链接,固件文件将自动下载。
✔ 下载并安装 Python
- 访问:https://www.python.org/downloads/
- 下载并安装最新的 Python(例如:3.x.x)。
校验步骤
下面提供了两个目标对应的验证步骤:
验证目标一
- 打开 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 进行验证。
验证目标二
- 打开 Terminal。
- 运行指令(OneKey 团队签名后的固件):
-
shasum -a 256 (文件路径)
-
- 运行指令(OneKey 官方 CDN 存储的固件):
-
shasum -a 256 (文件路径)
-
- 比对两个指令生成的 Checksum。若结果相同,则可以确定两个固件文件的代码一致性。
验证目标一(蓝牙)
验证目标一(蓝牙)
- 在您下载的「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 团队签名后的固件」文件的相同文件夹下,打开一个 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。若结果相同,则可以确定两个固件文件的代码一致性。