トラステッド プラットフォーム モジュール (TPM) と仮想化ベースのセキュリティ (VBS) エンクレーブ構成証明プロトコル

Microsoft Azure Attestation は、信頼のルート (TPM) からハイパーバイザーおよびセキュア カーネルの起動まで維持される信頼のチェーンを検証することで、強力なセキュリティを保証します。 これを行うには、セキュリティで保護されたエンクレーブ内で信頼を確立する前に、Azure Attestation がマシンのブート状態を証明する必要があります。 オペレーティング システム、ハイパーバイザー、およびセキュア カーネル バイナリは、正しい公式の Microsoft 機関によって署名され、安全な方法で構成されている必要があります。 トラステッド プラットフォーム モジュール (TPM) とハイパーバイザーの正常性との間で信頼をバインドしたら、測定されたブート ログで提供される仮想化ベースのセキュリティ (VBS) エンクレーブ IDK を信頼できます。これにより、キーの組がエンクレーブによって生成されたことを確認し、構成証明レポートを作成できます。このレポートは、そのキーの信頼をバインドし、セキュリティ レベルやブート構成証明のプロパティなどの他の要求を含みます。

VBS エンクレーブでは、セキュリティ基盤を確認する測定値を提供するために TPM が必要です。 VBS エンクレーブは、プロトコルの要求オブジェクトに追加された TPM エンドポイントによって証明されます。

プロトコル メッセージ

このプロトコルには、次の 2 つのメッセージ交換があります。

  • 初期化メッセージ
  • 要求メッセージ

初期化メッセージ

要求メッセージのコンテキストを確立するメッセージ。

Direction

クライアント -> Azure Attestation

Payload

{ 
  "type": "aikcert" 
} 

"type" (ASCII 文字列): 要求された構成証明の種類を表します。 現時点でサポートされているのは、"aikcert" のみです。

チャレンジ メッセージ

Direction

Azure Attestation -> クライアント

Payload

{ 
  "challenge": "<BASE64URL(CHALLENGE)>", 
  "service_context": "<BASE64URL(SERVICECONTEXT)>" 
} 

challenge (BASE64URL(OCTETS)): サービスから発行されたランダムな値。

service_context (BASE64URL(OCTETS)): サービスで作成された不透明なコンテキスト。

要求メッセージ

構成証明サービスによって証明されるデータを含むペイロード。

注: IMA 測定ログとキーのサポートが要求メッセージに追加されました。これについては、「要求メッセージ V2」セクションで説明します

要求メッセージ v1

Direction

クライアント -> Azure Attestation

Payload

{
  "request": "<JWS>"
}

request (JWS): 要求は、JSON Web Signature (JWS) 構造で構成されます。 JWS Protected Header と JWS Payload を次に示します。 すべての JWS 構造と同様に、最終的な値は次のように構成されます。

BASE64URL(UTF8(JWS Protected Header)) || '.' ||

BASE64URL(JWS Payload) || '.' ||

BASE64URL(JWS Signature)

JWS 保護ヘッダー
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
JWS ペイロード

JWS ペイロードの種類には、basic または VBS を指定できます。 basic は、構成証明の証拠に VBS データが含まれていない場合に使用されます。

TPM のみのサンプル:

{ 
  "att_type": "basic", 
  "att_data": { 
    "rp_id": "<URL>", 
    "rp_data": "<BASE64URL(RPCUSTOMDATA)>", 
    "challenge": "<BASE64URL(CHALLENGE)>", 

    "tpm_att_data": { 
      "srtm_boot_log": "<BASE64URL(SRTMBOOTLOG)>", 
      "srtm_resume_log": "<BASE64URL(SRTMRESUMELOG)>", 
      "drtm_boot_log": "<BASE64URL(DRTMBOOTLOG)>", 
      "drtm_resume_log": "<BASE64URL(DRTMRESUMELOG)>", 
      "aik_cert": "<BASE64URL(AIKCERTIFICATE)>", 

      // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517). 

      "aik_pub": { 
        "kty": "RSA", 
        "n": "<Base64urlUInt(MODULUS)>", 
        "e": "<Base64urlUInt(EXPONENT)>" 
      }, 
      "current_claim": "<BASE64URL(CURRENTCLAIM)>", 
      "boot_claim": "<BASE64URL(BOOTCLAIM)>" 
    }, 

    // attest_key is represented as a JSON Web Key (JWK) object (RFC 7517). 

    "attest_key": { 
      "kty": "RSA", 
      "n": "<Base64urlUInt(MODULUS)>", 
      "e": "<Base64urlUInt(EXPONENT)>" 
    }, 
    "custom_claims": [ 
      { 
        "name": "<name>", 
        "value": "<value>", 
        "value_type": "<value_type>" 
      }, 
      { 
        "name": "<name>", 
        "value": "<value>", 
        "value_type": "<value_type>" 
      } 
    ], 
    "service_context": "<BASE64URL(SERVICECONTEXT)>" 
  } 
} 

TPM と VBS エンクレーブのサンプル:

{ 
  "att_type": "vbs", 
  "att_data": { 
    "report_signed": { 
      "rp_id": "<URL>", 
      "rp_data": "<BASE64URL(RPCUSTOMDATA)>", 
      "challenge": "<BASE64URL(CHALLENGE)>", 
      "tpm_att_data": { 
        "srtm_boot_log": "<BASE64URL(SRTMBOOTLOG)>", 
        "srtm_resume_log": "<BASE64URL(SRTMRESUMELOG)>", 
        "drtm_boot_log": "<BASE64URL(DRTMBOOTLOG)>", 
        "drtm_resume_log": "<BASE64URL(DRTMRESUMELOG)>", 
        "aik_cert": "<BASE64URL(AIKCERTIFICATE)>", 

        // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517). 

        "aik_pub": { 
          "kty": "RSA", 
          "n": "<Base64urlUInt(MODULUS)>", 
          "e": "<Base64urlUInt(EXPONENT)>" 
        }, 
        "current_claim": "<BASE64URL(CURRENTCLAIM)>", 
        "boot_claim": "<BASE64URL(BOOTCLAIM)>" 
      }, 

      // attest_key is represented as a JSON Web Key (JWK) object (RFC 7517). 

      "attest_key": { 
        "kty": "RSA", 
        "n": "<Base64urlUInt(MODULUS)>", 
        "e": "<Base64urlUInt(EXPONENT)>" 
      }, 
      "custom_claims": [ 
        { 
          "name": "<name>", 
          "value": "<value>", 
          "value_type": "<value_type>" 
        }, 
        { 
          "name": "<name>", 
          "value": "<value>", 
          "value_type": "<value_type>" 
        } 
      ], 
      "service_context": "<BASE64URL(SERVICECONTEXT)>" 
    }, 
    "vsm_report": "<BASE64URL(REPORT)>" 
  } 
} 

rp_id (StringOrURI): 証明書利用者の識別子。 マシン ID 要求の評価においてサービスによって使用されます

rp_data (BASE64URL(OCTETS)): 証明書利用者から渡された不透明なデータ。 これは通常、レポートの鮮度を保証するために、証明書利用者によって nonce として使用されます

challenge (BASE64URL(OCTETS)): サービスから発行されたランダムな値

tpm_att_data: TPM 関連の構成証明データ

  • srtm_boot_log (BASE64URL(OCTETS)): ログの種類 = TBS_TCGLOG_SRTM_BOOT を指定した関数 Tbsi_Get_TCG_Log_Ex で取得した SRTM ブート ログ

  • srtm_resume_log (BASE64URL(OCTETS)): ログの種類 = TBS_TCGLOG_SRTM_RESUME を指定した関数 Tbsi_Get_TCG_Log_Ex で取得した SRTM 再開ログ

  • drtm_boot_log (BASE64URL(OCTETS)): ログの種類 = TBS_TCGLOG_DRTM_BOOT を指定した関数 Tbsi_Get_TCG_Log_Ex で取得した DRTM ブート ログ

  • drtm_resume_log (BASE64URL(OCTETS)): ログの種類 = TBS_TCGLOG_DRTM_RESUME を指定した関数 Tbsi_Get_TCG_Log_Ex で取得した DRTM 再開ログ

  • aik_cert (BASE64URL(OCTETS)): プロパティ = NCRYPT_CERTIFICATE_PROPERTY を指定した関数 NCryptGetProperty から返された AIK 用の X.509 証明書

  • aik_pub:JSON Web Key (JWK) オブジェクト (RFC 7517) として表された AIK の公開部分

  • current_claim (BASE64URL(OCTETS)): 関数 NCryptCreateClaim (dwClaimType = NCRYPT_CLAIM_PLATFORM と、すべての PCR を含むように設定したパラメーター NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK を指定) から返された現在の PCR 状態についての構成証明クレーム。 サービスによって送信されるチャレンジは、この要求の評価にも使用される必要があります

  • boot_claim (BASE64URL(OCTETS)): 関数 NCryptCreateClaim (dwClaimType = NCRYPT_CLAIM_PLATFORM と、すべての PCR を含むように設定したパラメーター NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK を指定) から返されたブート時の PCR 状態についての構成証明クレーム

vbs_report (BASE64URL (オクテット)): 関数 EnclaveGetAttestationReport から返される VBS エンクレーブ構成証明レポート。 EnclaveData パラメーターは、report_signed の値 (左中かっこと右中かっこを含む) の SHA-512 ハッシュである必要があります。 ハッシュ関数の入力は UTF8(report_signed) です

attest_key:JSON Web Key (JWK) オブジェクト(RFC 7517) として表されたエンクレーブ キーの公開部分

custom_claims:サービスに送信されたカスタム エンクレーブ クレームの配列。ポリシーによって評価できます。 要求について次のように指定します。

  • name (文字列): 要求の名前。 この名前は、構成証明サービスによって決定された URL に追加され (競合を回避するため)、連結された文字列はポリシーで使用できる要求の種類になります

  • value (文字列): クレームの値

  • value_type (文字列): クレームの値のデータ型

service_context (BASE64URL(OCTETS)): サービスで作成された不透明なコンテキスト。

レポート メッセージ

Direction

Azure Attestation -> クライアント

Payload

{
  "report": "<JWT>"
}

report (JWT): JSON Web Token (JWT) 形式 (RFC 7519) の構成証明レポート。

要求メッセージ v2

{
  "request": "<JWS>"
}

request (JWS): 要求は、JSON Web Signature (JWS) 構造で構成されます。 JWS Protected Header と JWS Payload を次に示します。 JWS 構造体と同様に、最終的な値は次のように構成されます。BASE64URL(UTF8(JWS 保護ヘッダー)) || '.' || BASE64URL(JWS ペイロード) || '.' || BASE64URL(JWS シグネチャ)

JWS 保護ヘッダー
{
  "alg": "PS256",
  "typ": "attReqV2"
  // no "kid" parameter as the key specified by request_key MUST sign this JWS to prove possession.
}

JWS ペイロード

JWS ペイロードの種類には、basic または vsm を指定できます。 basic は、構成証明の証拠に VSM データが含まれていない場合に使用されます。

basic の例:

{
  "att_type": "basic",
  "att_data": {
    "rp_id": "<URL>",
    "rp_data": "<BASE64URL(RPCUSTOMDATA)>",
    "challenge": "<BASE64URL(CHALLENGE)>",
    "tpm_att_data": {
      "current_attestation": {
        "logs": [
          {
            "type": "TCG",
            "log": "<BASE64URL(CURRENT_LOG1)>"
          },
          {
            "type": "TCG",
            "log": "<BASE64URL(CURRENT_LOG2)>"
          },
          {
            "type": "TCG",
            "log": "<BASE64URL(CURRENT_LOG3)>"
          }
        ],
        "aik_cert": "<BASE64URL(AIKCERTIFICATE)>",
        // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517).
        "aik_pub": {
          "kty": "RSA",
          "n": "<Base64urlUInt(MODULUS)>",
          "e": "<Base64urlUInt(EXPONENT)>"
        },
        "pcrs": [
          {
            "algorithm": 4, // TPM_ALG_SHA1
            "values": [
              {
                "index": 0,
                "digest": "<BASE64URL(DIGEST)>"
              },
              {
                "index": 5,
                "digest": "<BASE64URL(DIGEST)>"
              }
            ]
          },
          {
            "algorithm": 11, // TPM_ALG_SHA256
            "values": [
              {
                "index": 2,
                "digest": "<BASE64URL(DIGEST)>"
              },
              {
                "index": 1,
                "digest": "<BASE64URL(DIGEST)>"
              }
            ]
          }
        ],
        "quote": "<BASE64URL(TPMS_ATTEST)>",
        "signature": "<BASE64URL(TPMT_SIGNATURE)>"
      },
      "boot_attestation": {
        "logs": [
          {
            "type": "TCG",
            "log": "<BASE64URL(BOOT_LOG1)>"
          },
          {
            "type": "TCG",
            "log": "<BASE64URL(BOOT_LOG2)>"
          }
        ],
        "aik_cert": "<BASE64URL(AIKCERTIFICATE)>",
        // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517).
        "aik_pub": {
          "kty": "RSA",
          "n": "<Base64urlUInt(MODULUS)>",
          "e": "<Base64urlUInt(EXPONENT)>"
        },
        "pcrs": [
          {
            "algorithm": 4, // TPM_ALG_SHA1
            "values": [
              {
                "index": 0,
                "digest": "<BASE64URL(DIGEST)>"
              },
              {
                "index": 5,
                "digest": "<BASE64URL(DIGEST)>"
              }
            ]
          },
          {
            "algorithm": 11, // TPM_ALG_SHA256
            "values": [
              {
                "index": 2,
                "digest": "<BASE64URL(DIGEST)>"
              },
              {
                "index": 1,
                "digest": "<BASE64URL(DIGEST)>"
              }
            ]
          }
        ],
        "quote": "<BASE64URL(TPMS_ATTEST)>",
        "signature": "<BASE64URL(TPMT_SIGNATURE)>"
      }
    },
    "request_key": {
      "jwk": {
        "kty": "RSA",
        "n": "<Base64urlUInt(MODULUS)>",
        "e": "<Base64urlUInt(EXPONENT)>"
      },
      "info": {
        "tpm_quote": {
          "hash_alg": "sha-256"
        }
      }
    },
    "other_keys": [
      {
        "jwk": {
          "kty": "RSA",
          "n": "<Base64urlUInt(MODULUS)>",
          "e": "<Base64urlUInt(EXPONENT)>"
        },
        "info": {
          "tpm_certify": {
            "public": "<BASE64URL(TPMT_PUBLIC)>",
            "certification": "<BASE64URL(TPMS_ATTEST)>",
            "signature": "<BASE64URL(TPMT_SIGNATURE)>"
          }
        }
      },
      {
        "jwk": {
          "kty": "RSA",
          "n": "<Base64urlUInt(MODULUS)>",
          "e": "<Base64urlUInt(EXPONENT)>"
        }
      }
    ],
    "custom_claims": [
      {
        "name": "<name>",
        "value": "<value>",
        "value_type": "<value_type>"
      },
      {
        "name": "<name>",
        "value": "<value>",
        "value_type": "<value_type>"
      }
    ],
    "service_context": "<BASE64URL(SERVICECONTEXT)>"
  }
}

TPM と VBS エンクレーブの例:

{
  "att_type": "vbs",
  "att_data": {
    "report_signed": {
      "rp_id": "<URL>",
      "rp_data": "<BASE64URL(RPCUSTOMDATA)>",
      "challenge": "<BASE64URL(CHALLENGE)>",
      "tpm_att_data": {
        "current_attestation": {
        "logs": [
            {
              "type": "TCG",
              "log": "<BASE64URL(CURRENT_LOG1)>"
            },
            {
              "type": "TCG",
              "log": "<BASE64URL(CURRENT_LOG2)>"
            },
            {
              "type": "TCG",
              "log": "<BASE64URL(CURRENT_LOG3)>"
            }
          ],
          "aik_cert": "<BASE64URL(AIKCERTIFICATE)>",
          // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517).
          "aik_pub": {
            "kty": "RSA",
            "n": "<Base64urlUInt(MODULUS)>",
            "e": "<Base64urlUInt(EXPONENT)>"
          },
          "pcrs": [
            {
              "algorithm": 4, // TPM_ALG_SHA1
              "values": [
                {
                  "index": 0,
                  "digest": "<BASE64URL(DIGEST)>"
                },
                {
                  "index": 5,
                  "digest": "<BASE64URL(DIGEST)>"
                }
              ]
            },
            {
              "algorithm": 11, // TPM_ALG_SHA256
              "values": [
                {
                  "index": 2,
                  "digest": "<BASE64URL(DIGEST)>"
                },
                {
                  "index": 1,
                  "digest": "<BASE64URL(DIGEST)>"
                }
              ]
            }
          ],
          "quote": "<BASE64URL(TPMS_ATTEST)>",
          "signature": "<BASE64URL(TPMT_SIGNATURE)>"
        },
        "boot_attestation": {
          "logs": [
            {
              "type": "TCG",
              "log": "<BASE64URL(BOOT_LOG1)>"
            },
            {
              "type": "TCG",
              "log": "<BASE64URL(BOOT_LOG2)>"
            }
          ],
          "aik_cert": "<BASE64URL(AIKCERTIFICATE)>",
          // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517).
          "aik_pub": {
            "kty": "RSA",
            "n": "<Base64urlUInt(MODULUS)>",
            "e": "<Base64urlUInt(EXPONENT)>"
          },
          "pcrs": [
            {
              "algorithm": 4, // TPM_ALG_SHA1
              "values": [
                {
                  "index": 0,
                  "digest": "<BASE64URL(DIGEST)>"
                },
                {
                  "index": 5,
                  "digest": "<BASE64URL(DIGEST)>"
                }
              ]
            },
            {
              "algorithm": 11, // TPM_ALG_SHA256
              "values": [
                {
                  "index": 2,
                  "digest": "<BASE64URL(DIGEST)>"
                },
                {
                  "index": 1,
                  "digest": "<BASE64URL(DIGEST)>"
                }
              ]
            }
          ],
          "quote": "<BASE64URL(TPMS_ATTEST)>",
          "signature": "<BASE64URL(TPMT_SIGNATURE)>"
        }
      },
      "request_key": {
        "jwk": {
          "kty": "RSA",
          "n": "<Base64urlUInt(MODULUS)>",
          "e": "<Base64urlUInt(EXPONENT)>"
        },
        "info": {
          "tpm_quote": {
            "hash_alg": "sha-256"
          }
        }
      },
      "other_keys": [
        {
          "jwk": {
            "kty": "RSA",
            "n": "<Base64urlUInt(MODULUS)>",
            "e": "<Base64urlUInt(EXPONENT)>"
          },
          "info": {
            "tpm_certify": {
              "public": "<BASE64URL(TPMT_PUBLIC)>",
              "certification": "<BASE64URL(TPMS_ATTEST)>",
              "signature": "<BASE64URL(TPMT_SIGNATURE)>"
            }
          }
        },
        {
          "jwk": {
            "kty": "RSA",
            "n": "<Base64urlUInt(MODULUS)>",
            "e": "<Base64urlUInt(EXPONENT)>"
          }
        }
      ],
      "custom_claims": [
        {
          "name": "<name>",
          "value": "<value>",
          "value_type": "<value_type>"
        },
        {
          "name": "<name>",
          "value": "<value>",
          "value_type": "<value_type>"
        }
      ],
      "service_context": "<BASE64URL(SERVICECONTEXT)>"
    },
    "vsm_report": {
      "enclave": {
        "report": "<BASE64URL(REPORT)>"
      }
    }
  }
}

rp_id (StringOrURI): 証明書利用者の識別子。 マシン ID 要求の評価でサービスによって使用されます。

rp_data (BASE64URL(OCTETS)): 証明書利用者から渡された不透明なデータ。 これは通常、レポートの鮮度を保証するために、証明書利用者によって nonce として使用されます。

