为了实现远程证明,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的简单介绍。
1 2 3 4 5 | 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开发者手册》。
1 2 3 4 5 | { "handler": "xxxxx", "payload": {....} ... } |
通过handler的值可实现如下操作:
1 2 3 4 5 | # 获取度量报告,入参出参和特权接口获取度量报告时一致。 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调用。
为方便用户迅速开发远程证明应用,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);
1 2 3 4 | { "container_id": 容器id, "nsid": 容器nsid } |
libqca-report和QTA-report完成了容器内TEE OS接口调用的封装。libqca-report只有RemoteAttest接口,并只能用于获取report报告。若是容器调用libqca-report,其输入json结构体中需要增加如下容器信息。
1 2 3 4 5 6 7 8 9 10 | { ...... "payload": { ..... "container_info": { "id": 容器id, "type": 容器类型 } } } |