Поделиться через


Доверенный платформенный модуль (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).

Следующие шаги