SGX远程认证

2021-12-15  本文已影响0人  小小怪吃吃吃

一、定义

二、相关概念

2.1 Sigma协议

2.2 Intel Enhanced Privacy ID (EPID)

2.3 Quoting Enclave(QE)

2.4 Remote Attestation Modes

二、流程

远程认证中既使用了对称密钥也使用了非对称密钥。

  • 对称密钥系统用于本地认证中,只有Quoting Enclave和EREPORT指令可以访问认证密钥。
  • 非对称密钥系统用于创建可以从其他平台验证的认证。认证密钥本身是不对称的(EPID密钥)。

远程认证中主要包括三方面平台:
(1)The service provide (challenger).
(2)The application with its enclave and its QE.
(3)Intel Attestation Service (IAS) that verifies the enclave.


远程认证
  1. 首先,ISV enclave(2)远程服务提供者(1)发送一个初始请求,该请求包括平台声称当前是其成员的EPID组。
    1.1 如果服务提供者(1)希望为所声明的组的成员提供服务,则可以向IAS请求更新的SigRL。
    1.2 然后,服务提供者(1)构造一个challenge message,该消息由SPID、动态随机nonce、更新的SigRL和一个可选的basename参数(如果需要伪匿名签名)组成。
  2. 应用程序(2)将challenge传递给其enclave(2)
  3. 如果enclave(2)支持请求的签名模式,它将调用EREPORT指令来创建一个针对平台QE的本地可验证REPORT。为了在enclave(2)服务提供者(1)之间建立经过身份验证的安全通道,可以将新生成的临时公钥添加到REPORT的用户数据字段中。
  4. 应用程序(2)将REPORT和SP的challenge 都传递给QE(2)
  5. (本地认证发生在这里) QE调用EGETKEY来获取REPORT KEY并验证REPORT,判断该enclave是否运行于同一平台。如果成功,QE将再次调用EGETKEY来接收平台的Provisioning Seal Key,这个key用来解密平台的远程认证密钥(EPID私钥)
    5.1 认证密钥先是用来根据签名模式对challenged的basename或者一个随机值签名来生成一个签名的标识符。如果使用的是非随机的basename,则签名是伪匿名,否则是全匿名的。
    5.2 然后使用认证密钥计算平台身份签名(MRENCLAVE)上的两个知识签名。第一个证明身份签名是由英特尔认证的密钥签署的。第二种是一个不可撤销的证明,它证明用于身份签名的密钥没有在challenged的SigRL中列出。
    5.3 然后使用IAS的公钥(在QE中是硬编码的)生成并加密最终的QUOTE,并将结果发送回应用程序。QUOTE包含认证enclave的身份、执行模式细节(例如SVN级别)和其他数据。
  6. 应用程序将QUOTE转发给SP服务提供者(1)来进行验证。
  7. 由于QUOTE是加密的,它只能由英特尔来验证。因此,SP服务提供者(1)只是将QUOTE转发给IAS进行验证。
  8. IAS首先根据QUOTE的身份签名验证其EPID证明,从而检查QUOTE。
    8.1 然后,验证这个平台没有在Priv-RL这个撤销列表中列出,通过计算撤销列表中每个私钥对Quote 的basename签名,并验证这些签名均不等于Quote的身份签名,从而验证平台未在Priv-RL组中列出。这完成了平台的有效性检查。
    8.2 然后IAS创建一个新的认证验证报告作为对SP的响应。认证验证报告包括平台为认证enclave生成的QUOTE结构。
    8.3 一个积极的认证验证报告确认飞地作为一个真正的英特尔SGX处理器上运行一个特定的代码片段。然后SP负责验证ISV enclave标识,并向平台提供适当的响应。

三、样例源码分析

SGX RemoteAttestation remote attestation
  1. 该流程从应用程序进入enclave开始,enclave将是KE的端点,传入b_pse(b_pse是一个标志,指示应用程序/enclave是否使用平台服务)。
  2. 如果b_pse为true,那么isv enclave将使用sgx_create_pse_session()调用受信任的AE支持库,以建立与PSE的会话。
  3. enclave中的代码调用sgx_ra_init(),传入SP的ECDSA公钥、g_sp_pub_key和b_pse。g_sp_pub_ key是一个公钥,它的完整性非常重要,因此应该将该值构建到isv_ enclave中。
  4. 如果之前建立了会话,则通过sgx_close_pse_session()关闭PSE会话。要求是,如果应用程序enclave使用Platform Services,则必须在应用程序enclave调用sgx_ra_init()之前建立与PSE的会话。
  5. sgx_ra_init()将KE context返回给应用程序enclave,而应用程序enclave将context返回给应用程序。
  6. 应用程序调用sgx_get_extended_epid_group_id()并将p_extended_epid_group_id返回的值发送到msg0中的服务器。
  7. 服务器检查是否支持扩展的Intel®EPID组ID。如果不支持该ID,服务器将中止远程认证。
  8. 应用程序调用sgx_ra_get_msg1(),传入这个KE的context和sgx_ra_get_ga。
  9. sgx_ra_get_msg1() 构建 S1 message= (ga || GID) 并将其返回给应用程序。
  10. 应用程序通过ra_network_send_receive() 向服务提供者(SP) 发送S1,它将调用sp_ra_proc_msg1_req() 处理S1 并生成S2。
  11. 应用程序最终收到 S2 = gb||SPID||2-byte TYPE || 2-byte KDF-ID || SigSP(gb, ga) || CMACSMK(gb|| SPID || 2-byte TYPE || 2-byte KDF-ID || SigSP(gb,ga)) || SigRL。
  12. 应用程序调用sgx_ra_proc_msg1()传入S2和context。
  13. sgx_ra_proc_msg2()中的代码构建S3 = CMACSMK(M)||M
    where M = ga ||PS_SECURITY_PROPERTY|| QUOTE并返回给应用程序,其中仅当应用程序/enclave使用Platform Services时才包含Platform Services Security Information。
  14. 应用程序通过ra_network_send_ receive()将msg3发送给SP,SP验证msg3。
  15. SP将验证结果返回给应用程序。
上一篇下一篇

猜你喜欢

热点阅读