diff --git a/docs/opentrustee-guidelines/README-CN.md b/docs/opentrustee-guidelines/README-CN.md new file mode 100644 index 0000000..2ecf40b --- /dev/null +++ b/docs/opentrustee-guidelines/README-CN.md @@ -0,0 +1,8 @@ +# OpenTrustee指南 + +- [OpenTrustee系统概述](overview-of-opentrustee.md) +- [OpenTrustee系统架构和约束](opentrustee-architecture-and-constraints.md) +- [OpenTrustee适配和构建指导](opentrustee-adaptation-and-construction-guidelines.md) +- [开发CA和TA指导](develop-ca-and-ta-guidelines.md) +- [OpenTrustee调试机制介绍](opentrustee-debug-mechanism-introduction.md) +- [使能新平台适配指导](enable-new-platform-adaptation-guidelines.md) \ No newline at end of file diff --git a/docs/opentrustee-guidelines/develop-ca-and-ta-guidelines.md b/docs/opentrustee-guidelines/develop-ca-and-ta-guidelines.md new file mode 100644 index 0000000..0a4ecf5 --- /dev/null +++ b/docs/opentrustee-guidelines/develop-ca-and-ta-guidelines.md @@ -0,0 +1,103 @@ +## 开发CA + + + +## 开发TA + +### TA安装包 + +TA安装包不需要跟OpenTrustee镜像打包到一起,可以把TA安装包文件放到到非安全侧文件系统下。在TA被访问时,由TEE Client将TA安装包发送到OpenTrustee系统中加载运行。 + +由于TA安装包放在非安全侧文件系统中,需要对TA安装包做签名,保证安装包的完整性。 + +#### TA安装包路径 + +TA安装包放在非安全侧文件系统下,路径有两种选择。 + +1、将TA安装包命名为UUID.sec,放在/vendor/bin目录或者/system/bin目录,TEE client会在TA被访问时,自动查找该TA对应的UUID.sec,发送到OpenTrustee系统中加载运行。 + +2、TA安装包可以任意命名并自定义路径,在CA调用TEEC_OpenSession时,通过TEEC_Context的ta_path指定该TA安装包的路径,如xxx/xxx.sec,TEE client会在指定路径查找该安装包,并发送到OpenTrustee系统中加载运行。 + +#### TA安装包格式 + +TA安装包是以“.sec”为后缀名的包文件,文件格式如下:包含文件头、签名块、数据区三部分 + + + +![](figures/storage-format-of-ta.png) + + + + + +### TA签名机制 + +TA签名:由于TA安装包放在非安全侧文件系统中,需要对TA安装包做签名,确保加载到OpenTrutee中的TA安装包没有被篡改。OpenTrustee提供的SDK开发套件中,包含了TA的签名工具,支持对TA安装包一键签名。需要在OpenTrustee SDK开发套件中预置TA签名的私钥。 + +TA验签:在TA安装包加载到OpenTrustee系统中时,由OpenTrustee TA管理框架对TA安装包做签名验证,验证通过之后才允许该TA加载运行。需要在OpenTrustee系统中预置TA验签的公钥。 + +**⚠**为了方便社区开发者调试,社区的OpenTrustee SDK开发套件已经预置了TA签名私钥,OpenTrustee系统中预置了验签的公钥。开发者在OpenTrustee商用版本中应自行替换该签名私钥和验签公钥。 + +### SDK开发套件 + +#### 介绍 + +OpenTrustee提供了SDK开发套件支持独立开发TA,该开发套件集成了TA头文件、TA编译框架、TA签名脚本、demo样例等,目录结构如下: + +``` +├── build +│ ├── config_tee_private_sample.ini # sec签名和perm_config签名的python脚本的ini配置文件,需要厂商进行配置 +│ ├── mk # make编译框架 +│ ├── pack-TA # 提供sec签名能力的shell脚本 +│ └── tools # 包含sec文件链接的ld文件(32位和64位)、sec文件二进制检查的shell脚本 +├── include +│ └── TA # 给TA提供的TEE头文件 +├── thirdparty +│ └── open_source +│ ├── import_open_source_header.sh # 导入TA编译依赖的musl头文件和安全函数库头文件 +├── sample +│ ├── CA # CA示例代码 +│ └── TA # TA示例代码 +└── CHANGELOG # SDK包版本发布记录 +├── README.md # SDK包的英文说明文件 +├── README_zh.md # SDK包的中文说明文件 +``` + +- 开发语言:C语言 +- 开发环境:linux操作系统 + +#### 开发套件准备 + +开发者在使用OpenTrustee SDK开发套件开发TA之前,需要进行一些准备工作。 + +##### 配置编译工具链 + +编译工具链获取路径?也可以用OH docker镜像 + +export PATH=/home/peter/code/openharmony/prebuilts/clang/ohos/linux-x86_64/15.0.4/llvm/bin:$PATH + +##### 导入第三方头文件 + +执行sdk/thirdparty/open_source/import_open_source_header.sh,将TA编译依赖的musl头文件和安全函数库头文件,从OpenHarmony的thirdparty + +##### 替换签名密钥 + + + +##### 安装python + +SDK中用到了python脚本来完成TA的属性配置文件解析、对TA文件进行签名打包等操作,因此需要在开发环境上安装python相关的功能。可能需要root权限。 + +1、安装python + +2、安装python相关的库, + +pip install pycryptodome + +pip install defusedxml + +### TA开发步骤 + +##### TA属性配置 + +### TA API \ No newline at end of file diff --git a/docs/opentrustee-guidelines/enable-new-platform-adaptation-guidelines.md b/docs/opentrustee-guidelines/enable-new-platform-adaptation-guidelines.md new file mode 100644 index 0000000..dfafc94 --- /dev/null +++ b/docs/opentrustee-guidelines/enable-new-platform-adaptation-guidelines.md @@ -0,0 +1,431 @@ +# 使能新平台的指南 +## TEE 安全镜像Loader适配指导 + +### 概述 + +#### 功能简介 + +TEE Loader主要负责加载安全镜像并将启动参数传递给TEE OS的功能。 + +#### 约束与限制 + +- 芯片架构为ARMv7/ARMv8架构。 +- CPU需支持安全内存和非安全内存的划分,安全和非安全外设的划分。 + +### 开发指导 + +#### 场景介绍 + +由于安全镜像在flash中是以加密形式存储的,因此需要对镜像进行解密处理,随后拷贝到目标执行地址。在TEE OS启动时,需要对其传递启动参数。以上这些都是在Loader中进行的。因此在芯片使能TEE时,需要对Loader进行开发适配。 + +#### 接口说明 + +以下接口说明列表将介绍我们在实际使能TEE过程中对Loader适配将用到的接口。包括: + +- 启动参数配置 +- 镜像加载 + +**表 1** 启动参数配置调用接口表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

接口名

+

描述

+

必选/可选

+

void set_teeos_mem(uintptr_t teeos_base_addr, uint64_t size)

+

设置TEE OS的起始地址size大小。

+

必选,OS需要。

+

void set_teeos_uart(uint64_t uart_addr)

+

设置串口地址。

+

可选,建议配置,启动调试用。

+

void set_gic(struct gic_config_t gic_config)

+

配置gic寄存器。结构体定义见。

+

必选,OS需要。

+

bool copy_extend_datas(void * extend_datas, uint64_t extend_length)

+

保留字段拷贝。

+

可选,根据实际情况。

+

bool copy_teeos_cfg(void)

+

拷贝启动参数到目标位置,配置TEE OS属性后再调用此接口

+

必选,OS需要。

+
+ + +**表 2** 镜像加载调用接口表 + + + + + + + + + + + + + + + + + + + + + + +

接口名

+

描述

+

uintptr_t read_teeos(const char *part_name, uint32_t part_size)

+

将TEE OS从flash分区读镜像到RAM中。

+

int32_t verify_teeos(uintptr_t buf_addr)

+

TEE OS镜像验签。

+

int32_t decrypt_teeos(uintptr_t buf_addr)

+

TEE OS镜像解密。

+

int32_t copy_teeos(uintptr_t buf_addr)

+

TEE OS镜像拷贝到目标执行地址。

+

uint64_t get_teeos_start(void)

+

获取TEE OS启动地址。

+
+ + +#### 接口参数结构体定义 + +``` +struct gic_config_t { + char version; + union { + struct v2_t { + p_region_t dist; + p_region_t contr; + } v2; + struct v3_t { + p_region_t dist; + uint32_t redist_num; + uint32_t redist_stride; + p_region_t redist[GICR_MAX_NUM]; + } v3; + }; +}; +``` + +#### 开发步骤 + +1. 启动参数配置 + + 启动参数包含TEE OS用到的安全内存地址和大小,串口的地址,gic寄存器配置,其它拓展参数。 + + loader中启动参数的适配方法可以按照产品的习惯要求采用不同的方法,例如结构体中直接填写相应的参数,或者增加配置文件的方法。 + + **表 3** 启动参数列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

