最近又开始和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. js中获取 table节点各tr及td的内容方法

    js中获取 table节点各tr及td的内容方法 分类: java基础2013-10-12 17:54 1055人阅读 评论(0) 收藏 举报 <table id="tb1" ...

  2. Gym101630L Laminar Family

    题目链接:https://cn.vjudge.net/problem/Gym-101630L 题目大意: 对于一个集合的集合,若其中任意两个集合 \(A\) 和 \(B\) 都满足下述三个条件之一:\ ...

  3. kubeadm 搭建kubernetes集群环境

    需求 kubeadm 搭建kubernetes集群环境 准备条件 三台VPS(本文使用阿里云香港 - centos7.7) 一台能SSH连接到VPS的本地电脑 (推荐连接工具xshell) 安装步骤 ...

  4. 遍历集合(Collection)的方法

    使用增强for循环和迭代器遍历集合 package com.aff.coll; import java.util.ArrayList; import java.util.Collection; imp ...

  5. Android 中加载本地Html 跨域问题,http协议允许加载

    一.需求: 后台加载HTML的包时间太长,太卡,让把所有的HTML包放到前台:使用的是file://协议,有些内容和样式加载不出来,H5那边说需要用http://协议来加载: 二.处理过程: 安卓最简 ...

  6. TCP / IP 精彩回顾-必看

    TCP/IP 协议出现的原因是互联网世界各个主机作为一个个独立的个体,如何制定统一的规则让他们互相通信是达成万物互联的纽带.基于此,设定了 TCP/IP 协议来规范网络访问行为.TCP/IP 并不是一 ...

  7. 看不见远程新建git分支

    再网页上新建了一个git分支.然后在本地跑git branch -r(查看远程分支)/ git branch -a(查看所有分支)两个命令,都没有看到新建的那个分支.这是为啥呢??? 原因是因为:gi ...

  8. (Java实现) 图的m着色问题

    图的m着色问题 [问题描述] 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问 ...

  9. Java实现 蓝桥杯 算法训练 寻找数组中最大值

    算法训练 寻找数组中最大值 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述 对于给定整数数组a[],寻找其中最大值,并返回下标. 输入格式 整数数组a[],数组元素个数小于1等于10 ...

  10. Java实现蓝桥杯VIP 算法训练 P0502

    试题 算法训练 P0502 资源限制 时间限制:1.0s 内存限制:256.0MB 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20.然后 ...