Protokol pengesahan enklave Modul Platform Tepercaya (TPM) dan Keamanan berbasis Virtualisasi (VBS)

Microsoft Azure Attestation menjamin keamanan yang kuat dengan memverifikasi rantai kepercayaan, dikelola dari akar kepercayaan (TPM) hingga peluncuran hypervisor dan kernel aman. Untuk melakukannya, Azure Attestation harus membuktikan status boot komputer sebelum kita dapat membangun kepercayaan pada enklave aman. Sistem operasi, hypervisor, dan biner kernel yang aman harus ditandatangani oleh otoritas Microsoft resmi yang benar dan dikonfigurasi dengan cara yang aman. Setelah kami memiliki kepercayaan terikat antara Modul Platform Tepercaya (TPM) dan kesehatan hypervisor, kami dapat memercayai IDK enklave Keamanan Berbasis Virtualisasi (VBS) yang disediakan dalam Log Boot Terukur, dengan ini kami dapat memvalidasi bahwa pasangan kunci dibuat oleh enklave dan membuat laporan pengesahan yang mengikat kepercayaan pada kunci tersebut dan berisi klaim lain seperti tingkat keamanan dan properti pengesahan boot.

Enklave VBS memerlukan TPM untuk memberikan pengukuran untuk memvalidasi fondasi keamanan. Enklave VBS disahkan oleh titik akhir TPM dengan tambahan objek permintaan dalam protokol.

Pesan protokol

Protokol memiliki dua pertukaran pesan:

  • Pesan Init
  • Pesan permintaan

Pesan init

Pesan untuk menetapkan konteks untuk pesan permintaan.

Arah

Klien -> Azure Attestation

Payload

{ 
  "type": "aikcert" 
} 

"type" (string ASCII): mewakili jenis pengesahan yang diminta. Saat ini, hanya "aikcert" yang didukung.

Pesan tantangan

Arah

Azure Attestation -> Klien

Payload

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

challenge (BASE64URL(OCTETS)): Nilai acak yang dikeluarkan oleh layanan.

service_context (BASE64URL(OCTETS)): Konteks buram yang dibuat oleh layanan.

Pesan permintaan

Payload yang berisi data yang akan dibuktikan oleh layanan pengesahan.

Catatan: Dukungan untuk log pengukuran IMA dan Kunci telah ditambahkan ke pesan Permintaan, dan dapat ditemukan di bagian Pesan Permintaan V2

Pesan permintaan v1

Arah

Klien -> Azure Attestation

Payload

{
  "request": "<JWS>"
}

request (JWS): Permintaan terdiri dari struktur JSON Web Signature (JWS). JWS Protected Header dan JWS Payload ditampilkan di bawah. Seperti dalam struktur JWS apa pun, nilai akhir terdiri dari:

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

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

BASE64URL (Tanda Tangan JWS)

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

Payload JWS dapat berdasarkan jenis dasar atau VBS. Dasar digunakan saat bukti pengesahan tidak menyertakan data VBS.

Sampel khusus 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)>" 
  } 
} 

Sampel enklave 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): Mengandalkan pengidentifikasi partai. Digunakan oleh layanan dalam perhitungan klaim ID komputer

rp_data (BASE64URL(OCTETS)): Data buram yang diteruskan oleh pihak yang mengandalkan. Ini biasanya digunakan oleh pihak yang mengandalkan sebagai nonce untuk menjamin kesegaran laporan

challenge (BASE64URL(OCTETS)): Nilai acak yang dikeluarkan oleh layanan

tpm_att_data: Data pengesahan terkait TPM

  • srtm_boot_log (BASE64URL(OCTETS)): Log boot SRTM sebagaimana diambil oleh Tbsi_Get_TCG_Log_Ex dengan jenis log = TBS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL(OCTETS)): log resume SRTM sebagaimana diambil oleh Tbsi_Get_TCG_Log_Ex dengan jenis log = TBS_TCGLOG_SRTM_RESUME

  • drtm_boot_log (BASE64URL(OCTETS)): Log boot DRTM sebagaimana diambil oleh Tbsi_Get_TCG_Log_Ex dengan jenis log = TBS_TCGLOG_DRTM_BOOT

  • drtm_resume_log (BASE64URL(OCTETS)): Log resume DRTM sebagaimana diambil oleh Tbsi_Get_TCG_Log_Ex dengan jenis log = TBS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL(OCTETS)): Sertifikat X.509 untuk AIK sebagaimana ditampilkan oleh fungsi NCryptGetProperty dengan properti = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub: Bagian publik dari AIK yang diwakili sebagai objek JSON Web Key (JWK) (RFC 7517)

  • current_claim (BASE64URL(OCTETS)): Klaim pengesahan untuk status PCR saat ini sebagaimana ditampilkan oleh fungsi NCryptCreateClaim dengan dwClaimType = NCRYPT_CLAIM_PLATFORM dan parameter NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK yang diatur untuk menyertakan semua PCR. Tantangan yang dikirim oleh layanan juga harus digunakan dalam perhitungan klaim ini

  • boot_claim (BASE64URL(OCTETS)): Klaim pengesahan untuk status PCR saat boot sebagaimana ditampilkan oleh fungsi NCryptCreateClaim dengan dwClaimType = NCRYPT_CLAIM_PLATFORM dan parameter NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK yang diatur untuk menyertakan semua PCR

vsm_report (BASE64URL(OCTETS)): Laporan pengesahan enklave VBS sebagaimana dikembalikan oleh fungsi EnclaveGetAttestationReport. Parameter EnclaveData harus berupa hash SHA-512 dari nilai report_signed (termasuk kurung kurawal pembuka dan penutup). Input fungsi hash adalah UTF8(report_signed)

attest_key: Bagian publik dari kunci enklave yang dinyatakan sebagai objek JSON Web Key (JWK) (RFC 7517)

custom_claims: Array klaim enklave kustom yang dikirim ke layanan yang dapat dievaluasi oleh kebijakan. Klaim

  • nama (String): Nama klaim. Nama ini akan ditambahkan ke url yang ditentukan oleh Layanan Pengesahan (untuk menghindari konflik) dan string yang digabungkan menjadi jenis klaim yang dapat digunakan dalam kebijakan

  • value (String): Nilai klaim

  • value_type (String): Jenis data nilai klaim

service_context (BASE64URL(OCTETS)): Konteks buram yang dibuat oleh layanan.

Pesan laporan

Arah

Azure Attestation -> Klien

Payload

{
  "report": "<JWT>"
}

laporan (JWT): Laporan pengesahan dalam format JSON Web Token (JWT) (RFC 7519).

Pesan permintaan v2

{
  "request": "<JWS>"
}

request (JWS): Permintaan terdiri dari struktur JSON Web Signature (JWS). JWS Protected Header dan JWS Payload ditampilkan di bawah. Seperti dalam struktur JWS apa pun, nilai akhir terdiri dari: BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(Payload JWS) || '.' || BASE64URL(Tanda Tangan JWS)

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

Payload JWS

Payload JWS dapat berjenis dasar atau vsm. Dasar digunakan ketika bukti pengesahan tidak menyertakan data VSM.

Contoh dasar:

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

Contoh enklave 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): Mengandalkan pengidentifikasi partai. Digunakan oleh layanan dalam komputasi klaim ID mesin.

rp_data (BASE64URL(OCTETS)): Data buram yang diteruskan oleh pihak yang mengandalkan. Ini biasanya digunakan oleh pihak yang mengandalkan sebagai nonce untuk menjamin kesegaran laporan.

