Share via


Module de plateforme sécurisée (TPM) et protocole d’attestation de sécurité basée sur la virtualisation (VBS) de l’enclave

Microsoft Azure Attestation garantit une sécurité forte en vérifiant une chaîne d’approbation, gérée à partir d’une racine de confiance (TPM) au lancement de l’hyperviseur et du noyau sécurisé. Pour ce faire, Azure Attestation doit attester de l’état de démarrage de la machine avant de pouvoir établir l’approbation dans l’enclave sécurisée. Le système d’exploitation, l’hyperviseur et les fichiers binaires du noyau sécurisé doivent être signés par les autorités Microsoft officielles appropriées et configurés de façon sécurisée. Une fois que nous avons établi la confiance entre le module de plateforme sécurisée (TPM) et l’intégrité de l’hyperviseur, nous pouvons approuver les IDK de sécurité basée sur la virtualisation (VBS) de l’enclave fournies dans le journal de démarrage mesuré. Nous pouvons ainsi valider qu’une paire de clés a été générée par l’enclave et émettre un rapport d’attestation qui établit la confiance dans cette clé et contient d’autres revendications, telles que le niveau de sécurité et les propriétés d’attestation de démarrage.

Les enclaves VBS requièrent un TPM pour fournir la mesure permettant de valider la base de sécurité. Les enclaves VBS sont attestées par le point de terminaison TPM avec un ajout à l’objet de requête dans le protocole.

Messages de protocole

Le protocole a deux échanges de messages :

  • Message d’initialisation
  • Message de requête

Message d’initialisation

Message permettant d’établir le contexte du message de demande.

Sens

Client - > Azure Attestation

Payload

{ 
  "type": "aikcert" 
} 

« type » (chaîne ASCII) : représente le type d’attestation demandé. Actuellement, seul « aikcert » est pris en charge.

Message de vérification

Sens

Azure Attestation - > Client

Payload

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

challenge (BASE64URL(OCTETS)) : valeur aléatoire émise par le service.

service_context (BASE64URL(OCTETS)) : contexte opaque créé par le service.

Message de requête

Charge utile contenant les données qui doivent être attestées par le service d’attestation.

Remarque : La prise en charge des journaux de mesure et des clés IMA a été ajoutée au message de demande et se trouve dans la section Message de demande V2

Message de demande v1

Sens

Client - > Azure Attestation

Payload

{
  "request": "<JWS>"
}

request (JWS) : la requête se compose d’une structure JWS (JSON Web Signature). L’en-tête protégé JWS et la charge utile JWS sont présentés ci-dessous. Comme dans toute structure JWS, la valeur finale se compose comme suit :

BASE64URL(UTF8(En-tête protégé JWS)) || ’.’ ||

BASE64URL(Charge utile JWS) || ’.’ ||

BASE64URL(Signature JWS)

En-tête protégé JWS
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
Charge utile JWS

La charge utile JWS peut être de type de base ou VBS. Le type de base est utilisé quand la preuve d’attestation n’inclut pas de données VBS.

Exemple TPM uniquement :

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

Échantillon TPM + enclave 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) : identificateur de partie de confiance. Utilisé par le service dans le calcul de la revendication d’ID d’ordinateur

rp_data (BASE64URL(OCTETS)) : données opaques transmises par la partie de confiance. Elles sont normalement utilisées par la partie de confiance en tant que nonce pour garantir l’actualisation du rapport.

challenge (BASE64URL(OCTETS)) : valeur aléatoire émise par le service

