[其他ST产品] 使用 OP-TEE 进行 M 核固件认证 LAT6028

[复制链接]
471|0
STM新闻官 发表于 2025-9-16 22:56 | 显示全部楼层 |阅读模式
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(包含要加载的段的哈希值的哈希表和使用私钥计算的签名)。

(2)在执行阶段:远程处理框架(Remoteproc Framework)从文件系统中读取被签名的固件二进制文件,并将固件提供给 OP-TEE 可信应用程序;OP-TEE 可信应用程序将对固件进行认证,并将其安装在受保护的 Cortex-M 内存中。
3736568c979dda8895.png

图1. 签名及执行过程

本文是对此篇 Wiki 的补充,补充阐述使用 OP-TEE 进行 M4 固件认证的详细操作过程,此过程简称为“对 M 核加签”。

ST 提供了两种对 M 核加签的方式,一种是基于 Developer Pacakge 的版本,另一种是基于 Distribution Package 的版本,两种方式原理一致,仅在编译形式和指令上略有区别,客户可根据自己的偏好和开发环境自由选择加签方式。

2. M 核加签
在 Ecosystem 5.0.0 及以上版本中,STM32MP15x 系列的 OP-TEE 默认放在 DDR 中,默认配置禁用了安全服务,仅保留系统服务,如 PSCI 和 SCMI。 要嵌入带有 remoteproc 固件认证安全服务的 OP-TEE 固件,必须将 OP-TEE 放入 SYSRAM 中加载。

ST 目前提供了两种 M 核加签的方式,分别通过 Developer Package 和 Distribution Package 实现。用户可根据自己的开发环境选择性阅读本章 2.1 或 2.2 的内容。

2.1. (可选)基于 Developer Package 的 M 核加签
2.1.1. OP-TEE TA(Trusted Application)生成
OP-TEE 需要配置开关 CFG_STM32MP1_OPTEE_IN_SYSRAM=y,以便 OP-TEE 在安全的 SYSRAM 中执行。

PC $ > cd <path to developer package source>/optee-os-stm32mp-3.19.0-stm32mp-r1-r0/optee-os-stm32mp-3.19.0-stm32mp-r1/

PC $ > vim core/arch/arm/plat-stm32mp1/conf.mk

在此文件中将 CFG_STM32MP1_OPTEE_IN_SYSRAM 设置为 y(yes)。
159068c979ef161f0.png

图2. CFG_STM32MP1_OPTEE_IN_SYSRAM=y

TF-A 配置开关 STM32MP1_OPTEE_IN_SYSRAM=1,以便 TF-A/BL2 在安全的SYSRAM 中加载 OP-TEE,否则 TF-A 将无法引导 OP-TEE 镜像。

PC $ > cd <path to developer package source>/tf-a-stm32mp-v2.8.6-stm32mp-r1-r0/tf-a-stm32mp-v2.8.6-stm32mp-r1

PC $ > vim plat/st/stm32mp1/platform.mk
9467868c97a010016f.png

图3. STM32MP1_OPTEE_IN_SYSRAM=y

OP-TEE 中需要嵌入:远程处理器可信应用(TA);远程处理器平台伪可信应用(PTA);stm32mp 远程处理驱动程序。故在 OP-TEE 的配置文件中还需要将CFG_DRIVERS_REMOTEPROC、CFG_STM32MP_REMOTEPROC、CFG_RPROC_PTA使能,在 Developer Package 中,只需将 CFG_RPROC_PTA 设置为 y(yes)即可。

PC $ > cd <path to developer package source>/optee-os-stm32mp-3.19.0-stm32mp-r1-r0/optee-os-stm32mp-3.19.0-stm32mp-r1/

PC $ > vim core/arch/arm/plat-stm32mp1/conf.mk
5233368c97a13c9194.png

图4. CFG_RPROC_PTA=y

注:注意图 4 中的 TA 名称,若此 TA 被成功编译到 OP-TEE 中,可在后续查看 TA 的步骤中看到此 TA 的名字。

在 2.1.2 中将介绍固件签名的内容,OP-TEE 签名固件将涉及到密钥,此密钥可使用默认密钥或客户自行生成并指定的密钥,注意保证配置文件中的密钥与固件签名中的密钥一致。
459668c97a261c5bc.png

图5. CFG_RPROC_SIGN_KEY= <key file>

重新编译 OP-TEE,重新打包 FIP,并重新下载到板子中。

2.1.2. 固件签名
OP-TEE ST 发行版集成了 sign_rproc_fw.py,可以对固件二进制.elf 文件进行签名。