challenge (BASE64URL(OCTETS)): Nilai acak yang dikeluarkan oleh layanan.

  • current_attestation (Objek): Berisi log dan kutipan TPM untuk status sistem saat ini (boot atau resume). Nonce yang diterima dari layanan harus diteruskan ke perintah TPM2_Quote dalam parameter 'qualifyingData'.

  • boot_attestation (Objek): Ini bersifat opsional dan berisi log dan kutipan TPM yang disimpan sebelum sistem dihibernasi dan dilanjutkan. boot_attestation info harus dikaitkan dengan siklus boot dingin yang sama (yaitu, sistem hanya dihibernasi dan dilanjutkan di antara mereka).

  • log (Array(Object)): Array log. Setiap elemen array berisi log dan array harus dalam urutan yang digunakan untuk pengukuran.

    • type (String): Jenis log: "TCG" atau "IMA".
    • log (BASE64URL(OCTETS)): Log yang dikodekan sebagai string BASE64URL.
  • aik_cert (BASE64URL(OCTETS)): Sertifikat X.509 yang mewakili AIK.

  • aik_pub (JWK): Bagian publik dari AIK diwakili sebagai objek JSON Web Key (JWK) (RFC 7517).

  • pcrs (Array(Object)): Berisi set yang dikutip. Setiap elemen array mewakili bank PCR dan array harus dalam urutan yang digunakan untuk membuat kuotasi. Bank PCR didefinisikan oleh algoritma dan nilainya (hanya nilai yang dikutip yang harus ada dalam daftar).

    • algoritma (Bilangan Bulat): nilai UINT16 yang mewakili algoritma hash yang ditentukan oleh konstanta TPM_ALG_ID.
    • nilai (Array(Object)): Array nilai hash yang dikutip. Setiap elemen array mewakili nilai hash di bank PCR.
      • indeks (Bilangan Bulat): Indeks nilai hash PCR.
      • digest (BASE64URL(OCTETS)): Nilai hash.
    • quote (BASE64URL(OCTETS)): TPMS_ATTEST dikembalikan oleh perintah TPM2_Quote. Jika bidang ini berada di objek "current_attestation", tantangan yang diterima dari layanan harus diteruskan ke perintah TPM2_Quote dalam parameter 'qualifyingData'. Nilai parameter 'qualifyingData' tertentu tergantung pada metode pengikatan "request_key" dan dijelaskan di bagian KEY OBJECT.
    • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE dikembalikan oleh perintah TPM2_Quote. Jika bidang ini berada di objek "current_attestation", tantangan yang diterima dari layanan harus diteruskan ke perintah TPM2_Quote dalam parameter 'qualifyingData'. Nilai parameter 'qualifyingData' tertentu tergantung pada metode pengikatan "request_key" dan dijelaskan di bagian KEY OBJECT.

vsm_report (Objek Laporan VSM): Laporan pengesahan VSM. Lihat bagian OBJEK LAPORAN VSM.

request_key (Objek kunci): Kunci yang digunakan untuk menandatangani permintaan. Jika ada TPM (permintaan berisi kutipan TPM), request_key harus terikat ke TPM melalui kuotasi atau menjadi residen di TPM (lihat OBJEK KUNCI).

other_keys (Array(Objek kunci)): Array kunci yang akan dikirim ke layanan. Maksimal dua kunci.

custom_claims (Array(Object)): Array klaim enklave kustom yang dikirim ke layanan yang dapat dievaluasi oleh kebijakan.

  • nama (String): Nama klaim. Nama ini akan ditambahkan ke url yang ditentukan oleh Layanan Pengesahan (untuk menghindari konflik) dan string yang digabungkan menjadi jenis klaim yang dapat digunakan dalam kebijakan.

  • value (String): Nilai klaim.

  • value_type (String): Jenis data nilai klaim.

service_context (BASE64URL(OCTETS)): Buram, konteks terenkripsi yang dibuat oleh layanan yang mencakup, antara lain, tantangan dan waktu kedaluwarsa untuk tantangan tersebut.

Objek kunci

jwk (Objek): Bagian publik dari kunci yang diwakili sebagai objek JSON Web Key (JWK) (RFC 7517).

info (Objek): Informasi tambahan tentang kunci.

Tidak ada informasi tambahan:(Objek info dapat kosong atau hilang dari permintaan)

