手機安全和可信應用開發指南:TrustZone與OP-TEE技術詳解
第一篇 基礎技術篇
1 可信執行環境
1.1 系統存在的安全問題
1.2 TEE如何保護數據安全
1.3 現有TEE解決方案
1.3.1 智能手機領域的TEE
1.3.2 智能電視領域的TEE
1.3.3 IoT領域及其他領域的TEE
1.4 為什么選擇OP-TEE
2 ARM的TrustZone技術
2.1 TrustZone技術
2.1.1 片上系統硬件框架
2.1.2 ARMv7架構的TrustZone技術
2.1.3 ARMv8架構的TrustZone技術
2.2 ARM安全擴展組件
2.2.1 AXI總線上安全狀態位的擴展
2.2.2 AXI-to-APB橋的作用
2.2.3 TrustZone地址空間控制組件
2.2.4 TrustZone內存適配器組件
2.2.5 TrustZone保護控制器組件
2.2.6 TrustZone中斷控制器組件
2.2.7 Cache和MMU的擴展
2.3 TrustZone技術對資源隔離的實現
2.3.1 中斷源的隔離
2.3.2 片上RAM和片上ROM的隔離
2.3.3 片外DRAM的隔離
2.3.4 外圍設備的隔離
2.4 小結
3 ARM可信固件
3.1 為什么使用ATF
3.2 ATF的主要功能
3.3 ATF與TEE的關系
3.4 小結
4 OP-TEE運行環境的搭建及編譯
4.1 獲取OP-TEE代碼並搭建運行環境
4.1.1 OP-TEE開發環境的搭建
4.1.2 獲取OP-TEE的源代碼
4.1.3 獲取編譯OP-TEE的toolchain
4.1.4 編譯QEMU
4.1.5 運行OP-TEE
4.1.6 運行xtest和optee_example_hello_world
4.2 運行CA和TA示例
4.2.1 示例代碼的獲取和集成
4.2.2 目錄和文件創建
4.2.3 CA端代碼的修改
4.2.4 TA端代碼的修改
4.2.5 TA和CA在OP-TEE的集成
4.3 OP-TEE源代碼結構
4.4 OP-TEE編譯
4.4.1 編譯目標的依賴關系
4.4.2 bios.bin鏡像的生成過程
4.4.3 run-only目標的執行
4.5 小結
第二篇 系統集成篇
5 QEMU運行OP-TEE的啟動過程
5.1 bios.bin的入口函數
5.2 OP-TEE鏡像的加載和啟動
5.3 Linux內核鏡像的加載和啟動
5.4 rootfs的掛載
5.5 OP-TEE驅動的啟動
5.6 tee_supplicant的啟動
5.7 小結
6 安全引導功能及ATF的啟動過程
6.1 安全引導的作用
6.2 安全引導的原理
6.2.1 ARMv7安全引導的過程
6.2.2 ARMv8安全引導的過程
6.3 ATF的啟動過程
6.3.1 ATF中bl1的啟動
6.3.2 ATF中bl2的啟動
6.3.3 ATF中bl31的啟動
6.3.4 ATF中bl32的啟動
6.3.5 ATF啟動過程小結
6.4 小結
7 OP-TEE OS的啟動過程
7.1 OP-TEE鏡像啟動過程
7.1.1 OP-TEE OS的入口函數
7.1.2 OP-TEE的內核初始化過程
7.1.3 OP-TEE服務項的啟動
7.1.4 OP-TEE驅動的掛載
7.2 ARM64位與ARM32位OP-TEE啟動過程的差異
7.3 小結
8 OP-TEE在REE側的上層軟件
8.1 OP-TEE的軟件框架
8.2 REE側libteec庫提供的接口
8.2.1 libteec庫提供的接口說明
8.2.2 CA調用libteec庫中接口的流程
8.3 REE側的守護進程——tee_supplicant
8.3.1 tee_supplicant編譯生成和自啟動
8.3.2 tee_supplicant入口函數
8.3.3 tee_supplicant存放RPC請求的結構體
8.3.4 tee_supplicant中的無限循環
8.3.5 tee_supplicant獲取TA的RPC請求
8.3.6 TA RPC請求的解析
8.3.7 RPC請求的處理
8.3.8 回復RPC請求
8.4 各種RPC請求的處理
8.4.1 加載TA鏡像
8.4.2 操作REE側的文件系統
8.4.3 操作RPMB
8.4.4 分配共享內存
8.4.5 釋放共享內存
8.4.6 記錄程序執行效率
8.4.7 網絡套接字操作
8.5 小結
9 REE側OP-TEE的驅動
9.1 OP-TEE驅動模塊的編譯保存
9.2 REE側OP-TEE驅動的加載
9.2.1 設備號和class的初始化
9.2.2 optee_driver_init函數
9.2.3 掛載驅動的probe操作
9.2.4 獲取切換到Monitor模式或EL3的接口
9.2.5 驅動版本和API版本校驗
9.2.6 判定OP-TEE是否預留共享內存空間
9.2.7 配置驅動與OP-TEE之間的共享內存
9.2.8 分配和設置tee0和teepriv0的設備信息結構體變量
9.2.9 tee0和teepriv0設備的注冊
9.2.10 請求隊列的初始化
9.2.11 使能TEE中共享內存的緩存
9.2.12 OP-TEE驅動掛載的總結
9.3 REE側用戶空間對驅動的調用過程
9.4 OP-TEE驅動中重要的結構體變量
9.4.1 OP-TEE驅動的file_operation結構體變量tee_fops
9.4.2 tee0設備的tee_driver_ops結構體變量optee_ops
9.4.3 teepriv0設備的操作結構體變量optee_supp_ops
9.4.4 共享驅動緩存操作變量tee_shm_dma_buf_ops
9.5 OP-TEE驅動與OP-TEE之間共享內存的注冊和分配
9.6 libteec庫中的接口在驅動中的實現
9.6.1 libteec庫中的open操作
9.6.2 libteec庫中的release操作
9.6.3 libteec執行get_version操作
9.6.4 libteec庫中的open session操作
9.6.5 libteec庫中的invoke操作
9.7 tee_supplicant接口在驅動中的實現
9.7.1 接收OP-TEE的RPC請求
9.7.2 獲取OP-TEE的RPC請求
9.7.3 OP-TEE的RPC請求的返回
9.8 小結
第三篇 OP-TEE內核篇
10 ARM核安全態和非安全態間的切換
10.1 ARMv7基本知識
10.1.1 ARMv7運行模式擴展
10.1.2 安全狀態位擴展
10.1.3 重要寄存器
10.1.4 安全監控模式調用的匯編指令
10.2 Monitor模式下的處理過程
10.2.1 Monitor模式對安全監控模式調用的處理
10.2.2 正常世界狀態中觸發安全監控模式調用的處理過程
10.2.3 安全世界狀態中觸發安全監控模式調用的處理過程
10.3 ARMv8基本知識
10.3.1 ARM核運行模式的新定義
10.3.2 ARMv8安全狀態位擴展
10.3.3 寄存器資源
10.3.4 安全監控模式調用匯編指令
10.4 EL3的處理過程
10.4.1 ATF中EL3異常向量表的注冊
10.4.2 EL3處理安全監控模式調用的流程
10.4.3 安全世界狀態中觸發安全監控模式調用的處理過程
10.4.4 正常世界狀態中觸發安全監控模式調用的處理過程
10.4.5 opteed_smc_handler函數
10.5 小結
11 OP-TEE對安全監控模式調用的處理
11.1 OP-TEE的線程向量表
11.2 ARMv7中Monitor模式對安全監控模式調用的處理
11.3 ARMv8中EL3處理安全監控模式調用的實現
11.4 OP-TEE對快速安全監控模式調用的處理
11.5 OP-TEE對標准安全監控模式調用的處理
11.5.1 OP-TEE對RPC請求返回操作的處理
11.5.2 OP-TEE對libteec庫觸發的安全監控模式調用的處理
11.6 小結
12 OP-TEE對中斷的處理
12.1 系統的中斷處理
12.2 中斷控制器
12.2.1 GIC寄存器
12.2.2 ARMv7 SCR寄存器的設定
12.2.3 ARMv8 SCR寄存器的設定
12.2.4 GICv2架構
12.2.5 GICv3架構
12.3 異常向量表配置
12.3.1 ARMv7中Monitor模式的異常向量表
12.3.2 ARMv8中EL3階段的異常向量表
12.3.3 OP-TEE異常向量的配置
12.4 OP-TEE的線程向量表
12.5 全局handle變量的初始化
12.6 ARMv7 Monitor對FIQ事件的處理
12.7 ARMv8 EL3階段對FIQ事件的處理
12.8 OP-TEE對FIQ事件的處理
12.9 OP-TEE對IRQ事件的處理
12.10 小結
13 OP-TEE對TA操作的各種實現
13.1 創建會話在OP-TEE中的實現
13.1.1 靜態TA的創建會話操作
13.1.2 動態TA的創建會話操作
13.2 調用TA命令操作在OP-TEE中的實現
13.2.1 靜態TA的調用命令操作的實現
13.2.2 動態TA的調用命令操作實現
13.3 關閉會話操作在OP-TEE中的實現
13.3.1 靜態TA的關閉會話操作
13.3.2 動態TA的關閉會話操作
13.4 小結
14 OP-TEE的內存和緩存管理
14.1 物理內存和緩存數據的硬件安全保護
14.1.1 內存設備安全區域的隔離
14.1.2 MMU和緩存中數據的安全隔離
14.2 ARM核對內存的訪問
14.2.1 ARM核獲取內存數據的過程
14.2.2 獲取緩存數據的過程
14.2.3 緩存和TLB中條目的一致性
14.3 OP-TEE對內存區域的管理
14.3.1 OP-TEE中內存區域的類型
14.3.2 內存區域編譯設置
14.4 MMU的初始化和映射頁表
14.4.1 MMU的初始化入口函數
14.4.2 物理地址到虛擬地址表的建立
14.4.3 MMU轉換頁表的創建
14.4.4 MMU寄存器配置
14.5 OP-TEE內存安全權限檢查
14.6 系統的共享內存
14.6.1 共享內存的配置
14.6.2 OP-TEE驅動與OP-TEE之間的共享內存
14.6.3 OP-TEE內核空間與用戶空間之間的共享內存
14.7 數據是否需要寫入Cache
14.8 小結
15 OP-TEE中的線程管理
15.1 OP-TEE中的線程
15.2 線程狀態切換
15.2.1 Free態到Active態的實現
15.2.2 Active態到Suspend態的實現
15.2.3 Suspend態到Active態的實現
15.2.4 Active態到Free態的實現
15.3 線程運行時的資源
15.3.1 線程數據結構體
15.3.2 OP-TEE分配的內核棧
15.3.3 線程運行於用戶空間的資源
15.3.4 tee_ta_session結構體
15.4 線程運行時資源的使用關系
15.5 OP-TEE中線程的調度
15.6 線程的死鎖
15.6.1 死鎖的原理
15.6.2 防止死鎖
15.7 小結
16 OP-TEE的系統調用
16.1 OP-TEE系統調用的作用
16.2 OP-TEE系統調用的實現
16.2.1 系統調用的整體流程
16.2.2 系統調用的定義
16.2.3 系統調用表tee_sv_syacall_table
16.3 小結
17 OP-TEE的IPC機制
17.1 IPC機制的作用
17.2 IPC機制的原理
17.3 IPC的實現
17.3.1 TA調用其他TA的實現
17.3.2 TA調用系統服務和安全驅動的實現
17.3.3 TA對密碼學系統服務的調用實現
17.3.4 對SE功能模塊進行操作的系統服務
17.3.5 加載TA鏡像的系統服務
17.4 小結
第四篇 應用開發篇
18 TA鏡像的簽名和加載
18.1 TA鏡像文件的編譯和簽名
18.1.1 TA鏡像文件的編譯
18.1.2 對TA鏡像文件的簽名
18.2 TA鏡像的加載
18.2.1 REE側獲取TA鏡像文件的內容
18.2.2 加載TA鏡像的RPC請求
18.2.3 RPC請求的發送
18.2.4 讀取TA鏡像文件內容到共享內存
18.3 TA鏡像合法性的驗證
18.3.1 驗證TA鏡像合法性使用的RSA公鑰的產生和獲取
18.3.2 TA鏡像文件合法性的檢查
18.4 加載TA鏡像到OP-TEE的用戶空間
18.5 TA運行上下文的初始化
18.6 小結
19 OP-TEE中的密碼學算法
19.1 算法使用示例
19.1.1 示例代碼獲取和集成
19.1.2 板級編譯文件的修改
19.1.3 通用編譯文件的修改
19.1.4 編譯運行
19.2 OP-TEE中的SHA算法
19.2.1 TA中使用SHA算法的實現
19.2.2 SHA算法實現接口說明
19.3 OP-TEE中的AES算法
19.3.1 TA中使用AES算法的實現
19.3.2 AES算法實現接口說明
19.4 OP-TEE中的RSA算法
19.4.1 TA中使用RSA算法的實現
19.4.2 RSA算法實現接口說明
19.5 小結
20 OP-TEE的安全存儲
20.1 安全存儲簡介
20.2 安全存儲使用示例
20.2.1 示例代碼獲取和集成
20.2.2 板級編譯文件的修改
20.2.3 通用編譯文件的修改
20.2.4 編譯運行
20.3 安全存儲功能使用的密鑰
20.3.1 安全存儲密鑰
20.3.2 可信應用的存儲密鑰
20.3.3 文件加密密鑰
20.4 安全文件、dirf.db文件的數據格式和操作過程
20.4.1 dirf.db文件和安全文件的格式
20.4.2 安全存儲功能中使用的重要結構體
20.4.3 安全存儲中的文件節點組成
20.4.4 查詢安全文件中的特定數據塊
20.5 安全存儲文件的創建
20.5.1 安全存儲軟件框架
20.5.2 dirf.db文件的創建
20.5.3 安全文件的創建
20.6 安全文件的打開操作
20.6.1 安全文件的打開
20.6.2 打開dirf.db文件並建立節點樹
20.6.3 安全文件在/data/tee目錄下的文件編號
20.6.4 打開特定安全文件
20.7 安全文件的讀寫操作
20.7.1 安全文件中數據的讀取
20.7.2 安全文件中數據的寫入
20.8 安全文件中數據的加解密
20.8.1 各種類型數據的組成及作用
20.8.2 元數據的加密
20.8.3 數據塊區域的加密策略
20.9 小結
21 可信應用及客戶端應用的開發
21.1 TA及CA的基本概念
21.2 GP標准
21.3 GP標准對TA屬性的定義
21.4 GP標准定義的接口
21.4.1 GP定義的客戶端接口
21.4.2 GP定義的內部接口
21.5 TA和CA的實現
21.5.1 建立CA和TA的目錄結構
21.5.2 CA代碼的實現
21.5.3 TA代碼的實現
21.6 TA和CA的集成
21.6.1 CA和TA的Makefile的修改
21.6.2 OP-TEE中comm.mk和xxx.mk文件的修改
21.7 TA和CA的調試
21.8 TA和CA的使用
21.9 小結
22 安全驅動的開發
22.1 安全設備的硬件安全隔離
22.2 OP-TEE中安全驅動的框架
22.2.1 系統服務層
22.2.2 驅動層
22.2.3 驅動文件在源代碼中的位置
22.3 安全驅動的開發過程和示例
22.3.1 示例代碼獲取和集成
22.3.2 驅動實現
22.3.3 添加系統服務
22.3.4 添加系統調用
22.3.5 測試使用的TA和CA
22.4 安全驅動示例的測試
22.5 小結
23 終端密鑰在線下發系統
23.1 密鑰在線下發系統的框架
23.2 密鑰在線下發的數據包格式
23.3 密鑰在線下發系統示例
23.3.1 示例代碼獲取和集成
23.3.2 板級編譯文件的修改
23.3.3 通用編譯文件的修改
23.3.4 編譯運行
23.4 離線工具的使用
23.5 小結
24 基於OP-TEE的在線支付系統
24.1 在線支付系統的基本框架
24.2 可信通信通道
24.3 數據交互協議
24.3.1 數據頭部區域
24.3.2 數據區域
24.3.3 電子簽名區域
24.3.4 交互數據包的格式
24.4 在線支付系統示例的實現
24.4.1 第一次握手請求
24.4.2 第二次握手數據的解析
24.4.3 第三次握手請求
24.4.4 支付請求
24.4.5 支付反饋
24.5 示例的集成
24.5.1 示例代碼的獲取和集成
24.5.2 板級編譯文件的修改
24.5.3 通用編譯文件的修改
24.5.4 編譯運行
24.5.5 示例支持的命令說明
24.5.6 服務器端工具
24.6 組包操作嵌入內核
24.7 支付系統與生物特征的結合
24.8 小結
25 TEE可信應用的使用領域
25.1 在線支付
25.2 數字版權保護
25.3 身份驗證
25.4 其他領域
術語表
思維導圖
防止博客圖床圖片失效,防止圖片源站外鏈:
http://www.processon.com/chart_image/5e5b305ee4b02bc3ad6a13f0.png)
思維導圖在線編輯鏈接: