跳转到主要内容

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

更新于今天

OneKey 硬件钱包采用完全开源的固件。您可以在 OneKey 的 GitHub 仓库中查看相关产品的开源固件代码。在正式发布量产固件文件之前,OneKey 团队会使用 GitHub 的构建自动化工具(GitHub CI)从相应的固件仓库编译和构建固件源代码。随后,这些文件会由 OneKey 团队进行签名,然后才正式发布。

本文提供了一种自验证方法,通过比较官方团队多重签名(Multi-sig)前后的文件校验和(Checksums),以验证固件文件与开源代码的一致性。

有关如何使用 SHA-256 加密哈希函数校验不同文件源代码一致性(比较 Checksums)的方法,请参阅此文章

开源固件仓库

OneKey Pro

OneKey Classic 1S

OneKey Classic

OneKey Touch

OneKey Mini

如需重现 OneKey 的固件发布流程,请观看下方的视频教程

固件发布流程

当官方标准固件或蓝牙固件准备就绪后,OneKey 团队会执行相应仓库的 Action 进行开源代码编译。编译成功后,文件会上传至 GitHub Artifacts 存储区,等待团队完成内部多重签名,之后再上传至 OneKey 的 CDN。在更新 config.json 文件后,OneKey App 和 OneKey 固件更新网站 会推送更新通知,提示用户进行固件升级。具体流程请参考下图。

onekey github verifiy.png

验证目标

  1. 验证“OneKey 团队签名固件文件”是否源自 OneKey 开源仓库中的“GitHub CI 预签名固件文件”。

  2. 验证“OneKey 团队签名固件文件”与“OneKey 官方 CDN 存储固件文件”的一致性。

前提条件

系统固件 蓝牙固件

✔ 下载 GitHub CI 预签名固件(未签名)

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

2.png

✔ 下载 OneKey 团队签名固件(已签名)

github release bin.png

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

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

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

  • 复制 "url" 字段下的链接。

  • 在新浏览器窗口中打开链接,即可自动下载 bin 文件。

3.png

✔ 下载 GitHub CI 预签名蓝牙固件(未签名)

pro-bluetooth-firmware-github-ci.png
  • 点击 Artifacts 下方的固件名称进行下载(需要登录 GitHub)。

pro-bluetooth-firmware-github-ci-bin.png

✔ 下载 OneKey 团队签名蓝牙固件(已签名)

pro-bluetooth-firmware-github-release-signed.png

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

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

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

  • 复制 "ble" - "webUpdate" 字段下的链接。

  • 在新浏览器窗口中打开链接,即可自动下载 bin 文件。

pro-ble-firmware-cdn.png

✔ 下载并安装 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 预签名固件文件”。

7.png

对于系统固件,CI 版本的固件通过在文件前添加 1024 字节的签名,设备启动时引导加载程序(Bootloader)会对该签名进行验证。

通过 OneKey 官方 CDN 存储固件进行验证(系统固件)

  • 打开终端(Terminal)。

  • 运行下方的命令(执行 OneKey 团队签名固件文件):

    • shasum -a 256 (文件路径)

  • 运行下方的命令(执行 OneKey 官方 CDN 存储固件文件):

    • shasum -a 256 (文件路径)

  • 比较这两个命令生成的 Checksums。如果结果一致,则确认了两个固件文件的代码一致性。

6.png

通过 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""")

checksum-github-ci-ble.png
  • 对 OneKey 团队签名蓝牙固件文件运行相同的命令。

    • 注意:请将命令中的 ota.bin 替换为 OneKey 团队签名蓝牙固件文件的名称。

checksum-github-release.png
  • 比较这两个命令生成的 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。如果结果一致,则确认了两个固件文件的代码一致性。

compare-ble-checksum.png
这是否解答了您的问题?