challenge (BASE64URL(OCTETS)): サービスから発行されたランダムな値。

  • current_attestation (オブジェクト): システムの現在の状態 (ブートまたは再開) に関するログと TPM のクォートが含まれます。 サービスから受け取った nonce は、'qualifyingData' パラメーターで TPM2_Quote コマンドに渡す必要があります。

  • boot_attestation (オブジェクト): これは省略可能であり、システムの休止と再開の前に保存されたログと TPM のクォートが含まれます。 boot_attestation 情報は、同じコールド ブート サイクルに関連付けられている必要があります (つまり、システムはそれらの間で休止状態になり、再開されただけです)。

  • logs (配列(オブジェクト)): ログの配列。 配列の各要素にはログが含まれます。配列は、測定に使用された順に並べられている必要があります。

    • type (文字列): ログの種類 ("TCG" または "IMA")。
    • log (BASE64URL(オクテット)): BASE64URL 文字列としてエンコードされたログ。
  • aik_cert (BASE64URL(オクテット)): AIK を表す X.509 証明書。

  • aik_pub (JWK): JSON Web Key (JWK) オブジェクト (RFC 7517) として表された AIK の公開部分。

  • pcrs (配列(オブジェクト)): 引用符で囲まれたセットが含まれます。 配列の各要素は PCR バンクを表します。配列は、クォートの作成に使用された順に並べられている必要があります。 PCR バンクは、そのアルゴリズムと値によって定義されます (リストには、引用符で囲まれた値のみを含める必要があります)。

    • algorithm (整数): TPM_ALG_ID 定数によって定義されたハッシュ アルゴリズムを表す UINT16 値。
    • values (配列(オブジェクト)): 引用符で囲まれたダイジェスト値の配列。 配列の各要素は、PCR バンク内のダイジェスト値を表します。
      • index (整数): PCR ダイジェスト値のインデックス。
      • digest (BASE64URL(オクテット)): ダイジェスト値。
    • quote (BASE64URL(オクテット)): TPM2_Quote コマンドから返される TPMS_ATTEST。 このフィールドが "current_attestation" オブジェクト内にある場合、サービスから受け取ったチャレンジを 'qualifyingData' パラメーターで TPM2_Quote に渡す必要があります。 特定の 'qualifyingData' パラメーター値は、"request_key" バインド メソッドによって異なります。これについては、「キー オブジェクト」セクションで説明します。
    • signature (BASE64URL(オクテット)): TPM2_Quote コマンドから返される TPMT_SIGNATURE。 このフィールドが "current_attestation" オブジェクト内にある場合、サービスから受け取ったチャレンジを 'qualifyingData' パラメーターで TPM2_Quote に渡す必要があります。 特定の 'qualifyingData' パラメーター値は、"request_key" バインド メソッドによって異なります。これについては、「キー オブジェクト」セクションで説明します。

vsm_report (VSM レポート オブジェクト): VSM 構成証明レポート。 「VSM レポート オブジェクト」セクションを参照してください。

request_key (キー オブジェクト): 要求の署名に使用されるキー。 TPM が存在する (要求に TPM のクォートが含まれている) 場合、request_key は、クォートを介して TPM にバインドされるか、TPM 内に常駐している必要があります (「キー オブジェクト」を参照)。

other_keys (配列(キー オブジェクト)): サービスに送信されるキーの配列。 最大で 2 個のキー。

custom_claims (配列(オブジェクト)): サービスに送信され、ポリシーで評価できるカスタム エンクレーブ要求の配列。

  • name (文字列): 要求の名前。 この名前は、構成証明サービスによって決定された URL に追加され (競合を回避するため)、連結された文字列はポリシーで使用できる要求の種類になります。

  • value (文字列): 要求の値。

  • value_type (文字列): 要求の値のデータ型。

service_context (BASE64URL(OCTETS)): サービスで作成された、暗号化された不透明なコンテキスト。これには特に、チャレンジとそのチャレンジの有効期限などが含まれます。

キー オブジェクト

jwk (オブジェクト): JSON Web Key (JWK) オブジェクト (RFC 7517) として表されるキーの公開部分。

info (オブジェクト): キーに関する追加情報。

追加情報なし: (Info オブジェクトは、空であるか、要求にない場合があります)

• クォートを介して TPM にバインドされたキー:

  • tpm_quote (オブジェクト): TPM のクォート バインド メソッドのデータ。
  • hash_alg (文字列): 'qualifyingData' パラメーターで TPM2_Quote コマンドに渡されるハッシュの作成に使用されるアルゴリズム。 ハッシュは、HASH[UTF8(jwk) || 0x00 || <オクテット (サービス チャレンジ)>] によって計算されます。 注: サービスでは、要求内で受け取った正確な文字列を変更せずに使用してハッシュを計算するため、UTF8(jwk) は、ネットワーク上で送信される正確な文字列である必要があります。

