目前 OneKey 硬件产品 classic、mini 和 touch 所有安装的固件均开源且可以通过 CI 编译出最终待发布的固件。包含的具体固件类型及开源的仓库如下:
-
OneKey Classic
-
普通固件:https://github.com/OneKeyHQ/firmware(bixin_dev 分支)
-
蓝牙固件:https://github.com/OneKeyHQ/bluetooth-firmware-classic (main 分支)
-
-
OneKey Mini
-
普通固件:https://github.com/OneKeyHQ/firmware (mini 分支)
-
-
OneKey Touch
-
普通固件:https://github.com/OneKeyHQ/firmware (touch 分支)
-
蓝牙固件:https://github.com/OneKeyHQ/bluetooth-firmware-touch (main 分支)
-
所有固件的发布均会通过 CI 进行打包后,由 OneKey 内部人员进行签名后发布。
当有正式的固件或蓝牙固件准备发布时,我们会通过执行对应仓库的 action,在 CI 中对开源的代码进行编译,编译成功后会上传到 github artifacts 存储,最终签名后放置到 OneKey 的 CDN 上后,更新配置https://data.onekey.so/config.json 后,在 OneKey APP 和 https://firmware.onekey.so 进行更新提示用户对应的更新。
OneKey 普通固件验证方式
验证 github release 与 CI 编译时的代码一致
以最新发布的 OneKey Classic v2.9.0 版本固件为例,首先在仓库 release 中找到对应的 commit https://github.com/OneKeyHQ/firmware/releases
点击图一位置即可找到编译时的 commit hash,也可点击 compare 对比新老两个版本之间所有提交的代码和 commit,在 release 的 assets 当中会放置签名后的待发布固件内容。
点击上述红框中的 CI 任务,找到当前固件的编译过程(注:因为部分固件在别的分支当中,所以在验证 commit hash 时,需要确认 checkout 任务是否一致)
点击进入 CI 任务详情,查看 checkout 相关的信息,可以看到此时是编译的 2bd0563 开头的 commit,与 release 发布的 commit 一致
CI 产生的固件会上传到 github artifacts 暂时存储,OneKey 会将 CI 产生的固件进行再次签名(多签)之后,更新 github release 再发布到用户终端。内部主要会产生两个文件:
bootloader.*.bin |
出厂烧录进硬件设备后无法更改 |
启动校验固件签名信息等 |
firmware.*.bin |
用户可通过工具更新进入设备 |
各类业务相关逻辑 |
对于普通固件来说(Classic、Mini 和 Touch 均适用),多签后会在 CI 版本的固件前增加 1024 字节的签名结果,在设备启动时 bootloader 进行验证。
为了方便用户下载,OneKey 会将签名的结果放置于 CDN 内。所以对于 https://data.onekey.so/config.json 中的 classic.url
字段来说,需要再进行两步验证确保发布的版本是一致的。
-
验证 github release 中下载的固件和 CDN 完全一致
-
验证 github release 是由 CI 多签后得到的
tail -c +1024 /path/to/bin | shasum -a 256
针对截图中展示的三个 bin 文件名称
ci-classic.*.bin 代表从 github CI 中下载的固件内容(未签名)
release-classic.*.bin 代表从 github release 中下载的固件内容(已签名)
classic.*.bin 代表从 OneKey CDN 下载的固件内容(已签名)
由此即可验证,OneKey 发布的所有固件,无论是 github release 还是 CDN 发布的,都是由开源代码通过 github action(CI) 编译处理多签后发布的。
如果用户在下载安装时,没有安装多签后的固件,或固件签名异常,则会在启动时有风险版本的提示信息。
评论
0 条评论
文章评论已关闭。