如何配置 OP-TEE

2023-10-15 18:40:24 浏览数 (1)

前言:因为芯片内一些私密文档需要用到OP-TEE,貌似我这边没人搞过…so又开始自学之旅

1 目的

本文介绍了从源构建多个 OP-TEE 组件并将其部署到目标的配置和过程。 该构建示例基于 OpenSTLinux 开发包或分发包,并且还提供了裸环境的构建说明。

2 概述

OP-TEE 是适用于 Arm®v7-A 和 Arm®v8-A 平台的可信执行环境。 OP-TEE 由 OP-TEE 架构概述中描述的多个组件组成。 OP-TEE 组件生成启动映像和存储在目标中嵌入的文件系统中的文件。

  • OP-TEE OS 生成 3 个启动映像文件,加载到平台启动介质的预定义分区中。生成的启动映像包括 STM32 二进制标头,支持使用经过验证的启动和闪存编程工具。
  • 可以构建 OP-TEE 客户端(包 optee_client)来为 OP-TEE 操作系统生成非安全服务。 optee_client 构建生成的文件存储在嵌入式文件系统中。
  • OP-TEE 项目发布了其他用于测试和演示的软件包。这些可以构建并嵌入到目标文件系统中。构建 optee_examples 和 optee_test 会生成客户端和可信应用程序以及全部存储在目标文件系统中的库。请注意,OP-TEE Linux 驱动程序内置于 Linux 内核映像中,并且是 OP-TEE 生态系统的一部分。

OP-TEE 可以作为 BL32 嵌入到 STM32 MPU 平台中,以实现 ST 可信配置

注意:OP-TEE 启动映像必须嵌入到 BL2 加载的 FIP 二进制文件中,并且可以自动进行身份验证

3 OP-TEE核心配置

OP-TEE 操作系统需要超过 256Ko RAM。 SYSRAM只有256Ko,OP-TEE内核必须使用分页模式来使用DDR扩展内存。

OP-TEE OS 由 FSBL 加载到 SYSRAM 的开头。 OP-TEE 可以将内存扩展到完整的 SYSRAM。当使用分页器时,代码的第二部分被加载到受限制的安全可访问区域中的 DDR(可分页部分)中。

OP-TEE OS 通过将其上下文保存在 DDR(加密区域)中来管理低功耗模式,该上下文由保存在安全备份 SRAM 中的受保护执行代码恢复。

OP-TEE OS 实现以下secure services:

  • PSCI services
    • 系统重置
    • CPU热插拔
    • 低电量
  • SCMI services
    • 时钟管理
    • 重置管理
  • OTP 访问 services
  • PWR services
    • PWR 监管机构对非安全 IP 的访问
    • 唤醒源管理
  • RCC services 访问受限
    • OPP 请求管理
    • 校准触发

4 使用分发包构建

分发包提供了从相关 bitbake 目标构建以下 OP-TEE 组件的方法:

代码语言:javascript复制
 bitbake optee-os-stm32mp                # OP-TEE core firmware
 bitbake optee-os-sdk-stm32mp            # OP-TEE development kit for Trusted Applications
 bitbake optee-client                    # OP-TEE client
 bitbake optee-test                      # OP-TEE test suite (optional)
 bitbake optee-examples                  # TA and CA examples

分发包构建过程包括获取源文件、编译它们并将它们安装到目标映像。

OP-TEE 包的 Yocto 配方可以在以下位置找到:

代码语言:javascript复制
meta-st/meta-st-stm32mp/recipes-security/optee/optee-os-stm32mp*
meta-st/meta-st-openstlinux/recipes-security/optee/optee-client*
meta-st/meta-st-openstlinux/recipes-security/optee/optee-examples*
meta-st/meta-st-openstlinux/recipes-security/optee/optee-test*

5 使用开发者包或裸环境构建

开发人员包和裸构建环境都希望您获取/下载 OP-TEE 包源文件树,以便构建嵌入式二进制映像。 下面的指令集假设所有 OP-TEE 包源代码树在称为 <sources>/ 的基本目录中可用。源文件可从 github 存储库获取:

代码语言:javascript复制
cd <sources>/
 git clone https://github.com/STMicroelectronics/optee_os.git
 git clone https://github.com/OP-TEE/optee_client.git
 git clone https://github.com/OP-TEE/optee_test.git
 git clone https://github.com/linaro-swg/optee_examples.git
 ls -1 <sources>/
optee_client
optee_examples
optee_os
optee_test

STM32 MPU 平台可能未完全合并到官方 OP-TEE 存储库 [1] 中,因此上面提供的 URL 指的是 ST 发行版

