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("ca"); 引用native層函數
調用jni函數
libca.so
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
可以通過TEEC_UUID調用具體的STA程序
TEE_OpenTASession
TEE_InvokeTACommand
STA層(static TA):
utee_open_ta_session 響應user TA端TEE_OpenTASession
utee_invoke_ta_command 對應函數commandID 響應user TA端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端。