Condividi tramite


Protocollo di attestazione dell'enclave Trusted Platform Module (TPM) e Virtualization Based Security (VBS)

Microsoft attestazione di Azure garantisce una sicurezza avanzata verificando una catena di attendibilità, mantenuta da una radice di trust (TPM) all'avvio dell'hypervisor e del kernel sicuro. A tale scopo, attestazione di Azure deve attestare lo stato di avvio del computer prima di poter stabilire l'attendibilità nell'enclave sicuro. Il sistema operativo, l'hypervisor e i file binari del kernel sicuri devono essere firmati dalle autorità Microsoft ufficiali corrette e configurati in modo sicuro. Dopo aver associato un trust tra il TPM (Trusted Platform Module) e l'integrità dell'hypervisor, è possibile considerare attendibili gli ID enclave di Virtualization Based Security (VBS) forniti nel log di avvio misurato, con questo è possibile verificare che una coppia di chiavi sia stata generata dall'enclave e coniare un report di attestazione che associa attendibilità in tale chiave e contiene altre attestazioni, ad esempio il livello di sicurezza e le proprietà di attestazione di avvio.

Le enclave VBS richiedono un TPM per fornire la misurazione per convalidare le basi di sicurezza. Le enclave VBS sono attestate dall'endpoint TPM con un'aggiunta all'oggetto richiesta nel protocollo.

Messaggi del protocollo

Il protocollo ha due scambi di messaggi:

  • Messaggio Init
  • Messaggio di richiesta

Messaggio init

Messaggio per stabilire il contesto per il messaggio di richiesta.

Direzione

Client -> attestazione di Azure

Payload

{ 
  "type": "aikcert" 
} 

"type" (stringa ASCII): rappresenta il tipo di attestazione richiesto. Attualmente è supportato solo "aikcert".

Messaggio di richiesta di verifica

Direzione

attestazione di Azure -> Cliente

Payload

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

challenge (BASE64URL(OCTETS)): valore casuale rilasciato dal servizio.

service_context (BASE64URL(OCTETS)): contesto opaco creato dal servizio.

Messaggio di richiesta

Payload contenente i dati che devono essere attestati dal servizio di attestazione.

Nota: il supporto per i log di misurazione IMA e le chiavi sono stati aggiunti al messaggio di richiesta e sono disponibili nella sezione Request Message V2 (Messaggio di richiesta V2)

Messaggio di richiesta v1

Direzione

Client -> attestazione di Azure

Payload

{
  "request": "<JWS>"
}

request (JWS): la richiesta è costituita da una struttura JWS (JSON Web Signature). Di seguito sono riportati l'intestazione protetta JWS e il payload JWS. Come in qualsiasi struttura JWS, il valore finale è costituito da:

BASE64URL(UTF8(intestazione protetta JWS)) || '.' ||

BASE64URL(payload JWS) || '.' ||

BASE64URL(firma JWS)

Intestazione protetta da JWS
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
Payload JWS

Il payload JWS può essere di tipo basic o VBS. Basic viene usato quando l'evidenza di attestazione non include dati VBS.

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

Esempio di 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): identificatore della relying party. Usato dal servizio nel calcolo dell'attestazione ID computer

rp_data (BASE64URL(OCTETS)): dati opachi passati dalla relying party. Questa operazione viene in genere utilizzata dalla relying party come nonce per garantire l'aggiornamento del report

challenge (BASE64URL(OCTETS)): valore casuale rilasciato dal servizio

