<OPTEE>Trusted Application结构分析
最近又开始和Trusted Zone打起了交道,需要把Linaro开发的开源安全系统optee os移植到实验室的老板子上。不过导师要求我先开发一个应用,在普通环境和安全环境分别有一个程序,称为host与trusted application(简称TA)。让我在这个过程中了解一下这个系统。
optee os的github地址:https://github.com/OP-TEE/optee_os,一天几个commit,那几个大神真是勤劳。
不管怎么说,我要先搞清楚这个应用的结构,幸好这个项目还带有一个测试工具集optee test ,这个测试肯定包含host和TA两端,所以可以从这里入手学习。
host就是一个普通的可执行文件,除了调用了TEE的Api,没什么特别的。
TA端是OPTEE中运行的程序,有他的要求,下面以一个简单的测试存储的TA——storage为例介绍他的基本结构。
程序文件

include目录下的头文件

可以看到所需的文件并不多。简要介绍一下,makefile和sub.mk自不必说,storage.c写的是一些简单的调用TEE存储API的逻辑。
ta_entry.c比较重要,是TA的入口,里面主要是
TA_CreateEntryPoint,
TA_DestroyEntryPoint,
TA_OpenSessionEntryPoint,
TA_CloseSessionEntryPoint,
TA_InvokeCommandEntryPoint
几个函数,是作用通过名字即可看出,在<tee_ta_api.h>中早有定义,每一个TA都要各自实现这几个函数,不过代码量很小,一般不需要写逻辑,声明出来,处理参数不要报错就行。其中的TA_InvokeCommandEntryPoint主体是一个switch,用传入的命令ID判断和分发。
Ta_storage.h
#ifndef TA_STORAGE_H
#define TA_STORAGE_H
#define TA_STORAGE_UUID { 0xb689f2a7, 0x8adf, 0x477a, \
{ 0x9f, 0x99, 0x32, 0xe9, 0x0c, 0x0a, 0xd0, 0xa2 } } #define TA_STORAGE_CMD_OPEN 0
#define TA_STORAGE_CMD_CLOSE 1
#define TA_STORAGE_CMD_READ 2
#define TA_STORAGE_CMD_WRITE 3
#define TA_STORAGE_CMD_CREATE 4
#define TA_STORAGE_CMD_SEEK 5
#define TA_STORAGE_CMD_UNLINK 6
#define TA_STORAGE_CMD_RENAME 7
#define TA_STORAGE_CMD_TRUNC 8
#define TA_STORAGE_CMD_ALLOC_ENUM 9
#define TA_STORAGE_CMD_FREE_ENUM 10
#define TA_STORAGE_CMD_RESET_ENUM 11
#define TA_STORAGE_CMD_START_ENUM 12
#define TA_STORAGE_CMD_NEXT_ENUM 13 #endif /*TA_SKELETON_H */
上面定义了该TA的UUID, 以及各个命令的宏。OPTEE通过UUID唯一标识系统里的TA,因此这个UUID不能重复,这里建议的是通过网站ITU-T UUID generator
(http://www.itu.int/ITU-T/asn1/uuid.html)来创建唯一的ID,而且生成的数据长度和OPTEE的要求是一致的,只要按格式拆分就可以了。
上述命令在TA_InvokeCommandEntryPoint函数中用switch分发命令调用,处理请求的实现写在storage.c中。
TEE_Result TA_InvokeCommandEntryPoint(void *pSessionContext,
uint32_t nCommandID, uint32_t nParamTypes,
TEE_Param pParams[])
{
(void)pSessionContext; switch (nCommandID) {
case TA_STORAGE_CMD_OPEN:
return ta_storage_cmd_open(nParamTypes, pParams); case TA_STORAGE_CMD_CLOSE:
return ta_storage_cmd_close(nParamTypes, pParams) //......
}
user_ta_header_defines.h,TA的头部信息,主要是UUID和一些空间信息。
#ifndef USER_TA_HEADER_DEFINES_H
#define USER_TA_HEADER_DEFINES_H #include <ta_storage.h> #define TA_UUID TA_STORAGE_UUID /*
* This is important to have TA_FLAG_SINGLE_INSTANCE && !TA_FLAG_MULTI_SESSION
* as it is used by the ytest
*/
#define TA_FLAGS (TA_FLAG_USER_MODE | TA_FLAG_EXEC_DDR | \
TA_FLAG_SINGLE_INSTANCE)
#define TA_STACK_SIZE (2 * 1024)
#define TA_DATA_SIZE (32 * 1024)
在optee_os/../kernel tee_ta_Manager.c里面,tee_ta_init_static_ta_session函数中定义TA头部结构体类型,在OPTEE收到Host端的请求,准备初始化会话,加载对应的TA时,会创建一个TA指针,在循环中从内存中定义的start到stop移动,依次比对UUID,从而获取所需的TA头部指针,然后调用tee_ta_load函数,检查签名,加载待运行的TA。
static TEE_Result tee_ta_init_static_ta_session(const TEE_UUID *uuid,
struct tee_ta_session *s)
{
struct tee_ta_ctx *ctx = NULL;
ta_static_head_t *ta = NULL; DMSG(" Lookup for Static TA %08x-%04x-%04x",
uuid->timeLow, uuid->timeMid, uuid->timeHiAndVersion); ta = &__start_ta_head_section;
while (true) {
if (ta >= &__stop_ta_head_section)
return TEE_ERROR_ITEM_NOT_FOUND;
if (memcmp(&ta->uuid, uuid, sizeof(TEE_UUID)) == )
break;
ta++;
}
//......
}
所以新增的TA应该预先把自己的头部结构体放在区间内,经过分析,只要在编译完成后,把.ta文件预先放在rootfs下的lib/optee_armtz/目录内即可,运行时,系统将把这个目录下的TA的头部都加载到内存中以供查找。至于如何打包,最好的方式还是通过修改makefile中Root FS部分内容,这样每次编译完都会把.ta打包入镜像。
以上就是一个简单的TA项目基本的结构介绍和分析,更详细的代码请自行到github查看。
<OPTEE>Trusted Application结构分析的更多相关文章
- TEE(Trusted Execution Environment)简介【转】
转自:https://blog.csdn.net/fengbingchun/article/details/78657188 TEE(Trusted Execution Environment),可信 ...
- Summary of 2016 International Trusted Computing and Cloud Security Summit
1) Welcome Remarks 2) The advancement of Cloud Computing and Tursted Computing national st ...
- 什么是OPTEE-OS
1. 为什么会出现这种技术? 为了安全,例如:保护指纹虹膜的生物特征数据 2. 为了确保数据安全各家公司都做了些什么? Arm公司提出的了trustzone技术,用一根安全总线(称为NS位)来判断当前 ...
- 我(webabcd)的文章索引
[最后更新:2014.08.28] 重新想象 Windows Store Apps 系列文章 重新想象 Windows 8 Store Apps 系列文章 重新想象 Windows 8 Store A ...
- org.jawin.COMException: 8000ffff: Invalid ptr null flag(原址:http://osdir.com/ml/windows.devel.jawin/2006-01/msg00013.html)
I now realise my arguments to invoke should be more along the lines of byte[] result = tApp.invoke(& ...
- Spring Oauth2 with JWT Sample
https://www.javacodegeeks.com/2016/04/spring-oauth2-jwt-sample.html ******************************** ...
- XML External Entity attack
解析外部xml给本地带来的安全隐患. https://en.wikipedia.org/wiki/XML_external_entity_attack An XML External Entity ( ...
- The WebSocket Protocol
[Docs] [txt|pdf] [draft-ietf-hybi-t...] [Diff1] [Diff2] [Errata] Updated by: 7936 PROPOSED STANDAR ...
- TEE&TrustZone
一.TEE(Trusted Execution Environment) 1 A look back 1)2009 OMTP(Open Mobile Terminal Platform),首次定义了T ...
随机推荐
- 汉语分词工具包jieba
#分词pip install jieba import jieba str="你真的真不知道我是谁吗?" res1=jieba.cut(str) print(list(res1)) ...
- 09-Python之路---函数进阶
Python之路---函数进阶️ 程序员三大美德: 懒惰 因为一直致力于减少工作的总工作量. 缺乏耐性 因为一旦让你去做本该计算机完成的事,你将会怒不可遏. 傲慢 因为被荣誉感冲晕头的你会把程序写得让 ...
- VueRouter小手册
目录 一. 了解router 二. 工作流程 三. 简单的Demo 四. 理解template和route的组合 五. Vue-Router-GoBack记录返回 六. Router-Link 七. ...
- CF948D Perfect Security
题目链接:http://codeforces.com/contest/948/problem/D 知识点: Trie 题目大意: 给出两个长度为 \(N(1 \le N \le 300000)\) 的 ...
- Java效率工具Lombok使用与原理
Java效率工具Lombok使用与原理 我个人觉得 Lombok是一个优化Java代码以及提升开发效率不错的工具.Lombok 的Github地址为:https://github.com/rzwits ...
- .net core HttpClient 使用之消息管道解析(二)
一.前言 前面分享了 .net core HttpClient 使用之掉坑解析(一),今天来分享自定义消息处理HttpMessageHandler和PrimaryHttpMessageHandler ...
- 【C++】赋值过程中类型转换
注意:以下内容摘自文献[1],修改了部分内容. 1.赋值过程中的类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时自动进行类型转换. (1) 将浮点型数据(包括单.双精度)赋给 ...
- 【Mathtype】安装Mathtype后,word无法粘贴的问题
Win10安装mathtype后,word工具栏中自动添加mathtype的选项(mathtype为了使用户更加方便使用,故自动添加),但是却导致word无法粘贴.如何解决该问题? [方案1]官网描述 ...
- BUUCTF Crypto_WP(2)
BUUCTF Crypto WP 几道密码学wp [GXYCTF2019]CheckIn 知识点:Base64,rot47 下载文件后,发现一个txt文件,打开发现一串base64,界面之后出现一串乱 ...
- 【转】动态规划:最长递增子序列Longest Increasing Subsequence
转自:https://www.cnblogs.com/coffy/p/5878915.html 设f(i)表示L中以ai为末元素的最长递增子序列的长度.则有如下的递推方程: 这个递推方程的意思是,在求 ...