1. 前言
部分客户要求对 M 核进行保护和加密,对于此功能的支持,ST 提供了 Wiki How to protect the coprocessor firmware - stm32mpu (stmicroelectronics.cn),详细解释了如何保护由主处理器(A 核)加载到协处理器(M 核)的软件,并由 OP-TEE 认证需要被加载的固件。
图 1 描述了固件签名和执行过程:
(1)由 STM32CubeIDE 基于 M 核的程序编译出 M 核固件.elf 文件。依据公钥和私钥使用 OP-TEE 签名脚本进行签名,该脚本给 M 核固件.elf 文件添加了一个包含认证信息的 Header(包含要加载的段的哈希值的哈希表和使用私钥计算的签名)。
PC $ > cd <path to distribution package source>/build-openstlinuxweston-stm32mp15-disco/
PC $ > devtool modify tf-a-stm32mp
PC $ > devtool modify optee-os-stm32mp
执行完毕后,在<path to distribution package source>/build-openstlinuxweston-stm32mp15-disco/路径下会生成 workspace 目录,如下:
PC $ > cd <path to distribution package source>/build-openstlinuxwestonstm32mp15-disco/workspace/sources/optee-os-stm32mp
PC $ > vim core/arch/arm/plat-stm32mp1/conf.mk
PC $ > cd <path to distribution package source>/build-openstlinuxweston-stm32mp15-disco/workspace/sources/tf-a-stm32mp
PC $ > vim plat/st/stm32mp1/platform.mk
图8. STM32MP1_OPTEE_IN_SYSRAM=y
OP-TEE 中需要嵌入:远程处理器可信应用(TA);远程处理器平台伪可信应用(PTA);stm32mp 远程处理驱动程序。故在 OP-TEE 的配置文件中还需要将CFG_DRIVERS_REMOTEPROC、CFG_STM32MP_REMOTEPROC、CFG_RPROC_PTA
使能,在<path to distribution package source>/build-openstlinuxweston-stm32mp15-disco/workspace/sources/optee-os-stm32mp/core/arch/arm/plat-stm32mp1/conf.mk 文件中只需将 CFG_RPROC_PTA 设置为 y(yes)即可。
PC $ > cd <path to distribution package source>/build-openstlinuxweston-stm32mp15-disco/workspace/sources/optee-os-stm32mp
PC $ > vim core/arch/arm/plat-stm32mp1/conf.mk
图9. CFG_RPROC_PTA=y
注:注意图 9 中的 TA 名称,若此 TA 被成功编译到 OP-TEE 中,可在后续查看 TA 的步骤中看到此 TA 的名字。TA 名字一般不会随着 SDK 版本的迭代而更新,但客户在实际调试过程中仍需要注意 TA 的名字。CFG_RPROC_PTA 在后续版本有可能会切换为CFG_STM32MP_REMOTEPROC。
2.2.2. 固件签名
OP-TEE ST 发行版集成了 sign_rproc_fw.py,可以对固件二进制.elf 文件进行签名。
可在 OP-TEE 源码路径下找到.py 文件,路径示例:<path to distribution package source>/build-openstlinuxweston-stm32mp15-disco/workspace/sources/optee-os-stm32mp scripts/sign_rproc_fw.py。
此脚本的运行依赖 python 库,请先确保以下库被成功安装:
PC $> pip install pyelftools pycryptodomex
OP-TEE 签名固件可选用默认密钥或客户自行生成并指定的密钥:
(1)使用 OP-TEE 仓库中可用的默认 RSA 密钥:默认密钥路径:<path to distribution package source>/build-openstlinuxweston-stm32mp15-disco/workspace/sources/optee-os-stm32mp/keys/default_rproc.pem
PC $ > ./scripts/sign_rproc_fw.py sign –in <firmware path/firmware name>
3. 运行测试
验证测试需要首先确保 TA 被成功编译并集成到文件系统中,检查路径/sys/bus/tee/devices/,TA optee-ta-80a4c275-0a47-4905-8285-1486a9771a08 即为本次添加的 TA,如果没有生成这个 TA 说明上述步骤未成功执行:
root@stm32mp1:~# ls /sys/bus/tee/devices/
optee-ta-80a4c275-0a47-4905-8285-1486a9771a08
optee-ta-a8cfe406-d4f5-4a2e-9f8d-a25dc754c099
optee-ta-d96a5b40-c3e5-21e3-8794-1002a5d5c61b
optee-ta-94cf71ad-80e6-40b5-a7c6-3dc501eb2803
optee-ta-ab7a617c-b8e7-4d8f-8301-d09b61036b64
可参考 ST 提供的 M 核拉起脚本修改客户自己的启动脚本,示例:
root@stm32mp1:/# cd /usr/local/Cube-M4-examples/STM32MP157C-DK2/Examples/GPIO/GPIO_EXTI/
root@stm32mp1:/usr/local/Cube-M4-examples/STM32MP157C-DK2/Examples/GPIO/GPIO_EXTI# ./fw_cortex_m4.sh start