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

How to prove that certain data is calculated(or generated) inside Enclave(Intel SGX)?

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

我尝试在飞地内生成非对称密钥对(私钥可能对外部不可见),并且

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

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

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

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

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

The 64 byte data buffer is free form data and you can supply any information in that buffer that you would like to have identified as being in the possession and protection envelope of the enclave when the report/quote was generated. You can thus use this buffer to convey whatever information you would like to a verifying party. (Source)

可以通过跟踪以下结构找到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;

Quote 是远程认证协议 Msg3(客户端到服务器)的一部分。您可以在 this official Code Sample and in the 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
}

在这两种情况下,second argument sgx_report_data_t *report_data 都是 NULL 并且可以替换为指向任意输入的指针。这是您要放置 public 密钥或任何其他数据的地方。