Čip TPM (Trusted Platform Module) a protokol ověření identity založené na virtualizaci (VBS) enklávy

Ověření identity Microsoft Azure zaručuje silné zabezpečení tím, že ověřuje řetězec důvěryhodnosti, který se udržuje od kořenového adresáře důvěryhodnosti (TPM) až po spuštění hypervisoru a zabezpečeného jádra. Aby to bylo možné, musí ověření identity Azure otestovat stav spuštění počítače, abychom mohli navázat vztah důvěryhodnosti v zabezpečeném enklávu. Operační systém, hypervisor a zabezpečené binární soubory jádra musí být podepsány správnými oficiálními orgány Microsoftu a nakonfigurovány bezpečným způsobem. Jakmile budeme mít vztah důvěryhodnosti mezi čipem TPM (Trusted Platform Module) a stavem hypervisoru, můžeme důvěřovat sadám IDK enklávy VBS (Virtualization Based Security) poskytovaným v protokolu měřeného spouštění. Díky tomu můžeme ověřit, že pár klíčů vygeneroval enkláva a mátu zprávu o ověření identity, která váže vztah důvěryhodnosti v tomto klíči a obsahuje další deklarace identity, jako je úroveň zabezpečení a vlastnosti ověření spouštění.

Enklávy VBS vyžadují k ověření základu zabezpečení čip TPM. Enklávy VBS jsou potvrzeny koncovým bodem TPM s přidáním objektu požadavku v protokolu.

Protokolové zprávy

Protokol má dvě výměny zpráv:

  • Inicializační zpráva
  • Žádost o zprávu

Inicializační zpráva

Zpráva, která vytvoří kontext pro zprávu požadavku.

Směr

Klient –> Ověření identity Azure

Datová část

{ 
  "type": "aikcert" 
} 

"type" (řetězec ASCII): představuje typ požadovaného ověření identity. V současné době se podporuje pouze "aikcert".

Zpráva výzvy

Směr

Ověření identity Azure –> klient

Datová část

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

challenge (BASE64URL(OCTETS)): Náhodná hodnota vystavená službou.

service_context (BASE64URL(OCTETS)): Neprůzný kontext vytvořený službou.

Žádost o zprávu

Datová část obsahující data, která mají být potvrzena službou ověření identity.

Poznámka: Podpora protokolů měření IMA a klíčů byla přidána do žádosti zprávy a najdete ji v části Zpráva žádosti v2.

Žádost o zprávu v1

Směr

Klient –> Ověření identity Azure

Datová část

{
  "request": "<JWS>"
}

request (JWS): Požadavek se skládá ze struktury webového podpisu JSON (JWS). Níže jsou uvedeny hlavičky chráněné JWS a datová část JWS. Stejně jako v jakékoli struktuře JWS se konečná hodnota skládá z:

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

BASE64URL(datová část JWS) || '.' ||

BASE64URL(podpis JWS)

Chráněná hlavička JWS
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
Datová část JWS

Datová část JWS může být typu Basic nebo VBS. Základní se používá, když důkaz ověření identity neobsahuje data VBS.

Ukázka pouze 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)>" 
  } 
} 

Ukázka enklávy 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): Identifikátor předávající strany. Používá se službou ve výpočtu deklarace ID počítače.

rp_data (BASE64URL(OCTETS)): Neprůhládaná data předávající strany. Obvykle ji používá předávající strana jako nesvědčení k zajištění aktuálnosti sestavy.

challenge (BASE64URL(OCTETS)): Náhodná hodnota vystavená službou