含义

+

备注

+

plat_cfg_size

+

启动参数大小,包含extend_paras部分

+

整个启动参数的buffer大小,值为sizeof(struct platform_info) + extend _length。

+

phys_region_size

+

TEE OS内存大小

+

2MB的整数倍。

+

phys_region_start

+

TEE OS内存起始物理地址

+

2MB的整数倍。

+

uart_addr

+

串口寄存器的基地址

+

-

+

struct gic_config_t

+

gic寄存器参数

+

-

+

extend_datas

+

其它参数

+

格式需要和TEE OS核对。

+
+ +2. 镜像加载 + + tee loader适配在芯片平台的bios或者fastboot、preloader中,主要完成的功能有配置并传递TEE OS的启动参数、将TEE OS镜像加载到目标内存位置、传递共享内存信息给TEE OS。loader中启动参数的适配方法可以按照产品的习惯和要求采用不同的方法,例如结构体中直接填写相应的参数,或者增加配置文件。以下为镜像加载步骤: + + 1. 从flash分区读镜像到RAM中。 + 2. TEE OS镜像验签。 + 3. TEE OS镜像解密。 + 4. TEE OS镜像拷贝到目标执行地址。 + 5. TEE OS启动地址传递。获取TEE OS的启动地址,一般情况下需要将这个值传给atf, 作为ATF初始化TEE OS的入口地址。 + +相关配置接口见[接口说明](#section125843344514)。 + +#### 开发实例 + +- 使用 TEE Loader,在芯片使能TEE时,配置启动参数的开发实例。详细示例代码位于 `base/tee/tee_os_framework/sample/teeloader` 目录。 + +```C +#define TEEOS_TEXT_OFFSET (0x8000) +#define ALIGN_SIZE_2M (0x200000) +struct platform_info { + uint64_t plat_cfg_size; + uint64_t phys_region_size; + paddr_t phys_region_start; + paddr_t uart_addr; + struct gic_config_t gic_config; + struct extend_datas_t { + uint64_t extend_length; + char extend_paras[0]; + } extend_datas; +}; +static struct platform_info g_teeos_cfg; + +static uintptr_t g_teeos_base_addr = 0; + +/* 设置TEE OS的起始地址size的大小 */ +int32_t set_teeos_mem(uintptr_t teeos_base_addr, uint64_t size) +{ + g_teeos_base_addr = teeos_base_addr; + g_teeos_cfg.phys_region_size = size; + if ((uint64_t)teeos_base_addr % ALIGN_SIZE_2M != 0) + return -1; + + g_teeos_cfg.phys_region_start = (uint64_t)teeos_base_addr; + + return 0; +} + +/* 设置TEE OS的串口地址和类型 */ +void set_teeos_uart(uint64_t uart_addr) +{ + g_teeos_cfg.uart_addr = uart_addr; +} + +/* 配置gic寄存器 */ +void set_gic(struct gic_config_t gic_config) +{ + g_teeos_cfg.gic_config = gic_config; +} + +bool copy_extend_datas(void *extend_datas, uint64_t extend_length) +{ + if (extend_datas == NULL) + return false; + + if (sizeof(struct platform_info) + extend_length > MAX_CONFIG_LENGTH) + return false; + + g_teeos_cfg.extend_datas.extend_length = extend_length; + char *dst = (char *)(uintptr_t)(g_teeos_cfg.phys_region_start + sizeof(g_teeos_cfg)); + + if (memcpy_s(dst, MAX_CONFIG_LENGTH - sizeof(g_teeos_cfg), + extend_datas, extend_length) != EOK) + return false; + return true; +} + +/* 拷贝启动参数到目标位置,配置TEE OS属性后调用此接口 */ +bool copy_teeos_cfg(void) +{ + if (g_teeos_cfg.phys_region_start == 0) + return false; + + g_teeos_cfg.plat_cfg_size = sizeof(struct platform_info) + g_teeos_cfg.extend_datas.extend_length; + char *dst = (void *)(uintptr_t)g_teeos_cfg.phys_region_start; + + if (memcpy_s(dst, sizeof(g_teeos_cfg), + (char *)&g_teeos_cfg, g_teeos_cfg.plat_cfg_size - sizeof(uint64_t)) != EOK) + return false; + + return true; +} + +uint64_t get_teeos_start(void) +{ + return g_teeos_cfg.phys_region_start; +} + +uint64_t get_teeos_code_start(void) +{ + return g_teeos_cfg.phys_region_start + TEEOS_TEXT_OFFSET; +} + +uint64_t get_teeos_size(void) +{ + return g_teeos_cfg.phys_region_size; +} +``` + +- 不使用 TEE Loader(如 ATF 闭源等原因),需要在 TEE OS 中配置平台相关参数,以 RK3568 平台为例(详见 `base/tee/tee_os_kernel/kernel/arch/aarch64/plat/rk3568/machine.c`)。 + +- 若需要使能新平台,需要在 `base/tee/tee_os_kernel/kernel/arch/aarch64/plat` 目录下添加新平台的适配代码,并且在 `base/tee/tee_os_kernel/config.mk` 中更新 CHCORE_PLAT 配置 + + ```makefile + CHCORE_PLAT=new_plat + ``` + + +## TEE ATF适配指导 + +### 概述 + +#### 功能简介 + +ATF提供了安全世界的参考实现软件\[ARMv8-A\],包括执行的\[Secure Monitor\] \[TEE-SMC\]异常级别 3\(EL3\)。它实现了各种 ARM 接口标准,如电源状态协调接口\(\[PSCI\]\),可信板启动要求\(TBBR,ARM DEN0006C-1\)和\[SMC 呼叫公约\] \[SMCCC\]。 + +#### 约束与限制 + +- 芯片架构为ARMv7/ARMv8架构。 +- CPU需支持安全内存和非安全内存的划分,安全和非安全外设的划分。 + +### 开发指导 + +#### 场景介绍 + +芯片使能TEE时,需要对ATF进行适配,以下将相关内容做介绍。 + +#### 接口说明 + +**表 4** teed smc id管理列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

smc

+

smc id

+

处理的内容

+

来自安全/非安全侧

+

TEE_HANDLED_S_EL1_INTR

+

0xf2000006

+

FIQ中断

+

安全侧

+

TEE_ENTRY_DONE

+

0xf2000000

+

TEE完成smc命令返回

+

安全侧

+

TEE_ON_DONE

+

TEE_RESUME_DONE)

