add opentrustee-guidelines baseline
Signed-off-by: suwanghw <wangsu14@huawei.com>
@@ -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)
|
||||
@@ -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”为后缀名的包文件,文件格式如下:包含文件头、签名块、数据区三部分
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 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
|
||||
@@ -0,0 +1,431 @@
|
||||
# 使能新平台的指南
|
||||
## TEE 安全镜像Loader适配指导
|
||||
|
||||
### 概述
|
||||
|
||||
#### 功能简介
|
||||
|
||||
TEE Loader主要负责加载安全镜像并将启动参数传递给TEE OS的功能。
|
||||
|
||||
#### 约束与限制
|
||||
|
||||
- 芯片架构为ARMv7/ARMv8架构。
|
||||
- CPU需支持安全内存和非安全内存的划分,安全和非安全外设的划分。
|
||||
|
||||
### 开发指导
|
||||
|
||||
#### 场景介绍
|
||||
|
||||
由于安全镜像在flash中是以加密形式存储的,因此需要对镜像进行解密处理,随后拷贝到目标执行地址。在TEE OS启动时,需要对其传递启动参数。以上这些都是在Loader中进行的。因此在芯片使能TEE时,需要对Loader进行开发适配。
|
||||
|
||||
#### 接口说明<a name="section125843344514"></a>
|
||||
|
||||
以下接口说明列表将介绍我们在实际使能TEE过程中对Loader适配将用到的接口。包括:
|
||||
|
||||
- 启动参数配置
|
||||
- 镜像加载
|
||||
|
||||
**表 1** 启动参数配置调用接口表
|
||||
|
||||
<a name="table1496711447522"></a>
|
||||
|
||||
<table><thead align="left"><tr id="row596815449522"><th class="cellrowborder" valign="top" width="47.67%" id="mcps1.2.4.1.1"><p id="p196816442521"><a name="p196816442521"></a><a name="p196816442521"></a>接口名</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="32.129999999999995%" id="mcps1.2.4.1.2"><p id="p09681444165214"><a name="p09681444165214"></a><a name="p09681444165214"></a>描述</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="20.200000000000003%" id="mcps1.2.4.1.3"><p id="p19431194717249"><a name="p19431194717249"></a><a name="p19431194717249"></a>必选/可选</p>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><tr id="row51478313471"><td class="cellrowborder" valign="top" width="47.67%" headers="mcps1.2.4.1.1 "><p id="p497mcpsimp"><a name="p497mcpsimp"></a><a name="p497mcpsimp"></a>void set_teeos_mem(uintptr_t teeos_base_addr, uint64_t size)</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="32.129999999999995%" headers="mcps1.2.4.1.2 "><p id="p498mcpsimp"><a name="p498mcpsimp"></a><a name="p498mcpsimp"></a>设置TEE OS的起始地址size大小。</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="20.200000000000003%" headers="mcps1.2.4.1.3 "><p id="p12431947122419"><a name="p12431947122419"></a><a name="p12431947122419"></a><strong id="b1532325172812"><a name="b1532325172812"></a><a name="b1532325172812"></a>必选,OS需要。</strong></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row214793104714"><td class="cellrowborder" valign="top" width="47.67%" headers="mcps1.2.4.1.1 "><p id="p66112184581"><a name="p66112184581"></a><a name="p66112184581"></a>void set_teeos_uart(uint64_t uart_addr)</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="32.129999999999995%" headers="mcps1.2.4.1.2 "><p id="p196103189585"><a name="p196103189585"></a><a name="p196103189585"></a>设置串口地址。</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="20.200000000000003%" headers="mcps1.2.4.1.3 "><p id="p164311747112411"><a name="p164311747112411"></a><a name="p164311747112411"></a>可选,建议配置,启动调试用。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row3147173114720"><td class="cellrowborder" valign="top" width="47.67%" headers="mcps1.2.4.1.1 "><p id="p512mcpsimp"><a name="p512mcpsimp"></a><a name="p512mcpsimp"></a>void set_gic(struct gic_config_t gic_config)</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="32.129999999999995%" headers="mcps1.2.4.1.2 "><p id="p513mcpsimp"><a name="p513mcpsimp"></a><a name="p513mcpsimp"></a>配置gic寄存器。结构体定义见。</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="20.200000000000003%" headers="mcps1.2.4.1.3 "><p id="p1043194716242"><a name="p1043194716242"></a><a name="p1043194716242"></a><strong id="b0722234132818"><a name="b0722234132818"></a><a name="b0722234132818"></a>必选,OS需要。</strong></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row914714313476"><td class="cellrowborder" valign="top" width="47.67%" headers="mcps1.2.4.1.1 "><p id="p2744165514582"><a name="p2744165514582"></a><a name="p2744165514582"></a>bool copy_extend_datas(void * extend_datas, uint64_t extend_length)</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="32.129999999999995%" headers="mcps1.2.4.1.2 "><p id="p519mcpsimp"><a name="p519mcpsimp"></a><a name="p519mcpsimp"></a>保留字段拷贝。</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="20.200000000000003%" headers="mcps1.2.4.1.3 "><p id="p1431194762415"><a name="p1431194762415"></a><a name="p1431194762415"></a>可选,根据实际情况。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row514715384711"><td class="cellrowborder" valign="top" width="47.67%" headers="mcps1.2.4.1.1 "><p id="p520mcpsimp"><a name="p520mcpsimp"></a><a name="p520mcpsimp"></a>bool copy_teeos_cfg(void)</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="32.129999999999995%" headers="mcps1.2.4.1.2 "><p id="p521mcpsimp"><a name="p521mcpsimp"></a><a name="p521mcpsimp"></a>拷贝启动参数到目标位置,<strong id="b163513559278"><a name="b163513559278"></a><a name="b163513559278"></a>配置TEE OS属性后再调用此接口</strong>。</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="20.200000000000003%" headers="mcps1.2.4.1.3 "><p id="p3431747192413"><a name="p3431747192413"></a><a name="p3431747192413"></a><strong id="b625310456284"><a name="b625310456284"></a><a name="b625310456284"></a>必选,OS需要。</strong></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
**表 2** 镜像加载调用接口表
|
||||
|
||||
<a name="table15516113715563"></a>
|
||||
<table><thead align="left"><tr id="row5516113795615"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p10101114295614"><a name="p10101114295614"></a><a name="p10101114295614"></a>接口名</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p161017421562"><a name="p161017421562"></a><a name="p161017421562"></a>描述</p>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><tr id="row14516237105613"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1336862755413"><a name="p1336862755413"></a><a name="p1336862755413"></a>uintptr_t read_teeos(const char *part_name, uint32_t part_size)</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1351643714569"><a name="p1351643714569"></a><a name="p1351643714569"></a>将TEE OS从flash分区读镜像到RAM中。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row051633710563"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1463764075419"><a name="p1463764075419"></a><a name="p1463764075419"></a>int32_t verify_teeos(uintptr_t buf_addr)</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p105166372562"><a name="p105166372562"></a><a name="p105166372562"></a>TEE OS镜像验签。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row15516143712565"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p155165377567"><a name="p155165377567"></a><a name="p155165377567"></a>int32_t decrypt_teeos(uintptr_t buf_addr)</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p851619377562"><a name="p851619377562"></a><a name="p851619377562"></a>TEE OS镜像解密。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row13516153714567"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p351653735618"><a name="p351653735618"></a><a name="p351653735618"></a>int32_t copy_teeos(uintptr_t buf_addr)</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p152771458171114"><a name="p152771458171114"></a><a name="p152771458171114"></a>TEE OS镜像拷贝到目标执行地址。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row15835727135513"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p158111828105519"><a name="p158111828105519"></a><a name="p158111828105519"></a>uint64_t get_teeos_start(void)</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p281114283558"><a name="p281114283558"></a><a name="p281114283558"></a>获取TEE OS启动地址。</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
#### 接口参数结构体定义<a name="section15511163311570"></a>
|
||||
|
||||
```
|
||||
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** 启动参数列表
|
||||
|
||||
<a name="table31859499130"></a>
|
||||
<table><thead align="left"><tr id="row3185174941311"><th class="cellrowborder" valign="top" width="20.31%" id="mcps1.2.4.1.1"><p id="p9186154916134"><a name="p9186154916134"></a><a name="p9186154916134"></a>参数</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="28.64%" id="mcps1.2.4.1.2"><p id="p16186104911131"><a name="p16186104911131"></a><a name="p16186104911131"></a>含义</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="51.05%" id="mcps1.2.4.1.3"><p id="p12200103644211"><a name="p12200103644211"></a><a name="p12200103644211"></a>备注</p>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><tr id="row20186849151316"><td class="cellrowborder" valign="top" width="20.31%" headers="mcps1.2.4.1.1 "><p id="p5186194911131"><a name="p5186194911131"></a><a name="p5186194911131"></a>plat_cfg_size</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="28.64%" headers="mcps1.2.4.1.2 "><p id="p618617496136"><a name="p618617496136"></a><a name="p618617496136"></a>启动参数大小,包含extend_paras部分</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="51.05%" headers="mcps1.2.4.1.3 "><p id="p1520073664218"><a name="p1520073664218"></a><a name="p1520073664218"></a>整个启动参数的buffer大小,值为sizeof(struct platform_info) + extend _length。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row1618618496132"><td class="cellrowborder" valign="top" width="20.31%" headers="mcps1.2.4.1.1 "><p id="p292mcpsimp"><a name="p292mcpsimp"></a><a name="p292mcpsimp"></a>phys_region_size</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="28.64%" headers="mcps1.2.4.1.2 "><p id="p294mcpsimp"><a name="p294mcpsimp"></a><a name="p294mcpsimp"></a>TEE OS内存大小</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="51.05%" headers="mcps1.2.4.1.3 "><p id="p320093615420"><a name="p320093615420"></a><a name="p320093615420"></a>2MB的整数倍。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row01861049151317"><td class="cellrowborder" valign="top" width="20.31%" headers="mcps1.2.4.1.1 "><p id="p297mcpsimp"><a name="p297mcpsimp"></a><a name="p297mcpsimp"></a>phys_region_start</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="28.64%" headers="mcps1.2.4.1.2 "><p id="p299mcpsimp"><a name="p299mcpsimp"></a><a name="p299mcpsimp"></a>TEE OS内存起始物理地址</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="51.05%" headers="mcps1.2.4.1.3 "><p id="p1020063614220"><a name="p1020063614220"></a><a name="p1020063614220"></a>2MB的整数倍。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row18186649111319"><td class="cellrowborder" valign="top" width="20.31%" headers="mcps1.2.4.1.1 "><p id="p302mcpsimp"><a name="p302mcpsimp"></a><a name="p302mcpsimp"></a>uart_addr</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="28.64%" headers="mcps1.2.4.1.2 "><p id="p304mcpsimp"><a name="p304mcpsimp"></a><a name="p304mcpsimp"></a>串口寄存器的基地址</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="51.05%" headers="mcps1.2.4.1.3 "><p id="p1920015362427"><a name="p1920015362427"></a><a name="p1920015362427"></a>-</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row59731131174610"><td class="cellrowborder" valign="top" width="20.31%" headers="mcps1.2.4.1.1 "><p id="p9973113119460"><a name="p9973113119460"></a><a name="p9973113119460"></a>struct gic_config_t</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="28.64%" headers="mcps1.2.4.1.2 "><p id="p11973103114611"><a name="p11973103114611"></a><a name="p11973103114611"></a>gic寄存器参数</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="51.05%" headers="mcps1.2.4.1.3 "><p id="p797319312466"><a name="p797319312466"></a><a name="p797319312466"></a>-</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row1188221104618"><td class="cellrowborder" valign="top" width="20.31%" headers="mcps1.2.4.1.1 "><p id="p19884213469"><a name="p19884213469"></a><a name="p19884213469"></a>extend_datas</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="28.64%" headers="mcps1.2.4.1.2 "><p id="p98811215461"><a name="p98811215461"></a><a name="p98811215461"></a>其它参数</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="51.05%" headers="mcps1.2.4.1.3 "><p id="p18872120461"><a name="p18872120461"></a><a name="p18872120461"></a>格式需要和TEE OS核对。</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
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)。
|
||||
|
||||
#### 开发实例<a name="section3748141455319"></a>
|
||||
|
||||
- 使用 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管理列表
|
||||
|
||||
<a name="table7787117252"></a>
|
||||
|
||||
<table><thead align="left"><tr id="row4781911102519"><th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.1"><p id="p47816119253"><a name="p47816119253"></a><a name="p47816119253"></a>smc</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.2"><p id="p87881112256"><a name="p87881112256"></a><a name="p87881112256"></a>smc id</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.3"><p id="p57814117258"><a name="p57814117258"></a><a name="p57814117258"></a>处理的内容</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.4"><p id="p13782011162511"><a name="p13782011162511"></a><a name="p13782011162511"></a>来自安全/非安全侧</p>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><tr id="row10781211152514"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p1978151112256"><a name="p1978151112256"></a><a name="p1978151112256"></a>TEE_HANDLED_S_EL1_INTR</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p07861113251"><a name="p07861113251"></a><a name="p07861113251"></a>0xf2000006</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p279101182513"><a name="p279101182513"></a><a name="p279101182513"></a>FIQ中断</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1679611172510"><a name="p1679611172510"></a><a name="p1679611172510"></a>安全侧</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row07901112519"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p1279181162517"><a name="p1279181162517"></a><a name="p1279181162517"></a>TEE_ENTRY_DONE</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p279311122513"><a name="p279311122513"></a><a name="p279311122513"></a>0xf2000000</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p1579111182510"><a name="p1579111182510"></a><a name="p1579111182510"></a>TEE完成smc命令返回</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p10791411112516"><a name="p10791411112516"></a><a name="p10791411112516"></a>安全侧</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row167911118256"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p97971192516"><a name="p97971192516"></a><a name="p97971192516"></a>TEE_ON_DONE</p>
|
||||
<p id="p8791911192516"><a name="p8791911192516"></a><a name="p8791911192516"></a>TEE_RESUME_DONE)</p>
|
||||
<p id="p15791311172515"><a name="p15791311172515"></a><a name="p15791311172515"></a>TEE_SUSPEND_DONE</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p18793113256"><a name="p18793113256"></a><a name="p18793113256"></a>0xf2000001</p>
|
||||
<p id="p147914114255"><a name="p147914114255"></a><a name="p147914114255"></a>0xf2000004</p>
|
||||
<p id="p14797113257"><a name="p14797113257"></a><a name="p14797113257"></a>0xf2000003</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p1779111172511"><a name="p1779111172511"></a><a name="p1779111172511"></a>TEE启动完成,resume, suspend完成</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p157914117254"><a name="p157914117254"></a><a name="p157914117254"></a>安全侧</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row4791011122513"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p187961192516"><a name="p187961192516"></a><a name="p187961192516"></a>TEE_STD_REQUEST</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p679411142518"><a name="p679411142518"></a><a name="p679411142518"></a>0xb2000008</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p187941111255"><a name="p187941111255"></a><a name="p187941111255"></a>REE(tzdriver)侧的标准命令请求</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p67912115257"><a name="p67912115257"></a><a name="p67912115257"></a>非安全侧</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row14796115256"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p37911117254"><a name="p37911117254"></a><a name="p37911117254"></a>TEE_STD_REE_SIQ</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p187921142511"><a name="p187921142511"></a><a name="p187921142511"></a>0xb200000a</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p2791811142513"><a name="p2791811142513"></a><a name="p2791811142513"></a>SIQ线程处理请求</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p779121113252"><a name="p779121113252"></a><a name="p779121113252"></a>非安全侧</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row279511162517"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p117961102511"><a name="p117961102511"></a><a name="p117961102511"></a>TEE_STD_RESPONSE</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p127911172513"><a name="p127911172513"></a><a name="p127911172513"></a>0xb2000009</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p979111132517"><a name="p979111132517"></a><a name="p979111132517"></a>安全侧完成smc命令返回</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p87916115255"><a name="p87916115255"></a><a name="p87916115255"></a>安全侧</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row157919117258"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p187961116259"><a name="p187961116259"></a><a name="p187961116259"></a>TEE_STD_CRASH</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p1779211102520"><a name="p1779211102520"></a><a name="p1779211102520"></a>0xb200000b</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p1279111152516"><a name="p1279111152516"></a><a name="p1279111152516"></a>安全侧出现crash,告知ATF,此时ATF不会再处理任何非安全侧的请求</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p38011115254"><a name="p38011115254"></a><a name="p38011115254"></a>安全侧</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
#### 开发实例<a name="section3748141455319"></a>
|
||||
|
||||
- 在芯片使能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
|
||||
```
|
||||
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 24 KiB |
@@ -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。
|
||||
|
||||
> **注意:**
|
||||
>单独适配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中断号
|
||||
> **注意:**
|
||||
>注意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** 配置选项说明
|
||||
|
||||
<a name="table17608341239"></a>
|
||||
<table><thead align="left"><tr id="row1860844162318"><th class="cellrowborder" valign="top" width="44.2%" id="mcps1.2.3.1.1"><p id="p106081345231"><a name="p106081345231"></a><a name="p106081345231"></a>参数</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="55.800000000000004%" id="mcps1.2.3.1.2"><p id="p560812472313"><a name="p560812472313"></a><a name="p560812472313"></a>说明</p>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><tr id="row186081645232"><td class="cellrowborder" valign="top" width="44.2%" headers="mcps1.2.3.1.1 "><p id="p1160813419237"><a name="p1160813419237"></a><a name="p1160813419237"></a>CONFIG_TZDRIVER</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="55.800000000000004%" headers="mcps1.2.3.1.2 "><p id="p7608447236"><a name="p7608447236"></a><a name="p7608447236"></a>模块开关,使能tzdriver必须打开</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row560920412318"><td class="cellrowborder" valign="top" width="44.2%" headers="mcps1.2.3.1.1 "><p id="p1460916482311"><a name="p1460916482311"></a><a name="p1460916482311"></a>CONFIG_CPU_AFF_NR</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="55.800000000000004%" headers="mcps1.2.3.1.2 "><p id="p1960913482311"><a name="p1960913482311"></a><a name="p1960913482311"></a>CA绑核功能,非零值代表限制仅cpuid小于CONFIG_CPU_AFF_NR的CPU可以进入TEE,0代表无限制,当前只支持在0核运行,所以值为1</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row10656158102412"><td class="cellrowborder" valign="top" width="44.2%" headers="mcps1.2.3.1.1 "><p id="p4656168192410"><a name="p4656168192410"></a><a name="p4656168192410"></a>CONFIG_KERNEL_CLIENT</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="55.800000000000004%" headers="mcps1.2.3.1.2 "><p id="p1565616817245"><a name="p1565616817245"></a><a name="p1565616817245"></a>内核CA支持,默认建议开启</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row1051612110244"><td class="cellrowborder" valign="top" width="44.2%" headers="mcps1.2.3.1.1 "><p id="p351620118241"><a name="p351620118241"></a><a name="p351620118241"></a>CONFIG_TEELOG</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="55.800000000000004%" headers="mcps1.2.3.1.2 "><p id="p15516161182413"><a name="p15516161182413"></a><a name="p15516161182413"></a>TEE日志开关,默认建议开启</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row9724616192417"><td class="cellrowborder" valign="top" width="44.2%" headers="mcps1.2.3.1.1 "><p id="p3725516102418"><a name="p3725516102418"></a><a name="p3725516102418"></a>CONFIG_PAGES_MEM</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="55.800000000000004%" headers="mcps1.2.3.1.2 "><p id="p382054615243"><a name="p382054615243"></a><a name="p382054615243"></a>tlogger使用的内存类型,开发者无需修改</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row9724616192417"><td class="cellrowborder" valign="top" width="44.2%" headers="mcps1.2.3.1.1 "><p id="p3725516102418"><a name="p3725516102418"></a><a name="p3725516102418"></a>CONFIG_THIRDPARTY_COMPATIBLE</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="55.800000000000004%" headers="mcps1.2.3.1.2 "><p id="p382054615243"><a name="p382054615243"></a><a name="p382054615243"></a>兼容第三方opteed的适配,例如适配RK3568芯片需要开启此选项</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
### 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
|
||||
```
|
||||
> **注意:**
|
||||
>烧录的时候需要修改分区表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
|
||||
@@ -0,0 +1,42 @@
|
||||
## 系统架构
|
||||
|
||||
OpenTrustee是一套完整的TEE解决方案,包含多个部件,系统架构如同所示:
|
||||
|
||||

|
||||
|
||||
各部件基本功能介绍如下:
|
||||
|
||||
**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协议;
|
||||
@@ -0,0 +1,113 @@
|
||||
# OpenTrustee调试机制介绍
|
||||
|
||||
## TEE侧日志查看
|
||||
|
||||
当前OpenTrustee支持TEE侧日志系统,在TEE中提供LIB接口供TA和OpenTrustee Framework调用记录日志。使用维测接口获取TEE侧信息的说明如下:
|
||||
通过`hdc shell`打开命令行窗口,输入tlogcat即可查看日志。
|
||||
|
||||
## 日志级别
|
||||
|
||||
当前TEE中日志分为以下5个级别。
|
||||
|
||||
<a name="table263813112481"></a>
|
||||
<table><thead align="left"><tr id="row763951124815"><th class="cellrowborder" valign="top" width="21.052105210521052%" id="mcps1.1.4.1.1"><p id="p463916111482"><a name="p463916111482"></a><a name="p463916111482"></a>日志级别</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="45.614561456145616%" id="mcps1.1.4.1.2"><p id="p46393115489"><a name="p46393115489"></a><a name="p46393115489"></a>说明</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.1.4.1.3"><p id="p46391111204818"><a name="p46391111204818"></a><a name="p46391111204818"></a>对应的日志打印接口</p>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><tr id="row563919117484"><td class="cellrowborder" valign="top" width="21.052105210521052%" headers="mcps1.1.4.1.1 "><p id="p18639511124817"><a name="p18639511124817"></a><a name="p18639511124817"></a>VERBOSE</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="45.614561456145616%" headers="mcps1.1.4.1.2 "><p id="p66391511134814"><a name="p66391511134814"></a><a name="p66391511134814"></a>细粒度信息事件,详细地记录程序的运行过程。</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.3 "><p id="p13639161117487"><a name="p13639161117487"></a><a name="p13639161117487"></a>tlogv</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row10639201112487"><td class="cellrowborder" valign="top" width="21.052105210521052%" headers="mcps1.1.4.1.1 "><p id="p10639111184818"><a name="p10639111184818"></a><a name="p10639111184818"></a>DEBUG</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="45.614561456145616%" headers="mcps1.1.4.1.2 "><p id="p7558134616494"><a name="p7558134616494"></a><a name="p7558134616494"></a>细粒度信息事件,用于开发调试。</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.3 "><p id="p46391911164815"><a name="p46391911164815"></a><a name="p46391911164815"></a>tlogd</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row176395115486"><td class="cellrowborder" valign="top" width="21.052105210521052%" headers="mcps1.1.4.1.1 "><p id="p146391611194810"><a name="p146391611194810"></a><a name="p146391611194810"></a>INFO</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="45.614561456145616%" headers="mcps1.1.4.1.2 "><p id="p1063911124815"><a name="p1063911124815"></a><a name="p1063911124815"></a>突出强调应用程序的运行过程。</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.3 "><p id="p1461319875015"><a name="p1461319875015"></a><a name="p1461319875015"></a>tlogi</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row863981134816"><td class="cellrowborder" valign="top" width="21.052105210521052%" headers="mcps1.1.4.1.1 "><p id="p4639201113486"><a name="p4639201113486"></a><a name="p4639201113486"></a>WARNING</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="45.614561456145616%" headers="mcps1.1.4.1.2 "><p id="p7639911174815"><a name="p7639911174815"></a><a name="p7639911174815"></a>潜在的错误事件,不影响系统的继续运行。</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.3 "><p id="p9639111115480"><a name="p9639111115480"></a><a name="p9639111115480"></a>tlogw</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row1639171113485"><td class="cellrowborder" valign="top" width="21.052105210521052%" headers="mcps1.1.4.1.1 "><p id="p14639151117487"><a name="p14639151117487"></a><a name="p14639151117487"></a>ERROR</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="45.614561456145616%" headers="mcps1.1.4.1.2 "><p id="p1125856174915"><a name="p1125856174915"></a><a name="p1125856174915"></a>发生错误事件,影响系统的继续运行。</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.3 "><p id="p1563971113484"><a name="p1563971113484"></a><a name="p1563971113484"></a>tloge</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
> **说明:**
|
||||
>新开发TA推荐用上述日志接口,不建议使用其他接口。
|
||||
|
||||
### 日志使用限制<a name="section413233117432"></a>
|
||||
|
||||
1. 日志内存大小是有限的,当日志写入比较快时,会出现日志被覆盖的情况,日志内存采用的是内核申请的PAGES内存,大小是256K。
|
||||
2. 增加TA日志时,要符合安全规范,不能打印用户隐私信息、内存地址等,不打印调试日志,且一条日志内容要做到字符精简。
|
||||
|
||||
### 使用方法<a name="section61772276175810"></a>
|
||||
|
||||
在源代码文件中包含tee\_log.h,使用与日志级别对应的日志打印接口打印日志。
|
||||
|
||||
日志级别和相应的接口如上面描述,其使用与标准C中的printf类似。
|
||||
|
||||
tee\_log.h中默认使用的日志级别为INFO,即默认打印使用tloge、tlogw、tlogi接口的信息。如调试过程中希望打印其他级别,可选择下面方式中的一种进行修改,建议使用方式1:
|
||||
|
||||
1. 在Makefile文件中动态修改日志级别TA\_LOG\_LEVEL,具体值和对应的显示级别为:
|
||||
|
||||
<a name="table1136311211099"></a>
|
||||
<table><thead align="left"><tr id="row936414211913"><th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.1"><p id="p10364172119913"><a name="p10364172119913"></a><a name="p10364172119913"></a>TA_LOG_LEVEL值</p>
|
||||
</th>
|
||||
<th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.2"><p id="p1364162113919"><a name="p1364162113919"></a><a name="p1364162113919"></a>日志显示级别</p>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><tr id="row2036413219915"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p93938731415"><a name="p93938731415"></a><a name="p93938731415"></a>0</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p1226241161412"><a name="p1226241161412"></a><a name="p1226241161412"></a>Error</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row5364202112914"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p539312714149"><a name="p539312714149"></a><a name="p539312714149"></a>1</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p122621511111413"><a name="p122621511111413"></a><a name="p122621511111413"></a>Error、Warn</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row536413217917"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p5393779149"><a name="p5393779149"></a><a name="p5393779149"></a>2--默认值</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p1426221181412"><a name="p1426221181412"></a><a name="p1426221181412"></a>Error、Warn、Info</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row183648211790"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p143931576149"><a name="p143931576149"></a><a name="p143931576149"></a>3</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p14262191141410"><a name="p14262191141410"></a><a name="p14262191141410"></a>Error、Warn、Info、Debug</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row236418211891"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p3393177121414"><a name="p3393177121414"></a><a name="p3393177121414"></a>>=4</p>
|
||||
</td>
|
||||
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p1526381111143"><a name="p1526381111143"></a><a name="p1526381111143"></a>Error、Warn、Info、Debug、Verbo</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
2. 直接修改tee\_log.h中定义的TA\_LOG\_LEVEL\_DEFAULT为期望的级别。多个TA共用同一个tee\_log.h文件且期望打印的日志级别不一致时,不能选用此方式。
|
||||
3. 直接修改tee\_log.h中定义的TA\_LOG\_LEVEL为期望的级别。多个TA共用同一个tee\_log.h文件且期望打印的日志级别不一致时,不能选用此方式。
|
||||
@@ -0,0 +1,31 @@
|
||||
# OpenTrustee概述
|
||||
|
||||
OpenTrustee是一个部署在可信执行环境(TEE)中的安全操作系统。ARM架构中的TrustZone技术通过CPU层面的硬件设计,支持创建安全的可信执行环境。基于ARM TrustZone技术,我们可以在设备上同时运行OpenHarmony和OpenTrustee两个系统,这两个系统彼此隔离。基于这种系统隔离带来的安全性,OpenTrustee可以为用户的机密数据提供保护。
|
||||
|
||||
## **安全能力**
|
||||
|
||||
OpenTrustee支持安全计算、安全存储、安全密钥、安全外设、安全时钟等安全能力。
|
||||
|
||||
备注:应该展开介绍,是否放到单独章节
|
||||
|
||||
## **应用场景**
|
||||
|
||||
在终端设备越来越智能化的今天,人们正在把越来越多的个人应用和数据放到设备上,安全性成为一个很重要的命题。可信执行环境(TEE)已逐渐成为终端设备必备的安全技术。OpenTrustee具备丰富的安全特性,可以支持开发者灵活部署安全应用,应用场景也非常广泛,例如:移动支付、生物认证、版权保护等,也可以为系统安全提供保护,如安全启动、系统完整性检测等。
|
||||
|
||||
## **约束**
|
||||
|
||||
- 支持OpenHarmony定义的标准系统,暂不支持轻量系统和小型系统;
|
||||
- CPU需要支持ARM TrustZone机制;
|
||||
|
||||
## **术语**
|
||||
|
||||
| 缩略语 | 英文 | 中文 |
|
||||
| ------ | ---- | ---- |
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
|
After Width: | Height: | Size: 580 B |
|
After Width: | Height: | Size: 580 B |
|
After Width: | Height: | Size: 394 B |
|
After Width: | Height: | Size: 406 B |
|
After Width: | Height: | Size: 253 B |
|
After Width: | Height: | Size: 580 B |