TPM (Trusted Platform Module) och VBS(Virtualization Based Security) enklavattesteringsprotokoll

Microsoft Azure Attestation garanterar stark säkerhet genom att verifiera en förtroendekedja som upprätthålls från en rot av förtroende (TPM) till lanseringen av hypervisor-programmet och en säker kernel. För att göra det måste Azure Attestation intyga datorns starttillstånd innan vi kan upprätta förtroende för den säkra enklaven. Operativsystemet, hypervisor-programmet och de säkra kernel-binärfilerna måste signeras av rätt officiella Microsoft-myndigheter och konfigureras på ett säkert sätt. När vi har bundit förtroende mellan TPM (Trusted Platform Module) och hypervisor-programmets hälsotillstånd kan vi lita på virtualiseringsbaserade säkerhets-IDK:er (VBS) i den uppmätta startloggen, med detta kan vi verifiera att ett nyckelpar genererades av enklaven och prägla en attesteringsrapport som binder förtroende för den nyckeln och innehåller andra anspråk, till exempel säkerhetsnivå- och startattesteringsegenskaper.

VBS-enklaver kräver en TPM för att tillhandahålla mätningen för att verifiera säkerhetsgrunden. VBS-enklaver intygas av TPM-slutpunkten med ett tillägg till begärandeobjektet i protokollet.

Protokollmeddelanden

Protokollet har två meddelanden:

  • Init-meddelande
  • Begärandemeddelande

Init-meddelande

Meddelande för att upprätta kontext för begärandemeddelandet.

Riktning

Klient –> Azure Attestation

Nyttolast

{ 
  "type": "aikcert" 
} 

"type" (ASCII-sträng): representerar den typ av attestering som begärs. För närvarande stöds endast "aikcert".

Utmaningsmeddelande

Riktning

Azure-attestering –> klient

Nyttolast

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

challenge (BASE64URL(OCTETS)): Slumpmässigt värde som utfärdats av tjänsten.

service_context (BASE64URL(OCTETS)): Ogenomskinlig kontext som skapats av tjänsten.

Begärandemeddelande

Nyttolast som innehåller de data som ska intygas av attesteringstjänsten.

Obs! Stöd för IMA-måttloggar och nycklar har lagts till i meddelandebegäran och finns i avsnittet Begär meddelande V2

Begärandemeddelande v1

Riktning

Klient –> Azure Attestation

Nyttolast

{
  "request": "<JWS>"
}

request (JWS): Begäran består av en JSON-struktur för webbsignatur (JWS). JWS-skyddad rubrik och JWS-nyttolast visas nedan. Som i alla JWS-strukturer består det slutliga värdet av:

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

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

BASE64URL(JWS-signatur)

JWS-skyddat huvud
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
JWS-nyttolast

JWS-nyttolasten kan vara av typen basic eller VBS. Basic används när attesteringsbevis inte innehåller VBS-data.

Exempel på endast 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)>" 
  } 
} 

Exempel på TPM + VBS-enklaver:

{ 
  "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): Förlitande partsidentifierare. Används av tjänsten i beräkningen av dator-ID-anspråket

rp_data (BASE64URL(OCTETS)): Ogenomskinliga data som skickas av den förlitande parten. Detta används normalt av den förlitande parten som en nonce för att garantera rapportens färskhet

challenge (BASE64URL(OCTETS)): Slumpmässigt värde som utfärdats av tjänsten

tpm_att_data: TPM-relaterade attesteringsdata

  • srtm_boot_log (BASE64URL(OCTETS)): SRTM-startloggar som hämtas av funktion Tbsi_Get_TCG_Log_Ex med loggtyp = TBS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL(OCTETS)): SRTM återupptar loggen som hämtad av funktion Tbsi_Get_TCG_Log_Ex med loggtyp = TBS_TCGLOG_SRTM_RESUME

  • drtm_boot_log (BASE64URL(OCTETS)): DRTM-startloggar som hämtas av funktion Tbsi_Get_TCG_Log_Ex med loggtyp = TBS_TCGLOG_DRTM_BOOT

  • drtm_resume_log (BASE64URL(OCTETS)): DRTM återupptar loggen som hämtad av funktion Tbsi_Get_TCG_Log_Ex med loggtyp = TBS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL(OCTETS)): X.509-certifikatet för AIK som returneras av funktionen NCryptGetProperty med egenskapen = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub: Den offentliga delen av AIK som representeras som ett JSON-webbnyckelobjekt (JWK) (RFC 7517)

  • current_claim (BASE64URL(OCTETS)): Attesteringsanspråket för det aktuella PCR-tillståndet som returneras av funktionen NCryptCreateClaim med dwClaimType = NCRYPT_CLAIM_PLATFORM och parametern NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK inställd på att inkludera alla PCR. Den utmaning som skickas av tjänsten bör också användas vid beräkningen av detta anspråk

  • boot_claim (BASE64URL(OCTETS)): Attesteringsanspråket för PCR-tillståndet vid start som returneras av funktionen NCryptCreateClaim med dwClaimType = NCRYPT_CLAIM_PLATFORM och parametern NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK inställd på att inkludera alla PCR:er

