Доверенный платформенный модуль (TPM) и протокол аттестации анклава безопасности на основе виртуализации (VBS)
Microsoft Аттестация Azure гарантирует надежную безопасность, проверяя цепочку доверия, поддерживаемую от корня доверия (TPM) до запуска гипервизора и безопасного ядра. Для этого Аттестация Azure должны подтвердить состояние загрузки компьютера, прежде чем мы можем установить доверие к защищенному анклавам. Двоичные файлы операционной системы, низкоуровневой оболочки и защищенного ядра должны быть подписаны правильными официальными центрами Майкрософт и настроены безопасным образом. После того как будет установлена привязка доверия между доверенным платформенным модулем (TPM) и работоспособностью низкоуровневой оболочки, можно будет доверять IDK анклава безопасности на основе виртуализации (VBS) в журнале измеряемой загрузки. Это позволит проверить, что анклавом была создана пара ключей, и сформировать отчет об аттестации, привязывающий доверие к этому ключу и содержащий другие утверждения, например уровень безопасности и свойства аттестации загрузки.
Анклавам VBS требуется TPM как средство измерений для проверки фундаментальных основ безопасности. Анклавы VBS аттестуются конечной точкой TPM с добавлением к объекту Request в протоколе.
Сообщения протокола
Протокол содержит два обмена сообщениями:
- Сообщение init
- Сообщение запроса
Сообщение об инициализации
Сообщение для установления контекста для сообщения запроса.
Направление
Клиент —> Аттестация Azure
Полезная нагрузка
{
"type": "aikcert"
}
"type" (строка ASCII): представляет тип запрошенной аттестации. В настоящее время поддерживается только тип "aikcert".
Сообщение запроса
Направление
Аттестация Azure -> Клиент
Полезная нагрузка
{
"challenge": "<BASE64URL(CHALLENGE)>",
"service_context": "<BASE64URL(SERVICECONTEXT)>"
}
challenge (BASE64URL(октеты)): случайное значение, выданное службой.
service_context (BASE64URL (октеты)): непрозрачный контекст, созданный службой.
Сообщение запроса
Полезные данные, содержащие данные, которые должны быть подтверждены службой аттестации.
Примечание. Поддержка журналов измерений IMA и ключей добавлена в сообщение "Запрос" и можно найти в разделе "Сообщение запроса версии 2"
Запрос сообщения версии 1
Направление
Клиент —> Аттестация Azure
Полезная нагрузка
{
"request": "<JWS>"
}
request (JWS): представляет собой структуру JSON Web Signature (JWS). Ниже показаны защищенный заголовок и полезные данные JWS. Как и в любой структуре JWS, окончательное значение состоит из следующих компонентов:
BASE64URL(UTF8(защищенный заголовок JWS)) || '.' ||
BASE64URL(полезные данные JWS) || '.' ||
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 могут иметь тип "basic" или "VBS". Тип "basic" используется, когда в состав свидетельств об аттестации не входят данные VBS.
Пример только для доверенного платформенного модуля:
{
"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(октеты)): непрозрачные данные, передаваемые проверяющей стороной. Обычно используется проверяющей стороной в качестве nonce, чтобы гарантировать актуальность отчета.
challenge (BASE64URL(октеты)): случайное значение, выданное службой.
tpm_att_data: данные аттестации, связанные с TPM.
srtm_boot_log (BASE64URL(октеты)): журналы загрузки SRTM, полученные функцией Tbsi_Get_TCG_Log_Ex с типом журнала TBS_TCGLOG_SRTM_BOOT.
srtm_resume_log (BASE64URL(октеты)): журнал возобновления SRTM, полученный функцией Tbsi_Get_TCG_Log_Ex с типом журнала TBS_TCGLOG_SRTM_RESUME.
drtm_boot_log (BASE64URL(октеты)): журналы загрузки DRTM, полученные функцией Tbsi_Get_TCG_Log_Ex с типом журнала TBS_TCGLOG_DRTM_BOOT.
drtm_resume_log (BASE64URL(октеты)): журнал возобновления DRTM, полученный функцией Tbsi_Get_TCG_Log_Ex с типом журнала TBS_TCGLOG_DRTM_RESUME.
aik_cert (BASE64URL(октеты)): сертификат X.509 для AIK, возвращенный функцией NCryptGetProperty со свойством NCRYPT_CERTIFICATE_PROPERTY.
aik_pub: открытая часть AIK, представленная в виде объекта веб-ключа JSON (JWK) (RFC 7517).
current_claim (BASE64URL (октеты)): утверждение аттестации для текущего состояния PCR, возвращенное функцией NCryptCreateClaim с параметром dwClaimType = NCRYPT_CLAIM_PLATFORM и значением параметра NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK, включающим все PCR. При вычислении этого утверждения должен также использоваться запрос, отправленный службой.
boot_claim (BASE64URL (октеты)): утверждение аттестации для состояния PCR на момент загрузки, возвращенное функцией NCryptCreateClaim с параметром dwClaimType = NCRYPT_CLAIM_PLATFORM и значением параметра NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK, включающим все PCR.
vsm_report (BASE64URL(OCTETS)): отчет аттестации анклавов VBS, возвращенный функцией EnclaveGetAttestationReport. Параметр EnclaveData должен представлять собой хэш SHA-512 от значения report_signed (включая открывающую и закрывающую фигурные скобки). На вход хэш-функция подается строка UTF8(report_signed).
attest_key: открытая часть ключа анклава, представленная в виде объекта JSON Web Key (JWK) (RFC 7517).
custom_claims: передаваемый в службу массив настраиваемых утверждений об анклаве, который может быть оценен политикой. Утверждение
name (String): имя утверждения. Это имя будет добавлено к URL-адресу, определенному службой аттестации (во избежание конфликтов), а сцепленная строка становится типом утверждения, который можно использовать в политике.
value (String): значение утверждения.
value_type (String): тип данных значения утверждения.
service_context (BASE64URL (октеты)): непрозрачный контекст, созданный службой.
Отчетное сообщение
Направление
Аттестация Azure -> Клиент
Полезная нагрузка
{
"report": "<JWT>"
}
report (JWT): отчет об аттестации в формате JSON Web Token (JWT) (RFC 7519).
Запрос сообщения версии 2
{
"request": "<JWS>"
}
request (JWS): представляет собой структуру JSON Web Signature (JWS). Ниже показаны защищенный заголовок и полезные данные JWS. Как и в любой структуре 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. Базовый используется, если доказательства аттестации не включают данные 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(октеты)): непрозрачные данные, передаваемые проверяющей стороной. Обычно это используется проверяющей стороной в качестве нецелевого элемента, чтобы гарантировать свежесть отчета.
challenge (BASE64URL(октеты)): случайное значение, выданное службой.
current_attestation (объект): содержит журналы и кавычки TPM для текущего состояния системы (загрузка или возобновление). Неисключение, полученное от службы, должно быть передано команде TPM2_Quote в параметре "qualifyingData".
boot_attestation (объект): это необязательно и содержит журналы и кавычки доверенного платформенного модуля, сохраненные до гибернаации системы и возобновления работы. boot_attestation сведения должны быть связаны с тем же циклом холодной загрузки (т. е. система была только гибернаирована и возобновлена между ними).
logs (Array(Object)): массив журналов. Каждый элемент массива содержит журнал, и массив должен находиться в порядке, используемом для измерений.
-
- type (String): Тип журнала: TCG или IMA.
-
- log (BASE64URL(OCTETS)): журнал закодирован как строка BASE64URL.
aik_cert (BASE64URL(OCTETS)): сертификат X.509, представляющий AIK.
aik_pub (JWK): общедоступная часть AIK, представленная как объект веб-ключа JSON (JWK) (RFC 7517).
pcrs (Array(Object)): содержит кавычки набора. Каждый элемент массива представляет банк PCR, и массив должен находиться в порядке, используемом для создания кавычки. Банк PCR определяется алгоритмом и его значениями (в списке должны находиться только указанные в кавычки значения).
-
- алгоритм (целое число): значение UINT16, представляющее хэш-алгоритм , определенный константами TPM_ALG_ID.
-
- значения (Array(Object)): массив значений дайджеста, кавычек. Каждый элемент массива представляет значение дайджеста в банке PCR.
-
-
- index (Integer): Индекс значения дайджеста PCR.
-
-
-
- digest (BASE64URL(OCTETS)): значение дайджеста .
-
-
- кавычки (BASE64URL(OCTETS)): TPMS_ATTEST возвращается командой TPM2_Quote. Если это поле находится в объекте "current_attestation", вызов, полученный от службы, должен быть передан команде TPM2_Quote в параметре "qualifyingData". Конкретное значение параметра "qualifyingData" зависит от метода привязки "request_key" и описано в разделе KEY OBJECT.
-
- сигнатура (BASE64URL(OCTETS)): TPMT_SIGNATURE возвращается командой TPM2_Quote. Если это поле находится в объекте "current_attestation", вызов, полученный от службы, должен быть передан команде TPM2_Quote в параметре "qualifyingData". Конкретное значение параметра "qualifyingData" зависит от метода привязки "request_key" и описано в разделе KEY OBJECT.
vsm_report (объект отчета VSM): отчет аттестации VSM. См. раздел ОБЪЕКТА VSM REPORT.
request_key (объект ключа): ключ, используемый для подписи запроса. Если TPM присутствует (запрос содержит цитату TPM), request_key должны быть привязаны к TPM через цитату или быть резидентом В TPM (см. раздел KEY OBJECT).
other_keys (объект Array(Key)): массив ключей, отправляемых в службу. Не более двух ключей.
custom_claims (Array(Object)): массив пользовательских утверждений анклава, отправленных в службу, которую можно оценить политикой.
name (String): имя утверждения. Это имя будет добавлено в URL-адрес, определенный службой аттестации (чтобы избежать конфликтов), а сцепленная строка становится типом утверждения, которое можно использовать в политике.
значение (Строка): значение утверждения.
value_type (строка): тип данных значения утверждения.
service_context (BASE64URL(OCTETS)): непрозрачный, зашифрованный контекст, созданный службой, включая, среди прочего, вызов и время истечения срока действия для этой проблемы.
Ключевой объект
jwk (object): общедоступная часть ключа, представленная как объект веб-ключа JSON (JWK) (RFC 7517).
info (Object): Дополнительные сведения о ключе.
Никаких дополнительных сведений:(Объект Info может быть пустым или отсутствующим из запроса)
• Ключ, привязанный к доверенному платформенного платформенного модуля с помощью кавычки:
- tpm_quote (объект): данные для метода привязки к кавычки TPM.
- hash_alg (Строка): алгоритм, используемый для создания хэша, переданного команде TPM2_Quote в параметре "qualifyingData". Хэш вычисляется HASH[UTF8(jwk) || 0x00 || <OCTETS(вызов службы)>]. Примечание. UTF8(jwk) должна быть точной строкой, которая будет отправлена на провод, так как служба вычислит хэш с помощью точной строки, полученной в запросе без изменений.
Примечание. Этот метод привязки не может использоваться для ключей в массиве other_keys.
• Ключ, сертифицированный для резидента В TPM:
tpm_certify (объект): данные для метода привязки сертификации TPM. "public" (BASE64URL(OCTETS)): TPMT_PUBLIC структура, представляющая общедоступную область ключа в TPM.
сертификация (BASE64URL(OCTETS)): TPMS_ATTEST возвращается командой TPM2_Certify. Вызов, полученный от службы, должен быть передан команде TPM2_Certify в параметре "qualifyingData". AIK, предоставленный в запросе, должен использоваться для сертификации ключа.
сигнатура (BASE64URL(OCTETS)): TPMT_SIGNATURE возвращается командой TPM2_Certify. Вызов, полученный от службы, должен быть передан команде TPM2_Certify в параметре "qualifyingData". AIK, предоставленный в запросе, должен использоваться для сертификации ключа.
Примечание. Если этот метод привязки используется для request_key, значение параметра "qualifyingData", переданное команде TPM2_Quote, является просто проблемой, полученной от службы.
Примеры:
Ключ не привязан к доверенному платформенного модуля:
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
}
}
Ключ, привязанный к доверенному платформенного платформенного модуля через кавычки (либо резидент в анклавах 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)>"
}
}
}
Объект ключа политики
Объект ключа политики — это версия ключевого объекта, используемого в качестве входных утверждений в политике. Она обрабатывается службой, чтобы сделать ее более удобочитаемой и упрощенной для оценки правилами политики.
• Ключ не привязан к доверенному платформенного модуля: то же самое, что и соответствующий ключевой объект. Пример:
{
"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.
- отчет (BASE64URL(OCTETS)): отчет аттестации анклав VSM, возвращенный функцией EnclaveGetAttestationReport. Параметр EnclaveData должен представлять собой хэш SHA-512 от значения report_signed (включая открывающую и закрывающую фигурные скобки). Входные данные хэш-функции — UTF8(report_signed).
Примеры:
Аттестация анклава:
{
"enclave": {
"report": "<BASE64URL(REPORT)>"
}
}
Отчетное сообщение
Служба аттестации направления —> клиент
Полезная нагрузка
{
"report": "<JWT>"
}
report (JWT): отчет об аттестации в формате JSON Web Token (JWT) (RFC 7519).