Protocolo de atestado enclave TPM (Trusted Platform Module) e o VBS (segurança baseada em virtualização)

O Atestado do Microsoft Azure garante uma segurança forte verificando uma cadeia de confiança, mantida desde uma raiz de confiança (TPM) até a inicialização do hipervisor e do kernel seguro. Para fazer isso, o Atestado do Azure deve atestar o estado de inicialização do computador antes que possamos estabelecer confiança no enclave seguro. O sistema operacional, o hipervisor e os binários de kernel seguro devem ser assinados pelas autoridades oficiais da Microsoft certas e configurados de forma segura. Depois de associarmos a confiança entre o Trusted Platform Module (TPM) e a integridade do hipervisor, podemos confiar nos IDKS de enclave do VBS (segurança baseada em virtualização) fornecidos no log de inicialização medido, com isso, podemos validar que um par de chaves foi gerado pelo enclave e elaborar um relatório de atestado que associa a confiança nessa chave e contém outras declarações, como as propriedades de nível de segurança e de atestado de inicialização.

Enclaves do VBS requerem um TPM para fornecer meios de validar a base de segurança. Os enclaves do VBS são atestados pelo ponto de extremidade do TPM com uma adição ao objeto de solicitação no protocolo.

Mensagens de protocolo

O protocolo tem duas trocas de mensagens:

  • Mensagem Init
  • Mensagem de solicitação

Mensagem de inicialização

Mensagem para estabelecer o contexto da mensagem de solicitação.

Direção

Cliente -> Atestado do Azure

Conteúdo

{ 
  "type": "aikcert" 
} 

"Type" (cadeia de caracteres ASCII): representa o tipo de atestado solicitado. No momento, apenas um “aikcert” é compatível.

Mensagem de desafio

Direção

Atestado do Azure -> Cliente

Conteúdo

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

desafio (BASE64URL (OCTETS)): valor aleatório emitido pelo serviço.

service_context (BASE64URL (OCTETS)): contexto opaco criado pelo serviço.

Mensagem de solicitação

Conteúdo que apresenta os dados que devem ser atestados pelo serviço de atestado.

Observação: o suporte a logs de medição de IMA e chaves foi adicionado à mensagem de solicitação e pode ser encontrado na seção Mensagem de Solicitação V2

Mensagem de Solicitação v1

Direção

Cliente -> Atestado do Azure

Conteúdo

{
  "request": "<JWS>"
}

solicitação (JWS): a solicitação consiste em uma estrutura de assinatura da Web JSON (JWS). O cabeçalho protegido JWS e o conteúdo JWS são mostrados abaixo. Como em qualquer estrutura JWS, o valor final consiste em:

BASE64URL(UTF8(Cabeçalho protegido do JWS)) || '.' ||

BASE64URL(Conteúdo do JWS) || '.' ||

BASE64URL (Assinatura JWS)

Cabeçalho protegido do JWS
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
Conteúdo do JWS

O conteúdo JWS pode ser do tipo básico ou VBS. Básico é usado quando a evidência do atestado não inclui dados VBS.

Exemplo somente de 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)>" 
  } 
} 

Exemplo de enclave 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): identificador de terceira parte confiável. Usado pelo serviço na computação da declaração de ID do computador

rp_data (BASE64URL (OCTETS)): dados opacos passados pela terceira parte confiável. Normalmente, isso é usado pela terceira parte confiável como um nonce para garantir a atualização do relatório

desafio (BASE64URL (OCTETS)): valor aleatório emitido pelo serviço

tpm_att_data: dados de atestado relacionados ao TPM

  • srtm_boot_log (BASE64URL (OCTETS)): logs de inicialização SRTM como os recuperados pela função Tbsi_Get_TCG_Log_Ex com o tipo de log = TBS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL (OCTETS)): logs de resumo SRTM como os recuperados pela função Tbsi_Get_TCG_Log_Ex com o tipo de log = TBS_TCGLOG_SRTM_RESUME

  • srtm_boot_log (BASE64URL (OCTETS)): logs de inicialização DRTM como os recuperados pela função Tbsi_Get_TCG_Log_Ex com o tipo de log = TBS_TCGLOG_DRTM_BOOT

  • srtm_resume_log (BASE64URL (OCTETS)): logs de resumo DRTM como os recuperados pela função Tbsi_Get_TCG_Log_Ex com o tipo de log = TBS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL (OCTETS)): o certificado X.509 para o AIK, conforme retornado pela função NCryptGetProperty com a propriedade = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub: a parte pública do AIK representada como um objeto de chave da Web JSON (JWK) (RFC 7517)

  • current_claim (BASE64URL (OCTETS)): a declaração de atestado para o estado atual de PCR, conforme retornado pela função NCryptCreateClaim com dwClaimType = NCRYPT_CLAIM_PLATFORM e parâmetro NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK definido para incluir todos os PCRs. O desafio enviado pelo serviço também deve ser usado na computação desta declaração

  • boot_claim (BASE64URL (OCTETS)): a declaração de atestado para o estado atual de PCR, conforme retornado pela função NCryptCreateClaim com dwClaimType = NCRYPT_CLAIM_PLATFORM e parâmetro NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK definido para incluir todos os PCRs

