文章目录

  • 一、功能需求
  • 二、TA到PTA的总体设计
    • 1. 软件层总体设计
      • 1.1 总体结构图设计
      • 1.2 TA调用其他TA的接口设计
    • 2. 设计思路
  • 三、详细设计
    • 1. 修改代码清单
    • 2. 子模块设计
      • 2.1 libhanlerot库设计
      • 2.2 PTA模块设计
      • 2.3 TA模块设计

一、功能需求

上篇”从TA到安全驱动的功能设计“介绍了TA通过syscall的方式调用到driver的功能,那本篇主要描述一下如何实现TA调用PTA 完成基本功能的通路。
主要包括新增PTA实现几个基本接口功能、新增和封装PTA对应的lib库 便于TA调用这两个环节。

下面以实际例子进行实战介绍,加深一下对TA调用PTA流程的理解。

原创不易,转载请注明出处:https://blog.csdn.net/jackone12347/article/details/122555702

二、TA到PTA的总体设计

1. 软件层总体设计

1.1 总体结构图设计

1.2 TA调用其他TA的接口设计

API名称 API功能
TEE_OpenTASession 建立两个TA之间的session
TEE_InvokeTACommand 通过已创建的session和command id去调用另一个TA提供的操作接口
TEE_CloseTASession 关闭两个TA之间的session
TEE_PARAM_TYPES 定义两个TA之间传递的parameter参数

libhandlerot接口lib库中可以只实现这三个接口,但handlerot PTA中需要实现如下五个接口:

pseudo_ta_register(.uuid = PTA_ROT_UUID, .name = TA_NAME,.flags = PTA_DEFAULT_FLAGS | TA_FLAG_SECURE_DATA_PATH | TA_FLAG_CONCURRENT,.create_entry_point = create_ta,.destroy_entry_point = destroy_ta,.open_session_entry_point = open_session,.close_session_entry_point = close_session,.invoke_command_entry_point = invoke_command);

关于param参数的使用,这里说明一下
在调用InvokeTACommand函数时需要传入params参数,params可传入四个参数,类型有如下几种,params使用场景大致有这几种情况
1、当进入和返回都不需要携带参数时,使用TEE_PARAM_TYPE_NONE;
2、当只需要传入参数,不需要返回参数时,使用TEE_PARAM_TYPE_VALUE_INPUT;
不需要传入参数,只需要返回参数时,使用TEE_PARAM_TYPE_VALUE_OUTPUT;即需要传入 也需要返回,使用TEE_PARAM_TYPE_VALUE_INOUT;
3、当需要分配buffer内存时,使用TEE_PARAM_TYPE_MEMREF_X,使用区别和第2条相同。

PARAM类型 功能
TEE_PARAM_TYPE_NONE 无需传入参数和返回参数
TEE_PARAM_TYPE_VALUE_INPUT 只需要传入参数
TEE_PARAM_TYPE_VALUE_OUTPUT 只需要return返回参数
TEE_PARAM_TYPE_VALUE_INOUT 即需要传入也需要返回参数
TEE_PARAM_TYPE_MEMREF_INPUT 需要分配buff,只需要传入参数
TEE_PARAM_TYPE_MEMREF_OUTPUT 需要分配buff,只需要返回参数
TEE_PARAM_TYPE_MEMREF_INOUT 需要分配buff,即需要返回参数 ,也需要返回参数

2. 设计思路

需要先构思一下,如何实现这个功能,把需求分解为两部分。
1)封装libhandlerot lib库,便于TA中直接调用lib接口;
2)新增handle rot的PTA,实现libhandlerot中的几个接口。

三、详细设计

1. 修改代码清单

先看一下总体修改了哪些代码,修改的代码量不是很多。
@optee_os/lib/libhandlerot lib库中增加如下code

├── include
│   └── libhandlerot.h
├── libhandlerot.c
└── sub.mk

handle rot PTA中增加如下实现和对外头文件

core/pta/handle_rot.c
lib/libutee/include/pta_handle_rot.h

2. 子模块设计

2.1 libhanlerot库设计

新增libhandleroot.h头文件,我们这里还是实现两个接口,写入数据handle_write_rot和读取数据handle_read_rot。

/** libhandlerot interface*/#ifndef _LIB_HANDLE_ROT_H_
#define _LIB_HANDLE_ROT_H_#include <tee_internal_api.h>
#include <pta_handle_rot.h>TEE_Result handle_write_rot(uint8_t* data, uint32_t size);TEE_Result handle_read_rot(uint8_t* data, uint32_t size);#endif /* _LIB_HANDLE_ROT_H_ */

