【OPTEE开发】从TA到安全驱动的功能设计
文章目錄
- 一、功能需求
- 二、TA到Driver層的架構(gòu)
- 1. 軟件層架構(gòu)
- 2. 實(shí)現(xiàn)思路
- 2.3 封裝libutee層系統(tǒng)API
- 2.2 core中增加系統(tǒng)服務(wù)層
- 2.1 Driver側(cè)接口和實(shí)現(xiàn)
- 三、詳細(xì)實(shí)現(xiàn)
- 1. 修改清單
- 2. 詳細(xì)設(shè)計(jì)
- 2.1 libutee對(duì)外接口設(shè)計(jì)
- 2.2 core服務(wù)設(shè)計(jì)
- 2.3 Driver驅(qū)動(dòng)側(cè)設(shè)計(jì)
- 2.4 TA應(yīng)用側(cè)實(shí)現(xiàn)
一、功能需求
實(shí)現(xiàn)普通TA通過(guò)系統(tǒng)調(diào)用到增加的Driver側(cè)功能,實(shí)現(xiàn)完整的通路。
功能:在TA中通過(guò)系統(tǒng)調(diào)用安全驅(qū)動(dòng)中的write和read功能,增加rot service系統(tǒng)服務(wù),封裝libutee對(duì)TA提供的對(duì)外接口,實(shí)現(xiàn)完整的通路功能。
本篇主要是通過(guò)增加這個(gè)功能,來(lái)加深對(duì)TA調(diào)用通路的理解,當(dāng)然也可以不采用此通路設(shè)計(jì),可以直接設(shè)計(jì)成TA調(diào)用PTA完成基本功能。
原創(chuàng)不易,轉(zhuǎn)載請(qǐng)注明出處:https://blog.csdn.net/jackone12347/article/details/122487418
二、TA到Driver層的架構(gòu)
1. 軟件層架構(gòu)
2. 實(shí)現(xiàn)思路
為了實(shí)現(xiàn)這個(gè)功能,需要完成如下幾個(gè)子模塊的設(shè)計(jì)和實(shí)現(xiàn)。
2.3 封裝libutee層系統(tǒng)API
在libutee中增加對(duì)TA調(diào)用的系統(tǒng)接口,方便普通的TA通過(guò)libutee庫(kù)進(jìn)行調(diào)用。
2.2 core中增加系統(tǒng)服務(wù)層
libutee中的接口封裝OK后,需要在core serivce中增加自己的service,銜接libutee到 driver的功能。
增加的service本身也可以init初始化一些自己的基本功能,類(lèi)似android的Framework中的serivce。
同時(shí),可以增加core service有一個(gè)好處是將driver側(cè)的實(shí)現(xiàn)細(xì)節(jié)屏蔽掉,只提供一個(gè)對(duì)外的接口。
2.1 Driver側(cè)接口和實(shí)現(xiàn)
driver側(cè)的功能用途:一般driver側(cè)用來(lái)初始化一些私有的數(shù)據(jù)和操作安全設(shè)備。
我們這里增加rot的write和read功能。
三、詳細(xì)實(shí)現(xiàn)
下面是詳細(xì)的設(shè)計(jì)實(shí)現(xiàn)。
1. 修改清單
下面是所有的涉及到的文件修改列表:
對(duì)應(yīng)的git修改列表:
2. 詳細(xì)設(shè)計(jì)
2.1 libutee對(duì)外接口設(shè)計(jì)
這里直接修改原始的tee_api.h,當(dāng)然也可以不這么設(shè)計(jì),可以直接添加和libutee同級(jí)別的lib庫(kù)也是可以的。
TA調(diào)用接口:\lib\libutee\include\tee_api.h中增加三個(gè)調(diào)用接口:
TEE_Result Tee_Rot_Write(void *buf, size_t blen, size_t offset);TEE_Result Tee_Rot_Read(void *buf, size_t blen, size_t offset);TEE_Result Tee_Rot_Dump(void *buf, size_t blen);三個(gè)接口實(shí)現(xiàn):optee_os\lib\libutee\tee_api.c
TEE_Result Tee_Rot_Write(void *buf, size_t blen, size_t offset) {TEE_Result res = TEE_SUCCESS;res = _utee_rot_driver_write(buf, blen, offset);return res; }TEE_Result Tee_Rot_Read(void *buf, size_t blen, size_t offset) {TEE_Result res = TEE_SUCCESS;res = _utee_rot_driver_read(buf, blen, offset);return res; }TEE_Result Tee_Rot_Dump(void *buf, size_t blen) {TEE_Result res = TEE_SUCCESS;res = _utee_rot_driver_dump(buf, blen);return res; }其中_utee_rot_driver_write、_utee_rot_driver_read、_utee_rot_driver_dump需要在core中繼續(xù)封裝和實(shí)現(xiàn),tee_rot的封裝如下:
@core/include/tee/tee_rot.h
@core/tee/tee_rot.c實(shí)現(xiàn)如下:
#include <drivers/driver_rot.h> #include <tee/tee_rot.h> #include <tee/tee_svc.h> #include <trace.h>TEE_Result syscall_rot_driver_write(void *buf, size_t blen, size_t offset); TEE_Result syscall_rot_driver_read(void *buf, size_t blen, size_t offset); TEE_Result syscall_rot_driver_dump(void *buf, size_t blen);struct rot_service_ops rot_ops = {.name = "RotDriver",.rot_driver = {.device_init = device_init,.write_rot = write_rot,.read_rot = read_rot,.driver_dump = driver_dump,}, };TEE_Result syscall_rot_driver_write(void *buf, size_t blen, size_t offset) {uint8_t* src = NULL;DMSG("pis syscall_rot_driver_write entry.\n");src = malloc(blen);memcpy(src, buf, blen);rot_ops.rot_driver.write_rot(src, blen, offset);free(src);return TEE_SUCCESS; }TEE_Result syscall_rot_driver_read(void *buf, size_t blen, size_t offset) {uint8_t* dst = NULL;DMSG("pis syscall_rot_driver_read entry.\n");dst = malloc(blen);rot_ops.rot_driver.read_rot(dst, blen, offset);memcpy(buf, dst, blen);free(dst);return TEE_SUCCESS;}TEE_Result syscall_rot_driver_dump(void *buf, size_t blen) {uint8_t* dst = NULL;dst = malloc(blen);rot_ops.rot_driver.driver_dump(dst, blen);memcpy(buf, dst, blen);free(dst);return TEE_SUCCESS; }static TEE_Result tee_rot_init(void) {DMSG("Strat to start rot servie\n");if (rot_ops.rot_driver.device_init)rot_ops.rot_driver.device_init();DMSG("rot servcie initial is ok\n");return TEE_SUCCESS; }service_init(tee_rot_init);這里有兩個(gè)地方需要重要注意:
rot_service_ops是core serivce中定義的結(jié)構(gòu)體,而rot_driver_ops_s是driver對(duì)外的結(jié)構(gòu)體;
service_init(tee_rot_init)是我們新的rot service的初始化的地方。
2.2 core服務(wù)設(shè)計(jì)
core service一般在OPTEE的initcall段的代碼啟動(dòng)和初始化。
所以,這里我們?cè)黾觾蓚€(gè)文件,tee_rot.h和tee_rot.c文件,起到承上啟下的作用。
在2.1章節(jié)中調(diào)用了_utee_rot_driver_write等函數(shù),普通TA是運(yùn)行在用戶空間,不能直接調(diào)用到core service側(cè),需要syscall轉(zhuǎn)化一下。
所以,先增加syscall通路,列表如下:
內(nèi)容分別如下:
@lib/libutee/include/utee_syscalls.h
@lib/libutee/arch/arm/utee_syscalls_asm.S,第三個(gè)參數(shù)表示參數(shù)的個(gè)數(shù)。
UTEE_SYSCALL _utee_rot_driver_write, TEE_SCN_ROT_DRIVER_WRITE, 3UTEE_SYSCALL _utee_rot_driver_read, TEE_SCN_ROT_DRIVER_READ, 3UTEE_SYSCALL _utee_rot_driver_dump, TEE_SCN_ROT_DRIVER_DUMP, 2@core/arch/arm/tee/arch_svc.c,增加三個(gè)syscall函數(shù)
static const struct syscall_entry tee_svc_syscall_table[] = { ...SYSCALL_ENTRY(syscall_rot_driver_write),SYSCALL_ENTRY(syscall_rot_driver_read),SYSCALL_ENTRY(syscall_rot_driver_dump), }@lib/libutee/include/tee_syscall_numbers.h 增加三個(gè)syscall,MAX修改為73
#define TEE_SCN_ROT_DRIVER_WRITE 71 #define TEE_SCN_ROT_DRIVER_READ 72 #define TEE_SCN_ROT_DRIVER_DUMP 73 #define TEE_SCN_MAX 732.3 Driver驅(qū)動(dòng)側(cè)設(shè)計(jì)
最后再增加driver側(cè)的實(shí)現(xiàn)
core/drivers/driver_rot.ccore/include/drivers/driver_rot.h頭文件的定義:
@core/include/drivers/driver_rot.h
syscall_rot_driver_write是core serivce中對(duì)應(yīng)的,這樣TA -》core serivce -> TA driver就完整的實(shí)現(xiàn)了通路。
下面是driver_rot.c的實(shí)現(xiàn)的完整代碼:
@core/drivers/driver_rot.c
2.4 TA應(yīng)用側(cè)實(shí)現(xiàn)
有了以上三個(gè)部分的實(shí)現(xiàn)后,TA中的調(diào)用就比較簡(jiǎn)單了,就可以和普通的lib庫(kù)一樣調(diào)用即可。
比起TA通過(guò)openTAsession等函數(shù)方便多了~~~
測(cè)試代碼如下,實(shí)現(xiàn)了寫(xiě)入和讀取數(shù)據(jù),數(shù)據(jù)是存在driver中的全局變量。
#include <tee_internal_api.h> #include <tee_internal_api_extensions.h> #include <tee_api_types.h>TEE_Result get_rot_data() {TEE_Result res = TEE_SUCCESS;DMSG("pis 1 get_rot_data entry. \n");res = Tee_Rot_Write((void *)"aaaabbbbccccdddd1111222233334444aaaabbbbccccdddd1111222233334444", 64, 0);DMSG ("pis 22 Tee_Rot_Write result:%d", res);uint8_t *temp = NULL;temp = malloc(65);res = Tee_Rot_Read(temp, 64, 0);DMSG ("pis 1 Tee_Rot_Read result:%d", res);int i = 0;for(; i < 64; i++) {DMSG ("pis Tee_Rot_Read content:0x%x", temp[i]);}free(temp);DMSG("pis 1 get_rot_data done. \n");return res; }運(yùn)行結(jié)果:
rot service在OPTEE啟動(dòng)的時(shí)候的打印,可以看到rot service正常啟動(dòng)和init初始化了。
寫(xiě)ROT數(shù)據(jù):
D/TA: get_rot_data:1514 pis get_rot_data entry. F/TC:? 0 trace_syscall:155 syscall #71 (syscall_rot_driver_write) D/TC:? 0 syscall_rot_driver_write:35 pis syscall_rot_driver_write entry. D/TC:? 0 write_rot:36 pis driver write rot entry ==== D/TC:? 0 write_rot:44 pis driver write_rot:0x61 D/TC:? 0 write_rot:44 pis driver write_rot:0x61 D/TC:? 0 write_rot:44 pis driver write_rot:0x61 D/TC:? 0 write_rot:44 pis driver write_rot:0x61 D/TC:? 0 write_rot:44 pis driver write_rot:0x62 D/TC:? 0 write_rot:44 pis driver write_rot:0x62 D/TC:? 0 write_rot:44 pis driver write_rot:0x62 D/TC:? 0 write_rot:44 pis driver write_rot:0x62 D/TC:? 0 write_rot:44 pis driver write_rot:0x63 D/TC:? 0 write_rot:44 pis driver write_rot:0x63 D/TC:? 0 write_rot:44 pis driver write_rot:0x63 D/TC:? 0 write_rot:44 pis driver write_rot:0x63 D/TC:? 0 write_rot:44 pis driver write_rot:0x64 D/TC:? 0 write_rot:44 pis driver write_rot:0x64 D/TC:? 0 write_rot:44 pis driver write_rot:0x64 D/TC:? 0 write_rot:44 pis driver write_rot:0x64 D/TC:? 0 write_rot:44 pis driver write_rot:0x31 D/TC:? 0 write_rot:44 pis driver write_rot:0x31 D/TC:? 0 write_rot:44 pis driver write_rot:0x31 D/TC:? 0 write_rot:44 pis driver write_rot:0x31 D/TC:? 0 write_rot:44 pis driver write_rot:0x32 D/TC:? 0 write_rot:44 pis driver write_rot:0x32 D/TC:? 0 write_rot:44 pis driver write_rot:0x32 D/TC:? 0 write_rot:44 pis driver write_rot:0x32 D/TC:? 0 write_rot:44 pis driver write_rot:0x33 D/TC:? 0 write_rot:44 pis driver write_rot:0x33 D/TC:? 0 write_rot:44 pis driver write_rot:0x33 D/TC:? 0 write_rot:44 pis driver write_rot:0x33 D/TC:? 0 write_rot:44 pis driver write_rot:0x34 D/TC:? 0 write_rot:44 pis driver write_rot:0x34 D/TC:? 0 write_rot:44 pis driver write_rot:0x34 D/TC:? 0 write_rot:44 pis driver write_rot:0x34 D/TC:? 0 write_rot:44 pis driver write_rot:0x61 D/TC:? 0 write_rot:44 pis driver write_rot:0x61 D/TC:? 0 write_rot:44 pis driver write_rot:0x61 D/TC:? 0 write_rot:44 pis driver write_rot:0x61 D/TC:? 0 write_rot:44 pis driver write_rot:0x62 D/TC:? 0 write_rot:44 pis driver write_rot:0x62 D/TC:? 0 write_rot:44 pis driver write_rot:0x62 D/TC:? 0 write_rot:44 pis driver write_rot:0x62 D/TC:? 0 write_rot:44 pis driver write_rot:0x63 D/TC:? 0 write_rot:44 pis driver write_rot:0x63 D/TC:? 0 write_rot:44 pis driver write_rot:0x63 D/TC:? 0 write_rot:44 pis driver write_rot:0x63 D/TC:? 0 write_rot:44 pis driver write_rot:0x64 D/TC:? 0 write_rot:44 pis driver write_rot:0x64 D/TC:? 0 write_rot:44 pis driver write_rot:0x64 D/TC:? 0 write_rot:44 pis driver write_rot:0x64 D/TC:? 0 write_rot:44 pis driver write_rot:0x31 D/TC:? 0 write_rot:44 pis driver write_rot:0x31 D/TC:? 0 write_rot:44 pis driver write_rot:0x31 D/TC:? 0 write_rot:44 pis driver write_rot:0x31 D/TC:? 0 write_rot:44 pis driver write_rot:0x32 D/TC:? 0 write_rot:44 pis driver write_rot:0x32 D/TC:? 0 write_rot:44 pis driver write_rot:0x32 D/TC:? 0 write_rot:44 pis driver write_rot:0x32 D/TC:? 0 write_rot:44 pis driver write_rot:0x33 D/TC:? 0 write_rot:44 pis driver write_rot:0x33 D/TC:? 0 write_rot:44 pis driver write_rot:0x33 D/TC:? 0 write_rot:44 pis driver write_rot:0x33 D/TC:? 0 write_rot:44 pis driver write_rot:0x34 D/TC:? 0 write_rot:44 pis driver write_rot:0x34 D/TC:? 0 write_rot:44 pis driver write_rot:0x34 D/TC:? 0 write_rot:44 pis driver write_rot:0x34 D/TC:? 0 write_rot:65 pis driver write rot done ==== D/TA: get_rot_data:1518 pis Tee_Rot_Write result:0再讀取ROT數(shù)據(jù)
F/TC:? 0 trace_syscall:155 syscall #72 (syscall_rot_driver_read) D/TC:? 0 syscall_rot_driver_read:50 pis syscall_rot_driver_read entry. D/TC:? 0 read_rot:72 pis driver read rot entry ==== D/TC:? 0 read_rot:82 pis driver read rot done. D/TA: get_rot_data:1524 pis 1 Tee_Rot_Read result:0 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x61 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x61 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x61 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x61 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x62 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x62 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x62 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x62 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x63 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x63 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x63 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x63 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x64 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x64 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x64 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x64 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x31 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x31 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x31 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x31 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x32 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x32 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x32 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x32 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x33 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x33 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x33 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x33 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x34 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x34 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x34 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x34 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x61 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x61 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x61 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x61 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x62 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x62 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x62 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x62 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x63 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x63 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x63 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x63 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x64 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x64 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x64 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x64 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x31 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x31 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x31 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x31 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x32 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x32 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x32 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x32 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x33 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x33 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x33 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x33 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x34 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x34 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x34 D/TA: get_rot_data:1527 pis Tee_Rot_Read content:0x34 D/TA: get_rot_data:1532 pis 1 get_rot_data done. 新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的【OPTEE开发】从TA到安全驱动的功能设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LRU缓存机制
- 下一篇: 机器学习中常见的损失函数