+

TEE_SUSPEND_DONE

+

0xf2000001

+

0xf2000004

+

0xf2000003

+

TEE启动完成,resume, suspend完成

+

安全侧

+

TEE_STD_REQUEST

+

0xb2000008

+

REE(tzdriver)侧的标准命令请求

+

非安全侧

+

TEE_STD_REE_SIQ

+

0xb200000a

+

SIQ线程处理请求

+

非安全侧

+

TEE_STD_RESPONSE

+

0xb2000009

+

安全侧完成smc命令返回

+

安全侧

+

TEE_STD_CRASH

+

0xb200000b

+

安全侧出现crash,告知ATF,此时ATF不会再处理任何非安全侧的请求

+

安全侧

+
+ +#### 开发实例 + +- 在芯片使能TEE ATF时,需要修改teed,适配示例代码位于 `base/tee/tee_os_framework/sample/teed` +- TEE OS 需要适配 ATF 中的 TEED,目前 TEE OS 支持 teed 和 opteed 两种,分别位于 `base/tee/tee_os_kernel/kernel/arch/aarch64/trustzone/spd` 下的 teed 和 opteed 两个目录中。 +- 若需要使能新的 TEED,需要在该目录下添加相应 TEED 的适配代码,并且在 `base/tee/tee_os_kernel/tee_tee_os_kernel/config.mk` 中更新 CHCORE_SPD 配置 + + ```makefile + CHCORE_SPD=new_teed + ``` \ No newline at end of file diff --git a/docs/opentrustee-guidelines/figures/overview-of-opentrustee.png b/docs/opentrustee-guidelines/figures/overview-of-opentrustee.png new file mode 100644 index 0000000..9dcf53e Binary files /dev/null and b/docs/opentrustee-guidelines/figures/overview-of-opentrustee.png differ diff --git a/docs/opentrustee-guidelines/figures/storage-format-of-ta.png b/docs/opentrustee-guidelines/figures/storage-format-of-ta.png new file mode 100644 index 0000000..1fa6dbd Binary files /dev/null and b/docs/opentrustee-guidelines/figures/storage-format-of-ta.png differ diff --git a/docs/opentrustee-guidelines/opentrustee-adaptation-and-construction-guidelines.md b/docs/opentrustee-guidelines/opentrustee-adaptation-and-construction-guidelines.md new file mode 100644 index 0000000..dff76f7 --- /dev/null +++ b/docs/opentrustee-guidelines/opentrustee-adaptation-and-construction-guidelines.md @@ -0,0 +1,232 @@ +# OpenTrustee 适配和构建指导 + +## Tee Client的适配和构建 + +### Tee Client使能实例 + +本章节讲述如何针对一款芯片适配TEE Client,在相应配置json文件中增加tee_client部件即可。 + +以RK3568芯片为例,在vendor/hihope/rk3568/config.json中增加以下内容: + +```c +{ + "subsystem": "tee", + "components": [ + { + "component": "tee_client", + "features": [] + } + ] +} +``` + +### Tee Client编译命令 + +Tee Client代码位置:`base/tee/tee_client` + +以RK3568芯片为例,运行以下命令编译TEE Client部件,产物路径:out/rk3568/tee/tee_client + +```shell +./build.sh --product-name rk3568 --ccache --build-target tee_client +``` + +## Tzdriver的适配和构建 + +### 概述 + +tzdriver是TEE的内核驱动,主要功能是在整个TEE子系统中起连接作用,是使用TEE OS服务的桥梁,tzdriver处理来自于tee\_client的ioctl命令,并通过smc指令从REE切换到TEE。 + +>![](public_sys-resources/icon-caution.gif) **注意:** +>单独适配tzdriver,系统并不能正常启动,必须同时适配TEE OS。 + +### 适配指导以及适配实例 + +本章节中会讲述如何针对一款芯片适配tzdriver,此章节中以RK3568芯片为例。 + +第一小节介绍tzdriver入口和tzdriver代码位置,本章下面几个小节,每小节都是一个适配步骤。(这几个适配步骤顺序无关,但推荐将配置选项放到最后) + +#### tzdriver入口 + +- Linux内核tzdriver代码位置:base/tee/tee\_tee\_tzdriver/linux。 + +tzdriver是内核中的一个字符设备驱动。 + +tzdriver初始化时会创建一个字符设备文件,一般为/dev/tc\_ns\_client,用户态进程可以打开此节点,以及通过ioctl接口调用tzdriver相关功能。 + +tzdriver总入口在core/tc\_client\_driver.c中的tc\_client\_ioctl函数。 + +设备节点函数接口: + +```c +static const struct file_operations_vfs g_tc_ns_client_fops = { + .open = tc_client_open, + .close = tc_client_close, + .ioctl = tc_client_ioctl, + .mmap = tc_client_mmap, +}; +``` + +#### 工程编译适配 + +tzdriver需要被编译到内核中作为内核驱动。 + +- Linux内核tzdriver编译适配 + + 在Linux内核可以通过defconfig文件中的CONFIG\_TZDRIVER选项控制tzdriver的编译使能。 + + 1. defconfig文件修改 + + defconfig文件在kernel/linux/config仓,每个芯片应当创建自己的defconfig文件,后面会介绍tzdriver中的所有defconfig配置项。 + + 2. kernel补丁 + + 其他内核相关修改在kernel/linux/patches仓,以补丁方式提供。 + + RK3568芯片的patch在kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch,其他芯片平台也可以参考这个patch,每个芯片应该创建自己的patch文件。此patch补丁中应当包含以下内容: + + - 对于内核的根Makefile的修改(在其中引用tzdriver仓的子Makefile,其中tzdriver path需要修改为实际的相对路径,注意Linux kernel的编译是会将kernel仓代码拷贝到out目录打patch,因此这个相对路径是相对于out下的临时kernel仓的路径)。 + + ``` + obj-y += {tzdriver path} + ``` + + - 对于内核的根Kconfig的需改(在其中引用tzdriver仓的子Kconfig,其中tzdriver path需要修改为实际的相对路径,同上需要注意这个相对路径应当是在out目录下的临时kernel仓路径)。 + + ``` + source "{tzdriver path}/Kconfig" + ``` + + - dtsi的修改:需要在相应芯片的disi文件中包含trusted\_core节点,对于RK3568芯片,需要修改patch中的/arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0.dtsi文件,新增以下内容 + + ``` + /{ + trusted_core { + compatible = "trusted_core"; + interrupts = <0 73 4>; + }; + }; + ``` + 其中,Linux内核中tzdriver支持中断号的动态配置,上面的73为spi中断号 + >![](public_sys-resources/icon-caution.gif) **注意:** + >注意dtsi里面的spi中断号应该比实际的中断号小32,且需要保证不与其他组件的中断号冲突。 + + +#### 驱动初始化 + +- Linux内核中tzdriver驱动初始化方式 + + 自动初始化,无需适配修改。 + +### 配置选项 + +#### 内核配置选项 + +tzdriver有一些特性或者选项,可以选择配置,控制这些选项的地方如下: + +- Linux内核tzdriver配置选项 + + tzdriver选项应该写在kernel/linux/config仓,修改芯片的defconfig文件: + + ``` + # + # TEE OS + # + CONFIG_TZDRIVER=y + CONFIG_CPU_AFF_NR=1 + CONFIG_KERNEL_CLIENT=y + CONFIG_TEELOG=y + CONFIG_PAGES_MEM=y + CONFIG_THIRDPARTY_COMPATIBLE=y + + ``` + + 各选项其含义如下表所示: + + **表 1** 配置选项说明 + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