这两个接口的实现如下,封装invoke_rot_pta中,通过command不同来区分read和write

TEE_Result handle_write_rot(uint8_t* data, uint32_t size)
{TEE_Result res = TEE_ERROR_GENERIC;DMSG("[ROT] handle_write_rot entry.");res = invoke_rot_pta(PTA_ROT_CMD_WRITE, data, size);return res;
}TEE_Result handle_read_rot(uint8_t* data, uint32_t size)
{TEE_Result res = TEE_ERROR_GENERIC;res = invoke_rot_pta(PTA_ROT_CMD_READ, data, size);return res;
}

invoke_rot_pta的实现如下,请注意TEE_PARAM_TYPES中的参数,在前面章节中有介绍过。
主要封装了TEE_OpenTASession、TEE_PARAM_TYPES、TEE_InvokeTACommand、TEE_CloseTASession几个接口,具体的实现需要在PTA中去完成。

/*
* device root of trust handler
*/#include <string.h>
#include <tee_internal_api_extensions.h>
#include "libhandlerot.h"static TEE_Result invoke_rot_pta(uint32_t cmd_id, uint8_t* data, uint32_t size)
{// Dispatch to PTATEE_Result res = TEE_ERROR_GENERIC;TEE_UUID uuid = PTA_ROT_UUID;TEE_TASessionHandle session = TEE_HANDLE_NULL;uint32_t ret_orig = 0;TEE_Param params[TEE_NUM_PARAMS];uint32_t param_types = 0;//open sessionres = TEE_OpenTASession(&uuid, TEE_TIMEOUT_INFINITE,0, params, &session, &ret_orig);if (res != TEE_SUCCESS) {EMSG("[libhandlerot] open pta session failed, res 0x%08x, origin 0x%08x",res, ret_orig);return res;}//invoke commandparam_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INOUT,TEE_PARAM_TYPE_NONE,TEE_PARAM_TYPE_NONE,TEE_PARAM_TYPE_NONE);// data & sizeparams[0].memref.buffer = data;params[0].memref.size = size;DMSG("[libhandlerot] TEE_InvokeTACommand start.");res = TEE_InvokeTACommand(session, TEE_TIMEOUT_INFINITE, cmd_id,param_types, params, NULL);if (res != TEE_SUCCESS) {EMSG("[libhandlerot] Invoke command to pta failed, res 0x%08x, origin 0x%08x.",res, ret_orig);TEE_CloseTASession(session);session = TEE_HANDLE_NULL;return res;}//close sessionTEE_CloseTASession(session);session = TEE_HANDLE_NULL;return res;
}

2.2 PTA模块设计

handlerot PTA的设计,包含头文件和实现文件。
pta_handle_rot.h实现如下:

#ifndef __PTA_HANDLE_ROT_H
#define __PTA_HANDLE_ROT_H/** Interface to the rot pseudo-TA, which is used for handling* device root of trust function*/
//c7cf25d5-b62a-40bc-8841-2cefabbbf5bb
#define PTA_ROT_UUID \{ 0xc7cf25d5, 0xb62a, 0x40bc, \{ 0x88, 0x41, 0x2c, 0xef, 0xab, 0xbb, 0xf5, 0xbb } }#define TA_NAME        "handle_rot.ta"/** ROT PTA supported commands*/
#define PTA_ROT_CMD_READ        0
#define PTA_ROT_CMD_WRITE       1#endif /* __PTA_HANDLE_ROT_H */

头文件中主要定义了UUID和TA_NAME,这个是TA的标识,需要唯一指定。

下面是handle_rot.c的实现

