Compartir a través de


Módulo de plataforma segura (TPM) y protocolo de atestación de enclave de seguridad basada en virtualización (VBS)

Microsoft Azure Attestation garantiza una seguridad sólida comprobando una cadena de confianza, mantenida desde una raíz de confianza (TPM) hasta el lanzamiento del hipervisor y el kernel seguro. Para ello, Azure Attestation debe atestiguar el estado de arranque de la máquina para poder establecer la confianza en el enclave seguro. El sistema operativo, el hipervisor y los binarios de kernel seguros deben estar firmados por las autoridades oficiales de Microsoft adecuadas y estar configurados de forma segura. Una vez que se ha enlazado la confianza entre el Módulo de plataforma segura (TPM) y el estado del hipervisor, podemos confiar en los IDK del encave de seguridad basada en virtualización (VBS) que se proporcionan en el registro Arranque medido; con esto se puede validar que el enclave ha generado un par de claves y en el que se muestra un informe de atestación que enlaza la confianza en esa clave y contiene otras notificaciones, como el nivel de seguridad y las propiedades de atestación de arranque.

Los enclaves de VBS requieren un TPM para proporcionar la medida para validar la base de seguridad. Los enclaves de VBS se certifican mediante el punto de conexión de TPM con una adición al objeto de solicitud en el protocolo.

Mensajes de protocolo

El protocolo tiene dos intercambios de mensajes:

  • Mensaje init
  • Mensaje de solicitud

Mensaje init

Mensaje para establecer el contexto del mensaje de solicitud.

Dirección

Cliente -> Azure Attestation

Carga útil

{ 
  "type": "aikcert" 
} 

"type" (cadena ASCII): representa el tipo de atestación solicitado. Actualmente, solo se admite"aikcert".

Mensaje de desafío

Dirección

Azure Attestation -> Cliente

Carga útil

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

challenge (BASE64URL(OCTETS)): valor aleatorio emitido por el servicio.

service_context (BASE64URL(OCTETS)): contexto opaco creado por el servicio.

Mensaje de solicitud

Carga que contiene los datos que el servicio de atestación debe atestiguar.

Nota: Se agregó compatibilidad con claves y registros de medición de IMA al mensaje de solicitud y se puede encontrar en la sección Mensaje de solicitud v2.

Mensaje de solicitud v1

Dirección

Cliente -> Azure Attestation

Carga útil

{
  "request": "<JWS>"
}

request (JWS): la solicitud consta de una estructura json Web Signature (JWS). A continuación se muestran el encabezado protegido JWS y la carga JWS. Como en cualquier estructura JWS, el valor final consta de:

BASE64URL(UTF8(JWS Protected Header)) || '.' ||

BASE64URL(JWS Payload) || '.' ||

BASE64URL(JWS Signature)

Encabezado protegido JWS
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
Carga JWS

La carga JWS puede ser de tipo básico o VBS. Se utiliza el tipo básico cuando la evidencia de la atestación no incluye datos VBS.

Ejemplo de solo 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)>" 
  } 
} 

Ejemplo de enclave de 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 usuario de confianza. Utilizado por el servicio en el cálculo de la notificación del identificador de máquina.

rp_data (BASE64URL(OCTETS)): datos opacos pasados por el usuario de confianza. Normalmente, lo utiliza el usuario de confianza como un nonce para garantizar la actualización del informe.

challenge (BASE64URL(OCTETS)): valor aleatorio emitido por el servicio

tpm_att_data: datos de atestación relacionados con TPM

  • srtm_boot_log (BASE64URL(OCTETS)): registros de arranque srTM recuperados por la función Tbsi_Get_TCG_Log_Ex con tipo de registro = TBS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL(OCTETS)):SRTM reanuda el registro tal y como lo recupera la función Tbsi_Get_TCG_Log_Ex con el tipo de registro = TBS_TCGLOG_SRTM_RESUME

  • drtm_boot_log (BASE64URL(OCTETS)): registros de arranque drTM recuperados por la función Tbsi_Get_TCG_Log_Ex con tipo de registro = TBS_TCGLOG_DRTM_BOOT

  • drtm_resume_log (BASE64URL(OCTETS)): DRTM reanuda el registro tal y como lo recupera la función Tbsi_Get_TCG_Log_Ex con el tipo de registro = TBS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL(OCTETS)): certificado X.509 para el AIK tal y como devuelve la función NCryptGetProperty con la propiedad = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub: parte pública del AIK representado como un objeto JSON Web Key (JWK) (RFC 7517)

  • current_claim (BASE64URL(OCTETS)): la notificación de atestación para el estado DE PCR actual tal y como devuelve la función NCryptCreateClaim con dwClaimType = NCRYPT_CLAIM_PLATFORM y el parámetro NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK establecido para incluir todas las PCR. El desafío que envía el servicio también debe utilizarse en el cálculo de esta notificación.

  • boot_claim (BASE64URL(OCTETS)): la notificación de atestación para el estado de LA PCR en el arranque tal y como devuelve la función NCryptCreateClaim con dwClaimType = NCRYPT_CLAIM_PLATFORM y el parámetro NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK establecido para incluir todas las PCR

