使用 OP-TEE 进行 M 核固件认证 LAT6028
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 内存中。
图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)。
图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
图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
图4. CFG_RPROC_PTA=y
注:注意图 4 中的 TA 名称,若此 TA 被成功编译到 OP-TEE 中,可在后续查看 TA 的步骤中看到此 TA 的名字。
在 2.1.2 中将介绍固件签名的内容,OP-TEE 签名固件将涉及到密钥,此密钥可使用默认密钥或客户自行生成并指定的密钥,注意保证配置文件中的密钥与固件签名中的密钥一致。
图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 扩展名。
图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 目录,如下:
其中,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)。
图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
图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 签名固件将涉及到密钥,此密钥可使用默认密钥或客户自行生成并指定的密钥,注意保证配置文件中的密钥与固件签名中的密钥一致。
图 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 扩展名。
图 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
图 12. 执行
部分客户需要对STM32MPU系列中的M核进行保护和加密,确保其加载的软件不被篡改或非法访问
通过OP-TEE对由主处理器(A核)加载到M核的固件进行签名验证,只有经过授权的合法固件才能被执行
使用STM32CubeIDE基于M核的程序生成.elf格式的固件文件
在Ecosystem 5.0.0及以上版本中,默认情况下OP-TEE位于DDR中且禁用安全服务
远程处理框架从文件系统读取已签名的固件二进制文件,并将其传递给OP-TEE可信应用程序
直接修改源码仓库中的配置文件,重新编译OP-TEE并打包FIP镜像,最后下载到目标板卡
基于Developer Package的开发模式的优势在于灵活性高,适合定制化开发;缺点是需要手动管理依赖项和构建过程
利用Yocto构建系统工具链,通过devtool modify命令创建开发环境,允许用户修改TF-A和OP-TEE的软件包
确保配置文件中使用的密钥路径与实际用于签名的私钥一致,否则会导致认证失败
推荐先使用未加密的普通固件完成基础功能测试,再逐步引入安全机制,便于定位问题
页:
[1]