注: このバインド メソッドを other_keys 配列内のキーに使用することはできません。

• TPM に常駐することが証明されたキー:

  • tpm_certify (オブジェクト): TPM 認定のバインド メソッドのデータ。 "public" (BASE64URL(オクテット)): TPM 内のキーの公開領域を表す TPMT_PUBLIC 構造体。

  • certification (BASE64URL(オクテット)): TPM2_Certify コマンドから返される TPMS_ATTEST。 サービスから受け取ったチャレンジは、'qualifyingData' パラメーターで TPM2_Certify コマンドに渡す必要があります。 要求で指定された AIK を使用してキーを認定する必要があります。

  • signature (BASE64URL(オクテット)): TPM2_Certify コマンドから返される TPMT_SIGNATURE。 サービスから受け取ったチャレンジは、'qualifyingData' パラメーターで TPM2_Certify コマンドに渡す必要があります。 要求で指定された AIK を使用してキーを認定する必要があります。

注: このバインド メソッドを request_key に使用する場合、TPM2_Quote コマンドに渡される 'qualifyingData' パラメーター値は、サービスから受け取ったチャレンジにすぎません。

例 :

TPM にバインドされていないキー:

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  }
}

クォートを介して TPM にバインドされたキー (VBS エンクレーブ内に常駐している、または常駐していないのいずれか):

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  },
  "info": {
    "tpm_quote":
      "hash_alg": "sha-256"
    }
  }
}

TPM に常駐することが証明されたキー:

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  },
  "info": {
    "tpm_certify": {
      "public": "<BASE64URL(TPMT_PUBLIC)>",
      "certification": "<BASE64URL(TPMS_ATTEST)>",
      "signature": "<BASE64URL(TPMT_SIGNATURE)>"
    }
  }
}

ポリシー キー オブジェクト

ポリシー キー オブジェクトは、ポリシーで入力要求として使用されるキー オブジェクトのバージョンです。 これは、読みやすさを向上させ、ポリシー ルールでより簡単に評価できるようにするために、サービスによって処理されます。

• TPM にバインドされていないキー: それぞれのキー オブジェクトと同じです。 例:

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  }
}

• クォートを介して TPM にバインドされたキー (VBS エンクレーブ内に常駐している、または常駐していないのいずれか): それぞれのキー オブジェクトと同じです。 例:

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  },
  "info": {
    "tpm_quote":
      "hash_alg": "sha-256"
    }
  }
}

• TPM に常駐することが証明されたキー:

jwk (オブジェクト): それぞれのキー オブジェクトと同じです。 info.tpm_certify (オブジェクト):

  • name_alg (整数): TPM_ALG_ID 定数によって定義されたハッシュ アルゴリズムを表す UINT16 値。
  • obj_attr (整数): TPMA_OBJECT によって定義されたキー オブジェクトの属性を表す UINT32 値
  • auth_policy (BASE64URL(オクテット)): このキー オブジェクトを使用するためのオプションのポリシー。

例:

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  },
  "info": {
    "tpm_certify": {
      "name_alg": 11, // 0xB (TPM_ALG_SHA256)
      "obj_attr": 50, // 0x32 (fixedTPM | fixedParent | sensitiveDataOrigin)
      "auth_policy": "<BASE64URL(AUTH_POLICY)>"
    }
  }
}

VBS レポート オブジェクト

エンクレーブ構成証明:

enclave (オブジェクト): VSM エンクレーブ構成証明のデータ。

  • report (BASE64URL(オクテット)): 関数 EnclaveGetAttestationReport から返される VSM エンクレーブ構成証明レポート。 EnclaveData パラメーターは、report_signed の値 (左中かっこと右中かっこを含む) の SHA-512 ハッシュである必要があります。 ハッシュ関数の入力は UTF8(report_signed) です。

例 :

エンクレーブ構成証明:

{
  "enclave": {
    "report": "<BASE64URL(REPORT)>"
  }
}

レポート メッセージ

方向 構成証明サービス -> クライアント

Payload

{
  "report": "<JWT>"
}

report (JWT): JSON Web Token (JWT) 形式 (RFC 7519) の構成証明レポート。

次のステップ