共用方式為


信賴平臺模組 (TPM) 和虛擬化型安全性(VBS) 記憶體保護區證明通訊協定

Microsoft Azure 證明藉由驗證信任鏈結,從根信任目錄維護到 Hypervisor 的啟動和安全核心,以確保強大的安全性。 若要這樣做,Azure 證明必須證明電腦的開機狀態,才能在安全記憶體保護區中建立信任。 作業系統、Hypervisor 和安全核心二進位檔必須由正確的官方 Microsoft 授權單位簽署,並以安全的方式設定。 在信任平臺模組 (TPM) 與 Hypervisor 健康情況之間系結信任之後,我們可以信任在測量開機記錄中提供的虛擬化型安全性(VBS) 記憶體保護區 IDK,如此一來,我們就可以驗證記憶體保護區產生的金鑰組,並產生證明報告,以系結該金鑰的信任,並包含其他宣告,例如安全性層級和開機證明屬性。

VBS 記憶體保護區需要 TPM 提供測量來驗證安全性基礎。 VBS 記憶體保護區是由 TPM 端點證明,並新增至通訊協定中的要求物件。

通訊協定訊息

通訊協定有兩個訊息交換:

  • Init 訊息
  • 要求訊息

Init 訊息

要建立要求訊息內容的訊息。

方向

用戶端 - > Azure 證明

承載

{ 
  "type": "aikcert" 
} 

「type」 (ASCII 字串):表示所要求的證明類型。 目前僅支援 「aikcert」。

挑戰訊息

方向

Azure 證明 - >客戶

承載

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

挑戰 (BASE64URL(OCTETS)):服務發出的隨機值。

service_coNtext (BASE64URL(OCTETS)):服務所建立的不透明內容。

要求訊息

承載,包含證明服務要證明的資料。

注意:已將 IMA 測量記錄和金鑰的支援新增至要求訊息,而且可在要求訊息 V2 區段中找到

要求訊息 v1

方向

用戶端 - > Azure 證明

承載

{
  "request": "<JWS>"
}

request (JWS):要求是由 JSON Web 簽章 (JWS) 結構所組成。 JWS 受保護的標頭和 JWS 承載如下所示。 如同任何 JWS 結構,最終值包含:

BASE64URL(UTF8(JWS 受保護的標頭)) ||'.' ||

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

BASE64URL(JWS 簽名)

JWS 受保護的標頭
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
JWS 承載

JWS 承載的類型可以是基本或 VBS。 當證明辨識項不包含 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):信賴憑證者識別碼。 服務在電腦識別碼宣告的計算中使用

rp_data (BASE64URL(OCTETS)):信賴憑證者傳遞的不透明資料。 這通常由信賴憑證者用來作為 Nonce,以確保報表的新鮮度

挑戰 (BASE64URL(OCTETS)):服務發出的隨機值

tpm_att_data:TPM 相關證明資料

  • srtm_boot_log (BASE64URL(OCTETS)) :使用記錄類型 = Tbsi_Get_TCG_Log_Ex所擷取的 SRTM 開機記錄檔 = TBS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL(OCTETS)) :SRTM 會繼續記錄檔,如函式Tbsi_Get_TCG_Log_Ex所擷取,記錄類型 = TBS_TCGLOG_SRTM_RESUME

  • drtm_boot_log (BASE64URL(OCTETS)) :使用記錄類型 = TBS_TCGLOG_DRTM_BOOT 函式Tbsi_Get_TCG_Log_Ex擷取的 DRTM 開機記錄

  • drtm_resume_log (BASE64URL(OCTETS)) :DRTM 會繼續記錄檔,如函式Tbsi_Get_TCG_Log_Ex所擷取,記錄類型 = TBS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL(OCTETS)) :由函式 NCryptGetProperty 傳回的 AIK X.509 憑證,屬性 = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub :AIK 的公用部分,以 JSON Web 金鑰 (JWK) 物件表示 (RFC 7517)

  • current_claim (BASE64URL(OCTETS)) :由具有 dwClaimType = NCRYPT_CLAIM_PLATFORM 且參數NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK設為包含所有 PCR 之函式 NCryptCreateClaim 所傳回之目前PCR 狀態的證明宣告。 服務所傳送的挑戰也應該用於此宣告的計算中

  • boot_claim (BASE64URL(OCTETS)) :由具有 dwClaimType = NCRYPT_CLAIM_PLATFORM 且參數NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK設為包含所有 PCR 的函式 NCryptCreateClaim 所傳回,在開機時針對 PCR 狀態的證明宣告

