推广 热搜: 行业  设备    系统  参数  经纪    教师  机械  中国 

OPTEE之静态TA的创建与调用op手机「OPTEE之静态TA的创建与调用」

   日期:2025-01-12     作者:caijiyuan    caijiyuan   评论:0    移动:http://sjzytwl.xhstdz.com/mobile/news/13780.html
核心提示:先简单介绍下optee:TEE是智能手机主处理器中的一块安全区域,保证代码和数据的机密性和完整性;TEE中的数据

先简单介绍下optee:TEE是智能手机主处理器中的一块安全区域,保证代码和数据的机密性和完整性;TEE中的数据不会被REE中的程序非法访问;TEE中的 可信应用(TA)在隔离的环境中运行,其 安全性比手机主操作系统(Rich OS,比如Android)高,并且 提供比SE更丰富的功能。optee就是TEE的开源版本,企业可以将其的TEE功能移植到支持trustzone的arm芯片的各种操作系统,包括Android、Linux等其他系统。

目前我所知的OPTEE已经可以支持的设备有如下

  • HiKey 620
  • HiKey 960
  • Raspberry Pi 3
  • STM32MP1

其实还有很多厂商自己移植的,只是不对外公开。optee的官网地址为:Device specific information — OP-TEE documentation documentation

我是使用的qemu方式来验证TEE功能,TEE的理解我这里不详细介绍,网上很多资源可以看到对其的介绍,我主要是讲静态TA的创建方法和调用方法,接下来我的介绍都是在ubuntu上面搭建的optee的qemu环境上进行验证。

首先我大致说下静态TA和动态TA的区别

动态TA:动态TA就是最后编译生成的.TA文件是在REE测,用户可以在文件系统里面找到对应的.TA文件,在调用TA的时候,TEE测会加载该动态TA,然后验证TA是否合法,最后再执行TA中用户开发的代码功能。重点是需要时才会去加载,而且会验证TA合法性,并且TA是存在REE测

静态TA:静态TA最后编译的静态.TA文件是在TEE测,在系统运行的时候,静态TA会跟随系统一起加载起来在TEE测,在调用TA的时候直接进行调用使用。静态TA的重点是系统运行就会加载,我不确定是否需要验证合法性,并且TA在TEE测,用无法看到静态TA。

我们在qemu的optee_examples里面操作的全是属于动态TA的例子,动态TA的使用方法,网上太多了,大家可以按照optee_examples里面的例子自救去实验即可,我们直接讲如何创建静态TA和怎么调用静态TA。

在例子中我创建的是一个生成随机数的静态TA功能,用户在REE测调用静态TA,可以生成指定长度的随机数。

1、qemu的目录如下

 

我们需要在optee_os文件夹里面编辑静态TA,然后在optee_examples里面写调用静态TA的示例

2、新增静态TA的.c文件

 

内容如下:下面的操作就是静态TA的一个测试功能,是生成随机数,需要从REE测传入随机数的长度和生成随机数的种子。

备注一下哈,本来是可以直接调用TA测的生成随机数的函数或者rand函数,但是我试了很久都没调用起来,后来就找到了一个类似随机数生成的源码代替随机数函数。

 

3、修改sub.mk文件,将新的.c文件添加到其中

 

修改后内容如下

 

4、新增.c的头文件

 

内容如下:头文件里面包含了TA的UUID和一些其他参数

 

5、创建静态TA调用示例

在optee_examples创建一个static_test的文件夹

 

Android.mk内容如下

 

CMakeLists.txt内容如下

 

Makefile内容如下

 

host文件夹里面就两个文件:main.c和Makefile

host的main.c文件内容如下

备注:在下面代码可以看到

1)random_uuid是我最后生成随机数的数组,定义的16位,由op.params[0].tmpref.buffer传递给TA

2)sizeof(random_uuid)是随机数长度,由op.params[0].tmpref.size传递给TA

3)datanouse这个没用,只是为了传随机数种子随便定义的字符串数组,这个必须有,不然会报错,我测试出来是这样的,由op.params[1].tmpref.buffer传递给TA(TA那边不会用到这个参数

4)time(NULL)%1000这个是随机数种子,这个必须取余运算,否则TA会报内存溢出错误,猜测是time(NULL)太大了,大家自己也可以试试,由op.params[1].tmpref.size传递给TA

 

host的Makefile文件内容如下

 

6、切换到编译目录

 

然后执行命令

 

输入密码,等待编译完成,在界面输入c,回车 

然后REE测执行optee_static_test命令就会完成静态TA的调用示例,如下图所示

结尾备注

        在没有研究静态TA的时候,其实是不明白何为静态TA,何为动态TA,初学者只知道在optee_examples文件夹内创建自己的新的TA,我直到研究静态TA之前也是这样的理解程度。最后查了各种资料,包括网上资料和书本资料,最后大致明白静态TA和动态TA的调用其实是和CA那边完全没得任何关系的,optee_examples里面的CA怎么调用的TA就还是按照原来的方法调用,区别在于静态TA的源码是在core里面的,而且在代码尾部必须进行注册pseudo_ta_register,见上面的.c的源代码。

        在CA端的host里面的主函数开始调用TA时,CA会根据TA的uuid进行TA的调用,当UUID传到TA端时,TA端的内部函数会拿着这个UUID先在已经存在静态TA里面寻找对应的TA,如果找不到,才会去静态TA寻找,寻找到UUID,如果是在静态TA这边直接进行调用即可;如果在动态TA这边,就先加载动态TA,然后在执行动态TA的功能。CA-TA的调用内部流程如下图所示,该图片摘自《手机安全和可信应用开发指南 TrustZone与OP-TEE技术详解》

 从上图中可以看出,当用户调用TA的时候,先从已经创建的TA链表中查找(我的理解是之前调用过的TA就会被放在这个TA链表中,以后调用就直接调用,再也不用去静态TA或者动态TA中找了,然后再去静态TA中寻找,静态TA中找不到再去动态TA中寻找。

        好了,差不多了,之后再有新的理解看再来补充。

2021年1月20日下午5点补充

     针对main.c里面的op.paramTypes有了新的理解,之前理解的不够透彻,今天突然理解透了来记录一下。     

 

TEEC_PARAM_TYPES里面有四个参数,分别对应op.params[0],op.params[1],op.params[2],op.params[3]这个四个参数的类型。如上面代码所示

1)TEEC_MEMREF_TEMP_OUTPUT,对应op.params[0]参数,使用时就是使用tmpref.buffer和tmpref.size参数,不能调用value.a和value.b参数,否则会报内存错

2)TEEC_MEMREF_TEMP_INPUT,对应op.params[1]参数,使用时只能tmpref.buffer和tmpref.size参数,不能调用value.a和value.b参数,否则也会报内存错

3)当时我是想传随机数种子进入TA,由于没理解清楚,始终传不成功,一直报内存错误,后来理解清楚,就大致明白了op.params[N]里面有既有value也有tmpref,根据我测试结果,这两个参数是不能同时用的。如果我当时只想传随机数参数的话,只需要像下面这样设置就可以了

本文地址:http://sjzytwl.xhstdz.com/news/13780.html    物流园资讯网 http://sjzytwl.xhstdz.com/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类最新文章
0相关评论

文章列表
相关文章
最新动态
推荐图文
最新文章
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号