API接口简介
- kunpengsecl开源库已实现了远程证明的整体流程,用户可直接使用该库熟悉远程证明的整体流程和组件。
- 若有深度定制化需求,可通过如下介绍以及《iTrustee SDK开发者手册》了解底层开放的接口。《iTrustee SDK开发者手册》需向华为业务负责人申请获取。
为了实现远程证明,TEE OS底层对外提供两种类型的接口,一种是给特权QTA提供的特权级接口(Quoting System Interface, QSI),另一种是给其他TA提供的非特权级接口(Quoting Application Interface, QAI),其中TA调用QTA提供的接口,可以通过TA调用TA的方式实现。目前,特权级接口QSI共有1个,非特权级接口QAI共有3个。另外,QCA lib和QTA已封装好对TEE OS底层的接口调用,用户可使用QCA lib提供的接口完成TEE OS底层接口调用。以下为接口API的简单介绍。
TEE侧特权接口
struct ra_buffer_data { uint32_t length; uint8_t *buffer; }; TEE_Result ra_qsi_invoke(struct ra_buffer_data *in, struct ra_buffer_data *out);
该接口只能由QTA调用,入参与出参的buffer都为格式化的json字符串。json的结构体大致如下,详情可参考《iTrustee SDK开发者手册》。
{ "handler": "xxxxx", "payload": {....} ... }
通过handler的值可实现如下操作:
- Provision:生成AK密钥和AK证书,获取度量报告前需先执行此操作。入参的payload中可指定远程证明的场景。无AS场景下无出参,有AS场景下,出参的payload中包含QTA的度量、随机生成的AK公钥,还包括设备证书对payload的签名。
- SaveAKCert:在有AS场景下需要调用此接口保存AS回的证书。入参中包含AS返回的证书,无DAA(Direct Anonymous Attestation)场景时无出参,有DAA场景时返回随机化后的AK证书。
- ValidateAKCert:仅在有AS且有DAA模式下,调用SaveAKCert返回随机化的AK证书后,调用此接口验证AK证书并保存原证书。
- Report:获取度量报告。入参的包括待度量的TA的uuid,出参包括待度量TA的基准度量等信息。
TEE侧非特权接口
# 获取度量报告,入参出参和特权接口获取度量报告时一致。 TEE_Result ra_local_report(struct ra_buffer_data *in, struct ra_buffer_data *out); # 该接口与TA的度量值绑定,生成随机Key,对data进行加密和解密,只有该TA且度量值未变时,才能解密之前加密的数据 TEE_Result ra_seal(uint8_t *data, size_t in_size, uint8_t *cipher_data, size_t *cipher_size, uint32_t alg); TEE_Result ra_unseal(uint8_t *cipher_data, size_t cipher_size, uint8_t *data, size_t *out_size, uint32_t alg);
该接口可由任意非特权TA调用。
REE侧接口
为方便用户迅速开发远程证明应用,QCA lib/QTA已对TEE OS底层接口调用完成了封装,用户只需在开发REE侧的应用,即可完成接口调用。
TEEC_Result RemoteAttest(struct ra_buffer_data *in, struct ra_buffer_data *out); TEEC_Result RegisterContainer(struct ra_buffer_data *container_info, TEEC_Context *context, TEEC_Session *session, uint32_t *origin);
- RemoteAttest:对ra_qsi_invoke接口的封装,入参同ra_qsi_invoke的入参,为序列化的json字符串。
- RegisterContainer:从1.4.0起,为支持容器内远程证明,host上的QCA lib新增的接口,container_info为序列化的json结构体。
{ "container_id": 容器id, "nsid": 容器nsid }
libqca-report和QTA-report完成了容器内TEE OS接口调用的封装。libqca-report只有RemoteAttest接口,并只能用于获取report报告。若是容器调用libqca-report,其输入json结构体中需要增加如下容器信息。
{ ...... "payload": { ..... "container_info": { "id": 容器id, "type": 容器类型 } } }
父主题: 远程/本地证明