3.18. sample_trustzone 使用说明
3.18.1. 功能概述
sample_trustzone 分别完成了 TA 和 CA 的简单示例代码,用户可以通过 sample_ta 和 sample_ca 了解如何创建并使用 TA 和 CA 进行命令交互操作。
sample_ta 添加三条自定义命令,分别处理整型和字符串类型数据
数据自加命令
TA_SAMPLE_CMD_INC_VALUE: 由 TA 将传入的数值加 1,并返回给 CA数据自减命令
TA_SAMPLE_CMD_DEC_VALUE: 由 TA 将传入的数值减 1,并返回给 CA字符串回显命令
TA_SAMPLE_CMD_ECHO_STR: 由 TA 将传入的字符串追加[TA],并回显给 CA
3.18.1.1. 软件架构说明

3.18.1.2. 代码位置及目录结构
代码位置
app/samples/platform_samples/sample_trustzone目录结构
sample_trustzone
├── sample_ca
│ ├── Makefile
│ └── sample_ca.c
└── sample_ta
├── Makefile
├── include
│ └── sample_ta.h
├── sample_ta.c
├── sub.mk
└── user_ta_header_defines.h
3.18.1.3. API 流程说明

3.18.2. 编译
下面分别说明 sample_ta 与 sample_ca 的编译方法
3.18.2.1. sample_ta 编译
拷贝 sample_ta 源码
注意: sample_ta 并不是直接在 plamform_samples 目录下编译,需要拷贝至 miniboot/optee/hobot_tee_devkit/ta/customer 下编译
使用如下命令
cp app/samples/platform_samples/sample_trustzone/sample_ta miniboot/optee/hobot_tee_devkit/ta/customer/ -rf
创建 UUID
使用示例自带 UUID 可跳过此步骤
系统中允许存在多个 TA,每个 TA 需配置不同的 UUID。
UUID 可以通过此网址生成 https://www.uuidgenerator.net/

如上所示,生成 UUID 值 ed53d67d-4e58-4b9a-8514-0a61c3c94401
配置 UUID
使用示例自带 UUID 可跳过此步骤
上一个步骤生成的 UUID,需填入以下几处源码。
路径 sample_ta/include/sample_ta.h
#define TA_SAMPLE_UUID \
{ 0xed53d67d, 0x4e58, 0x4b9a, \
{ 0x85, 0x14, 0x0a, 0x61, 0xc3, 0xc9, 0x44, 0x01} }
路径 sample_ta/Makefile
# The UUID for the Trusted Application
BINARY=ed53d67d-4e58-4b9a-8514-0a61c3c94401
将 sample_ta 添加到编译选项
修改 miniboot/optee/hobot_tee_devkit/ta/customer/Makefile,将 sample_ta 追加到变量 CTA_DIRS
CTA_DIRS := sample_ta
编译
在 SDK 根目录下执行命令 ./bd.sh miniboot,将自动编译 sample_ta。
其编译成果物位于 miniboot/optee/hobot_tee_devkit/out/ta/sample_ta。
TA 运行程序命名规则为 [UUID].ta,根据之前步骤配置的 UUID,即 ed53d67d-4e58-4b9a-8514-0a61c3c94401.ta。
3.18.2.2. sample_ca 编译
配置 UUID
使用示例自带 UUID 可跳过此步骤
CA 是通过 UUID 指定需要调用的 TA,需要在代码中配置 TA 的 UUID。
// 匹配之前步骤配置的 TA UUID
TEEC_UUID uuid = { 0xed53d67d, 0x4e58, 0x4b9a, \
{ 0x85, 0x14, 0x0a, 0x61, 0xc3, 0xc9, 0x44, 0x01} };
// ...(省略部分代码)...
// 在 open session 的时候传入 UUID
res = TEEC_OpenSession(&ctx, &sess, &uuid,
TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
// ...(省略部分代码)...
编译
在 sample_ca 源码路径下执行 make 命令即可完成编译:
cd app/samples/platform_samples/sample_trustzone/sample_ca
make
详细的程序编译方式请查阅 编译方法 章节。
3.18.3. 部署
下面分别说明 sample_ta 与 sample_ca 的部署方法
3.18.3.1. sample_ta 部署
将上面步骤生成的 sample_ta 程序复制到 out/deploy/system/usr/lib/optee_armtz 目录。
执行 ./bd.sh system,将 sample_ta 程序打包进 system 分区。
刷写系统软件镜像后 , sample_ta 文件位于板端 : /usr/lib/optee_armtz
3.18.3.2. sample_ca 部署
刷写系统软件镜像后 , sample_ca 的可执行文件位于板端 : /app/platform_samples/sample_trustzone/sample_ca。
3.18.4. 运行
3.18.4.1. 程序运行方法
直接执行程序
./sample_ca -h可以获得帮助信息:
3.18.4.2. 程序参数选项说明
Usage: sample_ca [OPTIONS] [value]
Options:
-i <value> Increase value From TA
-d <value> Decrease value From TA
-c <string> Echo string From TA
-h Show this help message
选项:
i <value>: 由 TA 将传入的数值加 1,并返回给 CAd <value>: 由 TA 将传入的数值减 1,并返回给 CAc <string>: 由 TA 将传入的字符串追加[TA],并回显给 CAh: 显示帮助信息。
3.18.4.3. 运行效果
验证数据自加命令
执行命令 ./sample_ca -i 10,将 10 传给 sample_ta。
打印 log 如下
Establish Context with OP-TEE!
Establish Session with TA!
I/TC: RPMB: Using generated key
D/TA: TA_CreateEntryPoint:39 has been called
D/TA: TA_OpenSessionEntryPoint:68 has been called
D/TA: inc_value:105 has been called
I/TA: Got value: 10 from NW
I/TA: Increase value to: 11
TA incremented value to 11
Disconnect Session with TA!
D/TA: TA_DestroyEntryPoint:50 has been called
Disconnect Context with OP-TEE!
可以看到 TA 处理并返回数据 11 给 CA
验证数据自减命令
执行命令 ./sample_ca -d 10,将 10 传给 sample_ta。
打印 log 如下
Establish Context with OP-TEE!
Establish Session with TA!
D/TA: TA_CreateEntryPoint:39 has been called
D/TA: TA_OpenSessionEntryPoint:68 has been called
D/TA: dec_value:125 has been called
I/TA: Got value: 10 from NW
I/TA: Decrease value to: 9
TA incremented value to 9
Disconnect Session with TA!
D/TA: TA_DestroyEntryPoint:50 has been called
Disconnect Context with OP-TEE!
可以看到 TA 处理并返回数据 9 给 CA
验证字符串回显命令
执行命令 ./sample_ca -c hello,将字符串传给 sample_ta。
打印 log 如下
Establish Context with OP-TEE!
Establish Session with TA!
D/TA: TA_CreateEntryPoint:39 has been called
D/TA: TA_OpenSessionEntryPoint:68 has been called
D/TA: echo_str:146 has been called
I/TA: Got sting from NW: hello
TA Echo: hello[TA]
Disconnect Session with TA!
D/TA: TA_DestroyEntryPoint:50 has been called
Disconnect Context with OP-TEE!
可以看到 TA 处理并返回字符串 hello[TA] 给 CA
3.18.5. 常见问题
3.18.5.1. 执行 CA 程序调用 TA 提示 Verify key 错误

解决方法: TA 的加载需依赖 user root key。 关于 user root key 的烧录方法,请参考 efuse