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侧特权接口

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的值可实现如下操作:

TEE侧非特权接口

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调用。

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);

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": 容器类型
        }
    }
}