5.1 初始化交叉编译环境

可以使用开发包提供的编译工具链,参考设置交叉编译环境。

或者,可以使用其他裸工具链来构建 OP-TEE 安全部件。在这种情况下,下面的说明期望工具链成为 PATH 的一部分,并且其前缀由 CROSS_COMPILE 定义。人们可以使用类似的东西:

代码语言:javascript复制
export PATH=<path-to-toolchain>:$PATH
 export CROSS_COMPILE=<toolchain-prefix>-
5.2 构建OP-TEE操作系统

5.2.1 开发者包SDK

OP-TEE 操作系统可以通过 tarball 中的开发包 Makefile.sdk 脚本构建。它会自动为 OP-TEE OS 构建设置正确的配置。从 shell 命令构建:

代码语言:javascript复制
make -f Makefile.sdk CFG_EMBED_DTB_SOURCE_FILE=<board_dts_file_name>.dts

5.2.2 裸露环境

或者,也可以基于裸交叉编译工具链构建 OP-TEE 操作系统,例如用于 stm32mp157c-ev1 板:

代码语言:javascript复制
cd <optee-os>
 make PLATFORM=stm32mp1 
           CFG_EMBED_DTB_SOURCE_FILE=stm32mp157c-ev1.dts 
           CFG_TEE_CORE_LOG_LEVEL=2 O=out all

5.2.3 生成文件

3 个 OP-TEE 启动映像在以下路径生成:

代码语言:javascript复制
<optee-os>/out/core/tee-header_v2.bin
<optee-os>/out/core/tee-pageable_v2.bin
<optee-os>/out/core/tee-pager_v2.bin

可以在此文件中获取用于构建的配置指令:

代码语言:javascript复制
<optee-os>/out/conf.mk

该构建还生成一个用于构建可信应用程序二进制文件的开发工具包:

代码语言:javascript复制
<optee-os>/out/export-ta_arm32/

5.2.4 构建指令详情

构建 OP-TEE 操作系统的强制性指令:

  • PLATFORM=<platform>
    • Ex: PLATFORM=stm32mp1
  • CFG_EMBED_DTB_SOURCE_FILE=: in-tree (core/arch/arm/dts/ ) 设备树文件名及其 .dts 扩展名。

常见的可选指令:

  • CFG_TEE_CORE_DEBUG={n|y}:禁用/启用调试支持
  • CFG_TEE_CORE_LOG_LEVEL={0|1|2|3|4}:定义跟踪级别(0:无跟踪,4:跟踪溢出)
  • CFG_UNWIND={n|y}:禁用/启用堆栈展开支持

对于生态系统版本 ≤ v3.0.0 兼容性

注意:内部存储器大小限制了可以提供的调试支持级别。

5.2.5 故障排除

开发包工具链可能会报告跟踪中的依赖错误,例如:

代码语言:javascript复制
 make PLATFORM=stm32mp1 ...
arm-openstlinux_weston-linux-gnueabi-ld.bfd: cannot find libgcc.a: No such file or directory

要解决此问题,请添加指令 LIBGCC_LOCATE_CFLAGS=--sysroot=$SDKTARGETSYSROOT。

列如:

代码语言:javascript复制
 cd <optee-os>
 make PLATFORM=stm32mp1 
           CFG_EMBED_DTB_SOURCE_FILE=stm32mp157c-ev1.dts 
           CFG_TEE_CORE_LOG_LEVEL=2 
           LIBGCC_LOCATE_CFLAGS=--sysroot=${SDKTARGETSYSROOT} 
           O=out all

5.3 其他OP-TEE组件的构建命令

本节介绍如何构建多个 OP-TEE 组件(不包括上一节中描述的 OP-TEE OS)。所有这些组件都会生成针对基于嵌入式 Linux 操作系统的文件系统(即 rootfs)的文件。这些文件是安全的受信任应用程序 (TA) 二进制文件以及非安全客户端应用程序 (CA)、库和测试文件。

构建 OP-TEE 组件的方法有多种。下面给出的示例将 OP-TEE 客户端、测试和示例源文件树路径引用为 <optee-client><optee-test><optee-examples>

至少对于可信应用程序来说,构建这些组件需要构建 OP-TEE 操作系统,并且生成的 TA 开发套件可在 <optee-os>/out/export-ta_arm32/ 中找到。

建议使用 CMake 来构建 Linux 用户区部分,而安全世界二进制文件 (TA) 必须从 GNU makefile 构建,因为 OP-TEE 项目尚未通过 CMake 移植安全世界二进制文件构建过程。

