信賴平臺模組 (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)):D RTM 會繼續記錄檔,如函式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)。