可在 OP-TEE 源码路径下找到.py 文件,路径示例:<path to developer package source>/optee-os-stm32mp-3.19.0-stm32mp-r1-r0/optee-os-stm32mp-3.19.0-stm32mp-r1/scripts/sign_rproc_fw.py。

此脚本的运行依赖 python 库,请先确保以下库被成功安装:

PC $> pip install pyelftools pycryptodomex

OP-TEE 签名固件可选用默认密钥或客户自行生成并指定的密钥:

(1)使用 OP-TEE 仓库中可用的默认 RSA 密钥:默认密钥路径:<path to developer package source>/ optee-os-stm32mp-3.19.0-stm32mp-r1-r0/optee-os-stm32mp-3.19.0-stm32mp-r1/keys/default_rproc.pem
PC $ > ./scripts/sign_rproc_fw.py sign –in <firmware path/firmware name>

(2)指定密钥:
PC $ > ./scripts/sign_rproc_fw.py sign --in <firmware path/firmware name> --key <id_rsa private key>

更多脚本选项可执行如下指令:

PC $ > ./scripts/sign_rproc_fw.py sign --help

签署的固件在.elf 文件目录中且带有.sign 扩展名。
6010668c97a398b963.png

图6. 签名示例

注:此处客户可根据 STM32CubeIDE 生成的.elf 文件,指定自己的路径,对固件.elf 文件进行签名。

将此签名过的固件.elf 文件复制到板子中,用于后续执行。

2.2. (可选)基于 Distribution Package 的 M 核加签
Distribution Packge 的搭建与使用可参照:STM32MPU Distribution Package -stm32mpu,本章内容以 STM32MP15 探索板为例,即创建环境时使用指令:

PC $ > DISTRO=openstlinux-weston MACHINE=<machine> source layers/meta-st/scripts/envsetup.sh

2.2.1. OP-TEE TA(Trusted Application)生成
首先,在 Yocto 下,需要是用 devtool modify 指令创建开发环境,允许用户对指令软件包进行修改。本文的配置中只涉及 TF-A 和 OP-TEE 配置文件的修改,故可根据如下指令操作:

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 目录,如下:
887468c97a4d28a66.png

其中,sources 路径下即为 TF-A 和 OP-TEE 编译所使用的源码。

OP-TEE 需要配置开关 CFG_STM32MP1_OPTEE_IN_SYSRAM=y,以便 OP-TEE 在安全的 SYSRAM 中执行。

PC $ > cd <path to distribution package source>/build-openstlinuxwestonstm32mp15-disco/workspace/sources/optee-os-stm32mp
PC $ > vim core/arch/arm/plat-stm32mp1/conf.mk

在此文件中将 CFG_STM32MP1_OPTEE_IN_SYSRAM 设置为 y(yes)。
1920668c97a5a2dfa2.png

图7. CFG_STM32MP1_OPTEE_IN_SYSRAM=y

TF-A 需要配置开关 STM32MP1_OPTEE_IN_SYSRAM=1,以便 TF-A/BL2 在安全的SYSRAM 中加载 OP-TEE,否则 TF-A 将无法引导 OP-TEE 镜像。

PC $ > cd <path to distribution package source>/build-openstlinuxweston-stm32mp15-disco/workspace/sources/tf-a-stm32mp
PC $ > vim plat/st/stm32mp1/platform.mk
6504968c97a67b7b2e.png

图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
701368c97a785b690.png

图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 签名固件将涉及到密钥,此密钥可使用默认密钥或客户自行生成并指定的密钥,注意保证配置文件中的密钥与固件签名中的密钥一致。
836568c97a893bbb0.png

图 10. CFG_RPROC_SIGN_KEY= <key file>

重新编译 OP-TEE,重新打包 FIP,并重新下载到板子中。

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>

(2)指定密钥:
PC $ > ./scripts/sign_rproc_fw.py sign --in <firmware path/firmware name> --key <id_rsa private key>

更多脚本选项可执行如下指令:

PC $ > ./scripts/sign_rproc_fw.py sign --help

签署的固件在.elf 文件目录中且带有.sign 扩展名。
8854868c97a992893e.png

图 11. 签名示例

注:此处客户可根据 STM32CubeIDE 生成的.elf 文件,指定自己的路径,对固件.elf 文件进行签名。

将此签名过的固件.elf 文件复制到板子中,用于后续执行。

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
3906968c97aa934d6b.png

图 12. 执行


2770868c97ab58cf78.png


您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1385

主题

1669

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部