vsm_report (BASE64URL(OCTETS)): el informe de atestación del enclave VBS tal como lo ha devuelto la función EnclaveGetAttestationReport. El parámetro EnclaveData debe ser el hash SHA-512 del valor de report_signed (incluidas las llaves de apertura y cierre). La entrada de la función hash es UTF8(report_signed).

attest_key: parte pública de la clave de enclave representada como un objeto JSON Web Key (JWK) (RFC 7517)

custom_claims: matriz de notificaciones de enclave personalizadas enviadas al servicio que la directiva puede evaluar. La notificación

  • name (cadena): nombre de la notificación. Este nombre lo anexará a una dirección URL determinada el servicio de atestación (para evitar conflictos), y la cadena concatenada se convertirá en el tipo de notificación que se puede usar en la directiva.

  • value (String): valor de la notificación

  • value_type (String): tipo de datos del valor de la notificación

service_context (BASE64URL(OCTETS)): contexto opaco creado por el servicio.

Mensaje de informe

Dirección

Azure Attestation -> Cliente

Carga útil

{
  "report": "<JWT>"
}

report (JWT): el informe de atestación en formato JSON Web Token (JWT) (RFC 7519).

Mensaje de solicitud v2

{
  "request": "<JWS>"
}

request (JWS): la solicitud consta de una estructura json Web Signature (JWS). A continuación se muestran el encabezado protegido JWS y la carga JWS. Como en cualquier estructura JSW, el valor final consta de: BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature)

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

Carga JWS

La carga JWS puede ser de tipo básico o vsm. Se utiliza el tipo básico cuando la evidencia de la atestación no incluye datos VSM.

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

Ejemplo 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 usuario de confianza. Utilizado por el servicio en el cálculo de la notificación del identificador de la máquina.

rp_data (BASE64URL(OCTETS)): datos opacos pasados por el usuario de confianza. Por lo general, lo utiliza el usuario de confianza como un nonce para garantizar la actualización del informe.

challenge (BASE64URL(OCTETS)): valor aleatorio emitido por el servicio.

  • current_attestation (objeto): contiene registros y la cita del TPM para el estado actual del sistema (arranque o reanudación). El nonce recibido del servicio debe pasarse al comando TPM2_Quote en el parámetro "qualifyingData".

  • boot_attestation (objeto): es opcional y contiene registros y la cita del TMP que se guardó antes de que el sistema entrara en hibernación y se reanudara. boot_attestation información debe estar asociada al mismo ciclo de arranque en frío (es decir, el sistema solo estaba hibernado y reanudado entre ellos).

  • logs (matriz(objeto)): matriz de registros. Cada elemento de la matriz contiene un registro y la matriz debe estar en el orden que se utiliza para las medidas.

    • type (cadena): tipo del registro: "TCG" o "IMA".
    • log (BASE64URL(OCTETS)): el registro codificado como una cadena BASE64URL.
  • aik_cert (BASE64URL(OCTETS)): el certificado X.509 que representa el AIK.

  • aik_pub (JWK): la parte pública de AIK representada como un objeto JSON Web Key (JWK) (RFC 7517).

  • pcrs (matriz(objeto)): contiene el conjunto citado. Cada elemento de la matriz representa un banco PCR y la matriz debe estar en el orden utilizado para crear la cita. Un banco PCR se define mediante su algoritmo y sus valores (solo los valores citados deben estar en la lista).

    • algorithm (entero): valor UINT16 que representa un algoritmo hash definido por las constantes TPM_ALG_ID.
    • values (matriz(objeto)): matriz de valores de resumen citados. Cada elemento de la matriz representa un valor de resumen en el banco PCR.
      • index (entero): índice el valor de resumen de PCR.
      • digest (BASE64URL(OCTETS)): valor de resumen.
    • quote (BASE64URL(OCTETS)): TPMS_ATTEST devuelto por el comando TPM2_Quote. Si este campo está en el objeto "current_attestation", el desafío recibido del servicio se debe pasar al comando TPM2_Quote en el parámetro "qualifyingData". El valor del parámetro "qualifyingData" específico depende del método de enlace "request_key" y se describe en la sección KEY OBJECT.
    • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE devuelto por el comando TPM2_Quote. Si este campo está en el objeto "current_attestation", el desafío recibido del servicio se debe pasar al comando TPM2_Quote en el parámetro "qualifyingData". El valor del parámetro "qualifyingData" específico depende del método de enlace "request_key" y se describe en la sección KEY OBJECT.

