TEE 开发
官方规范文档地址: https://globalplatform.org/specs-library/?filter-committee=tee
TEE 开发入门知识
1 |
|
CA与TA之间的关系
CA 即执行在 REE 中的 普通应用程序,TA 则是执行在 TEE 中的 完全被信任安全程序。涉及到安全方面的操作时(如:人脸比对、指纹校验),CA就需要与TA交互,从TA中获取到结果。
REE中的系统结构:
CA(Client Application)对应 REE 层应用,比如指纹采集、支付能力等,通过调用 TEE Client API 实现与 TA 进行交互。CA通过接口让TA完成工作,完成对应功能然后返回计算结果,CA不需关心计算过程。
REE Communication Agent 为TA和CA之间的消息传递提供了REE支持
TEE Client API 是REE中的TEE驱动程序提供给外部的接口,用于 CA 与 TA 交互。
TEE中的系统结构:
TA(Trusted Application)是TEE中完成特定功能的应用。由于TEE中完成计算因此具有较高的安全性。每一个TA在REE中有一个或者多个对应的CA。TEE Internal Core API 则是TA侧的接口。
TEE Communication Agent 是可信操作系统的特殊组成部分,它与REE Communication Agent 一起工作,保证TA与CA之间传输消息的安全。
TEE Internal Core API 是TEE系统提供给TA调用的内部接口,包括密码学算法,内存管理等功能。
Trusted Device Drivers 可信设备驱动程序,为专用于TEE的可信外设提供通信接口。
Shared Memory 是一块只有CA和TA可以访问的一块安全内存,CA和TA通过共享内存来快速有效传输指令和数据
TEE软件交互接口定义
下面是TEE的软件交互流程,使用GlobalPlatform组织定义的 GP API 接口。
CA与TA通信需要使用下列接口完成整个会话流程:
CA侧接口如下:
TEEC_InitializeContext / TEEC_FinalizeContext:
对变量Context进行初始化和释放,用来建立和结束CA和TEE的联系,向TEE申请共享内存地址用于存放数据。
TEEC_OpenSession / TEEC_CloseSession:
建立和关闭一个CA和TA间的session,用于CA和UUID指定的TA进行通信,是CA连接TA的起始点和终点。
TEEC_InvokeCommand:
依靠打开的session,将传送命令请求给TA,并将必要的指令执行参数一并发送给TA。
TEEC_RegisterSharedMemory / TEEC_ReleaseSharedMemory:
TEEC_AllocateSharedMemory / TEEC_ReleaseSharedMemory:
同样是申请共享内存缓冲区,为更接近实现 零拷贝数据传输,TEEC_AllocateSharedMemory 是首选,其次才是 TEEC_RegisterSharedMemory。共享内存是由 REE 拥有 并映射到 TEE 内存空间的内存。
TA侧接口:
TA_CreateEntryPoint:为CA建立接入点,使得TA可以被CA调用。
TA_DestroyEntryPoint:移除CA的接入点,结束TA的功能。
TA_OpenSessionEntryPoint:建立CA与TA之间的通讯通道,作为CA连接TA的起点。
TA_CloseSessionEntryPoint:关闭CA与TA的通讯通道
TA_InvokeCommandEntryPoint:接收CA传送的指令和参数,并在这TEE侧执行。
交互流程实现:
在 GP 标准中,CA 要与 TA 进行通信,需要建立如下所示的软件逻辑流程:
1)首先 CA 需要与 Trusted OS 之间建立一个 Context,以后此 CA 与 TEE 环境的所有通信均基于此 Context。
2)然后 CA 会向 Trusted OS 申请与请求的 TA 建立一个 Session。
3)CA 与 TA 之间的 Session 建立完成后,CA 就可以向 TA 发送 Commands。
4)Commands 及其参数会通过共享内存的方式传递,TA 从共享内存中获取到 CA 的请求以及请求参数。
5)TA 在 TEE 环境下执行处理,得到的处理结果重新填充到共享内存中,CA 通过共享内存就可以获取到处理结果。
6)获得处理结果后,如不需要进一步请求,则由 CA 发起关闭 Session 的请求,Trusted OS 回收 TA 相关资源,最后 CA 发起销毁 Context 的请求,完成一次完整交互。
交互原理:
CA 通过调用 TEE Client API 触发系统调用,进入 REE 的操作系统内核态,系统根据 CA 的入参来找到需要执行的 REE 驱动程序,REE驱动程序通过 SMC (secure monitor call,安全监控模式调用) 汇编指令进入 Monitor模式,并修改 安全状态读写信号位(Non-secure bit,NS bit)将CPU切换到安全内核状态(改变寄存器最后1bit为0,1为非安全),进入 secure world。
切换到 TEE 后,CA 的服务请求通过 Binder 传到TEE侧,然后 TEE OS 通过 TEE Internal API 拉起对应的 TA,TA 运行结束后将结果和数据返回给 CA 。执行完后回到 TEE内核态,再通过 SMC 汇编指令进入 Monitor 切换到 REE 环境。