tpm_att_data : données d’attestation liées au module TPM

  • srtm_boot_log (BASE64URL(OCTETS) : journaux de démarrage SRTM récupérés par la fonction Tbsi_Get_TCG_Log_Ex avec le type de journal = ToS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL(OCTETS) : SRTM reprend le journal tel qu’il est récupéré par la fonction Tbsi_Get_TCG_Log_Ex avec le type de journal = ToS_TCGLOG_SRTM_RESUME

  • drtm_boot_log (BASE64URL(OCTETS) : journaux de démarrage DRTM récupérés par la fonction Tbsi_Get_TCG_Log_Ex avec type de journal = ToS_TCGLOG_DRTM_BOOT

  • drtm_resume_log (BASE64URL(OCTETS) : DRTM reprend le journal tel qu’il est récupéré par la fonction Tbsi_Get_TCG_Log_Ex avec le type de journal = ToS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL(OCTETS) : certificat X.509 pour l’AIK retourné par la fonction NCryptGetProperty avec propriété = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub : partie publique de l’AIK représentée en tant qu’objet JWK (JSON Web Key) (RFC 7517)

  • current_claim (BASE64URL(OCTETS) : revendication d’attestation pour l’état RPC actuel retourné par la fonction NCryptCreateClaim avec dwClaimType = NCRYPT_CLAIM_PLATFORM et le paramètre NCRYP ToUFFER_TPM_PLATFORM_CLAIM_PCR_MASK défini pour inclure tous les PCR. La vérification envoyée par le service doit également être utilisée dans le calcul de cette revendication.

  • boot_claim (BASE64URL(OCTETS) : revendication d’attestation pour l’état DE L’attestation au démarrage, comme retourné par la fonction NCryptCreateClaim avec dwClaimType = NCRYPT_CLAIM_PLATFORM et le paramètre NCRYP ToUFFER_TPM_PLATFORM_CLAIM_PCR_MASK défini pour inclure tous les PCR

vsm_report (BASE64URL(OCTETS)) : rapport d’attestation d’enclave VBS tel que retourné par la fonction EnclaveGetAttestationReport. Le paramètre EnclaveData doit être le hachage SHA-512 de la valeur report_signed (y compris les accolades ouvrantes et fermantes). L’entrée de la fonction de hachage est UTF8(report_signed)

attest_key : partie publique de la clé d’enclave représentée sous la forme d’un objet JWK (JSON Web Key) (RFC 7517)

custom_claims : tableau de revendications d’enclave personnalisées envoyées au service qui peuvent être évaluées par la stratégie. La revendication

  • name : nom de la revendication. Ce nom sera ajouté à une URL déterminée par le service d’attestation (pour éviter les conflits), et la chaîne concaténée devient le type de la revendication qui peut être utilisée dans la stratégie.

  • value (String) : valeur de la revendication

  • value_type (String) : type de données de la valeur de la revendication

service_context (BASE64URL(OCTETS)) : contexte opaque créé par le service.

Message du rapport

Sens

Azure Attestation - > Client

Payload

{
  "report": "<JWT>"
}

report (JWT) : rapport d’attestation au format JSON Web Token (JWT) (RFC 7519).

Message de demande v2

{
  "request": "<JWS>"
}

request (JWS) : la requête se compose d’une structure JWS (JSON Web Signature). L’en-tête protégé JWS et la charge utile JWS sont présentés ci-dessous. Comme dans toute structure JWS, la valeur finale se compose de : BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(charge utile JWS) || '.' || BASE64URL(Signature JWS)

En-tête protégé JWS
{
  "alg": "PS256",
  "typ": "attReqV2"
  // no "kid" parameter as the key specified by request_key MUST sign this JWS to prove possession.
}

Charge utile JWS

La charge utile JWS peut être de type de base ou vsm. Le type de base est utilisé quand la preuve d’attestation n’inclut pas de données VSM.

Exemple de base :

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

Exemple TPM + enclave 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) : identificateur de partie de confiance. Utilisé par le service dans le calcul de la revendication d’ID d’ordinateur.

rp_data (BASE64URL(OCTETS)) : données opaques transmises par la partie de confiance. Elles sont normalement utilisées par la partie de confiance en tant que nonce pour garantir l’actualisation du rapport.

challenge (BASE64URL(OCTETS)) : valeur aléatoire émise par le service.

  • current_attestation (Objet) : contient les journaux et le devis TPM pour l’état actuel du système (démarrage ou reprise). Le nonce reçu du service doit être passé à la commande TPM2_Quote dans le paramètre « qualifyingData ».

  • boot_attestation (Objet) : cette option est facultative et contient les journaux et le devis TPM enregistrés avant l’hibernation et la reprise du système. boot_attestation informations doivent être associées au même cycle de démarrage à froid (autrement dit, le système n’a été hiberné et repris entre eux).

  • logs (Array(Object)) : tableau de journaux. Chaque élément du tableau contient un journal et le tableau doit être dans l’ordre utilisé pour les mesures.

    • type (String) : type du journal : « TCG » ou « IMA ».
    • log (BASE64URL(OCTETS)) : journal encodé en tant que chaîne BASE64URL.
  • aik_cert (BASE64URL(OCTETS)) : certificat X.509 représentant l’AIK.

  • aik_pub : partie publique de l’AIK représentée sous la forme d’un objet clé web JSON (JWK) (RFC 7517).

  • pcrs (Array(Object)) : contient l’ensemble entre guillemets. Chaque élément du tableau représente une banque PCR et le tableau doit être dans l’ordre utilisé pour créer le devis. Une banque PCR est définie par son algorithme et ses valeurs (seules les valeurs citées doivent figurer dans la liste).

    • algorithm (Entier) : valeur UINT16 représentant un algorithme de hachage défini par les constantes TPM_ALG_ID.
    • values(Array(Object)) : tableau de valeurs digestes entre guillemets. Chaque élément du tableau représente une valeur digeste dans la banque PCR.
      • index (Entier) : index de la valeur de synthèse PCR.
      • digest(BASE64URL(OCTETS)) : valeur Digest.
    • quote (BASE64URL(OCTETS)) : TPMS_ATTEST retourné par la commande TPM2_Quote. Si ce champ se trouve dans l’objet « current_attestation », la requête reçue du service doit être passée à la commande TPM2_Quote dans le paramètre « qualifyingData ». La valeur du paramètre « qualifyingData » spécifique dépend de la méthode de liaison « request_key » et est décrite dans la section KEY OBJECT.
    • signature (BASE64URL(OCTETS)) : TPMT_SIGNATURE retourné par la commande TPM2_Quote. Si ce champ se trouve dans l’objet « current_attestation », la requête reçue du service doit être passée à la commande TPM2_Quote dans le paramètre « qualifyingData ». La valeur du paramètre « qualifyingData » spécifique dépend de la méthode de liaison « request_key » et est décrite dans la section KEY OBJECT.

vsm_report (objet de rapport VSM) : rapport d’attestation VSM. Consultez la section OBJET RAPPORT VSM.

request_key (objet Key) : clé utilisée pour signer la demande. Si un module de plateforme sécurisée est présent (la requête contient un devis TPM), request_key doit être lié au module de plateforme sécurisée via un devis ou résider dans le module de plateforme sécurisée (voir KEY OBJECT).

other_keys (Array(Key object)) : tableau de clés à envoyer au service. Maximum de deux clés.

custom_claims : tableau de revendications d’enclaves personnalisées envoyées au service, que la stratégie peut évaluer.

  • name : nom de la revendication. Ce nom sera ajouté à une URL déterminée par le service d’attestation (pour éviter les conflits), et la chaîne concaténée devient le type de la revendication qui peut être utilisée dans la stratégie.

  • value : valeur de la revendication.

  • value_type: type de données de la valeur de la revendication.

service_context (BASE64URL(OCTETS)) : contexte opaque et chiffré créé par le service qui inclut, entre autres, le défi et un délai d’expiration pour ce défi.

Objet Clé

jwk (Objet) : partie publique de la clé enclave représentée sous la forme d’un objet clé web JSON (JWK) (RFC 7517).

info (Objet) : informations supplémentaires sur la clé.

Aucune information supplémentaire :(L’objet Info peut être vide ou manquant dans la demande)

• Clé liée au module de plateforme sécurisée via un devis :

  • tpm_quote (Objet) : données pour la méthode de liaison de devis TPM.
  • hash_alg (String) : algorithme utilisé pour créer le hachage passé à la commande TPM2_Quote dans le paramètre « qualifyingData ». Le hachage est calculé par HASH[UTF8(jwk) || 0x00 || < OCTETS(défi de service)>]. Remarque : UTF8(jwk) doit être la chaîne exacte qui sera envoyée sur le câble, car le service calcule le hachage à l’aide de la chaîne exacte reçue dans la demande sans modification.

Remarque : Cette méthode de liaison ne peut pas être utilisée pour les clés du tableau other_keys.

• Clé certifiée résidente dans le module de plateforme sécurisée :

  • tpm_certify (Objet) : données pour la méthode de liaison de certification TPM. « public » (BASE64URL(OCTETS)) : TPMT_PUBLIC structure représentant la zone publique de la clé dans le module de plateforme sécurisée.

  • certification (BASE64URL(OCTETS)) : TPMS_ATTEST retourné par la commande TPM2_Certify. La demande reçue du service doit être passée à la commande TPM2_Certify dans le paramètre « qualifyingData ». L’AIK fourni dans la demande doit être utilisé pour certifier la clé.

  • signature (BASE64URL(OCTETS)) : TPMT_SIGNATURE retourné par la commande TPM2_Certify. La demande reçue du service doit être passée à la commande TPM2_Certify dans le paramètre « qualifyingData ». L’AIK fourni dans la demande doit être utilisé pour certifier la clé.

Remarque : Lorsque cette méthode de liaison est utilisée pour le request_key, la valeur du paramètre « qualifyingData » passée à la commande TPM2_Quote est simplement la demande reçue du service.

Exemples :

Clé non liée au module de plateforme sécurisée :

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

Clé liée au module de plateforme sécurisée par guillemet (résidant dans une enclave VBS ou non) :

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

Clé certifiée résidente dans le module de plateforme sécurisée :

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  },
  "info": {
    "tpm_certify": {
      "public": "<BASE64URL(TPMT_PUBLIC)>",
      "certification": "<BASE64URL(TPMS_ATTEST)>",
      "signature": "<BASE64URL(TPMT_SIGNATURE)>"
    }
  }
}

Objet clé de stratégie

L’objet clé de stratégie est la version de l’objet clé utilisé comme revendications d’entrée dans la stratégie. Il est traité par le service afin de le rendre plus lisible et plus facile à évaluer par des règles de stratégie.

• Clé non liée au module TPM : identique à l’objet clé respectif. Exemple :

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

• Clé liée au module de plateforme sécurisée par guillemet (résidant dans une enclave VBS ou non) : identique à l’objet clé respectif. Exemple :

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

• Clé certifiée résidente dans le module de plateforme sécurisée :

jwk (Objet) : identique à l’objet clé respectif. info.tpm_certify (Objet) :

  • name_alg (Entier) : valeur UINT16 représentant un algorithme de hachage défini par les constantes TPM_ALG_ID.
  • obj_attr (Entier) : valeur UINT32 représentant les attributs de l’objet clé défini par TPMA_OBJECT
  • obj_attr (BASE64URL(OCTETS)) : stratégie facultative pour l’utilisation de cet objet clé.

Exemple :

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

Objet de rapport VBS

Attestation d’enclave :

enclave (objet) : données pour l’attestation d’enclave VSM.

  • report (BASE64URL(OCTETS)) : rapport d’attestation d’enclave VBS tel que retourné par la fonction EnclaveGetAttestationReport. Le paramètre EnclaveData doit être le hachage SHA-512 de la valeur report_signed (y compris les accolades ouvrantes et fermantes). L’entrée de la fonction de hachage est UTF8(report_signed).

Exemples :

Attestation d’enclave :

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

Message du rapport

Service d’attestation de direction -> Client

Payload

{
  "report": "<JWT>"
}

report (JWT) : rapport d’attestation au format JSON Web Token (JWT) (RFC 7519).

Étapes suivantes