vsm_report (objeto de informe de VSM): el informe de atestación de VSM. Consulte la sección VSM REPORT OBJECT.

request_key (objeto de clave): la clave que se usa para firmar la solicitud. Si hay un TPM (la solicitud contiene la cita TPM ), request_key debe estar enlazada al TPM a través de la cita o debe residir el TPM (consulte KEY OBJECT).

other_keys (matriz(objeto de clave)): matríz de claves que se van a enviar al servicio. Máximo de dos claves.

custom_claims (matriz(objeto)): matriz de notificaciones de enclave personalizadas enviadas al servicio que la directiva puede evaluar.

  • name (cadena): nombre de la notificación. Este nombre se anexará a una dirección URL determinada el servicio de atestación (para evitar conflictos), y la cadena concatenada se convertirá en el tipo de notificación que se puede usar en la directiva.

  • value (cadena): valor de la notificación.

  • value_type (cadena): tipo de datos del valor de la notificación.

service_context (BASE64URL(OCTETS)): contexto cifrado opaco creado por el servicio que incluye, entre otros, el desafío y una hora de expiración para ese desafío.

Objeto de clave

jwk (objeto): la parte pública de la clave representada como un objeto JSON Web Key (JWK) (RFC 7517).

info (objeto): información adicional sobre la clave.

No hay información adicional:(el objeto de información puede estar vacío o puede faltar en la solicitud)

• Clave enlazada al TPM a través de la cita:

  • tpm_quote (objeto): datos para el método de enlace de la cita de TPM.
  • hash_alg (cadena): algoritmo que se usa para crear el hash pasado al comando TPM2_Quote en el parámetro "qualifyingData". El hash se calcula mediante HASH[UTF8(jwk) || 0x00 || <OCTETS(desafío de servicio)>]. Nota: UTF8(jwk) debe ser la cadena exacta que se enviará en la conexión, ya que el servicio calculará el hash con la cadena exacta recibida en la solicitud, sin ninguna modificación.

Nota: Este método de enlace no se puede usar para las claves de la matriz other_keys.

• Clave certificada como residente en el TPM:

  • tpm_certify (objeto): datos para el método de enlace de certificación del TPM. "public" (BASE64URL(OCTETS)): estructura TPMT_PUBLIC que representa el área pública de la clave en el TPM.

  • certification (BASE64URL(OCTETS)): TPMS_ATTEST que el comando TPM2_Certify devuelve. El desafío recibido del servicio debe pasarse al comando TPM2_Certify en el parámetro "qualifyingData". El AIK proporcionado en la solicitud debe usarse para certificar la clave.

  • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE que el comando TPM2_Certify devuelve. El desafío recibido del servicio debe pasarse al comando TPM2_Certify en el parámetro "qualifyingData". El AIK proporcionado en la solicitud debe usarse para certificar la clave.

Nota: Cuando se usa este método de enlace para request_key, el valor del parámetro "qualifyingData" pasado al comando TPM2_Quote es simplemente el desafío recibido del servicio.

Ejemplos:

Clave no enlazada al TPM:

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

Clave enlazada al TPM a través de la cita (ya sea residente en un enclave VBS o no):

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

Clave certificada como residente en el 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 de clave de directiva

El objeto de clave de directiva es la versión del objeto de clave que se usa como notificaciones de entrada en la directiva. El servicio lo procesa para que sea más legible y fácil de evaluar mediante reglas de directiva.

• Clave no enlazada al TPM: igual que el objeto de clave correspondiente. Ejemplo:

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

• Clave enlazada al TPM a través de la cita (ya sea residente en un enclave VBS o no): igual que el objeto de clave correspondiente. Ejemplo:

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

• Clave certificada como residente en el TPM:

jwk (objeto): igual que el objeto de clave correspondiente. info.tpm_certify (objeto):

  • name_alg (entero): valor UINT16 que representa un algoritmo hash definido por las constantes TPM_ALG_ID.
  • obj_attr (entero): valor UINT32 que representa los atributos del objeto de clave que TPMA_OBJECT define.
  • auth_policy (BASE64URL(OCTETS)): directiva opcional para usar este objeto de clave.

Ejemplo:

{
  "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 informe de VBS

Atestación de enclaves:

enclave (objeto): datos para la atestación del enclave VSM.

  • report (BASE64URL(OCTETS)): el informe de atestación del enclave VSM tal como lo ha devuelto la función EnclaveGetAttestationReport. El parámetro EnclaveData debe ser el hash SHA-512 del valor de report_signed (incluidas las llaves de apertura y cierre). La entrada de la función hash es UTF8(report_signed).

Ejemplos:

Atestación de enclaves:

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

Mensaje de informe

Servicio de atestación de dirección -> Cliente

Carga útil

{
  "report": "<JWT>"
}

report (JWT): el informe de atestación en formato JSON Web Token (JWT) (RFC 7519).

Pasos siguientes