tpm_att_data: dati di attestazione correlati a TPM

  • srtm_boot_log (BASE64URL(OCTETS): log di avvio SRTM recuperati dalla funzione Tbsi_Get_TCG_Log_Ex con tipo di log = TBS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL(OCTETS): SRTM riprende il log come recuperato dalla funzione Tbsi_Get_TCG_Log_Ex con tipo di log = TBS_TCGLOG_SRTM_RESUME

  • drtm_boot_log (BASE64URL(OCTETS): log di avvio DRTM recuperati dalla funzione Tbsi_Get_TCG_Log_Ex con tipo di log = TBS_TCGLOG_DRTM_BOOT

  • drtm_resume_log (BASE64URL(OCTETS): DRTM riprende il log come recuperato dalla funzione Tbsi_Get_TCG_Log_Ex con tipo di log = TBS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL(OCTETS): certificato X.509 per AIK restituito dalla funzione NCryptGetProperty con proprietà = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub: parte pubblica dell'AIK rappresentata come oggetto JWK (JSON Web Key) (RFC 7517)

  • current_claim (BASE64URL(OCTETS): attestazione per lo stato PCR corrente restituito dalla funzione NCryptCreateClaim con dwClaimType = NCRYPT_CLAIM_PLATFORM e parametro NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK impostato per includere tutte le richieste pull. La richiesta inviata dal servizio deve essere usata anche nel calcolo di questa attestazione

  • boot_claim (BASE64URL(OCTETS): attestazione per lo stato PCR all'avvio come restituito dalla funzione NCryptCreateClaim con dwClaimType = NCRYPT_CLAIM_PLATFORM e parametro NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK impostata per includere tutte le richieste pull

vsm_report (BASE64URL(OCTETS)): report di attestazione dell'enclave VBS restituito dalla funzione EnclaveGetAttestationReport. Il parametro EnclaveData deve essere l'hash SHA-512 del valore di report_signed (incluse le parentesi graffe di apertura e chiusura). L'input della funzione hash è UTF8(report_signed)

attest_key: parte pubblica della chiave dell'enclave rappresentata come oggetto JWK (JSON Web Key) (RFC 7517)

custom_claims: matrice di attestazioni di enclave personalizzate inviate al servizio che possono essere valutate dai criteri. Attestazione

  • name (String): nome dell'attestazione. Questo nome verrà aggiunto a un URL determinato dal servizio di attestazione (per evitare conflitti) e la stringa concatenata diventa il tipo dell'attestazione che può essere usata nei criteri

  • value (String): valore dell'attestazione

  • value_type (String): tipo di dati del valore dell'attestazione

service_context (BASE64URL(OCTETS)): contesto opaco creato dal servizio.

Messaggio di report

Direzione

attestazione di Azure -> Cliente

Payload

{
  "report": "<JWT>"
}

report (JWT): report di attestazione in formato JWT (JSON Web Token) (RFC 7519).

Messaggio di richiesta v2

{
  "request": "<JWS>"
}

request (JWS): la richiesta è costituita da una struttura JWS (JSON Web Signature). Di seguito sono riportati l'intestazione protetta JWS e il payload JWS. Come in qualsiasi struttura JWS, il valore finale è costituito da: BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(payload JWS) || '.' || BASE64URL(firma JWS)

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

Payload JWS

Il payload JWS può essere di tipo basic o vsm. Basic viene usato quando l'evidenza di attestazione non include dati VSM.

Esempio di 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)>"
  }
}

Esempio di 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): identificatore della relying party. Usato dal servizio nel calcolo dell'attestazione ID computer.

rp_data (BASE64URL(OCTETS)): dati opachi passati dalla relying party. Questa operazione viene in genere utilizzata dalla relying party come nonce per garantire l'aggiornamento del report.

challenge (BASE64URL(OCTETS)): valore casuale rilasciato dal servizio.

  • current_attestation (oggetto): contiene log e virgolette TPM per lo stato corrente del sistema (avvio o ripresa). Il nonce ricevuto dal servizio deve essere passato al comando TPM2_Quote nel parametro 'qualifyingData'.

  • boot_attestation (Oggetto): è facoltativo e contiene i log e l'offerta TPM salvata prima dell'ibernazione e ripresa del sistema. boot_attestation informazioni devono essere associate allo stesso ciclo di avvio a freddo (ovvero il sistema è stato solo ibernato e ripreso tra di essi).

  • logs (Array(Object)): matrice di log. Ogni elemento della matrice contiene un log e la matrice deve essere nell'ordine usato per le misurazioni.

    • type (String): tipo del log: "TCG" o "IMA".
    • log (BASE64URL(OCTETS)): il log codificato come stringa BASE64URL.
  • aik_cert (BASE64URL(OCTETS)): certificato X.509 che rappresenta l'AIK.

  • aik_pub (JWK): parte pubblica dell'AIK rappresentata come oggetto JWK (JSON Web Key) (RFC 7517).

  • pcrs (Array(Object)): contiene il set tra virgolette. Ogni elemento della matrice rappresenta una banca PCR e la matrice deve essere nell'ordine usato per creare l'offerta. Una banca PCR è definita dal relativo algoritmo e dai relativi valori (solo i valori delimitati devono trovarsi nell'elenco).

    • algorithm (Integer): valore UINT16 che rappresenta un algoritmo hash definito dalle costanti TPM_ALG_ID.
    • values (Array(Object)): matrice di valori digest tra virgolette. Ogni elemento della matrice rappresenta un valore digest nella banca PCR.
      • index (Integer): indice del valore del digest PCR.
      • digest (BASE64URL(OCTETS)): valore digest.
    • virgolette (BASE64URL(OCTETS)): TPMS_ATTEST restituite dal comando TPM2_Quote. Se questo campo si trova nell'oggetto "current_attestation", la richiesta di verifica ricevuta dal servizio deve essere passata al comando TPM2_Quote nel parametro 'qualifyingData'. Il valore del parametro 'qualifyingData' specifico dipende dal metodo di associazione "request_key" ed è descritto nella sezione KEY OBJECT.
    • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE restituito dal comando TPM2_Quote. Se questo campo si trova nell'oggetto "current_attestation", la richiesta di verifica ricevuta dal servizio deve essere passata al comando TPM2_Quote nel parametro 'qualifyingData'. Il valore del parametro 'qualifyingData' specifico dipende dal metodo di associazione "request_key" ed è descritto nella sezione KEY OBJECT.

vsm_report (oggetto report VSM): report di attestazione VSM. Vedere la sezione OGGETTO REPORT VSM.

request_key (oggetto Key): chiave usata per firmare la richiesta. Se è presente un TPM (la richiesta contiene l'offerta TPM), request_key deve essere associato al TPM tramite offerta o essere residente nel TPM (vedere KEY OBJECT).

other_keys (Array(Key object)): matrice di chiavi da inviare al servizio. Massimo due chiavi.

custom_claims (Array(Object)): matrice di attestazioni di enclave personalizzate inviate al servizio che possono essere valutate dai criteri.

  • name (String): nome dell'attestazione. Questo nome verrà aggiunto a un URL determinato dal servizio di attestazione (per evitare conflitti) e la stringa concatenata diventa il tipo dell'attestazione che può essere usata nei criteri.

  • value (String): valore dell'attestazione.

  • value_type (String): tipo di dati del valore dell'attestazione.

service_context (BASE64URL(OCTETS)): contesto opaco e crittografato creato dal servizio che include, tra gli altri, la richiesta di verifica e un'ora di scadenza per tale richiesta.

Oggetto Key

jwk (Object): parte pubblica della chiave rappresentata come oggetto JWK (JSON Web Key) (RFC 7517).

info (oggetto): informazioni aggiuntive sulla chiave.

Nessuna informazione aggiuntiva:(L'oggetto Info può essere vuoto o mancante dalla richiesta)

• Chiave associata al TPM tramite virgolette:

  • tpm_quote (Oggetto): dati per il metodo di associazione di virgolette TPM.
  • hash_alg (Stringa): algoritmo usato per creare l'hash passato al comando TPM2_Quote nel parametro 'qualifyingData'. L'hash viene calcolato da HASH[UTF8(jwk) || 0x00 || <OCTETS(service challenge)>]. Nota: UTF8(jwk) deve essere la stringa esatta che verrà inviata in transito perché il servizio calcola l'hash usando la stringa esatta ricevuta nella richiesta senza modifiche.

Nota: questo metodo di associazione non può essere usato per le chiavi nella matrice other_keys.

• Chiave certificata per essere residente nel TPM:

  • tpm_certify (Oggetto): dati per il metodo di associazione di certificazione TPM. "public" (BASE64URL(OCTETS)): TPMT_PUBLIC struttura che rappresenta l'area pubblica della chiave nel TPM.

  • certification (BASE64URL(OCTETS)): TPMS_ATTEST restituito dal comando TPM2_Certify. La richiesta di verifica ricevuta dal servizio deve essere passata al comando TPM2_Certify nel parametro 'qualifyingData'. L'AIK fornito nella richiesta deve essere usato per certificare la chiave.

  • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE restituito dal comando TPM2_Certify. La richiesta di verifica ricevuta dal servizio deve essere passata al comando TPM2_Certify nel parametro 'qualifyingData'. L'AIK fornito nella richiesta deve essere usato per certificare la chiave.

Nota: quando questo metodo di associazione viene usato per il request_key, il valore del parametro 'qualifyingData' passato al comando TPM2_Quote è semplicemente la richiesta di verifica ricevuta dal servizio.

Esempi:

Chiave non associata al TPM:

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

Chiave associata al TPM tramite virgolette (residente in un enclave VBS o meno):

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

Chiave certificata per essere residente nel 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)>"
    }
  }
}

