Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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é o lançamento do hipervisor e do kernel seguro. Para fazer isso, o Atestado do Azure deve atestar o estado de inicialização da máquina antes de podermos estabelecer confiança no enclave seguro. O sistema operacional, o hipervisor e os binários seguros do kernel devem ser assinados pelas autoridades oficiais corretas da Microsoft e configurados de forma segura. Uma vez que tenhamos a confiança ligada entre o TPM (Trusted Platform Module) e a integridade do hipervisor, podemos confiar nos IDKs do enclave VBS (Virtualization Based Security) fornecidos no Log de Inicialização Medida, com isso podemos validar que um par de chaves foi gerado pelo enclave e criar um relatório de atestado que vincula a confiança nessa chave e contém outras declarações, como o nível de segurança e as propriedades de atestado de inicialização.
Os enclaves VBS exigem um TPM para fornecer a medição para validar a base de segurança. Os enclaves VBS são atestados pelo ponto de extremidade TPM com uma adição ao objeto de solicitação no protocolo.
Mensagens de protocolo
O protocolo tem duas trocas de mensagens:
- Mensagem de inicialização
- Solicitar Mensagem
Mensagem de inicialização
Mensagem para estabelecer o contexto da mensagem de solicitação.
Direção
Cliente -> Atestado do Azure
Payload
{
"type": "aikcert"
}
"type" (cadeia ASCII): representa o tipo de atestado solicitado. Atualmente, apenas "aikcert" é suportado.
Mensagem de desafio
Direção
Atestado do Azure -> Cliente
Payload
{
"challenge": "<BASE64URL(CHALLENGE)>",
"service_context": "<BASE64URL(SERVICECONTEXT)>"
}
challenge (BASE64URL(OCTETS)): Valor aleatório emitido pelo serviço.
service_context (BASE64URL(OCTETS)): Contexto opaco criado pelo serviço.
Solicitar Mensagem
Carga útil contendo os dados que devem ser atestados pelo serviço de certificação.
Nota: O suporte para logs de medição e chaves do IMA foi adicionado à mensagem de solicitação e pode ser encontrado na seção Solicitar mensagem V2
Solicitar mensagem v1
Direção
Cliente -> Atestado do Azure
Payload
{
"request": "<JWS>"
}
request (JWS): A solicitação consiste em uma estrutura JSON Web Signature (JWS). O Cabeçalho Protegido JWS e a Carga Útil JWS são mostrados abaixo. Como em qualquer estrutura JWS, o valor final consiste em:
BASE64URL(UTF8(Cabeçalho Protegido JWS)) || '.' ||
BASE64URL(Carga útil JWS) || '.' ||
BASE64URL(Assinatura JWS)
Cabeçalho protegido por JWS
{
"alg": "PS256",
"typ": "attReq"
// no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
Carga útil JWS
A carga útil JWS pode ser do tipo basic ou VBS. Basic é usado quando a evidência de atestado não inclui dados VBS.
Amostra somente 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)>"
}
}
Amostra 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 no cálculo da declaração de ID da máquina
rp_data (BASE64URL(OCTETS)): Dados opacos passados pela terceira parte confiável. Isso normalmente é usado pela parte confiável como um nonce para garantir a atualização do relatório
challenge (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 recuperados por função Tbsi_Get_TCG_Log_Ex com tipo de log = TBS_TCGLOG_SRTM_BOOT
srtm_resume_log (BASE64URL(OCTETS)): SRTM retoma o log conforme recuperado por função Tbsi_Get_TCG_Log_Ex com log type = TBS_TCGLOG_SRTM_RESUME
drtm_boot_log (BASE64URL(OCTETS)): logs de inicialização DRTM recuperados por função Tbsi_Get_TCG_Log_Ex com tipo de log = TBS_TCGLOG_DRTM_BOOT
drtm_resume_log (BASE64URL(OCTETS)): DRTM retoma o log conforme recuperado pela função Tbsi_Get_TCG_Log_Ex com log type = TBS_TCGLOG_DRTM_RESUME
aik_cert (BASE64URL(OCTETS)): O certificado X.509 para o AIK retornado pela função NCryptGetProperty com propriedade = NCRYPT_CERTIFICATE_PROPERTY
aik_pub: A parte pública do AIK representada como um objeto JSON Web Key (JWK) (RFC 7517)
current_claim (BASE64URL(OCTETS)): A declaração de atestado para o estado atual da PCR retornada pela função NCryptCreateClaim com dwClaimType = NCRYPT_CLAIM_PLATFORM e parâmetro NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK definida para incluir todas as PCRs. A contestação enviada pelo serviço também deve ser utilizada no cálculo desta reclamação
boot_claim (BASE64URL(OCTETS)): A declaração de atestado para o estado de PCR na inicialização conforme retornado pela função NCryptCreateClaim com dwClaimType = NCRYPT_CLAIM_PLATFORM e parâmetro NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK definida para incluir todos os PCRs
vsm_report (BASE64URL(OCTETS)): O relatório de atestado de enclave VBS retornado pela função EnclaveGetAttestationReport. O parâmetro EnclaveData deve ser o hash SHA-512 do valor de report_signed (incluindo as chaves de abertura e fechamento). A entrada da função hash é UTF8(report_signed)
attest_key: A parte pública da chave de enclave representada como um objeto JWK (JSON Web Key) (RFC 7517)
custom_claims: Matriz de declarações de enclave personalizadas enviadas para o serviço que podem ser avaliadas pela política. Quanto ao pedido
name (String): 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 de declaração que pode ser usado na política
value (String): Valor da declaração
value_type (String): Tipo de dados do valor da reivindicação
service_context (BASE64URL(OCTETS)): Contexto opaco criado pelo serviço.
Denunciar mensagem
Direção
Atestado do Azure -> Cliente
Payload
{
"report": "<JWT>"
}
relatório (JWT): O relatório de atestado no formato JSON Web Token (JWT) (RFC 7519).
Solicitar mensagem v2
{
"request": "<JWS>"
}
request (JWS): A solicitação consiste em uma estrutura JSON Web Signature (JWS). O Cabeçalho Protegido JWS e a Carga Útil JWS são mostrados abaixo. Como em qualquer estrutura JWS, o valor final consiste em: BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(Carga útil JWS) || '.' || BASE64URL(Assinatura JWS)
Cabeçalho protegido por JWS
{
"alg": "PS256",
"typ": "attReqV2"
// no "kid" parameter as the key specified by request_key MUST sign this JWS to prove possession.
}
Carga útil JWS
A carga útil JWS pode ser do tipo basic ou vsm. Basic é usado quando a evidência de 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 no cálculo da declaração de ID da máquina.
rp_data (BASE64URL(OCTETS)): Dados opacos passados pela terceira parte confiável. Isso normalmente é usado pela terceira parte confiável como um nonce para garantir a atualização do relatório.
challenge (BASE64URL(OCTETS)): Valor aleatório emitido pelo serviço.
current_attestation (Objeto): Contém logs e cotação TPM para o estado atual do sistema (inicialização ou retomada). O nonce recebido do serviço deve ser passado para o comando TPM2_Quote no parâmetro 'qualifyingData'.
boot_attestation (Objeto): é opcional e contém logs e a cotação do TPM salva antes de o sistema hibernar e ser retomado. boot_attestation informações devem estar 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 deve estar na ordem usada para medições.
-
- type (String): Tipo do log: "TCG" ou "IMA".
-
- log (BASE64URL(OCTETS)): O log codificado como uma cadeia de caracteres 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 JSON Web Key (JWK) (RFC 7517).
pcrs (Array(Object)): Contém o conjunto citado. Cada elemento da matriz representa um banco PCR e a matriz deve estar na ordem usada para criar a cotação. Um banco PCR é definido pelo seu algoritmo e pelos seus valores (apenas os valores citados devem estar na lista).
-
- algoritmo (inteiro): valor UINT16 que representa um algoritmo de hash definido pelas constantes TPM_ALG_ID.
-
- valores (Array(Object)): Matriz de valores de resumo cotados. Cada elemento da matriz representa um valor digest no banco de PCR.
-
-
- índice (Inteiro): Índice do valor de digestão da PCR.
-
-
-
- digest (BASE64URL(OCTETS)): Valor do resumo.
-
-
- citação (BASE64URL(OCTETS)): TPMS_ATTEST retornada pelo comando TPM2_Quote. Se este campo estiver no objeto "current_attestation", o desafio recebido do serviço deve ser passado para o comando TPM2_Quote no parâmetro 'qualifyingData'. O valor específico do parâmetro 'qualifyingData' depende do método de vinculação "request_key" e é descrito na seção KEY OBJECT.
-
- assinatura (BASE64URL(OCTETS)): TPMT_SIGNATURE retornada pelo comando TPM2_Quote. Se este campo estiver no objeto "current_attestation", o desafio recebido do serviço deve ser passado para o comando TPM2_Quote no parâmetro 'qualifyingData'. O valor específico do parâmetro 'qualifyingData' depende do método de vinculação "request_key" e é descrito na seção KEY OBJECT.
vsm_report (VSM Report Object): O relatório de atestado VSM. Consulte a seção VSM REPORT OBJECT.
request_key (Objeto chave): Chave usada para assinar a solicitação. Se um TPM estiver presente (a solicitação contém cotação do TPM), request_key deve estar vinculado ao TPM via cotação ou ser residente no TPM (consulte KEY OBJECT).
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 de enclave personalizadas enviadas ao serviço que podem ser avaliadas pela política.
name (String): 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 (String): Valor da declaração.
value_type (String): 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 JSON Web Key (JWK) (RFC 7517).
info (Objeto): Informações adicionais sobre a chave.
Nenhuma informação extra:(O objeto Info pode estar vazio ou ausente da solicitação)
• Chave ligada ao TPM via cotação:
- tpm_quote (Object): Dados para o método de vinculação de cotação TPM.
- hash_alg (String): O algoritmo usado para criar o hash passado para o comando TPM2_Quote no parâmetro 'qualifyingData'. O hash é calculado por HASH[UTF8(jwk) || 0x00 || <OCTETS (desafio de serviço)>]. Nota: UTF8(jwk) deve ser a string exata que será enviada no fio, pois o serviço calculará o hash usando a string exata recebida na solicitação sem modificações.
Nota: Este método de ligação não pode ser usado para chaves na matriz other_keys.
• Chave certificada para ser residente no TPM:
tpm_certify (Objeto): Dados para o método de vinculação de certificação TPM. "público" (BASE64URL(OCTETS)): TPMT_PUBLIC estrutura que representa a área pública da chave no TPM.
certificação (BASE64URL(OCTETS)): TPMS_ATTEST retornada pelo comando TPM2_Certify. O desafio recebido do serviço deve ser passado para o comando TPM2_Certify no parâmetro 'qualifyingData'. O AIK fornecido na solicitação deve ser usado para certificar a chave.
assinatura (BASE64URL(OCTETS)): TPMT_SIGNATURE retornada pelo comando TPM2_Certify. O desafio recebido do serviço deve ser passado para o comando TPM2_Certify no parâmetro 'qualifyingData'. O AIK fornecido na solicitação deve ser usado para certificar a chave.
Nota: Quando esse método de vinculação é usado para o request_key, o valor do parâmetro 'qualifyingData' passado para o comando TPM2_Quote é simplesmente o desafio recebido do serviço.
Exemplos:
Chave não vinculada ao TPM:
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
}
}
Chave vinculada ao TPM via cotação (residente em um enclave VBS ou não):
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
},
"info": {
"tpm_quote":
"hash_alg": "sha-256"
}
}
}
Chave certificada para ser 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 da política
O objeto de chave de política é a versão do objeto de chave usado como declarações de entrada na política. É processado pelo serviço a fim de torná-lo mais legível e mais fácil de avaliar pelas regras da política.
• Chave não vinculada ao TPM: Igual ao respetivo objeto chave. Exemplo:
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
}
}
• Chave ligada ao TPM via cotação (residente ou não em um enclave VBS): O mesmo que o respetivo objeto chave. Exemplo:
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
},
"info": {
"tpm_quote":
"hash_alg": "sha-256"
}
}
}
• Chave certificada para ser residente no TPM:
jwk (Object): O mesmo que o respetivo objeto chave. info.tpm_certify (objeto):
- name_alg (Inteiro): valor UINT16 que representa um algoritmo de hash definido pelas constantes TPM_ALG_ID.
- obj_attr (inteiro): valor UINT32 que representa os atributos do objeto chave definido 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 o atestado de enclave VSM.
- report (BASE64URL(OCTETS)): O relatório de atestado de enclave VSM retornado pela função EnclaveGetAttestationReport. O parâmetro EnclaveData deve ser o hash SHA-512 do valor de report_signed (incluindo as chaves de abertura e fechamento). A entrada da função hash é UTF8(report_signed).
Exemplos:
Atestado de enclave:
{
"enclave": {
"report": "<BASE64URL(REPORT)>"
}
}
Denunciar mensagem
Serviço de Atestado de Direção -> Cliente
Payload
{
"report": "<JWT>"
}
relatório (JWT): O relatório de atestado no formato JSON Web Token (JWT) (RFC 7519).