5.3.1 构建安全组件

构建 TA:此步骤需要构建 OP-TEE OS 以生成 32 位 TA 开发套件。假设 OP-TEE OS 构建于路径 <optee-os>/out,则可以从路径 <optee-os>/out/export-ta_arm32/ 获取 TA 开发套件。

下面的说明构建可信应用程序二进制文件并将其复制到本地 ./target/ 目录,该目录可用于填充目标文件系统。

代码语言:javascript复制
 export TA_DEV_KIT_DIR=$PWD/optee_os/out/export-ta_arm32
 mkdir -p ./target/lib/optee_armtz
 for f in optee_test/ta/*/Makefile; do 
            make -C `dirname $f` O=out; 
            cp -f `dirname $f`/out/*.ta ./target/lib/optee_armtz; 
      done

本地目录./target/中的内容为TA二进制文件:

代码语言:javascript复制
 tree target/
target
└── lib
  └── optee_armtz
   ├── 614789f2-39c0-4ebf-b235-92b32ac107ed.ta
   ├── 731e279e-aafb-4575-a771-38caa6f0cca6.ta
   └── (...)

需要将这些文件复制到目标文件系统。

5.3.2 构建非安全( non-secure)组件

将 OP-TEE 源文件下载到基目录中,并在基目录中创建一个 CMakeLists.txt 文件,其中列出了要通过 CMake 构建的所有包。例如:

代码语言:javascript复制
 ls
optee_client
optee_examples
optee_os
optee_test
CMakeLists.txt
 cat CMakeLists.txt
add_subdirectory (optee_client)
add_subdirectory (optee_test)
add_subdirectory (optee_examples)

从基本目录中,运行 cmake 然后 make。下面的示例还创建了树文件系统 ./target/,其中填充了生成的需要安装在目标文件系统中的文件。

请注意,此示例还设置了工具链环境:

代码语言:javascript复制
 cmake -DOPTEE_TEST_SDK=$PWD/optee_os/out/export-ta_arm32 
            -DCMAKE_INSTALL_PREFIX=  -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=y
 make
 make DESTDIR=target install 

请注意空的 CMAKE_INSTALL_PREFIX 值是从 root / 而不是从 /usr/ 安装的。 DESTDIR=target 使嵌入文件填充到本地 ./target/ 目录中。

另请注意,stm32mp1 期望工具 tee-supplicant 位于目录 /usr/bin 中,而 CMake 将其安装在目录 /usr/sbin 中。为了解决这个问题,可以建立一个指向有效位置的链接,即:

代码语言:javascript复制
 ln -s ../bin/tee-supplicant target/sbin/tee-supplicant

完成后,本地目录 ./target/ 包含要复制到目标文件系统中的文件。

代码语言:javascript复制
 tree target/
target/
├── bin
│   ├── benchmark
│   ├── optee_example_acipher
│   ├── optee_example_aes
│   ├── optee_example_hello_world
│   ├── optee_example_hotp
│   ├── optee_example_random
│   ├── optee_example_secure_storage
│   ├── tee-supplicant
│   └── xtest
├── include
│   ├── tee_bench.h
│   ├── tee_client_api_extensions.h
│   ├── tee_client_api.h
│   └── teec_trace.h
├── lib
│   ├── libteec.so -> libteec.so.1
│   ├── libteec.so.1 -> libteec.so.1.0.0
│   └── libteec.so.1.0.0
│   └── optee_armtz
│       └── (...)                 # This directory was previously filled with TAs
└── sbin
    └── tee-supplicant -> ../bin/tee-supplicant

6 更新OP-TEE启动镜像

OP-TEE 启动映像是 FIP 二进制文件的一部分。

部署 OP-TEE 操作系统的下一步是在 FIP 更新过程之后更新 FIP 二进制文件。

7 更新OP-TEE Linux文件

7.1 Update on board

其他 OP-TEE 映像存储在目标文件系统中。

例如,如果使用 SD 卡作为目标启动介质,则可以将该卡插入其 PC 读卡器并复制映像。这些文件可以简单地复制到已安装的 rootfs 中。

7.2 SD卡更新

需要复制到目标文件系统的 OP-TEE 文件安装在本地目录 ./target/ 中。

一旦 SD 卡插入主机并且其文件系统安装在主机中,现在就可以将它们复制到目标 SD 卡 rootfs 分区,即

代码语言:javascript复制
 cp -ar target/* /media/$USERNAME/rootfs/

8 参考文献

  1. https://github.com/OP-TEE/optee_os
  2. https://github.com/STMicroelectronics/optee_os

0 人点赞