#include <bench.h>
#include <compiler.h>
#include <kernel/misc.h>
#include <kernel/mutex.h>
#include <kernel/pseudo_ta.h>
#include <malloc.h>
#include <mm/core_memprot.h>
#include <mm/mobj.h>
#include <mm/tee_mm.h>
#include <mm/tee_pager.h>
#include <mm/vm.h>
#include <optee_rpc_cmd.h>
#include <pta_handle_rot.h>
#include <stdio.h>
#include <string_ext.h>
#include <string.h>
#include <trace.h>uint8_t g_rotbuffer[64] = {0};static TEE_Result create_ta(void)
{DMSG("[PTA] create_ta.");return TEE_SUCCESS;
}static void destroy_ta(void)
{DMSG("[PTA] destroy_ta.");
}static TEE_Result open_session(uint32_t nParamTypes __unused,TEE_Param pParams[TEE_NUM_PARAMS] __unused,void **ppSessionContext __unused)
{DMSG("[PTA] open_session.");return TEE_SUCCESS;
}static void close_session(void *pSessionContext __unused)
{DMSG("[PTA] close_session.");
}static TEE_Result handle_rot_read_impl(uint8_t* buffer, uint32_t size)
{TEE_Result ret = TEE_SUCCESS;DMSG("[PTA] handle_rot_read_impl pta entry.");memcpy(buffer, &(g_rotbuffer[0]), size);size_t i = 0;for(; i < size; i++){DMSG("[PTA] handle_rot_read_impl data:0x%x\n", buffer[i]);}return ret;
}static TEE_Result handle_rot_write_impl(uint8_t* buffer, uint32_t size)
{TEE_Result ret = TEE_SUCCESS;memset(g_rotbuffer, 0, 64);memcpy(&(g_rotbuffer[0]), buffer, size);size_t j = 0;for(; j < size; j++){DMSG("[PTA] handle_rot_write_impl data:0x%x\n", g_rotbuffer[j]);}return ret;
}static TEE_Result invoke_command(void *session_ctx __unused,uint32_t cmd_id, uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS])
{DMSG("[PTA] invoke_command pta entry.");//check input param whether is invalidif (param_types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INOUT,TEE_PARAM_TYPE_NONE,TEE_PARAM_TYPE_NONE,TEE_PARAM_TYPE_NONE)) {FMSG("[PTA] invalid params \"%s\"", TA_NAME);return TEE_ERROR_BAD_PARAMETERS;}//get input data buffer and sizeuint8_t* buffer = params[0].memref.buffer;uint32_t size = params[0].memref.size;switch (cmd_id) {case PTA_ROT_CMD_READ:DMSG("[PTA] invoke_command pta read data.");return handle_rot_read_impl(buffer, size);case PTA_ROT_CMD_WRITE:DMSG("[PTA] invoke_command pta write data.");return handle_rot_write_impl(buffer, size);default:break;}return TEE_ERROR_BAD_PARAMETERS;
}pseudo_ta_register(.uuid = PTA_ROT_UUID, .name = TA_NAME,.flags = PTA_DEFAULT_FLAGS | TA_FLAG_SECURE_DATA_PATH | TA_FLAG_CONCURRENT,.create_entry_point = create_ta,.destroy_entry_point = destroy_ta,.open_session_entry_point = open_session,.close_session_entry_point = close_session,.invoke_command_entry_point = invoke_command);

我这里把PTA中会用的的接口全添加了,包括create_ta、destroy_ta;代码逻辑也比较简单。

2.3 TA模块设计

普通TA中调用libhandlerot库,去调用PTA中的实现,demo代码如下:

#include <libhandlerot.h>TEE_Result get_rot_data()
{TEE_Result res = TEE_SUCCESS;DMSG("[TA] get_rot_data entry. \n");uint8_t data[64] = "aaaabbbbccccdddd1111222233334444aaaabbbbccccdddd1111222233334444";res = handle_write_rot((uint8_t *)data, 64);uint8_t *temp = NULL;temp = malloc(65);res = handle_read_rot(temp, 64);DMSG ("[TA] handle_read_rot result:%d", res);int i = 0;for(; i < 64; i++) {DMSG ("[TA] handle_read_rot content:0x%x", temp[i]);}free(temp);DMSG("[TA] get_rot_data done. \n");return res;
}

运行结果:

D/TA:  get_rot_data:1516 [TA] get_rot_data entry.
D/TA:  handle_write_rot:60 [ROT] handle_write_rot entry.
F/TC:? 0 trace_syscall:155 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:155 syscall #5 (syscall_open_ta_session)
D/TC:? 0 tee_ta_init_pseudo_ta_session:299 Lookup pseudo TA c7cf25d5-b62a-40bc-8841-2cefabbbf5bb
D/TC:? 0 tee_ta_init_pseudo_ta_session:312 Open handle_rot.ta
D/TC:? 0 tee_ta_init_pseudo_ta_session:329 handle_rot.ta : c7cf25d5-b62a-40bc-8841-2cefabbbf5bb
D/TC:? 0 create_ta:29 [PTA] create_ta.
D/TC:? 0 open_session:42 [PTA] open_session.
D/TA:  invoke_rot_pta:39 [ROT] TEE_InvokeTACommand start.
F/TC:? 0 trace_syscall:155 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:155 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:155 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:155 syscall #7 (syscall_invoke_ta_command)
F/TC:? 0 trace_syscall:155 syscall #7 (syscall_invoke_ta_command)
D/TC:? 0 invoke_command:88 [PTA] invoke_command pta entry.
D/TC:? 0 invoke_command:109 [PTA] invoke_command pta write data.
D/TC:? 0 handle_rot_write_impl:78 [PTA] handle_rot_write_impl data:0x61
D/TC:? 0 handle_rot_write_impl:78 [PTA] handle_rot_write_impl data:0x61
D/TC:? 0 handle_rot_write_impl:78 [PTA] handle_rot_write_impl data:0x61
D/TC:? 0 handle_rot_write_impl:78 [PTA] handle_rot_write_impl data:0x61
D/TC:? 0 handle_rot_write_impl:78 [PTA] handle_rot_write_impl data:0x62
D/TC:? 0 handle_rot_write_impl:78 [PTA] handle_rot_write_impl data:0x62
D/TC:? 0 handle_rot_write_impl:78 [PTA] handle_rot_write_impl data:0x62
...省略
D/TC:? 0 handle_rot_write_impl:78 [PTA] handle_rot_write_impl data:0x34
D/TC:? 0 handle_rot_write_impl:78 [PTA] handle_rot_write_impl data:0x34
F/TC:? 0 trace_syscall:155 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:155 syscall #7 (syscall_invoke_ta_command)
F/TC:? 0 trace_syscall:155 syscall #6 (syscall_close_ta_session)
D/TC:? 0 tee_ta_close_session:513 csess 0x902ebe80 id 3
D/TC:? 0 tee_ta_close_session:531 Destroy session
D/TC:? 0 close_session:49 [PTA] close_session.
D/TC:? 0 destroy_ta:35 [PTA] destroy_ta.
F/TC:? 0 trace_syscall:155 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:155 syscall #5 (syscall_open_ta_session)
D/TC:? 0 tee_ta_init_session_with_context:607 Re-open TA c7cf25d5-b62a-40bc-8841-2cefabbbf5bb
D/TC:? 0 create_ta:29 [PTA] create_ta.
D/TC:? 0 open_session:42 [PTA] open_session.
D/TA:  invoke_rot_pta:39 [ROT] TEE_InvokeTACommand start.
F/TC:? 0 trace_syscall:155 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:155 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:155 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:155 syscall #7 (syscall_invoke_ta_command)
F/TC:? 0 trace_syscall:155 syscall #7 (syscall_invoke_ta_command)
D/TC:? 0 invoke_command:88 [PTA] invoke_command pta entry.
D/TC:? 0 invoke_command:106 [PTA] invoke_command pta read data.
D/TC:? 0 handle_rot_read_impl:56 [PTA] handle_rot_read_impl pta entry.
D/TC:? 0 handle_rot_read_impl:62 [PTA] handle_rot_read_impl data:0x61
...省略
D/TC:? 0 handle_rot_read_impl:62 [PTA] handle_rot_read_impl data:0x34
F/TC:? 0 trace_syscall:155 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:155 syscall #7 (syscall_invoke_ta_command)
F/TC:? 0 trace_syscall:155 syscall #6 (syscall_close_ta_session)
D/TC:? 0 tee_ta_close_session:513 csess 0x902ebc90 id 3
D/TC:? 0 tee_ta_close_session:531 Destroy session
D/TC:? 0 close_session:49 [PTA] close_session.
D/TC:? 0 destroy_ta:35 [PTA] destroy_ta.
D/TA:  get_rot_data:1526 [TA] handle_read_rot result:0
D/TA:  get_rot_data:1529 [TA] handle_read_rot content:0x61
D/TA:  get_rot_data:1529 [TA] handle_read_rot content:0x61
D/TA:  get_rot_data:1529 [TA] handle_read_rot content:0x61
D/TA:  get_rot_data:1529 [TA] handle_read_rot content:0x61
D/TA:  get_rot_data:1529 [TA] handle_read_rot content:0x62
...省略
D/TA:  get_rot_data:1529 [TA] handle_read_rot content:0x34
D/TA:  get_rot_data:1533 [TA] get_rot_data done.