vsm_report (BASE64URL (OCTETS)): o relatório de atestado enclave do VBS, como retornado pela função EnclaveGetAttestationReport. O parâmetro EnclaveData deve ser o código hash SHA-512 do valor de report_signed (incluindo as chaves de abertura e fechamento). A entrada da função de hash é UTF8 (report_signed)

attest_key: a parte pública da chave de enclave representada como um objeto de chave da Web JSON (JWK) (RFC 7517)

custom_claims: matriz de declarações enclave personalizadas enviadas ao serviço que podem ser avaliadas pela política. A declaração

  • name (cadeia de caracteres): nome da declaração. Esse nome será anexado a uma URL determinada pelo serviço de atestado (para evitar conflitos) e a cadeia de caracteres concatenada se tornará o tipo da declaração que pode ser usada na política

  • value (cadeia de caracteres): valor da declaração

  • value_type (cadeia de caracteres): tipo de dados do valor da declaração

service_context (BASE64URL (OCTETS)): contexto opaco criado pelo serviço.

Mensagem de relatório

Direção

Atestado do Azure -> Cliente

Conteúdo

{
  "report": "<JWT>"
}

report (JWT): o relatório de atestado no formato JWT (token Web JSON) (RFC 7519).

Mensagem de Solicitação v2

{
  "request": "<JWS>"
}

solicitação (JWS): a solicitação consiste em uma estrutura de assinatura da Web JSON (JWS). O cabeçalho protegido JWS e o conteúdo JWS são mostrados abaixo. Como em qualquer estrutura JWS, o valor final consiste em BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature)

Cabeçalho protegido do JWS
{
  "alg": "PS256",
  "typ": "attReqV2"
  // no "kid" parameter as the key specified by request_key MUST sign this JWS to prove possession.
}

Conteúdo do JWS

O conteúdo JWS pode ser do tipo básico ou vsm. Básico é usado quando a evidência do atestado não inclui dados VSM.

Exemplo básico:

{
  "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)>"
  }
}

Exemplo de enclave 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): identificador de terceira parte confiável. Usado pelo serviço na computação da declaração de ID do computador.

rp_data (BASE64URL (OCTETS)): dados opacos passados pela terceira parte confiável. Normalmente, isso é usado pela terceira parte confiável como um nonce para garantir a atualização do relatório.

desafio (BASE64URL (OCTETS)): valor aleatório emitido pelo serviço.

  • current_attestation (Object): contém logs e aspas TPM para o estado atual do sistema (inicialização ou retomada). O nonce recebido do serviço deve ser transmitido ao comando TPM2_Quote no parâmetro “qualifyingData”.

  • boot_attestation (Object): isso é opcional e contém logs e a cotação do TPM salva antes da hibernação e retomada do sistema. boot_attestation informações devem ser associadas ao mesmo ciclo de inicialização a frio (ou seja, o sistema foi apenas hibernado e retomado entre eles).

  • logs (Array(Object)): matriz de logs. Cada elemento da matriz contém um log, e a matriz precisa estar na ordem usada para medidas.

    • type (String): tipo do log: “TCG” ou “IMA”.
    • log (BASE64URL(OCTETS)): o log codificado como uma cadeia de caracteres de BASE64URL.
  • aik_cert (BASE64URL(OCTETS)): o certificado X.509 que representa o AIK.

  • aik_pub (JWK): a parte pública do AIK representada como um objeto de chave da Web JSON (JWK) (RFC 7517).

  • pcrs (Array(Object)): contém o conjunto entre aspas. Cada elemento da matriz representa um banco PCR, e a matriz precisa estar na ordem usada para criar as aspas. Um banco PCR é definido por seu algoritmo e seus valores (somente os valores entre aspas devem estar na lista).

    • algorithm (Integer): valor UINT16 que representa um algoritmo de hash definido pelas constantes TPM_ALG_ID.
    • values (Array(Object)): matriz de valores de hash entre aspas. Cada elemento da matriz representa um valor hash no banco PCR.
      • index (Integer): índice do valor de hash do PCR.
      • digest (BASE64URL(OCTETS)): valor de hash.
    • quote (BASE64URL(OCTETS)): TPMS_ATTEST retornado pelo comando TPM2_Quote. Se esse campo estiver no objeto “current_attestation”, o desafio recebido do serviço precisará ser transmitido ao comando TPM2_Quote no parâmetro “qualifyingData”. O valor do parâmetro “qualifyingData” específico depende do método de associação “request_key” e está descrito na seção KEY OBJECT.
    • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE retornado pelo comando TPM2_Quote. Se esse campo estiver no objeto “current_attestation”, o desafio recebido do serviço precisará ser transmitido ao comando TPM2_Quote no parâmetro “qualifyingData”. O valor do parâmetro “qualifyingData” específico depende do método de associação “request_key” e está descrito na seção KEY OBJECT.

