Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zaświadczanie platformy Microsoft Azure gwarantuje silne bezpieczeństwo, weryfikując łańcuch zaufania, utrzymywany z poziomu głównego modułu TPM do uruchomienia funkcji hypervisor i bezpiecznego jądra. W tym celu zaświadczenie platformy Azure musi świadczyć o stanie rozruchu maszyny, zanim będziemy mogli ustanowić zaufanie do bezpiecznej enklawy. System operacyjny, funkcja hypervisor i bezpieczne pliki binarne jądra muszą być podpisane przez właściwe oficjalne władze firmy Microsoft i skonfigurowane w bezpieczny sposób. Po powiązaniu zaufania między modułem TPM (Trusted Platform Module) i kondycją funkcji hypervisor możemy zaufać identyfikatorom enklaw zabezpieczeń wirtualizacji (VBS) podanych w dzienniku mierzonego rozruchu. Dzięki temu możemy sprawdzić, czy para kluczy została wygenerowana przez enklawę i pomięć raport zaświadczania, który wiąże zaufanie w tym kluczu i zawiera inne oświadczenia, takie jak poziom zabezpieczeń i właściwości zaświadczania rozruchowego.
Enklawy VBS wymagają modułu TPM, aby zapewnić pomiar w celu zweryfikowania podstawy zabezpieczeń. Enklawy VBS są testowane przez punkt końcowy modułu TPM z dodatkiem do obiektu żądania w protokole.
Komunikaty protokołu
Protokół ma dwie wymiany komunikatów:
- Wiadomość init
- Komunikat żądania
Wiadomość init
Komunikat w celu ustanowienia kontekstu dla komunikatu żądania.
Kierunek
Klient —> zaświadczenie platformy Azure
Ładunek
{
"type": "aikcert"
}
"type" (ciąg ASCII): reprezentuje żądany typ zaświadczania. Obecnie obsługiwany jest tylko element "aikcert".
Komunikat o wyzwaniu
Kierunek
Zaświadczenie platformy Azure —> klient
Ładunek
{
"challenge": "<BASE64URL(CHALLENGE)>",
"service_context": "<BASE64URL(SERVICECONTEXT)>"
}
challenge (BASE64URL(OCTETS)): wartość losowa wystawiona przez usługę.
service_context (BASE64URL(OCTETS)): nieprzezroczysty kontekst utworzony przez usługę.
Komunikat żądania
Ładunek zawierający dane, które mają być zaświadczane przez usługę zaświadczania.
Uwaga: Obsługa dzienników pomiarów i kluczy imA została dodana do komunikatu żądania i można je znaleźć w sekcji Komunikat żądania w wersji 2
Komunikat żądania w wersji 1
Kierunek
Klient —> zaświadczenie platformy Azure
Ładunek
{
"request": "<JWS>"
}
request (JWS): żądanie składa się ze struktury JSON Web Signature (JWS). Poniżej przedstawiono nagłówek chroniony JWS i ładunek JWS. Podobnie jak w każdej strukturze JWS, ostateczna wartość składa się z:
BASE64URL(nagłówek chroniony w formacie UTF8(JWS)) || '.' ||
BASE64URL(Ładunek JWS) || '.' ||
BASE64URL(JWS Signature)
Nagłówek chroniony przez usługę JWS
{
"alg": "PS256",
"typ": "attReq"
// no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
Ładunek JWS
Ładunek JWS może być typu basic lub VBS. Podstawowe jest używane, gdy dowody zaświadczania nie zawierają danych VBS.
Przykład tylko modułu 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)>"
}
}
Przykład enklawy MODUŁU TPM i 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): identyfikator jednostki uzależnionej. Używane przez usługę w obliczeniach oświadczenia o identyfikatorze komputera
rp_data (BASE64URL(OCTETS)): nieprzezroczyste dane przekazywane przez jednostkę uzależnioną. Jest to zwykle używane przez jednostkę uzależnioną jako nonce w celu zagwarantowania aktualności raportu
challenge (BASE64URL(OCTETS)): wartość losowa wystawiona przez usługę
tpm_att_data: dane zaświadczania związane z modułem TPM
srtm_boot_log (BASE64URL(OCTETS)): dzienniki rozruchu SRTM pobrane przez funkcję Tbsi_Get_TCG_Log_Ex z typem dziennika = TBS_TCGLOG_SRTM_BOOT
srtm_resume_log (BASE64URL(OCTETS)): program SRTM wznawia dziennik pobrany przez funkcję Tbsi_Get_TCG_Log_Ex z typem dziennika = TBS_TCGLOG_SRTM_RESUME
drtm_boot_log (BASE64URL(OCTETS)): dzienniki rozruchu DRTM pobrane przez funkcję Tbsi_Get_TCG_Log_Ex z typem dziennika = TBS_TCGLOG_DRTM_BOOT
drtm_resume_log (BASE64URL(OCTETS)): FUNKCJA DRTM wznawia dziennik pobrany przez funkcję Tbsi_Get_TCG_Log_Ex z typem dziennika = TBS_TCGLOG_DRTM_RESUME
aik_cert (BASE64URL(OCTETS)): certyfikat X.509 dla AIK zwrócony przez funkcję NCryptGetProperty z właściwością = NCRYPT_CERTIFICATE_PROPERTY
aik_pub: publiczna część AIK reprezentowana jako obiekt JSON Web Key (JWK) (RFC 7517)
current_claim (BASE64URL(OCTETS)): Oświadczenie zaświadczania dla bieżącego stanu PCR zwrócone przez funkcję NCryptCreateClaim z dwClaimType = NCRYPT_CLAIM_PLATFORM i parametru NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK ustawione na uwzględnianie wszystkich żądań PCR. Wyzwanie wysyłane przez usługę powinno być również używane w obliczeniach tego oświadczenia
boot_claim (BASE64URL(OCTETS)): Oświadczenie zaświadczania dla stanu PCR podczas rozruchu zwrócone przez funkcję NCryptCreateClaim z dwClaimType = NCRYPT_CLAIM_PLATFORM i parametru NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK ustawione na dołączenie wszystkich żądań PCR
vsm_report (BASE64URL(OCTETS)): raport zaświadczania VBS zwracany przez funkcję EnclaveGetAttestationReport. Parametr EnclaveData musi być skrótem SHA-512 wartości report_signed (w tym nawiasów klamrowych otwierających i zamykających). Dane wejściowe funkcji skrótu to UTF8(report_signed)
attest_key: publiczna część klucza enklawy reprezentowana jako obiekt JSON Web Key (JWK) (RFC 7517)
custom_claims: Tablica niestandardowych oświadczeń enklawy wysyłanych do usługi, które mogą być oceniane przez zasady. Oświadczenie
name (Ciąg): nazwa oświadczenia. Ta nazwa zostanie dołączona do adresu URL określonego przez usługę zaświadczania (aby uniknąć konfliktów), a połączony ciąg stanie się typem oświadczenia, którego można użyć w zasadach
value (Ciąg): Wartość oświadczenia
value_type (ciąg): typ danych wartości oświadczenia
service_context (BASE64URL(OCTETS)): nieprzezroczysty kontekst utworzony przez usługę.
Komunikat raportu
Kierunek
Zaświadczenie platformy Azure —> klient
Ładunek
{
"report": "<JWT>"
}
report (JWT): raport zaświadczania w formacie JSON Web Token (JWT) (RFC 7519).
Komunikat żądania w wersji 2
{
"request": "<JWS>"
}
request (JWS): żądanie składa się ze struktury JSON Web Signature (JWS). Poniżej przedstawiono nagłówek chroniony JWS i ładunek JWS. Podobnie jak w każdej strukturze JWS, ostateczna wartość składa się z: BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(Ładunek JWS) || '.' || BASE64URL(JWS Signature)
Nagłówek chroniony przez usługę JWS
{
"alg": "PS256",
"typ": "attReqV2"
// no "kid" parameter as the key specified by request_key MUST sign this JWS to prove possession.
}
Ładunek JWS
Ładunek JWS może być typu basic lub vsm. Podstawowy jest używany, gdy dowody zaświadczania nie zawierają danych programu VSM.
Podstawowy przykład:
{
"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)>"
}
}
Przykład enklawy modułu TPM i 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): identyfikator jednostki uzależnionej. Używany przez usługę w obliczeniach oświadczenia o identyfikatorze komputera.
rp_data (BASE64URL(OCTETS)): nieprzezroczyste dane przekazywane przez jednostkę uzależnioną. Jest to zwykle używane przez jednostkę uzależnioną jako nonce w celu zagwarantowania aktualności raportu.
challenge (BASE64URL(OCTETS)): wartość losowa wystawiona przez usługę.
current_attestation (obiekt): zawiera dzienniki i cudzysłów modułu TPM dla bieżącego stanu systemu (rozruch lub wznawianie). Nie odebrane z usługi musi zostać przekazane do polecenia TPM2_Quote w parametrze "qualifyingData".
boot_attestation (obiekt): jest to opcjonalne i zawiera dzienniki oraz cudzysłów modułu TPM zapisany przed hibernacji systemu i wznowienia. boot_attestation informacje muszą być skojarzone z tym samym zimnym cyklem rozruchu (oznacza to, że system był hibernated i wznowiony między nimi).
logs (Array(Object)): tablica dzienników. Każdy element tablicy zawiera dziennik, a tablica musi być w kolejności używanej do pomiarów.
-
- type (Ciąg): typ dziennika: "TCG" lub "IMA".
-
- log (BASE64URL(OCTETS)): dziennik zakodowany jako ciąg BASE64URL.
aik_cert (BASE64URL(OCTETS)): certyfikat X.509 reprezentujący zestaw AIK.
aik_pub (JWK): publiczna część zestawu AIK reprezentowana jako obiekt JSON Web Key (JWK) (RFC 7517).
pcrs (Array(Object)): zawiera zestaw cytowany. Każdy element tablicy reprezentuje bank PCR, a tablica musi być w kolejności użytej do utworzenia oferty. Bank PCR jest definiowany przez jego algorytm i jego wartości (tylko wartości cytowane powinny znajdować się na liście).
-
- algorithm (liczba całkowita): wartość UINT16 reprezentująca algorytm wyznaczania wartości skrótu zdefiniowany przez stałe TPM_ALG_ID.
-
- values (Array(Object)): tablica wartości szyfrowanych cytowanych. Każdy element tablicy reprezentuje wartość skrótu w banku PCR.
-
-
- index (liczba całkowita): indeks wartości skrótu PCR.
-
-
-
- skrót (BASE64URL(OCTETS)): wartość skrótu.
-
-
- quote (BASE64URL(OCTETS)): TPMS_ATTEST zwrócone przez polecenie TPM2_Quote. Jeśli to pole znajduje się w obiekcie "current_attestation", wyzwanie odebrane z usługi musi zostać przekazane do polecenia TPM2_Quote w parametrze "qualifyingData". Określona wartość parametru "qualifyingData" zależy od metody powiązania "request_key" i jest opisana w sekcji OBIEKT KLUCZA.
-
- signature (BASE64URL(OCTETS)): TPMT_SIGNATURE zwrócone przez polecenie TPM2_Quote. Jeśli to pole znajduje się w obiekcie "current_attestation", wyzwanie odebrane z usługi musi zostać przekazane do polecenia TPM2_Quote w parametrze "qualifyingData". Określona wartość parametru "qualifyingData" zależy od metody powiązania "request_key" i jest opisana w sekcji OBIEKT KLUCZA.
vsm_report (obiekt raportu VSM): raport zaświadczania programu VSM. Zobacz sekcję VSM REPORT OBJECT (OBIEKT RAPORTU PROGRAMU VSM).
request_key (obiekt klucza): klucz używany do podpisywania żądania. Jeśli moduł TPM jest obecny (żądanie zawiera cudzysłów modułu TPM), request_key musi być powiązany z modułem TPM za pośrednictwem cudzysłowu lub być rezydentem w module TPM (zobacz OBIEKT KLUCZA).
other_keys (obiekt Array(Key)): tablica kluczy do wysłania do usługi. Maksymalnie dwa klucze.
custom_claims (Array(Object)): Tablica niestandardowych oświadczeń enklawy wysyłanych do usługi, które mogą być oceniane przez zasady.
name (ciąg): nazwa oświadczenia. Ta nazwa zostanie dołączona do adresu URL określonego przez usługę zaświadczania (aby uniknąć konfliktów), a połączony ciąg stanie się typem oświadczenia, którego można użyć w zasadach.
value (Ciąg): wartość oświadczenia.
value_type (ciąg): typ danych wartości oświadczenia.
service_context (BASE64URL(OCTETS)): nieprzezroczysty, zaszyfrowany kontekst utworzony przez usługę, który obejmuje między innymi wyzwanie i czas wygaśnięcia tego wyzwania.
Obiekt klucza
jwk (obiekt): publiczna część klucza reprezentowana jako obiekt JSON Web Key (JWK) (RFC 7517).
info (obiekt): dodatkowe informacje o kluczu.
Brak dodatkowych informacji:(Obiekt informacji może być pusty lub brakujący w żądaniu)
• Klucz powiązany z modułem TPM za pośrednictwem cudzysłowu:
- tpm_quote (obiekt): dane metody powiązania cudzysłowu modułu TPM.
- hash_alg (ciąg): algorytm użyty do utworzenia skrótu przekazanego do polecenia TPM2_Quote w parametrze "qualifyingData". Skrót jest obliczany przez skrót HASH[UTF8(jwk) || 0x00 || || <OCTETS(wyzwanie usługi)>]. Uwaga: KOD UTF8(jwk) musi być dokładnym ciągiem, który zostanie wysłany w sieci, ponieważ usługa obliczy skrót przy użyciu dokładnego ciągu otrzymanego w żądaniu bez modyfikacji.
Uwaga: tej metody powiązania nie można użyć dla kluczy w tablicy other_keys.
• Klucz certyfikowany do zamieszkania w module TPM:
tpm_certify (obiekt): dane metody powiązania certyfikacji modułu TPM. "public" (BASE64URL(OCTETS)): TPMT_PUBLIC struktura reprezentująca obszar publiczny klucza w module TPM.
certification (BASE64URL(OCTETS)): TPMS_ATTEST zwrócone przez polecenie TPM2_Certify. Wyzwanie odebrane z usługi musi zostać przekazane do polecenia TPM2_Certify w parametrze "qualifyingData". Klucz AIK podany w żądaniu musi być używany do certyfikowania klucza.
signature (BASE64URL(OCTETS)): TPMT_SIGNATURE zwrócone przez polecenie TPM2_Certify. Wyzwanie odebrane z usługi musi zostać przekazane do polecenia TPM2_Certify w parametrze "qualifyingData". Klucz AIK podany w żądaniu musi być używany do certyfikowania klucza.
Uwaga: jeśli ta metoda powiązania jest używana dla request_key, wartość parametru "qualifyingData" przekazana do polecenia TPM2_Quote jest po prostu wyzwaniem otrzymanym od usługi.
Przykłady:
Klucz nie jest powiązany z modułem TPM:
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
}
}
Klucz powiązany z modułem TPM za pośrednictwem cudzysłowu (rezydent w enklawie VBS lub nie):
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
},
"info": {
"tpm_quote":
"hash_alg": "sha-256"
}
}
}
Klucz certyfikowany do zamieszkania w module 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)>"
}
}
}
Obiekt klucza zasad
Obiekt klucza zasad jest wersją obiektu klucza używanego jako oświadczenia wejściowe w zasadach. Jest ona przetwarzana przez usługę, aby była bardziej czytelna i łatwiejsza do oceny przez reguły zasad.
• Klucz nie jest powiązany z modułem TPM: taki sam jak odpowiedni obiekt klucza. Przykład:
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
}
}
• Klucz powiązany z modułem TPM za pośrednictwem cudzysłowu (rezydent w enklawie VBS lub nie): taki sam jak odpowiedni obiekt klucza. Przykład:
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
},
"info": {
"tpm_quote":
"hash_alg": "sha-256"
}
}
}
• Klucz certyfikowany do zamieszkania w module TPM:
jwk (obiekt): taki sam jak odpowiedni obiekt klucza. info.tpm_certify (obiekt):
- name_alg (liczba całkowita): wartość UINT16 reprezentująca algorytm wyznaczania wartości skrótu zdefiniowany przez stałe TPM_ALG_ID.
- obj_attr (liczba całkowita): wartość UINT32 reprezentująca atrybuty obiektu klucza zdefiniowanego przez TPMA_OBJECT
- auth_policy (BASE64URL(OCTETS)): opcjonalne zasady używania tego obiektu klucza.
Przykład:
{
"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)>"
}
}
}
Obiekt raportu VBS
Zaświadczenie enklawy:
enklawa (obiekt): dane zaświadczania enklawy VSM.
- report (BASE64URL(OCTETS)): raport zaświadczania usługi VSM zwrócony przez funkcję EnclaveGetAttestationReport. Parametr EnclaveData musi być skrótem SHA-512 wartości report_signed (w tym nawiasów klamrowych otwierających i zamykających). Dane wejściowe funkcji skrótu to UTF8(report_signed).
Przykłady:
Zaświadczenie enklawy:
{
"enclave": {
"report": "<BASE64URL(REPORT)>"
}
}
Komunikat raportu
Usługa zaświadczania kierunkowego —> klient
Ładunek
{
"report": "<JWT>"
}
report (JWT): raport zaświadczania w formacie JSON Web Token (JWT) (RFC 7519).