Oggetto chiave criteri

L'oggetto chiave dei criteri è la versione dell'oggetto chiave usato come attestazioni di input nei criteri. Viene elaborato dal servizio per renderlo più leggibile e più semplice da valutare in base alle regole dei criteri.

• Chiave non associata al TPM: uguale al rispettivo oggetto chiave. Esempio:

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

• Chiave associata al TPM tramite virgolette (residente in un enclave VBS o meno): uguale al rispettivo oggetto chiave. Esempio:

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

• Chiave certificata per essere residente nel TPM:

jwk (Object): uguale al rispettivo oggetto chiave. info.tpm_certify (oggetto):

  • name_alg (Integer): valore UINT16 che rappresenta un algoritmo hash definito dalle costanti TPM_ALG_ID.
  • obj_attr (Integer): valore UINT32 che rappresenta gli attributi dell'oggetto chiave definito da TPMA_OBJECT
  • auth_policy (BASE64URL(OCTETS)): criterio facoltativo per l'uso di questo oggetto chiave.

Esempio:

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

Oggetto report VBS

Attestazione dell'enclave:

enclave (oggetto): dati per l'attestazione dell'enclave VSM.

  • report (BASE64URL(OCTETS)): report di attestazione dell'enclave VSM restituito dalla funzione EnclaveGetAttestationReport. Il parametro EnclaveData deve essere l'hash SHA-512 del valore di report_signed (incluse le parentesi graffe di apertura e chiusura). L'input della funzione hash è UTF8(report_signed).

Esempi:

Attestazione dell'enclave:

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

Messaggio di report

Servizio di attestazione della direzione -> Client

Payload

{
  "report": "<JWT>"
}

report (JWT): report di attestazione in formato JWT (JSON Web Token) (RFC 7519).

Passaggi successivi