Enclave Key (EK)
Overview
Enclave Key(EK)はLCP Enclave内でsecp256k1 curveを用いて生成される署名鍵である。EKの秘密鍵(EKPriv)は決してEnclave外で読み取ることはできない。なお、この文書ではEKの秘密鍵をEKもしくはEKPriv、公開鍵をEKPubと呼び、EKPubからEthereumのaddressに派生させたものをEKAddrと呼ぶ。
ELCは、この鍵を用いてcommitmentに対してsignを行うことでcommitment proofとしてsignatureを生成する。このsignatureは、on-chainのLCP Clientにより検証される。
Key generation
EKの生成は、LCP Nodeの起動後にAppを介したGenerateEnclaveKey
commandの実行により行われる。EMにより生成されたEKはLCP Node内でSGXが提供するSealing機能を用いて暗号化した上で保存される。なお、Enclave内での秘密鍵の生成のためのシードには、sgx_read_rand
(内部ではRDRAND)を用いる。また、Sealing Policyとしては、MRENCLAVE policyを用いる。これにより、LCP Enclaveの更新後に以前のバージョンで暗号化されたEKを再利用することを防ぐ。
Remote Attestation
Remote Attestationは、Enclave内の実行の完全性を外部のpartyに証明可能にするための機能である。LCPでは、chain上のLCP Clientが期待されるEnclaveで生成されたEKであることを検証可能にするためにRemote Attestationを利用する。
LCP EnclaveはEKPubから派生したEKAddrをreport dataとして含むQuoteを生成し、Remote AttestationによりVerifiable Quoteを生成する。このVerifiable QuoteはQuoteに含まれるMRENCLAVEと一致するenclaveが生成したreport dataであることを検証可能にする。なお、このRemote Attestationの実行は、新しいEKの生成ごとに行う必要がある。
次の図は、EKを生成し、IASを利用してEKAddrを含むQuoteに対するAttestation Verification Report(AVR. cf. https://api.trustedservices.intel.com/documents/sgx-attestation-api-spec.pdf )を得るフローである。
各ステップは次のようになる
- Appは
GenerateEnclaveKey
commandをEnclaveに送信する。 - EnclaveはEKを生成し、Sealing Keyを用いて暗号化し、Sealed EKを生成する。
- EnclaveはEKからEKAddrを生成し、Report Dataとして含めてQuoting Enclave(QE)へのReportを作成する。
- EnclaveはAppにReportとシーリングされたEKを返す。AppはこれらをDBに保存する。
- Appは、Quoting Enclave(QE)にReportを渡してQuoteの作成を要求する。
- QEは、Attestation Keyを使ってReportに署名を行い、Quoteを作成し、Appに返す。
以下のステップは、IASをはじめとする外部のAttestation Serviceを利用する場合のみ必要なことに注意。DCAP(ECDSA Attestation)の場合は、6で得られたQuoteを外部検証可能なVerifiable Quoteとする。
- Appは得られたQuoteをIASに送信する。
- IASは、Quoteの検証を行い、QuoteとEnclaveの検証結果で構成されるレポートに対して署名を生成する。そして、それらのデータと署名を含んだAttestation Verification Report(AVR)を返す。署名に用いられる鍵はIntelが公開する鍵によりcertifyされている。そのため、AVRはブロックチェーンのスマートコントラクトをはじめとした外部のpartyにより検証可能である。
Relayerによりこの得られたAVRはLCP Clientに送信され、検証された上でEKAddrをLCP Client上に登録する。このプロセスの詳細はRegisterEnclaveKeyで述べる。なお、LCP Clientは、AVRを検証して得られたEKをRAのtimestampを基準に有効期限をつけて保存する。Relayerが参照するEKの有効期限が切れた場合は、再度上記フローを行い、新しいEKを登録する。