TPM(신뢰할 수 있는 플랫폼 모듈) 및 VBS(가상화 기반 보안) Enclave 증명 프로토콜
Microsoft Azure Attestation은 TPM(신뢰 루트)에서 하이퍼바이저 시작 및 보안 커널까지 유지 관리되는 신뢰 체인을 확인하여 강력한 보안을 보장합니다. 이렇게 하려면 보안 Enclave에 대한 신뢰를 설정하기 전에 Azure Attestation이 컴퓨터의 부팅 상태를 증명해야 합니다. 운영 체제, 하이퍼바이저 및 보안 커널 이진 파일은 올바른 공식 Microsoft 기관에서 서명하고 안전한 방식으로 구성해야 합니다. TPM(신뢰할 수 있는 플랫폼 모듈)과 하이퍼바이저 상태 간에 트러스트를 바인딩한 후에는 측정된 부팅 로그에 제공된 VBS(가상화 기반 보안) Enclave IDK를 신뢰할 수 있습니다. 이를 통해 키 쌍이 enclave에 의해 생성되었는지 확인하고 해당 키에 대한 트러스트를 바인딩하고 보안 수준 및 부팅 증명 속성과 같은 다른 클레임을 포함하는 증명 보고서를 게시할 수 있습니다.
VBS enclave는 보안 기반의 유효성을 검사하기 위한 측정값을 제공하기 위해 TPM이 필요합니다. VBS enclave는 TPM 엔드포인트에서 증명되고 프로토콜의 요청 개체에 추가됩니다.
프로토콜 메시지
프로토콜에는 두 개의 메시지 교환이 있습니다.
- Init 메시지
- 요청 메시지
Init 메시지
요청 메시지에 대한 컨텍스트를 설정하기 위한 메시지입니다.
방향
클라이언트 -> Azure Attestation
페이로드
{
"type": "aikcert"
}
"type"(ASCII 문자열): 요청된 증명의 형식을 나타냅니다. 현재는 “aikcert”만 지원됩니다.
챌린지 메시지
방향
Azure Attestation -> 클라이언트
페이로드
{
"challenge": "<BASE64URL(CHALLENGE)>",
"service_context": "<BASE64URL(SERVICECONTEXT)>"
}
challenge (BASE64URL(OCTETS)): 서비스에서 발급한 임의 값입니다.
service_context(BASE64URL(OCTETS)): 서비스에서 만든 불투명 컨텍스트입니다.
요청 메시지
증명 서비스에서 증명할 데이터가 포함된 페이로드입니다.
참고: IMA 측정 로그 및 키에 대한 지원이 요청 메시지에 추가되었으며 요청 메시지 V2 섹션에서 찾을 수 있습니다.
요청 메시지 v1
방향
클라이언트 -> Azure Attestation
페이로드
{
"request": "<JWS>"
}
요청 (JWS): 요청은 JWS(JSON 웹 서명) 구조로 구성됩니다. JWS 보호 헤더 및 JWS 페이로드는 다음과 같습니다. JWS 구조와 마찬가지로 최종값은 다음과 같이 구성됩니다.
BASE64URL(UTF8(JWS Protected Header)) || '.' ||
BASE64URL(JWS 페이로드) || '.' ||
BASE64URL(JWS Signature)
JWS 보호 헤더
{
"alg": "PS256",
"typ": "attReq"
// no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
JWS 페이로드
JWS 페이로드는 기본 또는 VBS 형식일 수 있습니다. 증명 증거에 VBS 데이터가 포함되지 않는 경우 기본이 사용됩니다.
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)>"
}
}
TPM + VBS enclave 샘플:
{
"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): 신뢰 당사자 식별자. 컴퓨터 ID 클레임의 계산에서 서비스에서 사용됩니다.
rp_data(BASE64URL(OCTETS)): 신뢰 당사자가 전달한 불투명 데이터입니다. 이는 일반적으로 신뢰 당사자가 보고서의 새로 고침을 보장하기 위해 nonce로 사용됩니다.
challenge (BASE64URL(OCTETS)): 서비스에서 발급한 임의 값
tpm_att_data: TPM 관련 증명 데이터
srtm_boot_log(BASE64URL(OCTETS): 로그 유형 = TBS_TCGLOG_SRTM_BOOT 함수 Tbsi_Get_TCG_Log_Ex 검색된 SRTM 부팅 로그
srtm_resume_log(BASE64URL(OCTETS)): 함수 Tbsi_Get_TCG_Log_Ex(로그 유형 = TBS_TCGLOG_SRTM_RESUME)로 검색된 SRTM 계속하기 로그
drtm_boot_log(BASE64URL(OCTETS): 로그 유형 = TBS_TCGLOG_DRTM_BOOT 함수 Tbsi_Get_TCG_Log_Ex 검색된 DRTM 부팅 로그
drtm_resume_log(BASE64URL(OCTETS): DRTM은 로그 유형 = TBS_TCGLOG_DRTM_RESUME 함수 Tbsi_Get_TCG_Log_Ex 검색된 로그를 다시 시작합니다.
aik_cert(BASE64URL(OCTETS): 함수 NCryptGetProperty에서 반환된 AIK의 X.509 인증서입니다. 속성 = NCRYPT_CERTIFICATE_PROPERTY
aik_pub: JWK(JSON 웹 키) 개체로 표현되는 AIK의 공용 부분(RFC 7517)
current_claim(BASE64URL(OCTETS)): 함수 NCryptCreateClaim(dwClaimType = NCRYPT_CLAIM_PLATFORM) 및 모든 PCR을 포함하도록 설정된 매개 변수 NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK에서 반환한 현재 PCR 상태에 대한 증명 클레임. 서비스에서 보낸 챌린지는 이 클레임의 계산에도 사용해야 합니다.
boot_claim(BASE64URL(OCTETS): dwClaimType = NCRYPT_CLAIM_PLATFORM 및 매개 변수 NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK 모든 PCR을 포함하도록 설정된 함수 NCryptCreateClaim에서 반환된 부팅 시 PCR 상태에 대한 증명 클레임입니다.
vsm_report(BASE64URL(OCTETS)): 함수 EnclaveGetAttestationReport에서 반환한 VBS enclave 증명 보고서입니다. EnclaveData 매개 변수는 report_signed 값(여는 중괄호 및 닫는 중괄호 포함)의 SHA-512 해시여야 합니다. 해시 함수 입력이 UTF8(report_signed)입니다.
attest_key: JWK(JSON 웹 키) 개체로 표시되는 enclave 키의 공개 부분(RFC 7517)
custom_claims: 정책에서 평가할 수 있는 서비스로 전송된 사용자 지정 enclave 클레임의 배열입니다. 다음과 같은 클레임 항목이 있습니다.
name(문자열): 클레임의 이름. 이 이름은 증명 서비스에서 결정된 URL에 추가되고(충돌을 방지하기 위해) 연결된 문자열은 정책에서 사용할 수 있는 클레임의 형식이 됩니다.
value (String): 클레임의 값
value_type(문자열): 클레임 값의 데이터 형식
service_context(BASE64URL(OCTETS)): 서비스에서 만든 불투명 컨텍스트입니다.
보고서 메시지
방향
Azure Attestation -> 클라이언트
페이로드
{
"report": "<JWT>"
}
report(JWT): JWT(JSON Web Token) 형식(RFC 7519)의 증명 보고서
요청 메시지 v2
{
"request": "<JWS>"
}
요청 (JWS): 요청은 JWS(JSON 웹 서명) 구조로 구성됩니다. JWS 보호 헤더 및 JWS 페이로드는 다음과 같습니다. 모든 JWS 구조에서와 마찬가지로 최종 값은 다음으로 구성됩니다. BASE64URL(UTF8(JWS 보호 헤더)) || '.' || BASE64URL(JWS 페이로드) || '.' || BASE64URL(JWS 서명)
JWS 보호 헤더
{
"alg": "PS256",
"typ": "attReqV2"
// no "kid" parameter as the key specified by request_key MUST sign this JWS to prove possession.
}
JWS 페이로드
JWS 페이로드는 기본 또는 vsm 형식일 수 있습니다. 증명 증거에 VSM 데이터가 포함되지 않은 경우 기본이 사용됩니다.
기본 예:
{
"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)>"
}
}
TPM + VBS Enclave 예:
{
"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): 신뢰 당사자 식별자. 서비스에서 머신 ID 클레임을 계산하는 데 사용됩니다.
rp_data(BASE64URL(OCTETS)): 신뢰 당사자가 전달한 불투명 데이터입니다. 일반적으로 신뢰 당사자에 의해 보고서가 최신 상태임을 보장하는 nonce로 사용됩니다.
challenge (BASE64URL(OCTETS)): 서비스에서 발급한 임의 값입니다.
current_attestation(개체): 시스템의 현재 상태(부팅 또는 다시 시작)에 대한 로그 및 TPM 견적을 포함합니다. 서비스에서 받은 nonce는 'qualifyingData' 매개 변수의 TPM2_Quote 명령에 전달되어야 합니다.
boot_attestation(개체): 이는 선택 사항이며 시스템이 최대 절전 모드로 전환되고 다시 시작되기 전에 저장된 로그 및 TPM 견적을 포함합니다. boot_attestation 정보는 동일한 콜드 부팅 주기와 연결되어야 합니다(즉, 시스템이 최대 절전 모드로 전환되고 다시 시작됨).
logs(Array(Object)): 로그 배열. 배열의 각 요소에는 로그가 포함되며 배열은 측정에 사용되는 순서를 따라야 합니다.
-
- type(문자열): 로그 형식: "TCG" 또는 "IMA".
-
- log(BASE64URL(OCTETS)): BASE64URL 문자열로 인코딩된 로그.
aik_cert(BASE64URL(OCTETS)): AIK를 나타내는 X.509 인증서.
aik_pub(JWK): JWK(JSON 웹 키) 개체(RFC 7517)로 표시된 AIK의 퍼블릭 부분.
pcrs(Array(Object)): 인용된 집합 포함. 배열의 각 요소는 PCR 은행을 나타내며 배열은 견적을 만드는 데 사용된 순서를 따라야 합니다. PCR 뱅크는 알고리즘과 값으로 정의됩니다(인용된 값만 목록에 있어야 함).
-
- algorithm(정수): TPM_ALG_ID 상수로 정의된 해시 알고리즘을 나타내는 UINT16 값.
-
- values(Array(Object)): 인용된 다이제스트 값의 배열. 배열의 각 요소는 PCR 뱅크의 다이제스트 값을 나타냅니다.
-
-
- index(정수): PCR 다이제스트 값의 인덱스.
-
-
-
- digest(BASE64URL(OCTETS)): 다이제스트 값.
-
-
- quote(BASE64URL(OCTETS)): TPM2_Quote 명령에 의해 반환된 TPMS_ATTEST. 이 필드가 "current_attestation" 개체에 있는 경우 서비스에서 받은 챌린지는 "qualifyingData" 매개 변수의 TPM2_Quote 명령에 전달되어야 합니다. 특정 "qualifyingData" 매개 변수 값은 "request_key" 바인딩 방법에 따라 다르며 KEY OBJECT 섹션에 설명되어 있습니다.
-
- signature(BASE64URL(OCTETS)): TPM2_Quote 명령에 의해 반환된 TPMT_SIGNATURE. 이 필드가 "current_attestation" 개체에 있는 경우 서비스에서 받은 챌린지는 "qualifyingData" 매개 변수의 TPM2_Quote 명령에 전달되어야 합니다. 특정 "qualifyingData" 매개 변수 값은 "request_key" 바인딩 방법에 따라 다르며 KEY OBJECT 섹션에 설명되어 있습니다.
vsm_report(VSM 보고서 개체): VSM 증명 보고서. VSM REPORT OBJECT 섹션을 참조하세요.
request_key(키 개체): 요청에 서명하는 데 사용되는 키. TPM이 있는 경우(요청에 TPM 견적 포함) request_key는 견적을 통해 TPM에 바인딩되거나 TPM에 상주해야 합니다(KEY OBJECT 참조).
other_keys(Array(키 개체)): 서비스로 보낼 키의 배열. 최대 2개의 키입니다.
custom_claims(Array(개체)): 정책에서 평가할 수 있는 서비스로 전송된 사용자 지정 enclave 클레임의 배열.
name(문자열): 클레임의 이름. 이 이름은 증명 서비스에서 결정된 URL에 추가되고(충돌을 방지하기 위해) 연결된 문자열은 정책에서 사용 가능한 클레임 형식이 됩니다.
value(문자열): 클레임의 값.
value_type(문자열): 클레임 값의 데이터 형식.
service_context(BASE64URL(OCTETS)): 서비스에서 만든 불투명하고 암호화된 컨텍스트로, 그 중에서도 해당 챌린지에 대한 챌린지 및 만료 시간이 포함됩니다.
Key 개체
jwk(개체): JSON 웹 키(JWK) 개체(RFC 7517)로 표현되는 키의 공용 부분.
info(개체): 키에 대한 추가 정보.
추가 정보 없음:(정보 개체가 비어 있거나 요청에서 누락될 수 있음)
• 견적을 통해 TPM에 바인딩된 키:
- tpm_quote(개체): TPM 견적 바인딩 방법에 대한 데이터.
- hash_alg(문자열): 'qualifyingData' 매개 변수에서 TPM2_Quote 명령에 전달되는 해시를 만드는 데 사용되는 알고리즘. 해시는 다음과 같이 계산됩니다. HASH[UTF8(jwk) || 0x00 || <OCTETS(서비스 챌린지)>]. 참고: UTF8(jwk)은 서비스가 수정 없이 요청에서 받은 정확한 문자열을 사용하여 해시를 계산하므로 유선으로 전송될 정확한 문자열이어야 합니다.
참고: 이 바인딩 방법은 other_keys 배열의 키에 사용할 수 없습니다.
• TPM에 상주하도록 인증된 키:
tpm_certify(개체): TPM 인증 바인딩 방법에 대한 데이터. "public"(BASE64URL(OCTETS)): TPM에서 키의 공용 영역을 나타내는 TPMT_PUBLIC 구조.
certification(BASE64URL(OCTETS)): TPM2_Certify 명령에서 반환된 TPMS_ATTEST. 서비스에서 받은 챌린지는 'qualifyingData' 매개 변수의 TPM2_Certify 명령으로 전달되어야 합니다. 요청에 제공된 AIK를 사용하여 키를 인증해야 합니다.
signature(BASE64URL(OCTETS)): TPM2_Certify 명령에서 반환된 TPMT_SIGNATURE. 서비스에서 받은 챌린지는 'qualifyingData' 매개 변수의 TPM2_Certify 명령으로 전달되어야 합니다. 요청에 제공된 AIK를 사용하여 키를 인증해야 합니다.
참고: 이 바인딩 방법이 request_key에 사용되는 경우 TPM2_Quote 명령에 전달되는 'qualifyingData' 매개 변수 값은 단순히 서비스에서 받은 챌린지입니다.
예:
TPM에 바인딩되지 않은 키:
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
}
}
견적을 통해 TPM에 바인딩된 키(VBS Enclave에 상주하는지 여부):
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
},
"info": {
"tpm_quote":
"hash_alg": "sha-256"
}
}
}
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)>"
}
}
}
정책 키 개체
정책 키 개체는 정책에서 입력 클레임으로 사용되는 키 개체의 버전입니다. 정책 규칙에 따라 더 읽기 쉽고 쉽게 평가할 수 있도록 서비스에서 처리됩니다.
• TPM에 바인딩되지 않은 키: 해당 키 개체와 동일합니다. 예시:
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
}
}
• 견적을 통해 TPM에 바인딩된 키(VBS Enclave에 상주하는지 여부): 각각의 키 개체와 동일합니다. 예시:
{
"jwk": {
"kty": "RSA",
"n": "<Base64urlUInt(MODULUS)>",
"e": "<Base64urlUInt(EXPONENT)>"
},
"info": {
"tpm_quote":
"hash_alg": "sha-256"
}
}
}
• TPM에 상주하도록 인증된 키:
jwk(개체): 해당 키 개체와 동일. info.tpm_certify(개체):
- name_alg(정수): TPM_ALG_ID 상수로 정의된 해시 알고리즘을 나타내는 UINT16 값.
- obj_attr(Integer): TPMA_OBJECT에 의해 정의된 키 개체의 특성을 나타내는 UINT32 값.
- auth_policy(BASE64URL(OCTETS)): 이 키 개체를 사용하기 위한 선택적 정책.
예시:
{
"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 보고서 개체
Enclave 증명:
enclave(개체): VSM enclave 증명을 위한 데이터.
- report(BASE64URL(OCTETS)): 함수 EnclaveGetAttestationReport에서 반환한 VBS enclave 증명 보고서. EnclaveData 매개 변수는 report_signed 값(여는 중괄호 및 닫는 중괄호 포함)의 SHA-512 해시여야 합니다. 해시 함수 입력은 UTF8(report_signed)입니다.
예:
Enclave 증명:
{
"enclave": {
"report": "<BASE64URL(REPORT)>"
}
}
보고서 메시지
방향 증명 서비스 -> 클라이언트
페이로드
{
"report": "<JWT>"
}
report(JWT): JWT(JSON Web Token) 형식(RFC 7519)의 증명 보고서