vsm_report (BASE64URL(OCTETS)):VBS 記憶體保護區證明報告,如函式記憶體保護區GetAttestationReport 所傳回。 EnclaveData 參數必須是 report_signed 值的 SHA-512 雜湊(包括左大括弧和右大括弧)。 雜湊函式輸入為 UTF8(report_signed)

attest_key:記憶體保護區金鑰的公用部分,以 JSON Web 金鑰 (JWK) 物件表示 (RFC 7517)

custom_claims :傳送至可由原則評估之服務的自訂記憶體保護區宣告陣列。 宣告

  • name (String) :宣告的名稱。 此名稱會附加至證明服務所決定的 URL(以避免衝突),串連字號串會變成可在原則中使用的宣告類型

  • value (String) :宣告的值

  • value_type (String) :宣告值的資料類型

service_coNtext (BASE64URL(OCTETS)):服務所建立的不透明內容。

報告訊息

方向

Azure 證明 - >客戶

承載

{
  "report": "<JWT>"
}

report (JWT):JSON Web Token (JWT) 格式的證明報告(RFC 7519)。

要求訊息 v2

{
  "request": "<JWS>"
}

request (JWS):要求是由 JSON Web 簽章 (JWS) 結構所組成。 JWS 受保護的標頭和 JWS 承載如下所示。 如同任何 JWS 結構,最終值包含:BASE64URL(UTF8(JWS 受保護的標頭)) ||'.' ||BASE64URL(JWS Payload) ||'.' ||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 承載的類型可以是基本或 vsm。 當證明辨識項不包含 VSM 資料時,會使用基本 。

基本範例:

{
  "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):信賴憑證者識別碼。 服務在電腦識別碼宣告的計算中使用。

rp_data (BASE64URL(OCTETS)):信賴憑證者傳遞的不透明資料。 這通常由信賴憑證者用來作為 Nonce,以確保報表的新鮮度。

挑戰 (BASE64URL(OCTETS)):服務發出的隨機值。

  • current_attestation (Object):包含系統目前狀態的記錄和 TPM 引號(開機或繼續)。 從服務收到的 nonce 必須傳遞至 'qualifyingData' 參數中的 TPM2_Quote 命令。

  • boot_attestation (Object):這是選擇性的,包含記錄和儲存在系統休眠並繼續之前儲存的 TPM 引號。 boot_attestation資訊必須與相同的冷開機週期相關聯(也就是說,系統只休眠並在它們之間繼續)。

  • logs (Array(Object)):記錄陣列。 陣列的每個元素都包含一個記錄檔,而且陣列必須依用於測量的順序排列。

    • type (String):記錄檔的類型:「TCG」 或 「IMA」。
    • log (BASE64URL(OCTETS)):編碼為BASE64URL字串的記錄檔。
  • aik_cert (BASE64URL(OCTETS)):代表 AIK 的 X.509 憑證。

  • aik_pub (JWK):AIK 的公用部分,以 JSON Web 金鑰 (JWK) 物件表示(RFC 7517)。

  • pcs (Array(Object)):包含引號的集合。 陣列的每個元素都代表一個PCR銀行,而且陣列必須依用來建立引號的順序排列。 一個PCR銀行是由演算法和其值所定義(只有引號的值應該在清單中)。

    • algorithm (Integer):UINT16 值,代表TPM_ALG_ID常數所定義的雜湊演算法。
    • values (Array(Object)): 引用的摘要值陣列。 陣列的每個元素都代表在PCR銀行中的摘要值。
      • index (整數):對PCR摘要值的索引。
      • digest (BASE64URL(OCTETS)):摘要值。
    • quote (BASE64URL(OCTETS)):TPMS_ATTEST由 TPM2_Quote 命令傳回。 如果此欄位位於 「current_attestation」 物件中,則從服務收到的挑戰必須傳遞至 'qualifyingData' 參數中的 TPM2_Quote 命令。 特定的 'qualifyingData' 參數值取決於 「request_key」 系結方法,並在 KEY OBJECT 一節中說明。
    • signature (BASE64URL(OCTETS)):TPMT_SIGNATURE由 TPM2_Quote 命令傳回。 如果此欄位位於 「current_attestation」 物件中,則從服務收到的挑戰必須傳遞至 'qualifyingData' 參數中的 TPM2_Quote 命令。 特定的 'qualifyingData' 參數值取決於 「request_key」 系結方法,並在 KEY OBJECT 一節中說明。

vsm_report (VSM 報表物件):VSM 證明報表。 請參閱 VSM REPORT OBJECT 一節。

request_key (Key 物件):用來簽署要求的金鑰。 如果 TPM 存在(要求包含 TPM 報價),request_key必須透過引號系結至 TPM,或位於 TPM 中(請參閱 KEY OBJECT)。

other_keys (Array(Key 物件)):要傳送至服務的金鑰陣列。 最多兩個索引鍵。

custom_claims (Array(Object)):傳送至原則可評估之服務的自訂記憶體保護區宣告陣列。

  • name (字串):宣告的名稱。 此名稱會附加至證明服務所決定的 URL(以避免衝突),串連字號串會變成可在原則中使用的宣告類型。

  • value (String):宣告的值。

  • value_type (String):宣告值的資料類型。

service_coNtext (BASE64URL(OCTETS)):服務所建立的不透明、加密內容,其中包括挑戰的挑戰和到期時間。

Key 物件

jwk (物件):以 JSON Web 金鑰 (JWK) 物件表示之金鑰的公用部分(RFC 7517)。

info (物件):金鑰的額外資訊。

沒有額外的資訊:(Info 物件可以是空的或從要求中遺失的)

• 透過引號系結至 TPM 的金鑰:

  • tpm_quote (Object):TPM 引號系結方法的資料。
  • hash_alg (String):用來在 'qualifyingData' 參數中建立傳遞至 TPM2_Quote 命令的雜湊的演算法。 雜湊是由 HASH[UTF8(jwk) || 0x00 || <OCTETS(服務挑戰) > ]。 注意:UTF8(jwk) 必須是在網路傳送的確切字串,因為服務會使用要求中收到的確切字串來計算雜湊,而不需修改。

注意:這個系結方法不能用於other_keys陣列中的索引鍵。

• 經認證為在 TPM 中居住的金鑰:

  • tpm_certify (物件):TPM 認證系結方法的資料。 「public」 (BASE64URL(OCTETS)):TPMT_PUBLIC結構,代表 TPM 中索引鍵的公用區域。

  • certification (BASE64URL(OCTETS)):TPMS_ATTEST由 TPM2_Certify 命令傳回。 從服務收到的挑戰必須傳遞至 'qualifyingData' 參數中的 TPM2_Certify 命令。 要求中提供的 AIK 必須用來認證金鑰。

  • signature (BASE64URL(OCTETS)):TPMT_SIGNATURE由 TPM2_Certify 命令傳回。 從服務收到的挑戰必須傳遞至 '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 (Object):與個別索引鍵物件相同。 info.tpm_certify (物件):

  • name_alg (整數):UINT16 值,代表TPM_ALG_ID常數所定義的雜湊演算法。
  • obj_attr (整數):UINT32 值,代表由 TPMA_OBJECT 定義的索引鍵物件屬性
  • auth_policy (BASE64URL(OCTETS)):使用此索引鍵物件的選擇性原則。

範例:

{
  "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 報表物件

記憶體保護區證明:

記憶體保護區 (物件):VSM 記憶體保護區證明的資料。

  • report (BASE64URL(OCTETS)):VSM 記憶體保護區證明報告,如函式 EnclaveGetAttestationReport 所傳回。 EnclaveData 參數必須是 report_signed 值的 SHA-512 雜湊(包括左大括弧和右大括弧)。 雜湊函式輸入為 UTF8(report_signed)。

範例:

記憶體保護區證明:

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

報告訊息

方向證明服務 - > 用戶端

承載

{
  "report": "<JWT>"
}

report (JWT):JSON Web Token (JWT) 格式的證明報告(RFC 7519)。

下一步