1

如何证明某些数据是在 Enclave(英特尔 SGX)内部计算(或生成)的?

我试图在 enclave 内生成非对称密钥对(私钥可能对外不可见),并且

然后用证据公开公钥(我猜是引用或远程证明相关的东西)。

我知道远程证明是如何进行的,但是我无法提出应用远程证明来验证 enclave 生成​​的数据。

英特尔 SGX 是否可能出现这种情况?

4

1 回答 1

2

report_data您可以通过将其放置在报告证明期间生成的报价字段中来证明公钥的来源。

_quote_t.report_data可用于证明任意数据:

64 字节数据缓冲区是自由格式数据,您可以在该缓冲区中提供您希望在生成报告/报价时识别为在飞地的拥有和保护信封中的任何信息。因此,您可以使用此缓冲区向验证方传达您想要的任何信息。(来源)

report_data可以通过跟踪以下结构找到该字段:

sgx_key_exchange.h

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;

sgx_quote.h

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.

于 2019-11-29T16:18:22.190 回答