tpm_att_data: Data ověření identity související s čipem TPM

  • srtm_boot_log (BASE64URL(OCTETS)):: Protokoly spouštění SRTM načtené funkcí Tbsi_Get_TCG_Log_Ex s typem protokolu = TBS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL(OCTETS)): SRTM obnoví protokol podle funkce Tbsi_Get_TCG_Log_Ex s typem protokolu = TBS_TCGLOG_SRTM_RESUME

  • drtm_boot_log (BASE64URL(OCTETS)):: Spouštěcí protokoly DRTM načtené funkcí Tbsi_Get_TCG_Log_Ex s typem protokolu = TBS_TCGLOG_DRTM_BOOT

  • drtm_resume_log (BASE64URL(OCTETS)): DRTM obnoví protokol podle funkce Tbsi_Get_TCG_Log_Ex s typem protokolu = TBS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL(OCTETS)):: Certifikát X.509 pro AIK vrácený funkcí NCryptGetProperty s vlastností = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub: Veřejná část AIK reprezentovaná jako objekt JSON Web Key (JWK) (RFC 7517)

  • current_claim (BASE64URL(OCTETS)):: Deklarace identity pro aktuální stav PCR vrácená funkcí NCryptCreateClaim with dwClaimType = NCRYPT_CLAIM_PLATFORM a parametr NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK nastavená tak, aby zahrnovala všechny žádosti o přijetí změn. Výzva odeslaná službou by se měla použít také při výpočtu této deklarace identity.

  • boot_claim (BASE64URL(OCTETS)):: Deklarace identity stavu PCR při spuštění vrácená funkcí NCryptCreateClaim with dwClaimType = NCRYPT_CLAIM_PLATFORM a parametr NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK nastavená tak, aby zahrnovala všechna pravidla PCRS

vsm_report (BASE64URL(OCTETS)): Sestava ověření identity enklávy VBS vrácená funkcí EnclaveGetAttestationReport. Parametr EnclaveData musí být hodnotou hash SHA-512 report_signed (včetně levých a uzavíracích závorek). Vstup funkce hash je UTF8(report_signed)

attest_key: Veřejná část klíče enklávy reprezentovaná jako objekt JSON Web Key (JWK) (RFC 7517)

custom_claims: Pole vlastních deklarací enklávy odesílaných do služby, kterou může zásada vyhodnotit. Deklarace identity

  • name (String): Název deklarace identity. Tento název se připojí k adrese URL určené službou ověření identity (aby se zabránilo konfliktům) a zřetězený řetězec se stane typem deklarace identity, kterou lze použít v zásadách.

  • value (String): Hodnota deklarace identity

  • value_type (String):: Datový typ hodnoty deklarace identity

service_context (BASE64URL(OCTETS)): Neprůzný kontext vytvořený službou.

Zpráva sestavy

Směr

Ověření identity Azure –> klient

Datová část

{
  "report": "<JWT>"
}

report (JWT): Sestava ověření identity ve formátu JSON Web Token (JWT) (RFC 7519).

Žádost o zprávu v2

{
  "request": "<JWS>"
}

request (JWS): Požadavek se skládá ze struktury webového podpisu JSON (JWS). Níže jsou uvedeny hlavičky chráněné JWS a datová část JWS. Stejně jako v jakékoli struktuře JWS se konečná hodnota skládá z: BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(datová část JWS) || '.' || BASE64URL(podpis JWS)

Chráněná hlavička JWS
{
  "alg": "PS256",
  "typ": "attReqV2"
  // no "kid" parameter as the key specified by request_key MUST sign this JWS to prove possession.
}

Datová část JWS

Datová část JWS může být typu Basic nebo vsm. Základní se používá, když důkazy ověření identity neobsahují data virtuálních počítačů.

Základní příklad:

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

Příklad enklávy 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): Identifikátor předávající strany. Používá se službou ve výpočtu deklarace ID počítače.

rp_data (BASE64URL(OCTETS)): Neprůhládaná data předávající strany. Obvykle ji používá předávající strana jako nonce k zajištění aktuálnosti sestavy.