说明

+

CONFIG_TZDRIVER

+

模块开关,使能tzdriver必须打开

+

CONFIG_CPU_AFF_NR

+

CA绑核功能,非零值代表限制仅cpuid小于CONFIG_CPU_AFF_NR的CPU可以进入TEE,0代表无限制,当前只支持在0核运行,所以值为1

+

CONFIG_KERNEL_CLIENT

+

内核CA支持,默认建议开启

+

CONFIG_TEELOG

+

TEE日志开关,默认建议开启

+

CONFIG_PAGES_MEM

+

tlogger使用的内存类型,开发者无需修改

+

CONFIG_THIRDPARTY_COMPATIBLE

+

兼容第三方opteed的适配,例如适配RK3568芯片需要开启此选项

+
+ +### TEE Tzdriver编译命令 +tzdriver部件跟随kernel一起编译,编译命令如下 +```Bash +./build.sh --product-name rk3568 --ccache --build-target kernel --gn-args linux_kernel_version=\"linux-5.10\" +``` + +## TEE OS镜像的构建指导 + +以RK3568芯片为例,TEEOS的二进制文件(bl32.bin)被打包在uboot.img中,以下是构建TEEOS镜像的指导。 + +### 编译TEEOS + +TEEOS内核代码位置:`base/tee/tee_os_kernel` + +TEEOS框架代码位置:`base/tee/tee_os_framework` + +切换目录至OpenHarmony源码根目录, 输入以下指令编译TEEOS镜像 + +```Bash +./build.sh --product-name rk3568 --build-target tee --ccache +``` +构建产物为TEEOS镜像,路径如下:`base/tee/tee_os_kernel/kernel/bl32.bin` + +### 编译uboot.img +根据以下步骤编译uboot.img +- 克隆`https://github.com/rockchip-linux/rkbin`,其中包含bl31.elf +- 克隆`https://github.com/rockchip-linux/u-boot`,其中包含u-boot +- 将rkbin和u-boot放在同一目录下, 修改rkbin/RKTRUST/RK3568TRUST.ini中BL32_OPTION下的PATH指向bl32.bin +- 其中,u-boot/make.sh中有以下内容,搜索RK3568TRUST.ini中包含_bl32_的文件名,如果BL32的文件名是bl32.bin的话,需要修改下匹配规则 +```Bash +BL32_BIN=`sed -n '/_bl32_/s/PATH=//p' ${INI} | tr -d '\r'` +``` +- 修改u-boot/configs/rk3568_defconfig,关闭OPTEE驱动,增大镜像大小到6M。 +```Bash +- CONFIG_OPTEE_CLIENT=y ++ CONFIG_SPL_FIT_IMAGE_KB=6144 ++ CONFIG_SPL_FIT_IMAGE_MULTIPLE=1 +``` +>![](public_sys-resources/icon-caution.gif) **注意:** +>烧录的时候需要修改分区表parameter.txt,和uboot.img的镜像大小一致 +- 修改make.sh中编译工具链路径,使其指向正确的路径(可以使用openharmony工程prebuilts目录下的工具链) +```Bash +-CROSS_COMPILE_ARM32=../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- +-CROSS_COMPILE_ARM64=../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- +``` +- 在u-boot目录下执行./make.sh rk3568,最终会在u-boot目录中生成uboot.img \ No newline at end of file diff --git a/docs/opentrustee-guidelines/opentrustee-architecture-and-constraints.md b/docs/opentrustee-guidelines/opentrustee-architecture-and-constraints.md new file mode 100644 index 0000000..6ca028f --- /dev/null +++ b/docs/opentrustee-guidelines/opentrustee-architecture-and-constraints.md @@ -0,0 +1,42 @@ +## 系统架构 + +OpenTrustee是一套完整的TEE解决方案,包含多个部件,系统架构如同所示: + +![](figures/overview-of-opentrustee.png) + +各部件基本功能介绍如下: + +**TEE Client** + +- 部署在REE侧用户态,为CA提供符合GP TEE标准的TEE Client API; +- 内置TEE的代理服务:如日志代理服务,支持获取TEE侧日志并落盘到REE侧文件系统;如安全存储服务,支持获取TEE侧加密的数据并落盘到REE侧文件系统。 + +**Tzdriver** + +- 部署在REE侧内核中的驱动,支持REE和TEE进行通信。 + +**OpenTrustee 操作系统框架** + +- 为TA提供符合GP TEE标准的TEE Internal API; +- 提供TA运行管理、驱动运行管理等框架基础服务; +- 提供安全存储、加解密等安全能力。 + +**OpenTrustee 操作系统内核** + +- ChCore微内核,提供IPC/进程管理/内存管理/调度/中断管理/REE和TEE切换等基础内核功能。 + +**OpenTrustee 开发套件** + +- 包括TA开发套件和驱动开发套件两部分,提供API头文件、编译框架、签名脚本、demo样例等,支持高效开发TA和驱动。 + +**OpenTrustee Dispatcher** + +- 部署在ATF中,在REE和TEE之间交互时完成两个世界上下文的切换。 + +## 贡献 + +### 编码规范 + +### license + +遵循Mulan PSL V2协议; \ No newline at end of file diff --git a/docs/opentrustee-guidelines/opentrustee-debug-mechanism-introduction.md b/docs/opentrustee-guidelines/opentrustee-debug-mechanism-introduction.md new file mode 100644 index 0000000..7708ad4 --- /dev/null +++ b/docs/opentrustee-guidelines/opentrustee-debug-mechanism-introduction.md @@ -0,0 +1,113 @@ +# OpenTrustee调试机制介绍 + +## TEE侧日志查看 + +当前OpenTrustee支持TEE侧日志系统,在TEE中提供LIB接口供TA和OpenTrustee Framework调用记录日志。使用维测接口获取TEE侧信息的说明如下: +通过`hdc shell`打开命令行窗口,输入tlogcat即可查看日志。 + +## 日志级别 + +当前TEE中日志分为以下5个级别。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

