TA接口(GP Internal API)

TA接口

每一个TA必须TA接口,这些接口函数是Trusted Core Framework创建TA实例的入口点,告知该实例一个客户端正在连接,或告知客户端调用了一个命令等。这些入口点不能由TA代码动态注册,他们必须在TA运行前绑定到框架。

 

生命周期如下:

 

 

 (1)接口操作参数

当一个CA开启一个会话或调用一个命令时,它会发送operation parameter到TA,一个operation可以携带至多四个参数。

每个参数可以携带包含32比特整数的值参数,或者包含客户端内存缓冲区指针的内存引用参数。每个参数还得标记数据流的方向(输入、输出、输入输出)。

内存引用参数通常指向CA端内存,其在操作期间与TA共享。内存引用参数在传输大容量数据时特别有用,可以最大程度减少内存副本的数量和数据占用量。

(2)安全考虑

内存引用可以直接使用与CA共享的内存,在处理此类数据时,TA需要注意。

(3)错误处理

除TA_DestroyEntryPoint和TA_CloseSessionEntryPoint之外的所有TA接口函数都返回TEE_Result类型的返回码。Trustd Core Framework处理如下:

A、TA_CreateEntryPoint返回错误,则不创建TA实例

B、TA_OpenSessionEntryPoint返回错误,则拒绝CA连接,并传送一个错误码到CA

C、TA_InvokeCommandEntryPoint返回错误,则将错误码送到CA

D、TA_CloseSessionEntryPoint和TA_DestroyEntryPoint不返回错误码

注意,TA_OpenSessionEntryPoint和TA_InvokeCommandEntryPoint返回错误时,其return origin被设置为TEEC_ORIGIN_TRUSTED_APP。

(4)客户端属性

当CA连接到TA时,框架会将会话与客户端属性相关联,TA可以通过使用TEE_PROPSET_CURRENT_CLIENT调用属性访问功能之一来检索其客户端的身份和属性。

 

TA接口中的操作参数

CA开启会话或在会话中调用命令时,它可以将操作参数传输到TA实例,并从TA实例接收回响应数据。参数paramTypes和params用于对传递给TA实例的操作参数及其类型进行编码。在OpenSession和InvokeCommand调用中,TA程序还可以写入param参数来编码响应数据。

paramTypes是参数类型,其决定param[]中数据的有效域,

 

对于MEMREF类型,TA是无法区分注册内存引用和临时内存引用。

注意在内存引用类型参数返回时,需要考虑param中buffer的长度问题:如果需求长度小于等于param[i].memref.size则Trusted Core Framework将填充实际大小的数据;如果需求大于param[i].memref.size则TCF认定TA未写入任何数据,并且不会同步数据到CA端。

举个例子:假设size的传入值为100,

A、如果TA不修改size值,则将同步整个缓冲区,并保证CA端可以观察到所有更改。

B、如果TA将size改成50,则CA端可以观察到索引值从0到49范围内的更改。

C、如果TA将size改成200,则数据不能同步到CA端,然而CA可以接收到size的新值。TA通常可以使用此功能来告知客户端内存引用太小,并请求客户端使用至少200字节的内存引用重试。

 

 内存引用和内存同步

如果参数是内存引用类型,则操作完成后内存缓冲区可能会被立即释放或取消映射,此外在操作开始之前和操作完成之后可能会显式同步内存缓冲区的内容。所以:

  • 操作完成后,TA务必不能访问内存缓冲区。特别是不能用作CA和受TA之间的长期通信手段,内存引用仅在operation生命期间可以访问。
  • TA不要尝试写类型为TEE_PARAM_TYPE_MEMREF_INPUT的内存缓冲区。
  • 对于类型为OUTPUT或INOUT的Memory Reference,TA可以写由params [i] .memref.size值描述的整个范围。只有当返回size等于或小于传入值时,CA端才会看到数据。

 

posted @ 2021-04-25 13:29  hunterDing  阅读(1169)  评论(0编辑  收藏  举报