challenge (BASE64URL(OCTETS)): Náhodná hodnota vystavená službou.

  • current_attestation (objekt): Obsahuje protokoly a uvozovky TPM pro aktuální stav systému (buď spuštění, nebo obnovení). Nonce přijatá ze služby musí být předána do příkazu TPM2_Quote v parametru 'opravňujícíData'.

  • boot_attestation (Objekt): Toto nastavení je volitelné a obsahuje protokoly a nabídku TPM uloženou před hibernacem a obnovením systému. boot_attestation informace musí být přidružené ke stejnému cyklu studeného spouštění (to znamená, že systém byl pouze hibernován a obnoven mezi nimi).

  • logs (Array(Object)): Pole protokolů. Každý prvek pole obsahuje protokol a pole musí být v pořadí použitém pro měření.

    • type (String): Typ protokolu: "TCG" nebo "IMA".
    • log (BASE64URL(OCTETS)): Protokol je kódovaný jako řetězec BASE64URL.
  • aik_cert (BASE64URL(OCTETS)): Certifikát X.509 představující AIK.

  • aik_pub (JWK): Veřejná část AIK reprezentovaná jako objekt JSON Web Key (JWK) (RFC 7517).

  • pcrs (Array(Object)): Obsahuje sadu citovaných. Každý prvek pole představuje banku PCR a pole musí být v pořadí použitém k vytvoření nabídky. Banku PCR definuje jeho algoritmus a jeho hodnoty (v seznamu by měly být pouze hodnoty uvedené v uvozovním seznamu).

    • algoritmus (Integer): Hodnota UINT16 představující algoritmus hash definovaný konstantami TPM_ALG_ID.
    • values (Array(Object)): Array of digest values quoted. Každý prvek pole představuje hodnotu digest v bance PCR.
      • index (Integer): Index hodnoty hash PCR.
      • digest (BASE64URL(OCTETS)): Hodnota digestu.
    • quote (BASE64URL(OCTETS)): TPMS_ATTEST vrácený příkazem TPM2_Quote. Pokud je toto pole v objektu "current_attestation", musí být výzva přijatá ze služby předána do příkazu TPM2_Quote v parametru 'opravňujícíData'. Konkrétní hodnota parametru 'opravňujícíData' závisí na metodě vazby "request_key" a je popsána v části KEY OBJECT.
    • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE vrácený příkazem TPM2_Quote. Pokud je toto pole v objektu "current_attestation", musí být výzva přijatá ze služby předána do příkazu TPM2_Quote v parametru 'opravňujícíData'. Konkrétní hodnota parametru 'opravňujícíData' závisí na metodě vazby "request_key" a je popsána v části KEY OBJECT.

vsm_report (objekt sestavy VSM): Sestava ověření identity virtuálního počítače. Viz část OBJEKTU SESTAVY VSM.

request_key (objekt klíče): Klíč použitý k podepsání požadavku. Pokud je k dispozici čip TPM (požadavek obsahuje nabídku TPM), request_key musí být buď svázaný s čipem TPM prostřednictvím uvozovek, nebo musí být v uvozovkách (viz KEY OBJECT).

other_keys (Array(key object)): Pole klíčů, které se mají odeslat do služby. Maximálně dva klíče.

custom_claims (Array(Object)): Pole vlastních deklarací enklávy odesílaných do služby, kterou může zásada vyhodnotit.

  • name (String): Název deklarace identity. Tento název se připojí k adrese URL určené službou ověření identity (aby nedocházelo ke konfliktům) a zřetězený řetězec se stane typem deklarace identity, kterou lze použít v zásadách.

  • value (String): Hodnota deklarace identity.

  • value_type (String): Datový typ hodnoty deklarace identity.

service_context (BASE64URL(OCTETS)): Neprůhlený, šifrovaný kontext vytvořený službou, který mimo jiné zahrnuje výzvu a dobu vypršení platnosti tohoto úkolu.

Objekt klíče

jwk (Object): Veřejná část klíče reprezentovaná jako objekt JSON Web Key (JWK) (RFC 7517).

info (Objekt): Dodatečné informace o klíči.

