MS-RTOS APP 镜像数字签名
本章将介绍 MS-RTOS APP 镜像数字签名的使用。
为什么需要 APP 镜像数字签名?
APP 镜像数字签名有效阻止了未经签名或被恶意篡改或伪造的 APP 在目标系统(如智能电力设备)上运行,有效保证了目标系统的安全性。
使能 APP 镜像数字签名功能
APP 镜像数字签名功能在 MS-RTOS Base 工程构建时默认是关闭的,使用此功能需要重新构建 MS-RTOS Base,并修改默认配置。具体修改方式如下:
通过登录 MS-RTOS 云开发平台,进入 MS-RTOS 构建界面,点击参数配置:
在 APP 启动器使能菜单下选择一种 APP 镜像数字签名算法:
保存并构建 Base,在之后系统镜像编译与 APP 编译时均需要使用此 Base。
安装 python3
下载 python3 安装包并安装 https://www.python.org/downloads/
安装时勾选添加到环境变量 PATH
或手动添加 python3 安装目录到环境变量 PATH
,这样可在命令控制台下直接执行 python 文件。
更换 python pip3 源
源 | 地址 |
---|---|
阿里云 | http://mirrors.aliyun.com/pypi/simple/ |
中国科技大学 | https://pypi.mirrors.ustc.edu.cn/simple/ |
豆瓣(douban) | http://pypi.douban.com/simple/ |
清华大学 | https://pypi.tuna.tsinghua.edu.cn/simple/ |
中国科学技术大学 | http://pypi.mirrors.ustc.edu.cn/simple/ |
使用以下命令更换 python pip3
源:
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
升级 pip 到最新版本
pip install pip -U
工具
APP 数字签名功能相关工具、文件见 MS-RTOS Base 目录 libmsrtos\src\hosttools
。
安装数字签名工具依赖
pip3 install --user -r requirements.txt
生成数字签名私钥
执行以下命令生成数字签名私钥,使用 rsa-2048
签名算法:
./msrtos-sign.py keygen -k filename.pem -t rsa-2048
请妥善保管 filename.pem
,不要泄漏。
除了 rsa-2048
外,msrtos-sign.py
还支持以下几种数字签名算法:
- rsa-2048
- rsa-3072
- ecdsa-p256
- ecdsa-p224
- ed25519
- x25519
请确保使用的数字签名算法与 MS-RTOS SDK 的配置一致。
生成数字签名公钥
./msrtos-sign.py getpub -k filename.pem
控制台将输出:
/* Autogenerated by imgtool.py, do not edit. */
const unsigned char rsa_pub_key[] = {
...
};
const unsigned int rsa_pub_key_len = 270;
将以上代码复制到 BSP 的 bsp_init.c
文件,BSP 的启动线程 boot_thread
在调用 ms_app_start
或 ms_apps_start
函数启动 APP 前,需要加入 launcher
的初始化,并传入数字签名公钥:
static void boot_thread(ms_ptr_t arg)
{
// do some thing
ms_launcher_init(rsa_pub_key, rsa_pub_key_len);
// do some thing
ms_apps_start("ms-boot-param.dtb");
}
对 APP 镜像数字签名
使用如下命令对 helloworld.bin
进行数字签名,将生成 signed-helloworld.bin
,--slot-size
指定的大小需要比镜像文件要大:
./msrtos-sign.py sign --key filename.pem --header-size 64 --align 8 --version 1.2 --slot-size 0x60000 --pad-header helloworld.bin signed-helloworld.bin
一个数字签名不合法的 APP,ms_app_start
或 ms_apps_start
函数将返回 MS_ERR_LAUNCHER_APP_SIGNATURE_FAIL
。