跳转到主要内容

验证 OneKey 发布的固件文件与开源代码的一致性

OneKey avatar
作者:OneKey
本周更新

OneKey 的硬件钱包系列产品的固件是全开源的,您可以在 OneKey 的 GitHub 仓库中查看相关产品的固件开源代码。在正式发布用于批量生产的固件文件之前,OneKey 团队会通过 GitHub 自动化构建工具(GitHub CI)从相应的固件仓库中编译和打包固件源代码。再由 OneKey 内部人员进行签名后发布正式的固件文件。这篇文章提供给您一种自验证的方法,通过比较正式签名发布前后文件的 Checksum 来验证固件文件与开源代码的一致性。

关于如何通过 SHA-256 加密哈希函数(比对 Checksum)验证不同文件的源数据一致性的方法,可以参考这篇文章

固件代码开源仓库

OneKey Pro

OneKey Classic 1S

OneKey Classic

OneKey Touch

OneKey Mini

固件发布流程

当有正式的固件或蓝牙固件准备发布时,OneKey 团队会通过执行对应仓库的 Action 对开源的代码进行编译签名,编译成功后会上传到 GitHub Artifacts 存储,等待团队完成内部签名后,放置到 OneKey 的 CDN 上。更新配置 config.json 完成后,在 OneKey App 和 OneKey 固件更新网站 推送更新通知,提示用户进行对应的固件升级。具体流程参考下图:

校验目标

  1. 验证「OneKey 团队签名后的固件文件」是经过 OneKey 团队多签「OneKey 开源仓库中 GitHub CI 签名前的固件文件」后得来。

  2. 验证「OneKey 团队签名后的固件文件」和「OneKey 官方 CDN 存储的固件文件」的一致性。

校验前准备

系统固件 蓝牙固件

✔ 下载「OneKey 开源仓库中 GitHub CI 签名前的固件文件」(未签名)

  • 点击 Artifacts 下的固件名称进行下载(需要登录 GitHub)。

✔ 下载「OneKey 团队签名后的固件文件」(已签名)

✔ 下载 「OneKey 官方 CDN 存储的固件文件」(已签名)

  • 访问 OneKey CDN 文件:https://data.onekey.so/config.json

  • 找到您要验证的固件版本。

  • 复制「url」字段下的链接。

  • 在浏览器新窗口打开,将自动为您下载 bin 文件。

✔ 下载「OneKey 开源仓库中 GitHub CI 签名前的固件文件」(未签名)

  • 点击「Artifacts」下的固件文件名启动下载(需要提前登陆您的 GitHub 账号)。

✔ 下载「OneKey 团队签名后的蓝牙固件文件」(已签名)

✔ 下载 「OneKey 官方 CDN 存储的蓝牙固件文件」(已签名)

  • 找到您想要验证的版本号。例如:"pro" - "ble" - "version": [2, 3, 1]。

  • 复制「webUpdate」下的固件下载链接。

  • 在新的浏览器窗口访问该链接,固件文件将自动下载。

✔ 下载并安装 Python

校验步骤

下面提供了两个目标对应的验证步骤:

系统固件 蓝牙固件

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

这是否解答了您的问题?