Žádné další informace:(Objekt informace může být prázdný nebo chybí v požadavku)

• Klíč svázaný s čipem TPM prostřednictvím uvozovek:

  • tpm_quote (Object): Data pro metodu vazby uvozovek TPM.
  • hash_alg (String): Algoritmus použitý k vytvoření hodnoty hash předané do příkazu TPM2_Quote v parametru 'opravňujícíData'. Hodnota hash se vypočítá pomocí hodnoty HASH[UTF8(jwk) || 0x00 || <OCTETS(výzva služby)>]. Poznámka: UTF8(jwk) musí být přesný řetězec, který se odešle na drát, protože služba vypočítá hodnotu hash pomocí přesného řetězce přijatého v požadavku bez úprav.

Poznámka: Tuto metodu vazby nelze použít pro klíče v poli other_keys.

• Klíč certifikovaný pro rezidenta v čipu TPM:

  • tpm_certify (objekt): Data pro metodu certifikační vazby TPM. "public" (BASE64URL(OCTETS)): TPMT_PUBLIC struktura představující veřejnou oblast klíče v čipu TPM.

  • certification (BASE64URL(OCTETS)): TPMS_ATTEST vrácený příkazem TPM2_Certify. Výzva přijatá ze služby musí být předána do příkazu TPM2_Certify v parametru 'opravňujícíData'. K certifikaci klíče se musí použít AIK poskytnutý v požadavku.

  • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE vrácený příkazem TPM2_Certify. Výzva přijatá ze služby musí být předána do příkazu TPM2_Certify v parametru 'opravňujícíData'. K certifikaci klíče se musí použít AIK poskytnutý v požadavku.

Poznámka: Pokud se tato metoda vazby používá pro request_key, hodnota parametru "opravňujícíData" předaná do příkazu TPM2_Quote je jednoduše výzva přijatá ze služby.

Příklady:

Klíč není svázaný s čipem TPM:

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

Klíč vázaný na TPM prostřednictvím uvozovek (buď rezident v enklávě VBS, nebo ne):

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

Klíč certifikovaný pro rezidenta v čipu 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)>"
    }
  }
}

Objekt klíče zásad

Objekt klíče zásady je verze objektu klíče, který se používá jako vstupní deklarace identity v zásadě. Služba ji zpracovává, aby byla čitelnější a snadněji vyhodnocovaná pravidly zásad.

• Klíč není svázán s čipem TPM: Stejný jako příslušný objekt klíče. Příklad:

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

• Klíč vázaný na TPM prostřednictvím uvozovek (buď rezident v enklávě VBS, nebo ne): Stejný jako příslušný objekt klíče. Příklad:

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

• Klíč certifikovaný pro rezidenta v čipu TPM:

jwk (Object): Stejné jako příslušný objekt klíče. info.tpm_certify (objekt):

  • name_alg (Integer): Hodnota UINT16 představující algoritmus hash definovaný TPM_ALG_ID konstantami.
  • obj_attr (Integer): Hodnota UINT32 představující atributy objektu klíče definovaného TPMA_OBJECT
  • auth_policy (BASE64URL(OCTETS)): Volitelné zásady pro použití tohoto objektu klíče.

Příklad:

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

Objekt sestavy VBS

Ověření identity enklávy:

enclave (Object): Data pro ověření enklávy VSM.

  • report (BASE64URL(OCTETS)): Sestava ověření identity enklávy VSM vrácená funkcí EnclaveGetAttestationReport. Parametr EnclaveData musí být hodnotou hash SHA-512 report_signed (včetně levých a uzavíracích závorek). Vstup funkce hash je UTF8(report_signed).

Příklady:

Ověření identity enklávy:

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

Zpráva sestavy

Směr služby ověření identity –> klient

Datová část

{
  "report": "<JWT>"
}

report (JWT): Sestava ověření identity ve formátu JSON Web Token (JWT) (RFC 7519).

Další kroky