vsm_report (BASE64URL(OCTETS)): Rapporten om attestering av VBS-enklaver som returneras av funktionen EnclaveGetAttestationReport. Parametern EnclaveData måste vara SHA-512-hashvärdet för värdet för report_signed (inklusive inledande och avslutande klammerparenteser). Hashfunktionens indata är UTF8(report_signed)

attest_key: Den offentliga delen av enklavnyckeln som representeras som ett JWK-objekt (JSON Web Key) (RFC 7517)

custom_claims: Matris med anpassade enklaveranspråk som skickas till tjänsten som kan utvärderas av principen. Anspråket

  • name (String): Namnet på anspråket. Det här namnet läggs till i en URL som bestäms av attesteringstjänsten (för att undvika konflikter) och den sammanfogade strängen blir den typ av anspråk som kan användas i principen

  • value (String): Värdet för anspråket

  • value_type (sträng): Datatyp för anspråkets värde

service_context (BASE64URL(OCTETS)): Ogenomskinlig kontext som skapats av tjänsten.

Rapportmeddelande

Riktning

Azure-attestering –> klient

Nyttolast

{
  "report": "<JWT>"
}

report (JWT): Attesteringsrapporten i JSON Web Token-format (JWT) (RFC 7519).

Begär meddelande v2

{
  "request": "<JWS>"
}

request (JWS): Begäran består av en JSON-struktur för webbsignatur (JWS). JWS-skyddad rubrik och JWS-nyttolast visas nedan. Precis som i alla JWS-strukturer består det slutliga värdet av: BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS-signatur)

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

JWS-nyttolast

JWS-nyttolasten kan vara av typen basic eller vsm. Basic används när attesteringsbevis inte innehåller VSM-data.

Grundläggande exempel:

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

Exempel på TPM + VBS-enklaver:

{
  "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): Förlitande partsidentifierare. Används av tjänsten i beräkningen av dator-ID-anspråket.

rp_data (BASE64URL(OCTETS)): Ogenomskinliga data som skickas av den förlitande parten. Detta används normalt av den förlitande parten som en nonce för att garantera rapportens färskhet.

challenge (BASE64URL(OCTETS)): Slumpmässigt värde som utfärdats av tjänsten.

  • current_attestation (objekt): Innehåller loggar och TPM-offert för systemets aktuella tillstånd (antingen start eller återuppta). Den nonce som tas emot från tjänsten måste skickas till kommandot TPM2_Quote i parametern "qualifyingData".

  • boot_attestation (objekt): Detta är valfritt och innehåller loggar och TPM-offerten som sparats innan systemet viloläge och återupptagits. boot_attestation information måste vara associerad med samma kallstartscykel (d.v.s. systemet viloläge och återupptogs mellan dem).

  • loggar (Array(Object)): Matris med loggar. Varje element i matrisen innehåller en logg och matrisen måste vara i den ordning som används för mätningar.

    • type (String): Typ av logg: "TCG" eller "IMA".
    • log (BASE64URL(OCTETS)): Loggen som kodas som en BASE64URL sträng.
  • aik_cert (BASE64URL(OCTETS)): X.509-certifikatet som representerar AIK.

  • aik_pub (JWK): Den offentliga delen av AIK som representeras som ett JSON-webbnyckelobjekt (JWK) (RFC 7517).

  • pcrs (Array(Object)): Innehåller den angivna uppsättningen. Varje element i matrisen representerar en PCR-bank och matrisen måste vara i den ordning som används för att skapa offerten. En PCR-bank definieras av dess algoritm och dess värden (endast de värden som anges ska finnas i listan).

    • algoritm (Heltal): UINT16-värde som representerar en hash-algoritm som definieras av TPM_ALG_ID konstanter.
    • values (Array(Object)): Matris med sammanfattade värden som citeras. Varje element i matrisen representerar ett sammandragsvärde i PCR-banken.
      • index (Heltal): Index för PCR-sammandragsvärdet.
      • digest (BASE64URL(OCTETS)): Sammandragsvärde.
    • quote (BASE64URL(OCTETS)): TPMS_ATTEST returneras av kommandot TPM2_Quote. Om det här fältet finns i objektet "current_attestation" måste uppgiften som tas emot från tjänsten skickas till kommandot TPM2_Quote i parametern "qualifyingData". Det specifika parametervärdet "qualifyingData" beror på bindningsmetoden "request_key" och beskrivs i avsnittet NYCKELOBJEKT.
    • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE returneras av kommandot TPM2_Quote. Om det här fältet finns i objektet "current_attestation" måste uppgiften som tas emot från tjänsten skickas till kommandot TPM2_Quote i parametern "qualifyingData". Det specifika parametervärdet "qualifyingData" beror på bindningsmetoden "request_key" och beskrivs i avsnittet NYCKELOBJEKT.

vsm_report (VSM-rapportobjekt): VSM-attesteringsrapporten. Se avsnittet VSM-RAPPORTOBJEKT.

request_key (nyckelobjekt): Nyckel som används för att signera begäran. Om en TPM finns (begäran innehåller TPM-offert) måste request_key antingen vara bunden till TPM via offert eller vara bosatt i TPM (se NYCKELOBJEKT).

other_keys (Matris(nyckelobjekt)): Matris med nycklar som ska skickas till tjänsten. Maximalt två nycklar.

custom_claims (Array(Object)): Matris med anpassade enklaveranspråk som skickas till tjänsten som kan utvärderas av principen.

  • name (String): Namnet på anspråket. Det här namnet läggs till i en URL som bestäms av attesteringstjänsten (för att undvika konflikter) och den sammanfogade strängen blir den typ av anspråk som kan användas i principen.

  • värde (sträng): Anspråkets värde.

  • value_type (Sträng): Datatyp för anspråkets värde.

service_context (BASE64URL(OCTETS)): Ogenomskinlig, krypterad kontext som skapats av tjänsten som bland annat innehåller utmaningen och en förfallotid för den utmaningen.

Nyckelobjekt

jwk (Objekt): Den offentliga delen av nyckeln som representeras som ett JSON-webbnyckelobjekt (JWK) (RFC 7517).

info (Object): Extra information om nyckeln.

Ingen extra information:(Info-objektet kan vara tomt eller saknas i begäran)

• Nyckel bunden till TPM via citattecken:

  • tpm_quote (objekt): Data för bindningsmetoden för TPM-offert.
  • hash_alg (Sträng): Algoritmen som används för att skapa hashen som skickas till kommandot TPM2_Quote i parametern "qualifyingData". Hashen beräknas av HASH[UTF8(jwk) || 0x00 || <OCTETS(service challenge)>]. Obs! UTF8(jwk) måste vara den exakta sträng som skickas på tråden eftersom tjänsten beräknar hashen med den exakta strängen som tas emot i begäran utan ändringar.

Obs! Den här bindningsmetoden kan inte användas för nycklar i other_keys matris.

• Nyckel certifierad för att vara bosatt i TPM:

  • tpm_certify (objekt): Data för TPM-certifieringsbindningsmetoden. "public" (BASE64URL(OCTETS)): TPMT_PUBLIC struktur som representerar det offentliga området för nyckeln i TPM.

  • certifiering (BASE64URL(OCTETS)): TPMS_ATTEST returneras av kommandot TPM2_Certify. Den utmaning som tas emot från tjänsten måste skickas till kommandot TPM2_Certify i parametern "qualifyingData". AIK som anges i begäran måste användas för att certifiera nyckeln.

  • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE returneras av kommandot TPM2_Certify. Den utmaning som tas emot från tjänsten måste skickas till kommandot TPM2_Certify i parametern "qualifyingData". AIK som anges i begäran måste användas för att certifiera nyckeln.

Obs! När den här bindningsmetoden används för request_key är parametervärdet "qualifyingData" som skickas till kommandot TPM2_Quote helt enkelt den utmaning som tas emot från tjänsten.

Exempel:

Nyckeln är inte bunden till TPM:

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

Nyckel som är bunden till TPM via citattecken (antingen bosatt i en VBS-enklav eller inte):

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

Nyckel som är certifierad för att vara bosatt i 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)>"
    }
  }
}

Principnyckelobjekt

Principnyckelobjektet är den version av nyckelobjektet som används som indataanspråk i principen. Den bearbetas av tjänsten för att göra den mer läsbar och enklare att utvärdera med principregler.

• Nyckeln är inte bunden till TPM: Samma som respektive nyckelobjekt. Exempel:

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

• Nyckel bunden till TPM via offert (antingen bosatt i en VBS-enklav eller inte): Samma som respektive nyckelobjekt. Exempel:

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

• Nyckel certifierad för att vara bosatt i TPM:

jwk (objekt): Samma som respektive nyckelobjekt. info.tpm_certify (objekt):

  • name_alg (Heltal): UINT16-värde som representerar en hash-algoritm som definieras av TPM_ALG_ID konstanter.
  • obj_attr (Heltal): UINT32-värde som representerar attributen för nyckelobjektet som definierats av TPMA_OBJECT
  • auth_policy (BASE64URL(OCTETS)): Valfri princip för att använda det här nyckelobjektet.

Exempel:

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

VBS-rapportobjekt

Enklavattestering:

enclave (Object): Data för VSM-enklavattestering.

  • report (BASE64URL(OCTETS)): VSM-enklavens attesteringsrapport som returneras av funktionen EnclaveGetAttestationReport. Parametern EnclaveData måste vara SHA-512-hashvärdet för värdet för report_signed (inklusive inledande och avslutande klammerparenteser). Indata för hashfunktionen är UTF8(report_signed).

Exempel:

Enklavattestering:

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

Rapportmeddelande

Direction Attestation Service –> klient

Nyttolast

{
  "report": "<JWT>"
}

report (JWT): Attesteringsrapporten i JSON Web Token-format (JWT) (RFC 7519).

Nästa steg