20. OP-TEE中TA与CA执行流程-------CA部分的代码篇

xiaoxiao2021-02-27  311

    历经一年多时间的系统整理合补充,《手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解 》一书得以出版,书中详细介绍了TEE以及系统安全中的所有内容,全书按照从硬件到软件,从用户空间到内核空间的顺序对TEE技术详细阐述,读者可从用户空间到TEE内核一步一步了解系统安全的所有内容,同时书中也提供了相关的示例代码,读者可根据自身实际需求开发TA。目前该书已在天猫、京东、当当同步上线,链接如下(麻烦书友购书时能给予评论,多谢多谢):

京东购买地址

当当购买地址

天猫购买地址

非常感谢在此期间大家的支持以及各位友人的支持和帮助!!!。

为方便和及时的回复读者对书中或者TEE相关的问题的疑惑,也为了大家能有一个统一的交流平台。我搭建了一个简单的论坛,网址如下:

https://www.huangtengxq.com/discuz/forum.php

关于您的疑问可在“相关技术讨论“”中发帖,我会逐一回复。也欢迎大家发帖,一起讨论TEE相关的一些有意思的feature。共同交流。同时该论坛中也会添加关于移动端虚拟化的相关技术的板块,欢迎各位共同交流学习

  

例子的source code可以自行从http://download.csdn.net/detail/shuaifengyun/9838378进行下载。在该例子中实现了三个功能:打印helloworld, 调用sha1算法和sha256算法分别计算hash值,并将计算结构返回给CA端。

  关于在OP-TEE中如何添加自己的TA和CA请参阅《2. OP-TEE中添加自己的TA和CA》,修改好对应的makefile,配置文件,UUID, commandID等等之后,完成一次完整的CA请求时在linux userspace端需要执行的操作依次如下 :

1. 调用TEEC_InitializeContext函数打开op-tee驱动文件,获取到操作句柄并存放到TEE_Context类型的变量中。

2. 调用TEEC_OpenSession函数,通过获取到的TEE_Context类型的变量创建一个特定CA与特定TA之间进行通信的通道,如果TA image被存放在file system中,那个在创建session的时候,OP-TEE OS端还会将TA image从file system中加载到OP-TEE。

3. 初始化TEEC_Operation类型的变量,并根据实际需要借助TEEC_PARAM_TYPES宏来设定TEEC_Operation类型变量中paramTypes成员的值,该值规定传递到OP-TEE中的最多4个变量缓存或者是数据的作用(作为输入还是输出)。并且还要根据paramTypes的值设定对应的params[x]成员的值或者是指向的地址以及缓存的长度。

4. 使用已经创建好的session,TA与CA端规定的command ID以及配置好的TEEC_Operation类型变量作为参数调用TEEC_InvokeCommand函数来真正发起请求。 调用TEEC_InvokeCommand成功之后,剩下的事情就有OP-TEE和TA进行处理并将结果和相关的数据通过TEEC_Operation类型变量中的params成员返回给CA。

5. 调用成功之后如果不需要再次调用该TA则需要注销session和释放掉context,这两个操作一次通过调用TEEC_CloseSession函数和TEEC_FinalizeContext函数来实现。

在Linux端一次完整的CA接口调用过程如下图所示:

NOTE:

1. 注意在如果调用CA接口是一个service或者是一个常驻linux kernel且该接口会被多次调用的时候,在未将context和session释放掉的前提下,TEEC_InitializeContext和TEEC_OpenSession接口不要重复调用,否则会引起OP-TEE出错,因为每次执行initialize context和openssion的时候,OP-TEE都会划分一定的memory,如果在为释放已有资源的时候重复分配context和session,则会造成OP-TEE内存泄露。针对该情况可以在CA接口的实现时对执行初始化context和open session的操作添加一个flag进行控制,当该接口的context和session已经被初始化时则不需要重复操作,而且在调用完TEEC_InvokeCommand之后,如果service或者Process还需要调用该CA接口,则不建议立即释放context和session。详细情况请查阅测试代码(测试代码加了flag,但是对于调用完TEEC_InvokeCommand操作后的后续操作需要重新搞搞,以后会更新该代码)

2. 在使用过程过程中,一般会将CA接口打包成库文件给上层调用,也可以将该接口封装成JNI接口供JAVA层调用。

3. 关于上述几个TEEC接口的具体实现每家芯片厂商可能不一样,但对于用户来说都一样。下文将以OP-TEE的实现为准进行介绍。后续有时间可以讲讲海思和mstar添加TA和CA的方式

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-6114.html

最新回复(0)