23. OP-TEE中TA與CA執行流程-------tee-supplicant(TA請求具體請求的處理)__OP-TEE

來源:互聯網
上載者:User

  當tee_supplicant接收到來自TA的請求並解析出對應的請求func ID之後,tee_supplicant將會根據func ID來執行具體的請求操作。主要是針對在REE端的檔案系統的操作。 1. 載入TA image到共用記憶體

  當TA請求的func ID為RPC_CMD_LOAD_TA時,tee_supplicant將會到檔案系統中將TA鏡像的內容讀取到共用記憶體中。該操作是通過調用load_ta函數來實現的,該函數定義在tee_supplicant.c檔案中,內容如下:

static uint32_t load_ta(size_t num_params, struct tee_ioctl_param *params){int ta_found = 0;size_t size = 0;TEEC_UUID uuid;struct tee_ioctl_param_value *val_cmd;TEEC_SharedMemory shm_ta;memset(&shm_ta, 0, sizeof(shm_ta));/* 解析出需要載入的TA鏡像的UUID以及配置將讀取到的TA鏡像的內容存放位置 */if (num_params != 2 || get_value(num_params, params, 0, &val_cmd) ||    get_param(num_params, params, 1, &shm_ta))return TEEC_ERROR_BAD_PARAMETERS;/* 將UUID的值轉換成TEEC_UUID格式 */uuid_from_octets(&uuid, (void *)val_cmd);/* 從ta_dir變數指定的目錄中尋找與UUID相符的TA鏡像,並將其內容讀取到共用記憶體中 */size = shm_ta.size;ta_found = TEECI_LoadSecureModule(ta_dir, &uuid, shm_ta.buffer, &size);if (ta_found != TA_BINARY_FOUND) {EMSG("  TA not found");return TEEC_ERROR_ITEM_NOT_FOUND;}/* 設定讀取到的TA鏡像的大小到返回參數的size成員中 */params[1].u.memref.size = size;return TEEC_SUCCESS;}
該函數的執行流程如下:



2. 執行對REE端檔案系統的操作   當func ID為RPC_CMD_FS時,tee_supplicant將會根據TA請求調用tee_supp_fs_process函數來完成對檔案系統的具體操作,包括常規的檔案和目錄的開啟,關閉,讀取,寫入,重新命名,刪除,等等。其內容如下:

TEEC_Result tee_supp_fs_process(size_t num_params,struct tee_ioctl_param *params){/* 解析出params */if (num_params == 1 && tee_supp_param_is_memref(params)) {void *va = tee_supp_param_to_va(params);/* 如果num_params為1,且轉換後va合法,則調用tee_supp_fs_process_primitive函數進行檔案操作 */if (!va)return TEEC_ERROR_BAD_PARAMETERS;return tee_supp_fs_process_primitive(va, params->u.memref.size);}if (!num_params || !tee_supp_param_is_value(params))return TEEC_ERROR_BAD_PARAMETERS;/* 如果num_params參數不為1,則根據params中的value值來確定執行什麼操作,並且根據params中的資料指定檔案名稱 */switch (params->u.value.a) {case OPTEE_MRF_OPEN:return ree_fs_new_open(num_params, params);case OPTEE_MRF_CREATE:return ree_fs_new_create(num_params, params);case OPTEE_MRF_CLOSE:return ree_fs_new_close(num_params, params);case OPTEE_MRF_READ:return ree_fs_new_read(num_params, params);case OPTEE_MRF_WRITE:return ree_fs_new_write(num_params, params);case OPTEE_MRF_TRUNCATE:return ree_fs_new_truncate(num_params, params);case OPTEE_MRF_REMOVE:return ree_fs_new_remove(num_params, params);case OPTEE_MRF_RENAME:return ree_fs_new_rename(num_params, params);case OPTEE_MRF_OPENDIR:return ree_fs_new_opendir(num_params, params);case OPTEE_MRF_CLOSEDIR:return ree_fs_new_closedir(num_params, params);case OPTEE_MRF_READDIR:return ree_fs_new_readdir(num_params, params);default:return TEEC_ERROR_BAD_PARAMETERS;}}
3. 執行對rpmb分區的操作   當func ID為RPC_CMD_RPMB時,tee_supplicant將會根據TA請求調用process_rpmb函數來完成對EMMC中rmpb分區的操作。在EMMC中的rpmb分區,在讀寫過程中會執行驗簽和加解密的操作。其內容如下:
static uint32_t process_rpmb(size_t num_params, struct tee_ioctl_param *params){TEEC_SharedMemory req;TEEC_SharedMemory rsp;/* 指定存放請求和返回資料的共用記憶體 */if (get_param(num_params, params, 0, &req) ||    get_param(num_params, params, 1, &rsp))return TEEC_ERROR_BAD_PARAMETERS;/* 指定對rpmb分區的操作 */return rpmb_process_request(req.buffer, req.size, rsp.buffer, rsp.size);}
4. 執行分配共用記憶體的操作   當 func ID為RPC_CMD_SHM_ALLOC時,tee_supplicant將會根據TA請求調用process_alloc函數來分配TA與tee_supplicant之間的共用記憶體。其內容如下:
static uint32_t process_alloc(int fd, size_t num_params,      struct tee_ioctl_param *params){struct tee_ioctl_shm_alloc_data data;struct tee_ioctl_param_value *val;struct tee_shm *shm;int shm_fd;memset(&data, 0, sizeof(data));/* 擷取從TA發送到tee_supplicant的value */if (num_params != 1 || get_value(num_params, params, 0, &val))return TEEC_ERROR_BAD_PARAMETERS;/* 分配shm變數空間 */shm = calloc(1, sizeof(*shm));if (!shm)return TEEC_ERROR_OUT_OF_MEMORY;/* 調用tee驅動分配共用空間 */data.size = val->b;shm_fd = ioctl(fd, TEE_IOC_SHM_ALLOC, &data);if (shm_fd < 0) {free(shm);return TEEC_ERROR_OUT_OF_MEMORY;}/* 將分配好的共用記憶體的控制代碼映射到系統記憶體中 */shm->p = mmap(NULL, data.size, PROT_READ | PROT_WRITE, MAP_SHARED,      shm_fd, 0);close(shm_fd);if (shm->p == (void *)MAP_FAILED) {free(shm);return TEEC_ERROR_OUT_OF_MEMORY;}/* 記錄分配好的共用記憶體資料 */shm->id = data.id;shm->size = data.size;val->c = data.id;/* 將分配的共用記憶體添加到共用記憶體鏈表中 */push_tshm(shm);return TEEC_SUCCESS;}
5. 執行釋放共用記憶體的操作   當 func ID為RPC_CMD_SHM_FREE時,tee_supplicant將會根據TA請求調用process_free函數來釋放TA與tee_supplicant之間的共用記憶體。其內容如下:
static uint32_t process_free(size_t num_params, struct tee_ioctl_param *params){struct tee_ioctl_param_value *val;struct tee_shm *shm;int id;/* 擷取從TA傳遞到tee_supplicant的val資料 */if (num_params != 1 || get_value(num_params, params, 0, &val))return TEEC_ERROR_BAD_PARAMETERS;/* 擷取需要被釋放的共用記憶體的id值 */id = val->b;/* 從共用記憶體鏈表刪除指定的節點 */shm = pop_tshm(id);if (!shm)return TEEC_ERROR_BAD_PARAMETERS;/* 取消掉系統記憶體映射 */if (munmap(shm->p, shm->size) != 0) {EMSG("munmap(%p, %zu) failed - Error = %s",     shm->p, shm->size, strerror(errno));free(shm);return TEEC_ERROR_BAD_PARAMETERS;}/* 執行free操作 */free(shm);return TEEC_SUCCESS;}
6. 執行記錄程式執行效率操作   當 func ID為RPC_CMD_GPROF時,tee_supplicant將會根據TA請求調用gprof_process函數來將某個特定的TA執行效率資訊記錄到檔案系統中。其內容如下:
TEEC_Result gprof_process(size_t num_params, struct tee_ioctl_param *params){char vers[5] = "";char path[255];size_t bufsize;TEEC_UUID *u;int fd = -1;void *buf;int flags;int id;int st;int n;/* TA傳遞到tee_supplicant參數檢查 */if (num_params != 3 ||    (params[0].attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK) !=TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT ||    (params[1].attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK) !=TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT ||    (params[2].attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK) !=                TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT)return TEEC_ERROR_BAD_PARAMETERS;/* 用於判定是否需要建立專門的檔案進行記錄執行效率資訊 */id = params[0].u.value.a;if (params[1].u.memref.size != sizeof(TEEC_UUID))return TEEC_ERROR_BAD_PARAMETERS;/* 擷取需要記錄的TA的UUID值 */u = tee_supp_param_to_va(params + 1);if (!u)return TEEC_ERROR_BAD_PARAMETERS;/* 擷取需要記錄的資訊 */buf = tee_supp_param_to_va(params + 2);if (!buf)return TEEC_ERROR_BAD_PARAMETERS;bufsize = params[2].u.memref.size;if (id < 0 || id > 100)return TEEC_ERROR_BAD_PARAMETERS;flags = O_APPEND | O_WRONLY;if (!id) {/* id == 0 means create file */flags |= O_CREAT | O_EXCL;id = 1;}/* 將buffer中的資訊記錄到/tmp/gmon-[uuid].out檔案中 */for (;;) {if (id > 1) {/* * id == 1 is file 0 (no suffix), id == 2 is file .1 * etc. */snprintf(vers, sizeof(vers), ".%d", id - 1);}n = snprintf(path, sizeof(path),"/tmp/gmon-""%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x""%s.out",u->timeLow, u->timeMid, u->timeHiAndVersion,u->clockSeqAndNode[0], u->clockSeqAndNode[1],u->clockSeqAndNode[2], u->clockSeqAndNode[3],u->clockSeqAndNode[4], u->clockSeqAndNode[5],u->clockSeqAndNode[6], u->clockSeqAndNode[7],vers);        if ((n < 0) || (n >= (int)sizeof(path)))break;fd = open(path, flags, 0600);if (fd >= 0) {do {st = write(fd, buf, bufsize);} while (st < 0 && errno == EINTR);close(fd);if (st < 0 || st != (int)bufsize)break;params[0].u.value.a = id;goto success;}if (errno != EEXIST)break;if (id++ == 100)break;}/* An error occured */return TEEC_ERROR_GENERIC;success:return TEEC_SUCCESS;}
7.執行網路socket操作   當 func ID為OPTEE_MSG_RPC_CMD_SOCKET時,tee_supplicant將會根據TA請求調用tee_socket_process函數來完成網路socket的相關操作,包括socket的建立,發送,接收和ioctl操作。其內容如下:
TEEC_Result tee_socket_process(size_t num_params,       struct tee_ioctl_param *params){if (!num_params || !tee_supp_param_is_value(params))return TEEC_ERROR_BAD_PARAMETERS;/* 根據value.a的值來判定執行什麼操作,而操作所需要的資料都    從params中擷取 */switch (params->u.value.a) {case OPTEE_MRC_SOCKET_OPEN:return tee_socket_open(num_params, params);case OPTEE_MRC_SOCKET_CLOSE:return tee_socket_close(num_params, params);case OPTEE_MRC_SOCKET_CLOSE_ALL:return tee_socket_close_all(num_params, params);case OPTEE_MRC_SOCKET_SEND:return tee_socket_send(num_params, params);case OPTEE_MRC_SOCKET_RECV:return tee_socket_recv(num_params, params);case OPTEE_MRC_SOCKET_IOCTL:return tee_socket_ioctl(num_params, params);default:return TEEC_ERROR_BAD_PARAMETERS;}}









聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.