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。若结果相同,则可以确定两个固件文件的代码一致性。