vsm_report (VSM Report Object): o relatório de atestado do VSM. Confira a seção OBJETO DE RELATÓRIO VSM.

request_key (Key object): chave usada para assinar a solicitação. Se um TPM estiver presente (a solicitação contém aspas do TPM), request_key deverá ser associado ao TPM por meio de aspas ou residir no TPM (confira OBJETO CHAVE).

other_keys (Array(Key object)): matriz de chaves a serem enviadas para o serviço. Máximo de duas chaves.

custom_claims (Array(Object)): matriz de declarações enclave personalizadas enviadas ao serviço que podem ser avaliadas pela política.

  • name (cadeia de caracteres): nome da declaração. Esse nome será anexado a uma URL determinada pelo serviço de atestado (para evitar conflitos) e a cadeia de caracteres concatenada se tornará o tipo da declaração que pode ser usada na política.

  • value (cadeia de caracteres): valor da declaração.

  • value_type (cadeia de caracteres): tipo de dados do valor da declaração.

service_context (BASE64URL(OCTETS)): Contexto opaco e criptografado criado pelo serviço que inclui, entre outros, o desafio e um tempo de expiração para esse desafio.

Objeto chave

jwk (Object): a parte pública da chave representada como um objeto de chave da Web JSON (JWK) (RFC 7517).

info (Object): informações extras sobre a chave.

Nenhuma informação extra: (O objeto Info pode estar vazio ou ausente da solicitação)

• Chave vinculada ao TPM por meio de aspas:

  • tpm_quote (Object): dados para o método de associação de aspas do TPM.
  • hash_alg (String): o algoritmo usado para criar o hash transmitido ao comando TPM2_Quote no parâmetro 'qualifyingData'. O hash é calculado por HASH[UTF8(jwk) || 0x00 || <OCTETS(service challenge)>]. Observação: UTF8(jwk) precisa ser a cadeia de caracteres exata que será transmitida, pois o serviço calculará o hash usando a cadeia de caracteres exata recebida na solicitação sem modificações.

Observação: esse método de associação não pode ser usado para chaves na matriz other_keys.

• Chave certificada como residente no TPM:

  • tpm_certify (Object): dados para o método de associação de certificação TPM. “public” (BASE64URL(OCTETS)): estrutura TPMT_PUBLIC que representa a área pública da chave no TPM.

  • certification (BASE64URL(OCTETS)): TPMS_ATTEST retornado pelo comando TPM2_Certify. O desafio recebido do serviço precisa ser transmitido ao comando TPM2_Certify no parâmetro “qualifyingData”. O AIK fornecido na solicitação precisa ser usado para certificar a chave.

  • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE retornado pelo comando TPM2_Certify. O desafio recebido do serviço precisa ser transmitido ao comando TPM2_Certify no parâmetro “qualifyingData”. O AIK fornecido na solicitação precisa ser usado para certificar a chave.

Observação: quando esse método de associação é usado para o request_key, o valor do parâmetro 'qualifyingData' transmitido ao comando TPM2_Quote é simplesmente o desafio recebido do serviço.

Exemplos:

Chave não associada ao TPM:

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

Chave associada ao TPM por meio de aspas (residente em um enclave de VBS ou não):

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

Chave certificada como residente no 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)>"
    }
  }
}

Objeto chave de política

O objeto chave de política é a versão do objeto chave usado como declarações de entrada na política. Ele é processado pelo serviço para torná-lo mais legível e mais fácil de avaliar por regras de política.

• Chave não vinculada ao TPM: igual ao objeto chave respectivo. Exemplo:

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

• Chave vinculada ao TPM por meio de aspas (residente em um enclave VBS ou não): igual ao objeto chave respectivo. Exemplo:

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

• Chave certificada como residente no TPM:

jwk (Object): igual ao objeto chave respectivo. info.tpm_certify (Object):

  • name_alg (Integer): valor UINT16 que representa um algoritmo de hash definido pelas constantes TPM_ALG_ID.
  • obj_attr (Integer): valor UINT32 que representa os atributos do objeto de chave definidos por TPMA_OBJECT
  • auth_policy (BASE64URL(OCTETS)): política opcional para usar esse objeto de chave.

Exemplo:

{
  "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)>"
    }
  }
}

Objeto de relatório VBS

Atestado de enclave:

enclave (Object): dados para atestado de enclave do VSM.

  • report (BASE64URL (OCTETS)): o relatório de atestado enclave do VSM, como retornado pela função EnclaveGetAttestationReport. O parâmetro EnclaveData deve ser o código hash SHA-512 do valor de report_signed (incluindo as chaves de abertura e fechamento). A entrada da função de hash é UTF8 (report_signed).

Exemplos:

Atestado de enclave:

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

Mensagem de relatório

Serviço de Atestado de Direção –> Cliente

Conteúdo

{
  "report": "<JWT>"
}

report (JWT): o relatório de atestado no formato JWT (token Web JSON) (RFC 7519).

Próximas etapas