GP TEE Internal API基础知识

可信应用

可信应用是运行于TEE环境,并向其客户端暴露安全服务的程序。TA是面向命令的,客户端通过打开与TA的会话并在该会话中调用命令来访问TA。当TA程序收到命令时,它将解析与该命令相关联的消息,执行必要的处理,然后将响应发送回客户端。

每个TA都公开一份由一系列入口函数组成的接口,Trusted Core Framework调用这些入口点来通知TA有关生命周期的变化,并中继CA、TA之间的通信。一旦Trusted Core Framework调用了某个TA入口点,TA便可以使用TEE Internal API来访问TOS。每个TA都由UUID唯一标识,其还附带一组可信应用程序配置属性。

 

 

  实例、会话、任务、命令

当客户端与TA创建一个会话时,它将连接到该TA的实例。一个TA实例有与其他所有TA实例分隔开的物理内存,TA实例的内存空间持有TA实例的堆空间以及可写的全局和静态数据。

任务用来执行TA中的所有代码,任务会记录其执行历史记录(通常通过堆栈来实现)和当前执行状态,该记录被称之为任务上下文,每当TOS调用一个TA的入口点时,必须创建一个任务。一旦从入口点返回,任务可以被回收从而来运行另一个入口点,但是它必须看起来像是创建了一个全新的任务来调用新的入口点。

会话用于逻辑连接在一个TA中调用的多个命令,每个会话都有其自己的状态,该状态通常包含会话上下文和执行该会话的任务的上下文。

命令在会话上下文中发出,包含一个命令标识符(一个32位整数)和四个操作参数,操作参数可以包含整数值或对客户端拥有的共享内存块的引用。

 

 

实例类型

至少要包括两种实例类型:多实例和单实例。

对于多实例TA,客户端打开的每个会话都将定向到一个单独的TA实例,该实例在打开会话时按需创建,并在会话关闭时销毁。此类TA的每个实例在给定的时间都接受并处理一个且只有一个会话。

对于单实例TA,客户端打开的所有会话都定向到一个唯一的TA实例。从TA端看,所有会话共享同一个的TA实例内存空间,这意味着一个会话动态分配的内存其余所有会话都可以访问。

 

 

错误处理

TEE InternalCore API函数通常返回类型为TEE_Result的返回码,以指示错误给调用者。

 

 

Panic

panic是实例范围内、由于调用一个API而产生的不可捕获的异常,其会杀死整个TA实例。当系统检测到可避免的程序员错误,并且没有专门定义的错误代码覆盖其时,产生panic。TA可以通过调用函数TEE_Panic来请求panic。

当panic发生关闭TA实例打开的所有资源,包括所有句柄和所有内存,并销毁该实例时,Trusted Core Framework会终止panicking TA实例并执行以下操作:

(1)丢弃在TA实例上排队的所有客户端入口点调用,并关闭客户端打开的所有会话。

(2)关闭TA实例打开的所有资源,包括所有句柄和所有内存,并销毁该实例。注意,多个实例可以引用一个公共资源,例如一个对象。如果共享资源的实例被销毁,那么框架不会立即销毁共享资源,而是会等到没有其他实例引用该资源后再回收资源。

发生panic后,该TA实例的所有函数将不再被调用,甚至TA_DestroyEntryPoint也不会被调用。从CA端来看,当一个TA发生panic,客户端命令return result是TEE_ERROR_TARGET_DEAD,return origin是TEE_ORIGIN_TEE。

 

 

不透明句柄

该规范使用了为特定TA实例创建的不透明句柄,句柄仅在创建它的TA实例的上下文中有效,并且必须始终与类型关联。

特殊值TEE_HANDLE_NULL(必须始终为0)用于表示没有句柄,通常用于发生错误或有时在某些功能中触发特殊行为的情况。例如,如果传递了TEE_HANDLE_NULL,则函数TEE_SetOperationKey将清除操作密钥。通常,如果将类似“ close”的函数传递给NULL句柄,则它们将不执行任何操作。

传递无效的句柄(即API未返回,已经关闭或类型错误的句柄)始终是程序员错误,但有时特定值TEE_HANDLE_NULL除外。

该规范为每种高级句柄类型定义了一个C类型。如下:

 

 这些C类型定义为未定义结构上的指针。例如,TEE_TASessionHandle被定义为__TEE_TASessionHandle *。

 

 

属性
该规范利用属性来表示配置参数,权限或实现特征。属性是由名称标识的不可变值,该名称是Unicode字符串。可以以多种格式检索属性值:Unicode字符串,二进制块,32位整数,布尔值和标识。

属性的值是不可变的,TA程序只能检索它,而不能对其进行修改。API中公开了下列属性集:

(1)每个TA都可以访问其自己的配置属性,其中一些参数会影响TEE本身的行为,其他可用于配置此TA连接到的TA的行为。

(2)TA实例可以为其每个客户端访问一组属性。当客户端是TA程序时,属性集包含该TA的配置属性。否则,它包含由REE设置的属性。

(3)TA可以访问描述TEE自身特征的属性。

属性名称区分大小写,并且具有层次结构,层次结构中的级别由点字符“.”分隔。属性名称应使用反向域名约定,以最大程度地减少由不同组织定义的属性之间发生冲突的风险。例如,ACME公司应使用“ com.acme.”前缀,ISO标准化的属性将使用“ org.iso.”命名空间。本规范保留了“ gpd.”命名空间,并定义了该命名空间中一些属性的含义。

 

posted @ 2021-04-23 16:09  hunterDing  阅读(796)  评论(0编辑  收藏  举报