OP-TEE:Secure world OS(optee_os)、normal world client(optee_client)、test suite(optee_test/xtest)以及linux驱动
optee_os: https://github.com/OP-TEE/optee_os
optee_client: https://github.com/OP-TEE/optee_client 主要生成libteec.so, 是包含用于与可信操作系统通信的API的库
optee_test:https://github.com/OP-TEE/optee_test
可参考书籍《手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解 》
CA(Client Application,运行在normal world)和TA(Trust Application,运行在secure world)
TA又分为用户TA(user ta)和静态TA(static ta),静态TA是和optee build在一起的
CA主要通过TEEC_UUID来调用TA
Java层调用库包:System.loadLibrary("control_opt"); 引用native层函数
调用jni函数
Jni层:调用CA程序
加载头文件,引用CA的C函数
extern "C"
{
#include "ca.h"
}
CA层:通过TEEC_OpenSession调用libteec.so,其中TEEC_UUID的对应具体要通信的TA
TEEC_InvokeCommand 通过cmd_id调用TA对应函数
user TA层:TEEC_UUID.ta (换成具体对应的uuid.ta) TA端程序
TA_OpenSessionEntryPoint 响应CA端TEEC_OpenSession
TA_InvokeCommandEntryPoint 对应函数cmd_id 响应CA端TEEC_InvokeCommand
STA层(static TA): 也是通过TEEC_UUID调用具体的TA程序
TEE_OpenTASession
TEE_InvokeTACommand
由于CA端与TA端是隔离的,如果需要交换数据的话,要使用:TEEC_MEMREF_TEMP_INOUT/TEEC_MEMREF_PARTIAL_INOUT 这两种内存映射,一个是临时一个是部分的
TEEC_MEMREF_TEMP_INOUT:临时内存引用指向的是共享内存缓冲区,而不是共享内存控制结构
TEEC_MEMREF_PARTIAL_INOUT :部分内存引用,指向父共享内存块的子区域,允许模块中任 意字节域共享给可信应用,需要通过TEEC_AllocateSharedMemory申请
CA如果还需要跟STA(static TA)交换数据的话,需要在user TA中重新申请内存,缓存上述所说的内存映射或者内存缓冲区,由user TA端与STA端交换数据,并把交换后的数据拷贝到相应的内存映射或者内存缓冲区,返回到CA端。