日志级别

+

说明

+

对应的日志打印接口

+

VERBOSE

+

细粒度信息事件,详细地记录程序的运行过程。

+

tlogv

+

DEBUG

+

细粒度信息事件,用于开发调试。

+

tlogd

+

INFO

+

突出强调应用程序的运行过程。

+

tlogi

+

WARNING

+

潜在的错误事件,不影响系统的继续运行。

+

tlogw

+

ERROR

+

发生错误事件,影响系统的继续运行。

+

tloge

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>新开发TA推荐用上述日志接口,不建议使用其他接口。 + +### 日志使用限制 + +1. 日志内存大小是有限的,当日志写入比较快时,会出现日志被覆盖的情况,日志内存采用的是内核申请的PAGES内存,大小是256K。 +2. 增加TA日志时,要符合安全规范,不能打印用户隐私信息、内存地址等,不打印调试日志,且一条日志内容要做到字符精简。 + +### 使用方法 + +在源代码文件中包含tee\_log.h,使用与日志级别对应的日志打印接口打印日志。 + +日志级别和相应的接口如上面描述,其使用与标准C中的printf类似。 + +tee\_log.h中默认使用的日志级别为INFO,即默认打印使用tloge、tlogw、tlogi接口的信息。如调试过程中希望打印其他级别,可选择下面方式中的一种进行修改,建议使用方式1: + +1. 在Makefile文件中动态修改日志级别TA\_LOG\_LEVEL,具体值和对应的显示级别为: + + + + + + + + + + + + + + + + + + + + + + +

