最近又开始和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_os

  optee test

<OPTEE>Trusted Application结构分析的更多相关文章

  1. TEE(Trusted Execution Environment)简介【转】

    转自:https://blog.csdn.net/fengbingchun/article/details/78657188 TEE(Trusted Execution Environment),可信 ...

  2. Summary of 2016 International Trusted Computing and Cloud Security Summit

    1)      Welcome Remarks 2)      The advancement of Cloud Computing and Tursted Computing national st ...

  3. 什么是OPTEE-OS

    1. 为什么会出现这种技术? 为了安全,例如:保护指纹虹膜的生物特征数据 2. 为了确保数据安全各家公司都做了些什么? Arm公司提出的了trustzone技术,用一根安全总线(称为NS位)来判断当前 ...

  4. 我(webabcd)的文章索引

    [最后更新:2014.08.28] 重新想象 Windows Store Apps 系列文章 重新想象 Windows 8 Store Apps 系列文章 重新想象 Windows 8 Store A ...

  5. 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(& ...

  6. Spring Oauth2 with JWT Sample

    https://www.javacodegeeks.com/2016/04/spring-oauth2-jwt-sample.html ******************************** ...

  7. XML External Entity attack

    解析外部xml给本地带来的安全隐患. https://en.wikipedia.org/wiki/XML_external_entity_attack An XML External Entity ( ...

  8. The WebSocket Protocol

      [Docs] [txt|pdf] [draft-ietf-hybi-t...] [Diff1] [Diff2] [Errata] Updated by: 7936 PROPOSED STANDAR ...

  9. TEE&TrustZone

    一.TEE(Trusted Execution Environment) 1 A look back 1)2009 OMTP(Open Mobile Terminal Platform),首次定义了T ...

随机推荐

  1. logger日志接口SLF4J

    SLF4J只是一个接口,可以实现程序的解藕.SLF4J可以与log4j.logback.jdk等日志系统结合,以及在这些日志系统之间切换. 使用maven导入各个日志系统的jar包.需要注意的是要写相 ...

  2. ShoneSharp语言(S#)软件更新13.6版

    ShoneSharp语言(S#)编辑解析运行器 软件更新13.6版 作者:Shone 今天把近期发现的各种软件问题做了修改,并发布新版ShoneSharp.13.6.exe,最新的网盘链接为: htt ...

  3. 【python爬虫】scrapy入门8:发送POST请求

    scrapy基础知识之发送POST请求与使用 FormRequest.from_response() 方法模拟登陆 https://blog.csdn.net/qq_33472765/article/ ...

  4. Kubernetes学习笔记(五):卷

    简介 卷是Pod的一部分,与Pod共享生命周期.它不是独立的Kubernetes对象,因此不能单独创建. 卷提供的存储功能不但可以解决容器重启后数据丢失的问题,还可以使数据在容器间共享. 一些卷的类型 ...

  5. shiro简单的认证功能

    使用静态shiro.ini文件完成认证 创建项目到爆 <dependency> <groupId>org.apache.shiro</groupId> <ar ...

  6. web自动化之iframe操作

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  7. Java学习大纲-0412更新

    非科班报培训班学习Java,从博客园,知乎,CNDS上搜了一圈,暂时按以下计划执行,有问题随时更新--0412 1.培训班的课程按时按点学习完成(毕竟掏钱在学的是不,不好好听亏不亏...) keys: ...

  8. Docker安装常见的应用与将本地镜像推送到阿里云

    一.Docker安装常用的应用 1,docker安装mysql #拉取镜像mysql5.7 docker pull mysql:5.7 #启动容器(绑定对应的配置文件和日志,默认密码为123456) ...

  9. [译]Tus 协议

    原文地址:https://tus.io/protocols/resumable-upload.html 摘要 该协议提供一种基于 HTTP/1.1 和 HTTP/2 机制用于文件断点续传. 核心协议 ...

  10. pyinstaller打包pyqt5,从入坑到填坑,详解

    以上省略pyinstaller安装步骤,直入主题.先分享我的心路历程. 1.pyinstaller -F -i 1.ico UI_Main.py (先在CMD中 cd到 py文件对应的路径) 第一步打 ...