TEE Client API關鍵原則是:
C語言
阻塞式函數
源碼級別的可移植性
客戶端內存分配
零拷貝數據傳輸
通過指針共享內存
專注於定義基礎通信機制
TEE Client AP基礎概念:
TEE Context:TEE Context是CA和TEE之間的邏輯連接的抽象。
必須先初始化TEE Context,然后才能在該TEE Context所表示的TEE中創建CA與TA間的會話。當不再需要與TEE的連接時,應終止TEE Context,從而釋放系統資源。
Session:Session是CA和TA之間的邏輯連接的抽象。會話由CA在特定的TEE Context內打開。
在創建新會話時,CA必須使用UUID標識其希望連接的TA。
Command:Command是一個會話中CA和TA的通信單元。
當啟動新命令時,CA通過傳遞數字標識符來標識其希望執行TA中的對應功能,並提供TA需要的數據。命令調用將阻塞CA線程,等待來自TA的答復,CA可以使用多線程來並發處理多個命令。
Operation Payload:OpenSession和InvokeCommand可以攜帶payload,載荷存儲在TEEC_Parameter數據結構中,可以攜帶四個TEEC_Parameter。
每個Parameter是內存引用或值參數,內存引用參數用於通過共享內存緩沖區交換數據,值參數以兩個32位整數的形式攜帶少量數據。
內存引用包含已注冊內存引用或臨時內存引用,注冊內存引用是在操作之前創建的共享內存塊中的區域,臨時內存引用直接指定了CA擁有的一塊內存緩沖區,該緩沖區在執行操作期間由TEE Client API臨時注冊。
Shared Memory:共享內存是在CA內存空間中分配的內存區域,可用於在CA和TA之間傳輸數據。
共享內存可以是現有的CA內存,該內存隨后通過TEE Client API注冊,也可以是CA使用TEE Client API分配的內存。共享內存可以注冊或分配一次,然后在多個命令中使用,甚至可以在多個會話中使用,前提是它們存在於創建共享內存的TEE Context范圍內。
零拷貝數據傳輸——在可能的情況下,TEE Client API下的通信通道的實現應嘗試將共享內存直接映射到TA內存空間,從而實現真正的零拷貝數據傳輸。CA開發人員應注意,讓TEE Client API使用TEEC_AllocateSharedMemory函數分配內存緩沖區可最大程度地利用零拷貝交換成功共享它。
Memory References:內存引用是某個特定操作實際共享的字節范圍,表示為TEEC_MemoryReference或TEEC_TempMemoryReference數據結構。
內存引用類型包含有,
TEEC_MEMREF_TEMP_INPUT、TEEC_MEMREF_TEMP_OUTPUT、TEEC_MEMREF_TEMP_INOUT,臨時內存引用預示着該參數指向要共享的內存緩沖區,而不是指向共享內存控制結構。在執行操作期間,此CA緩沖區將被臨時共享。
TEEC_MEMREF_WHOLE,整個內存引用實現了一種輕量級的機制,可以共享整個父級共享內存塊,而無需復制內存引用中共享內存結構控制字段的內容。使用此內存類型時,整個共享內存區域將與父共享內存指定的方向標志共享。
TEEC_MEMREF_PARTIAL_INPUT、TEEC_MEMREF_PARTIAL_OUTPUT、TEEC_MEMREF_PARTIAL_INOUT,部分內存引用是指父共享內存塊的子區域,允許該塊內的任何區域與TA共享。
Resource Cleanup:
釋放Shared Memory時,客戶端代碼必須確保在掛起的操作中未引用它
關閉會話時,會話中不得有任何待處理的操作
在終止TEE Context時,其范圍內不得有任何打開的會話