TA_LOG_LEVEL值

+

日志显示级别

+

0

+

Error

+

1

+

Error、Warn

+

2--默认值

+

Error、Warn、Info

+

3

+

Error、Warn、Info、Debug

+

>=4

+

Error、Warn、Info、Debug、Verbo

+
+ +2. 直接修改tee\_log.h中定义的TA\_LOG\_LEVEL\_DEFAULT为期望的级别。多个TA共用同一个tee\_log.h文件且期望打印的日志级别不一致时,不能选用此方式。 +3. 直接修改tee\_log.h中定义的TA\_LOG\_LEVEL为期望的级别。多个TA共用同一个tee\_log.h文件且期望打印的日志级别不一致时,不能选用此方式。 \ No newline at end of file diff --git a/docs/opentrustee-guidelines/overview-of-opentrustee.md b/docs/opentrustee-guidelines/overview-of-opentrustee.md new file mode 100644 index 0000000..b1fd24f --- /dev/null +++ b/docs/opentrustee-guidelines/overview-of-opentrustee.md @@ -0,0 +1,31 @@ +# OpenTrustee概述 + +OpenTrustee是一个部署在可信执行环境(TEE)中的安全操作系统。ARM架构中的TrustZone技术通过CPU层面的硬件设计,支持创建安全的可信执行环境。基于ARM TrustZone技术,我们可以在设备上同时运行OpenHarmony和OpenTrustee两个系统,这两个系统彼此隔离。基于这种系统隔离带来的安全性,OpenTrustee可以为用户的机密数据提供保护。 + +## **安全能力** + +OpenTrustee支持安全计算、安全存储、安全密钥、安全外设、安全时钟等安全能力。 + +备注:应该展开介绍,是否放到单独章节 + +## **应用场景** + +在终端设备越来越智能化的今天,人们正在把越来越多的个人应用和数据放到设备上,安全性成为一个很重要的命题。可信执行环境(TEE)已逐渐成为终端设备必备的安全技术。OpenTrustee具备丰富的安全特性,可以支持开发者灵活部署安全应用,应用场景也非常广泛,例如:移动支付、生物认证、版权保护等,也可以为系统安全提供保护,如安全启动、系统完整性检测等。 + +## **约束** + +- 支持OpenHarmony定义的标准系统,暂不支持轻量系统和小型系统; +- CPU需要支持ARM TrustZone机制; + +## **术语** + +| 缩略语 | 英文 | 中文 | +| ------ | ---- | ---- | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | \ No newline at end of file diff --git a/docs/opentrustee-guidelines/public_sys-resources/icon-caution.gif b/docs/opentrustee-guidelines/public_sys-resources/icon-caution.gif new file mode 100644 index 0000000..6e90d7c Binary files /dev/null and b/docs/opentrustee-guidelines/public_sys-resources/icon-caution.gif differ diff --git a/docs/opentrustee-guidelines/public_sys-resources/icon-danger.gif b/docs/opentrustee-guidelines/public_sys-resources/icon-danger.gif new file mode 100644 index 0000000..6e90d7c Binary files /dev/null and b/docs/opentrustee-guidelines/public_sys-resources/icon-danger.gif differ diff --git a/docs/opentrustee-guidelines/public_sys-resources/icon-note.gif b/docs/opentrustee-guidelines/public_sys-resources/icon-note.gif new file mode 100644 index 0000000..6314297 Binary files /dev/null and b/docs/opentrustee-guidelines/public_sys-resources/icon-note.gif differ diff --git a/docs/opentrustee-guidelines/public_sys-resources/icon-notice.gif b/docs/opentrustee-guidelines/public_sys-resources/icon-notice.gif new file mode 100644 index 0000000..86024f6 Binary files /dev/null and b/docs/opentrustee-guidelines/public_sys-resources/icon-notice.gif differ diff --git a/docs/opentrustee-guidelines/public_sys-resources/icon-tip.gif b/docs/opentrustee-guidelines/public_sys-resources/icon-tip.gif new file mode 100644 index 0000000..93aa720 Binary files /dev/null and b/docs/opentrustee-guidelines/public_sys-resources/icon-tip.gif differ diff --git a/docs/opentrustee-guidelines/public_sys-resources/icon-warning.gif b/docs/opentrustee-guidelines/public_sys-resources/icon-warning.gif new file mode 100644 index 0000000..6e90d7c Binary files /dev/null and b/docs/opentrustee-guidelines/public_sys-resources/icon-warning.gif differ