【OPTEE开发】从TA到PTA的功能设计相关推荐

  1. 【OPTEE开发】从TA到安全驱动的功能设计

    文章目录 一.功能需求 二.TA到Driver层的架构 1. 软件层架构 2. 实现思路 2.3 封装libutee层系统API 2.2 core中增加系统服务层 2.1 Driver侧接口和实现 三 ...

  2. optee中User TA的加载和运行

    文章目录 1.optee中的TA简介 2.TA的调用 2.tee_entry_std :std smc的调用 3.open_session 思考: User TA是怎样编译的? User TA是怎样签 ...

  3. OPTEE之静态TA的创建与调用

    先简单介绍下optee:TEE是智能手机主处理器中的一块安全区域,保证代码和数据的机密性和完整性:TEE中的数据不会被REE中的程序非法访问:TEE中的 可信应用(TA)在隔离的环境中运行,其 安全性 ...

  4. optee中User TA的加载/验签和运行

    文章目录 1.TA的加载到TEE内存 思考:- User TA是怎样编译的?- User TA是怎样签名的?- User TA是怎样被load到内存的?- 怎样验证TA签名的?- 如何解析TA hea ...

  5. 升讯威微信营销系统开发实践:(2)功能设计与架构设计

    在上一篇中,我们详细分析了微信订阅号和服务号的区别,在本篇中,将进入正题:升讯威微信营销系统的功能设计及架构设计. 一.功能设计 1)设计目标 ◇ 为微信服务号提供运营及管理所需的各种功能,包括微官网 ...

  6. 企业电子招投标系统简介 招投标系统源码 定制化服务 二次开发 java招投标系统 招投标系统功能设计

    随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求.在企业里建立一个公平.公开.公正的采购环境,最大限度控制采购成本至关重要.符合国家电子招投标法律法规及相关规范 ...

  7. 云炬Android开发笔记 5-9,10拦截器功能设计与实现

    6.拦截器功能设计与实现之拦截器的初始化 [说明]没有搭建服务器,然后使用okhttp库中的拦截功能,将接收到请求之后做出响应,返回json文件: 6.1[配置文件中的拦截器的配置] 6.2 将配置文 ...

  8. Scratch二次开发0:少儿编程平台功能设计及各框架应用

    自打自己进入少儿编程这行,对这个行业慢慢的有所了解.以前基本上什么编程语言都用过,反正是需要开发的应用是合适用什么编程语言,就去使用,还好,对于编程选择的语言工具,对本人没障碍. 下面是自己的所思所想 ...

  9. 股票软件开发技术之个股的选择功能设计思路101

    目前A股大概4000支股票(上市公司),1000支是垃圾股,2000支墙头草股票(不死不活的业绩),业绩较好每年正增长的大概是1000支左右. 能够在未来几年还会持续正增长的大概100个股票,散户老百 ...

最新文章

  1. Bash中的$*和$@的区别
  2. Python3函数和代码复用
  3. ubuntu设置始终亮屏_ubuntu设置关闭屏幕和锁定
  4. linux c代码出现段错误,Linux下段错误(C语言)
  5. java中间件是什么意思_数据库中间件漫谈
  6. ArrayQueue详解(待解决)
  7. 解决VScode安装Babel转码器报错:无法将“cnpm“项识别为cmdlet\函数、脚本文件或可运行程序的名称的问题
  8. 电脑怎么重装系统Win11?需要什么条件
  9. Android关机流程解析
  10. 软件评测师教程——软件测试基础
  11. 保研夏令营、考研复试个人升学简历模板与制作注意事项
  12. 创建VSIX项目模板
  13. vue typeScript get set 用法
  14. 使用WIFIPR跑握手包,破解wifi密码
  15. 泽塔云:紧盯用户需求,用差异化竞争和技术创新赢得超融合云计算市场
  16. Redis详解及使用
  17. go语言安装插件报错cannot find package golang.org/x/tools/go/buildutil
  18. 现代计算机领域出现了,时空道路网最近邻查询技术
  19. Modeling Task Relationships in Multi-task Learning withMulti-gate Mixture-of-Experts
  20. 交换机与路由器配置-利用OSPF协议实现网络互联

热门文章

  1. CListCtrl 使用演示的例子
  2. 用python机器学习实现新闻关键词的抽取,你学会了吗?
  3. 程序员如何拓展知识面 推荐几个技术公众号
  4. 新版 chrome 将原生支持图片懒加载!
  5. 一般程序员 vs 优秀程序员,没有对比就没有伤害
  6. uoni扫地机器人好用吗_抖音走红的日本uoni尤利扫地机器人好吗?体验感如何?...
  7. matlab 二值化_基于MATLAB的指纹识别系统[GUI界面+万字技术文档+语音播报]
  8. .bin 文件用excel文件打开_用python读Excel文件
  9. OpenCV中图像轮廓检测
  10. R语言学习 - 图形设置中英字体