如何证明某些数据是在 Enclave(英特尔 SGX)内部计算(或生成)的?
我试图在 enclave 内生成非对称密钥对(私钥可能对外不可见),并且
然后用证据公开公钥(我猜是引用或远程证明相关的东西)。
我知道远程证明是如何进行的,但是我无法提出应用远程证明来验证 enclave 生成的数据。
英特尔 SGX 是否可能出现这种情况?
report_data
您可以通过将其放置在报告证明期间生成的报价字段中来证明公钥的来源。
_quote_t.report_data
可用于证明任意数据:
64 字节数据缓冲区是自由格式数据,您可以在该缓冲区中提供您希望在生成报告/报价时识别为在飞地的拥有和保护信封中的任何信息。因此,您可以使用此缓冲区向验证方传达您想要的任何信息。(来源)
report_data
可以通过跟踪以下结构找到该字段:
typedef struct _ra_msg3_t {
sgx_mac_t mac
sgx_ec256_public_t g_a;
sgx_ps_sec_prop_desc_t ps_sec_prop;
uint8_t quote[]; // <- Here!
} sgx_ra_msg3_t;
typedef struct _quote_t
{
uint16_t version;
uint16_t sign_type;
sgx_epid_group_id_t epid_group_id;
sgx_isv_svn_t qe_svn;
sgx_isv_svn_t pce_svn;
uint32_t xeid;
sgx_basename_t basename;
sgx_report_body_t report_body; // <- Here!
uint32_t signature_len;
uint8_t signature[];
} sgx_quote_t;
报价是远程证明协议的 Msg3(客户端到服务器)的一部分。您可以在此官方代码示例和intel/sgx-ra-sample RA 示例中查看 Msg3 创建的详细信息。
在后者中,您可以使用以下命令了解如何生成报告sgx_create_report
:
sgx_status_t get_report(sgx_report_t *report, sgx_target_info_t *target_info)
{
#ifdef SGX_HW_SIM
return sgx_create_report(NULL, NULL, report);
#else
return sgx_create_report(target_info, NULL, report);
#endif
}
In both cases, second argument sgx_report_data_t *report_data
is NULL
and can be replaced by pointer to arbitrary input. This is where you want to put your public key or any other data.