属性访问(GP Internal API)
GP TEE Internal Core API中定义了一系列属性访问函数,可以访问属性集合中的单个属性,并将其转换成各种类型。这些函数可以用来访问TA配置属性、CA属性等。
被转换成的类型
包括:
Binary block,二进制块
32-bit unsigned integer,32位无符号整数
Boolean,布尔型
UUID,
Identity (a pair composed of a login method and a UUID),由登录方式和UUID组成的身份信息
通过函数TEE_GetPropertyAsString获取的属性必须被转换为以UTF-8编码的可打印字符串。以上各种类型转换成UTF-8编码的可打印字符串的规则如下:
A、二进制块,转换为与其对应的Base64编码一致的字符串。
B、32位无符号整数,可以表示为十进制、十六进制、二进制,decimal-integer: [0-9,_]+{K,M}? hexadecimal-integer: 0[x,X][0-9,a-f,A-F,_]+ binary-integer: 0[b,B][0,1,_]+
如:1024可以表示为“1K”, “0X400”, “0b100_0000_0000”
C、布尔值,转成“true”或“false”
D、UUID
E、身份信息,转成 identity: integer (':'uuid)? 形式
枚举属性
属性集中的属性可以被枚举,
使用TEE_AllocatePropertyEnumerator函数分配一个属性枚举器;
调用TEE_StartPropertyEnumerator函数开始枚举,传递枚举集上所需的伪句柄;
使用枚举句柄和一个NULL名调用TEE_GetProperty[AsXXX]函数。
枚举器可以以任意顺序提供属性。
属性操作函数
1、TEE_Result TEE_GetPropertyAsString(TEE_PropSetHandle propsetOrEnumerator, [instringopt] char* name, [outstring] char* valueBuffer, size_t* valueBufferLen);
2、TEE_Result TEE_GetPropertyAsBool(TEE_PropSetHandle propsetOrEnumerator, [instringopt] char* name, [out] bool* value );
3、TEE_Result TEE_GetPropertyAsU32(TEE_PropSetHandle propsetOrEnumerator, [instringopt] char* name, [out] uint32_t* value );
4、TEE_Result TEE_GetPropertyAsBinaryBlock(TEE_PropSetHandle propsetOrEnumerator, [instringopt] char* name, [outbuf] void* valueBuffer, size_t* valueBufferLen);
5、TEE_Result TEE_GetPropertyAsUUID(TEE_PropSetHandle propsetOrEnumerator, [instringopt] char* name, [out] TEE_UUID* value);
6、TEE_Result TEE_GetPropertyAsIdentity(TEE_PropSetHandle propsetOrEnumerator, [instringopt] char* name, [out] TEE_Identity* value );
7、TEE_Result TEE_AllocatePropertyEnumerator([out] TEE_PropSetHandle* enumerator);
分配一个属性枚举器对象,一旦分配了属性枚举器上的句柄,就可以使用函数TEE_StartPropertyEnumerator来枚举该属性集中的属性。
8、void TEE_FreePropertyEnumerator(TEE_PropSetHandle enumerator);
释放一个属性枚举器对象。
9、void TEE_StartPropertyEnumerator(TEE_PropSetHandle enumerator, TEE_PropSetHandle propSet);
开始枚举某个枚举器中的属性,一旦枚举器附着上每个枚举集,
- 通过传递枚举集的枚举器句柄和值为NULL的名称,使用TEE_GetPropertyAsXXX函数检索属性
- 使用函数TEE_GetPropertyName在枚举器中检索当前属性的名称
- 使用函数TEE_GetNextProperty将枚举推进到属性集中的下一个属性
10、void TEE_ResetPropertyEnumerator(TEE_PropSetHandle enumerator);
将属性枚举器重置为其刚分配后的状态
11、TEE_Result TEE_GetPropertyName(TEE_PropSetHandle enumerator, [outstring] void* nameBuffer, size_t* nameBufferLen);
获取枚举器中当前属性的名称
12、TEE_Result TEE_GetNextProperty(TEE_PropSetHandle enumerator);
将枚举器前进到下一个属性
TA可配置属性
每个TA都关联着一个配置属性,其可以通过属性访问函数和TEE_PROPSET_CURRENT_TA伪句柄进行访问。下表定义了TA的标准配置属性:
属性名称 | 属性类型 | 意义 |
gpd.ta.appID | UUID | TA标识符 |
gpd.ta.singleInstance | Boolean |
true:为所有会话创建一个TA实例 false: 为每一个会话创建一个单独的TA实例 |
gpd.ta.multiSession | Boolean | TA实例是否支持多会话,当gpd.ta.singleInstance属性为false时该属性忽略。 |
gpd.ta.instanceKeepAlive | Boolean |
没有会话连接时,是否应保留TA实例上下文。实例上下文定义为TA实例内存空间中的所有可写数据,包括实例堆。gpd.ta.singleInstance设置为ture时该属性才有意义。 当该属性为false,在TA上打开一个或多个会话时必须创建TA会话,当TA上没有任何会话时必须将其销毁。当该属性为true,仅当TEE关闭时TA实例才会终止。 |
gpd.ta.dataSize | Integer | TA堆空间大小,通过TEE_Malloc分配的内存块是从该空间中提取的 |
gpd.ta.stackSize | Integer | TA栈空间大小 |
gpd.ta.version | String | 该TA的版本号 |
gpd.ta.description | String | 可选的TA描述 |
客户端属性
标准的客户端属性可以使用属性访问函数和TEE_PROPSET_CURRENT_CLIENT伪句柄进行访问;其他非标准的客户端属性可以由具体实现定义,但必须定义在gpd.之外的命名空间。
请注意,只能在与客户端关联的TA入口点的上下文中访问客户端属性,即以下函数中:TA_OpenSessionEntryPoint,TA_InvokeCommandEntryPoint或TA_CloseSessionEntryPoint。
属性名称 | 属性类型 | 意义 |
gpd.client.identity | Identity |
当前客户端的身份信息,可以通过TEE_GetPropertyAsIdentity函数获取该值。 TA可以使用客户端身份来执行访问控制,如其可以拒绝为未识别的客户端打开会话。 |
具体TEE属性
通过属性访问函数和TEE_PROPSET_TEE_IMPLEMENTATION伪句柄来检索TEE属性。标准的TEE属性包括:
属性名称 | 属性类型 | 意义 |
gpd.tee.apiversion | String | API实现的版本号,当前版本时“1.1”。 |
gpd.tee.description | String |
API实现描述,该属性的具体内容取决于实现,通常包含实现的版本、内部版本号及其他配置信息。 |
gpd.tee.deviceID | UUID | 一个设备标识符在所有GP TEE中必须时全局唯一的。如果一个设备上由多个GP TEE,则每个TEE应该有唯一的一个gpd.tee.deviceID。 |
gpd.tee.systemTime.protectionLevel | Integer |
系统时间执行所提供的保护级别 |
gpd.tee.TAPersistentTime.protectionLevel | Integer | TA Persistent时间提供的保护级别 |
gpd.tee.arith.maxBigIntSize | Integer | TEE Arithmetical API算法支持的大整数的最大位数。超出此限制,由于预分配的资源不足或硬件限制,可能会导致panic |
gpd.tee.cryptography.ecc | Boolean | 是否支持ECC算法 |
gpd.tee.trustedStorage.antiRollback.protectionLevel | Integer | 防回滚安全存储的保护级别,0-无防回滚保护,100-安全存储的防回滚机制在REE级别实现,1000-安全存储的防回滚机制基于TEE控制的硬件 |
gpd.tee.trustedos.implementation.version | String | TEE实现的详细版本号。当TOS代码发生任何更新时,此属性值必须得到修改 |
gpd.tee.trustedos.implementation.binaryversion | binary | 等效于gpd.tee.trustedos.implementation.version的二进制值 |
gpd.tee.trustedos.manufacturer | String | TOS制造商名字 |
gpd.tee.firmware.implementation.version | String | TOS固件的详细版本号 |
gpd.tee.firmware.implementation.binaryversion | binary | 等效于gpd.tee.firmware.implementation.version的二进制值 |
gpd.tee.firmware.manufacturer | String | TOS固件制造商的名称,如果没有此固件,则为空字符串 |