• Kunci terikat ke TPM melalui kutipan:

  • tpm_quote (Objek): Data untuk metode pengikatan kutipan TPM.
  • hash_alg (String): Algoritma yang digunakan untuk membuat hash yang diteruskan ke perintah TPM2_Quote dalam parameter 'qualifyingData'. Hash dihitung oleh HASH[UTF8(jwk) || 0x00 || <OCTETS(tantangan layanan)>]. Catatan: UTF8(jwk) harus berupa string yang tepat yang akan dikirim pada kawat karena layanan akan menghitung hash menggunakan string yang tepat yang diterima dalam permintaan tanpa modifikasi.

Catatan: Metode pengikatan ini tidak dapat digunakan untuk kunci dalam array other_keys.

• Bersertifikat kunci untuk menjadi residen di TPM:

  • tpm_certify (Objek): Data untuk metode pengikatan sertifikasi TPM. "public" (BASE64URL(OCTETS)): TPMT_PUBLIC struktur yang mewakili area publik kunci dalam TPM.

  • sertifikasi (BASE64URL(OCTETS)): TPMS_ATTEST dikembalikan oleh perintah TPM2_Certify. Tantangan yang diterima dari layanan harus diteruskan ke perintah TPM2_Certify dalam parameter 'qualifyingData'. AIK yang disediakan dalam permintaan harus digunakan untuk mensertifikasi kunci.

  • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE dikembalikan oleh perintah TPM2_Certify. Tantangan yang diterima dari layanan harus diteruskan ke perintah TPM2_Certify dalam parameter 'qualifyingData'. AIK yang disediakan dalam permintaan harus digunakan untuk mensertifikasi kunci.

Catatan: Ketika metode pengikatan ini digunakan untuk request_key, nilai parameter 'qualifyingData' yang diteruskan ke perintah TPM2_Quote hanyalah tantangan yang diterima dari layanan.

Contoh:

Kunci tidak terikat ke TPM:

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

Kunci terikat ke TPM melalui kutipan (baik penduduk di enklave VBS atau tidak):

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

Kunci bersertifikat untuk menjadi penghuni di 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)>"
    }
  }
}

Objek kunci kebijakan

Objek kunci kebijakan adalah versi objek kunci yang digunakan sebagai klaim input dalam kebijakan. Ini diproses oleh layanan untuk membuatnya lebih mudah dibaca dan lebih mudah dievaluasi oleh aturan kebijakan.

• Kunci tidak terikat ke TPM: Sama dengan objek kunci masing-masing. Contoh:

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

• Kunci terikat ke TPM melalui kutipan (baik penduduk di enklave VBS atau tidak): Sama dengan objek kunci masing-masing. Contoh:

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

• Bersertifikat kunci untuk menjadi residen di TPM:

jwk (Objek): Sama dengan objek kunci masing-masing. info.tpm_certify (Objek):

  • name_alg (Bilangan Bulat): Nilai UINT16 yang mewakili algoritma hash yang ditentukan oleh konstanta TPM_ALG_ID.
  • obj_attr (Bilangan Bulat): Nilai UINT32 yang mewakili atribut objek kunci yang ditentukan oleh TPMA_OBJECT
  • auth_policy (BASE64URL(OCTETS)): Kebijakan opsional untuk menggunakan objek kunci ini.

Contoh:

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

Objek laporan VBS

Pengesahan Enklave:

enklave (Objek): Data untuk pengesahan enklave VSM.

  • report (BASE64URL(OCTETS)): Laporan pengesahan enklave VSM seperti yang dikembalikan oleh fungsi EnclaveGetAttestationReport. Parameter EnclaveData harus berupa hash SHA-512 dari nilai report_signed (termasuk kurung kurawal pembuka dan penutup). Input fungsi hash adalah UTF8(report_signed).

Contoh:

Pengesahan Enklave:

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

Pesan laporan

Layanan Pengesahan Arah -> Klien

Payload

{
  "report": "<JWT>"
}

laporan (JWT): Laporan pengesahan dalam format JSON Web Token (JWT) (RFC 7519).

Langkah berikutnya