키 저장소는 제어된 방식으로 암호화 키를 생성, 저장 및 사용하는 데 더 안전한 장소를 제공합니다. 하드웨어 지원 키 저장소를 사용할 수 있고 사용하고 있다면 키 자료는 기기에서 추출하는 것으로부터 더 안전해지고 Keymaster는 풀기 어려운 제한을 시행합니다.
하지만 이는 키 저장소 키가 하드웨어 지원 저장소에 있다고 알려진 경우에만 적용됩니다. Keymaster 1에서는 앱 또는 원격 서버가 이 경우가 맞는 건지 확실하게 확인할 방법이 없었습니다. 키 저장소 데몬은 사용할 수 있는 Keymaster HAL을 로드하고 키의 하드웨어 지원에 관해 HAL이 알려준 대로 신뢰했습니다.
이를 해결하기 위해 Keymaster는 Android 7.0(Keymaster 2)에 키 증명과 Android 8.0(Keymaster 3)에 ID 증명을 도입했습니다.
키 증명은 비대칭 키 쌍의 하드웨어 지원 여부, 키의 속성 및 사용 제약 조건은 무엇인지를 확인하는 강력한 방법을 제공합니다.
ID 증명을 사용하면 기기에서 일련번호 또는 IMEI와 같은 하드웨어 식별자 증명을 제공할 수 있습니다.
키 증명
키 증명을 지원하기 위해 Android 7.0에서는 HAL에 태그, 유형 및 메서드 집합을 도입했습니다.
태그
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
유형
Keymaster 2 이하
typedef struct { keymaster_blob_t* entries; size_t entry_count; } keymaster_cert_chain_t;
AttestKey
메서드
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) generates(ErrorCode error, vec<vec<uint8_t>> certChain);
Keymaster 2 이하
keymaster_error_t (*attest_key)(const struct keymaster2_device* dev, const keymaster_key_blob_t* key_to_attest, const keymaster_key_param_set_t* attest_params, keymaster_cert_chain_t* cert_chain);
dev
는 Keymaster 기기 구조입니다.keyToAttest
는generateKey
에서 반환되는 키 blob이며 증명은 키 blob을 위해 생성됩니다.attestParams
는 증명에 필요한 매개변수의 목록입니다. 이 목록에는Tag::APPLICATION_ID
와Tag::APPLICATION_DATA
외에도Tag::ATTESTATION_CHALLENGE
가 포함되고Tag::RESET_SINCE_ID_ROTATION
도 포함될 수 있습니다. 앞의 두 태그가 키 생성 중에 지정되었다면 키 blob을 복호화하는 데 필요합니다.certChain
은 출력 매개변수이며 인증서의 배열을 반환합니다. 항목 0은 증명 인증서이며keyToAttest
에서 키를 인증하고 인증 확장을 포함합니다.
attestKey
메서드는 언제든지 호출될 수 있고 승인 제약 조건을 충족하지 않아도 되므로 증명된 키의 공개 키 연산으로 간주합니다. 예를 들어 사용 시 증명된 키에 사용자 인증이 필요하다면 증명은 사용자 인증 없이 생성될 수 있습니다.
증명 인증서
증명 인증서는 표준 X.509 인증서이며 증명된 키의 설명을 포함하는 선택적 증명 확장을 사용합니다. 인증서는 인증된 증명 키로 서명됩니다. 증명 키는 키 증명과 다른 알고리즘을 사용할 수 있습니다.
증명 인증서에는 아래 표의 필드가 포함되며 추가 필드는 포함될 수 없습니다. 일부 필드는 고정된 필드 값을 지정합니다. CTS 테스트는 인증서 콘텐츠가 정의된 것과 정확히 일치하는지 확인합니다.
Certificate SEQUENCE
필드 이름(RFC 5280 참조) | 값 |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
signatureAlgorithm | 키 서명에 사용하는 알고리즘의 AlgorithmIdentifier: EC 키의 경우 ECDSA이며 RSA 키의 경우 RSA입니다. |
signatureValue | BIT STRING이며 ASN.1 DER로 인코딩된 tbsCertificate로 계산된 서명입니다. |
TBSCertificate SEQUENCE
필드 이름(RFC 5280 참조) | 값 |
---|---|
version |
INTEGER 2(v3 인증서를 의미함) |
serialNumber |
INTEGER 1(고정 값: 모든 인증서에서 동일함) |
signature |
키 서명에 사용하는 알고리즘의 AlgorithmIdentifier: EC 키의 경우 ECDSA이며 RSA 키의 경우 RSA입니다. |
issuer |
배치 증명 키의 subject 필드와 동일합니다. |
validity |
Tag::ACTIVE_DATETIME 및 Tag::USAGE_EXPIRE_DATETIME 의 값을 포함하는 두 날짜의 SEQUENCE입니다.
이러한 값은 1970년 1월 1일 이후 시간을 밀리초 단위로 나타낸 것입니다.
인증서의 올바른 날짜 표현은 RFC 5280을 참조하세요.Tag::ACTIVE_DATETIME 이 없다면 Tag::CREATION_DATETIME 의 값을 사용합니다. Tag::USAGE_EXPIRE_DATETIME 이 없다면 배치 증명 키 인증서의 만료일을 사용합니다. |
subject |
CN = 'Android Keystore Key'(고정 값: 모든 인증서에서 동일함) |
subjectPublicKeyInfo |
증명된 공개 키를 포함하는 SubjectPublicKeyInfo입니다. |
extensions/Key Usage |
digitalSignature: 키에 KeyPurpose::SIGN 또는 KeyPurpose::VERIFY 목적이 있다면 설정합니다. 다른 모든 비트는 설정되지 않습니다. |
extensions/CRL Distribution Points |
값이 정해지지 않았습니다. |
extensions/"attestation" |
OID는 1.3.6.1.4.1.11129.2.1.17이며 콘텐츠는 아래의 증명 확장 섹션에 정의되어 있습니다. 모든 X.509 인증서 확장과 마찬가지로 콘텐츠는 증명 SEQUENCE의 DER 인코딩을 포함하는 OCTET_STRING으로 표현됩니다. |
증명 확장
attestation
확장에는 OID 1.3.6.1.4.1.11129.2.1.17
이 있습니다. 여기에는 증명되는 키 쌍과 키 생성 시 기기 상태에 관한 정보가 포함됩니다.
AIDL 인터페이스 사양에 정의된 Keymaster/KeyMint 태그 유형은 다음과 같이 ASN.1 유형으로 변환됩니다.
Keymaster/KeyMint 유형 | ASN.1 유형 | 참고 |
---|---|---|
ENUM |
INTEGER |
|
ENUM_REP |
SET of INTEGER |
|
UINT |
INTEGER |
|
UINT_REP |
SET of INTEGER |
|
ULONG |
INTEGER |
|
ULONG_REP |
SET of INTEGER |
|
DATE |
INTEGER |
1970년 1월 1일 00:00:00 GMT 이후의 밀리초입니다. |
BOOL |
NULL |
태그가 있으면 true를, 없으면 false를 의미합니다. |
BIGNUM |
이 유형의 태그가 없으므로 매핑이 정의되지 않습니다. | |
BYTES |
OCTET_STRING |
스키마
증명 확장 콘텐츠는 다음 ASN.1 스키마로 설명합니다.
버전 400
KeyDescription ::= SEQUENCE { attestationVersion 400, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL, moduleHash [724] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
버전 300
KeyDescription ::= SEQUENCE { attestationVersion 300, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
버전 200
KeyDescription ::= SEQUENCE { attestationVersion 200, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
버전 100
KeyDescription ::= SEQUENCE { attestationVersion 100, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
버전 4
KeyDescription ::= SEQUENCE { attestationVersion 4, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
버전 3
KeyDescription ::= SEQUENCE { attestationVersion 3, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
버전 2
KeyDescription ::= SEQUENCE { attestationVersion 2, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
버전 1
KeyDescription ::= SEQUENCE { attestationVersion 1, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
KeyDescription 필드
-
attestationVersion
- ASN.1 스키마 버전입니다.
값 Keymaster/KeyMint 버전 1 Keymaster 버전 2.0 2 Keymaster 버전 3.0 3 Keymaster 버전 4.0 4 Keymaster 버전 4.1 100 KeyMint 버전 1.0 200 KeyMint 버전 2.0 300 KeyMint 버전 3.0 400 KeyMint 버전 4.0 -
attestationSecurityLevel
-
증명된 키가 저장되는 위치의 보안 수준입니다.
-
keymasterVersion
/keyMintVersion
- Keymaster/KeyMint 하드웨어 추상화 계층 (HAL) 구현의 버전입니다.
값 Keymaster/KeyMint 버전 2 Keymaster 버전 2.0 3 Keymaster 버전 3.0 4 Keymaster 버전 4.0 41 Keymaster 버전 4.1 100 KeyMint 버전 1.0 200 KeyMint 버전 2.0 300 KeyMint 버전 3.0 400 KeyMint 버전 4.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Keymaster/KeyMint 구현의 보안 수준입니다.
-
attestationChallenge
- 키 생성 시 제공된 챌린지입니다.
-
uniqueId
- 시스템 앱이 키 생성 시 요청할 수 있는 개인 정보 보호에 민감한 기기 식별자입니다. 고유 ID가 요청되지 않으면 이 필드는 비어 있습니다. 자세한 내용은 고유 ID 섹션을 참고하세요.
-
softwareEnforced
- Android 시스템에서 시행하는 Keymaster/KeyMint 승인 목록입니다. 이 정보는 플랫폼의 코드에 의해 수집되거나 생성됩니다. 기기가 Android 플랫폼 보안 모델을 준수하는 운영체제를 실행하는 한 신뢰할 수 있습니다(즉, 기기의 부트로더가 잠겨 있고
verifiedBootState
가Verified
임). -
hardwareEnforced
- 기기의 신뢰할 수 있는 실행 환경 (TEE) 또는 StrongBox에서 시행하는 Keymaster/KeyMint 승인 목록입니다. 이 정보는 보안 하드웨어의 코드에 의해 수집되거나 생성되며 플랫폼에서 제어하지 않습니다. 예를 들어 정보는 부트로더에서 가져오거나 플랫폼을 신뢰하지 않는 보안 통신 채널을 통해 가져올 수 있습니다.
SecurityLevel 값
SecurityLevel
값은 키 저장소 관련 요소 (예: 키 쌍 및 증명)가 공격에 얼마나 잘 견디는지 나타냅니다.
값 | 의미 |
---|---|
Software |
기기의 Android 시스템이 Android 플랫폼 보안 모델을 준수하는 한(즉, 기기의 부트로더가 잠겨 있고 verifiedBootState 가 Verified 임) 안전합니다. |
TrustedEnvironment |
신뢰할 수 있는 실행 환경 (TEE)이 손상되지 않는 한 안전합니다. TEE의 격리 요구사항은 Android 호환성 정의 문서의 9.11[C-1-1] ~[C-1-4] 섹션에 정의되어 있습니다. TEE는 원격 손상에 매우 강하고 직접적인 하드웨어 공격에 의한 손상에는 비교적 강합니다. |
StrongBox |
StrongBox가 손상되지 않는 한 안전합니다. StrongBox는 하드웨어 보안 모듈과 유사한 보안 요소에 구현됩니다. StrongBox의 구현 요구사항은 Android 호환성 정의 문서의 9.11.2 섹션에 정의되어 있습니다. StrongBox는 원격 도용 및 직접적인 하드웨어 공격(예: 물리적 조작 및 부채널 공격)에 매우 강합니다. |
AuthorizationList 필드
각 필드는 AIDL 인터페이스 사양의 Keymaster/KeyMint 승인 태그에 대응됩니다.
사양은 승인 태그에 관한 정보의 소스입니다. 즉, 의미, 콘텐츠 형식, KeyDescription
객체의 softwareEnforced
또는 hardwareEnforced
필드에 표시될지 여부, 다른 태그와 상호 배타적인지 여부 등입니다. 모든 AuthorizationList
필드는 선택사항입니다.
각 필드에는 Keymaster/KeyMint 태그 번호와 동일한 EXPLICIT
컨텍스트별 태그가 있어 AuthorizationList
에서 데이터를 더 컴팩트하게 표현할 수 있습니다. 따라서 ASN.1 파서는 각 컨텍스트별 태그의 예상 데이터 유형을 알아야 합니다. 예를 들어 Tag::USER_AUTH_TYPE
는 ENUM | 504
로 정의됩니다. 증명 확장 프로그램 스키마에서 AuthorizationList
의 purpose
필드는 userAuthType [504] EXPLICIT INTEGER OPTIONAL
로 지정됩니다. 따라서 ASN.1 인코딩에는 ASN.1 유형 INTEGER
의 UNIVERSAL
클래스 태그(10
) 대신 컨텍스트별 태그 504
가 포함됩니다.
-
purpose
-
Tag::PURPOSE
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 1을 사용합니다. -
algorithm
-
Tag::ALGORITHM
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 2를 사용합니다.증명
AuthorizationList
객체에서 알고리즘 값은 항상RSA
또는EC
입니다. -
keySize
-
Tag::KEY_SIZE
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 3을 사용합니다. -
digest
-
Tag::DIGEST
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 5를 사용합니다. -
padding
-
Tag::PADDING
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 6을 사용합니다. -
ecCurve
-
Tag::EC_CURVE
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 10을 사용합니다.Android 시스템 키 저장소에서 서명 및 확인을 위해 ECDSA를 사용하는 타원 곡선(EC) 키 쌍을 생성하는 데 사용되는 매개변수 집합입니다.
-
rsaPublicExponent
Tag::RSA_PUBLIC_EXPONENT
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 200을 사용합니다.-
mgfDigest
-
키 증명 버전 100 이상에만 있습니다.
Tag::RSA_OAEP_MGF_DIGEST
KeyMint 승인 태그에 대응하며, 이 태그는 태그 ID 값으로 203을 사용합니다. -
rollbackResistance
-
키 증명 버전 3 이상에만 있습니다.
Tag::ROLLBACK_RESISTANCE
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 303을 사용합니다. -
earlyBootOnly
-
키 증명 버전 4 이상에만 있습니다.
Tag::EARLY_BOOT_ONLY
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 305를 사용합니다. -
activeDateTime
-
Tag::ACTIVE_DATETIME
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 400을 사용합니다. -
originationExpireDateTime
-
Tag::ORIGINATION_EXPIRE_DATETIME
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 401을 사용합니다. -
usageExpireDateTime
Tag::USAGE_EXPIRE_DATETIME
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 402를 사용합니다.-
usageCountLimit
Tag::USAGE_COUNT_LIMIT
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 405를 사용합니다.-
noAuthRequired
-
Tag::NO_AUTH_REQUIRED
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 503을 사용합니다. -
userAuthType
-
Tag::USER_AUTH_TYPE
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 504를 사용합니다. -
authTimeout
-
Tag::AUTH_TIMEOUT
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 505를 사용합니다. -
allowWhileOnBody
-
Tag::ALLOW_WHILE_ON_BODY
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 506을 사용합니다.사용자가 기기를 계속 몸에 착용하고 있으면 인증 시간 제한 후 키를 사용하도록 허용합니다. 안전한 신체 활동 센서가 기기가 사용자의 신체에 착용되어 있는지 확인합니다.
-
trustedUserPresenceRequired
-
키 증명 버전 3 이상에만 있습니다.
Tag::TRUSTED_USER_PRESENCE_REQUIRED
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 507을 사용합니다.사용자가 실제 존재 증거를 제공한 경우에만 이 키를 사용할 수 있다고 명시합니다. 몇 가지 예는 다음과 같습니다.
- StrongBox 키의 경우 하드웨어 버튼이 StrongBox 기기의 핀에 내장되어 있습니다.
- TEE 키의 경우 TEE에서 스캐너를 독점적으로 제어하고 지문 일치 프로세스를 시행하는 한 지문 인증이 존재를 증명합니다.
-
trustedConfirmationRequired
-
키 증명 버전 3 이상에만 있습니다.
Tag::TRUSTED_CONFIRMATION_REQUIRED
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 508을 사용합니다.사용자가 승인 토큰을 사용해 서명될 데이터를 확인하는 경우에만 키를 사용할 수 있음을 지정합니다. 사용자의 확인을 받는 방법에 관한 자세한 내용은 Android 보안 확인을 참고하세요.
참고: 이 태그는
SIGN
목적으로 사용되는 키에만 적용할 수 있습니다. -
unlockedDeviceRequired
-
키 증명 버전 3 이상에만 있습니다.
Tag::UNLOCKED_DEVICE_REQUIRED
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 509를 사용합니다. -
allApplications
-
Tag::ALL_APPLICATIONS
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 600을 사용합니다.기기의 모든 앱이 키 쌍에 액세스할 수 있는지 나타냅니다.
-
applicationId
Tag::APPLICATION_ID
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 601을 사용합니다.-
creationDateTime
-
Tag::CREATION_DATETIME
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 701을 사용합니다. -
origin
-
Tag::ORIGIN
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 702를 사용합니다. -
rollbackResistant
-
키 증명 버전 1과 2에만 있습니다.
Tag::ROLLBACK_RESISTANT
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 703을 사용합니다. -
rootOfTrust
-
Tag::ROOT_OF_TRUST
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 704를 사용합니다.자세한 내용은 RootOfTrust 데이터 구조를 설명하는 섹션을 참고하세요.
-
osVersion
-
Tag::OS_VERSION
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 705를 사용합니다.Keymaster와 연결된 Android 운영체제의 버전으로, 6자리 정수로 지정됩니다. 예를 들어, 버전 8.1.0은 080100으로 나타냅니다.
Keymaster 버전 1.0 이상에서만 승인 목록에 이 값을 포함합니다.
-
osPatchLevel
-
Tag::PATCHLEVEL
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 706을 사용합니다.Keymaster에서 사용되는 보안 패치와 연결된 월과 연도로, 6자리 정수로 지정됩니다. 예를 들어, 2018년 8월 패치는 201808로 나타냅니다.
Keymaster 버전 1.0 이상에서만 승인 목록에 이 값을 포함합니다.
-
attestationApplicationId
-
키 증명 버전 2 이상에만 있습니다.
Tag::ATTESTATION_APPLICATION_ID
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 709를 사용합니다.자세한 내용은 AttestationApplicationId 데이터 구조를 설명하는 섹션을 참고하세요.
-
attestationIdBrand
-
키 증명 버전 2 이상에만 있습니다.
Tag::ATTESTATION_ID_BRAND
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 710을 사용합니다. -
attestationIdDevice
-
키 증명 버전 2 이상에만 있습니다.
Tag::ATTESTATION_ID_DEVICE
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 711을 사용합니다. -
attestationIdProduct
-
키 증명 버전 2 이상에만 있습니다.
Tag::ATTESTATION_ID_PRODUCT
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 712를 사용합니다. -
attestationIdSerial
-
키 증명 버전 2 이상에만 있습니다.
Tag::ATTESTATION_ID_SERIAL
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 713을 사용합니다. -
attestationIdImei
-
키 증명 버전 2 이상에만 있습니다.
Tag::ATTESTATION_ID_IMEI
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 714를 사용합니다. -
attestationIdMeid
-
키 증명 버전 2 이상에만 있습니다.
Tag::ATTESTATION_ID_MEID
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 715를 사용합니다. -
attestationIdManufacturer
-
키 증명 버전 2 이상에만 있습니다.
Tag::ATTESTATION_ID_MANUFACTURER
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 716을 사용합니다. -
attestationIdModel
-
키 증명 버전 2 이상에만 있습니다.
Tag::ATTESTATION_ID_MODEL
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 717을 사용합니다. -
vendorPatchLevel
-
키 증명 버전 3 이상에만 있습니다.
Tag::VENDOR_PATCHLEVEL
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 718을 사용합니다.이 키를 사용할 기기에 설치되어야 하는 공급업체 이미지 보안 패치 수준을 지정합니다. 값은 YYYYMMDD 형식으로 표시되며, 공급업체 보안 패치의 날짜를 나타냅니다. 예를 들어 공급업체의 2018년 8월 1일 보안 패치가 설치된 Android 기기에서 키가 생성된 경우 이 값은 20180801이 됩니다.
-
bootPatchLevel
-
키 증명 버전 3 이상에만 있습니다.
Tag::BOOT_PATCHLEVEL
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 719를 사용합니다.이 키를 사용할 기기에 설치되어야 하는 커널 이미지 보안 패치 수준을 지정합니다. 값은 YYYYMMDD 형식으로 표시되며, 시스템 보안 패치의 날짜를 나타냅니다. 예를 들어 시스템의 2018년 8월 5일 보안 패치가 설치된 Android 기기에서 키가 생성된 경우 이 값은 20180805가 됩니다.
-
deviceUniqueAttestation
-
키 증명 버전 4 이상에만 있습니다.
Tag::DEVICE_UNIQUE_ATTESTATION
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 720을 사용합니다. -
attestationIdSecondImei
-
키 증명 버전 300 이상에만 있습니다.
Tag::ATTESTATION_ID_SECOND_IMEI
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 723을 사용합니다. -
moduleHash
-
키 증명 버전 400 이상에만 있습니다.
Tag::MODULE_HASH
승인 태그에 대응하며, 이 태그는 태그 ID 값으로 724를 사용합니다.
RootOfTrust 필드
-
verifiedBootKey
- 자체 검사 부팅의 일환으로 기기 부팅 중에 실행되는 모든 코드의 무결성과 진정성을 확인하는 데 사용되는 공개 키의 보안 해시입니다. SHA-256을 사용하는 것이 좋습니다.
-
deviceLocked
-
기기의 부트로더가 잠겨 있는지 여부입니다.
true
는 기기가 자체 검사 부팅으로 성공적으로 확인된 서명된 이미지를 부팅했음을 나타냅니다. -
verifiedBootState
- 기기의 자체 검사 부팅 상태입니다.
-
verifiedBootHash
- 자체 검사 부팅으로 보호되는 모든 데이터의 다이제스트입니다. Android 자체 검사 부팅 참조 구현을 사용하는 기기의 경우 이 필드에 VBMeta 다이제스트가 포함됩니다.
VerifiedBootState 값
값 | 상응하는 부팅 상태 | 의미 |
---|---|---|
Verified |
GREEN |
전체 신뢰 체인은 하드웨어로 보호되는 신뢰할 수 있는 루트에서 부트로더 및 자체 검사 부팅으로 확인된 모든 파티션으로 확장됩니다.
이 상태에서 verifiedBootKey 필드에는 기기 제조업체가 공장에서 기기의 ROM에 삽입한 인증서인 삽입된 신뢰할 수 있는 루트의 해시가 포함됩니다. |
SelfSigned |
YELLOW |
제조업체가 공장에서 삽입한 신뢰할 수 있는 루트 대신 사용자가 구성한 신뢰할 수 있는 루트를 사용하여 인증이 이루어졌다는 점을 제외하고는 Verified 와 동일합니다.
이 상태에서 verifiedBootKey 필드에는 사용자가 구성한 공개 키의 해시가 포함됩니다. |
Unverified |
ORANGE |
기기의 부트로더가 잠금 해제되어 있어 신뢰 사슬을 설정할 수 없습니다. 기기를 자유롭게 수정할 수 있으므로 사용자는 대역 외에서 기기의 무결성을 확인해야 합니다. 이 상태에서 verifiedBootKey 필드에는 32바이트의 0이 포함됩니다. |
Failed |
RED |
기기가 인증에 실패했습니다. 이 상태에서는 다른 RootOfTrust 필드의 콘텐츠에 대한 보장이 없습니다. |
AttestationApplicationId
이 필드는 증명 중인 비밀 키 머티리얼을 사용하도록 허용된 앱에 대한 Android 플랫폼의 신뢰를 반영합니다. 여러 패키지가 동일한 UID를 공유하는 경우에만 여러 패키지를 포함할 수 있습니다. AuthorizationList
의 AttestationApplicationId
필드는 OCTET_STRING
유형이며 다음 ASN.1 스키마에 따라 형식이 지정됩니다.
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
package_infos
AttestationPackageInfo
객체의 집합으로, 각 패키지의 이름과 버전 번호를 제공합니다.signature_digests
-
앱 서명 인증서의 SHA-256 다이제스트 집합입니다. 앱에는 여러 개의 서명 키 인증서 체인이 있을 수 있습니다. 이러한 각 체인에 대해 '리프' 인증서가 다이제스트되어
signature_digests
필드에 배치됩니다. 필드 이름은getPackageInfo()
호출에서 반환된Signature
클래스에 대해 명명된 것이므로, 오해의 소지가 있습니다. 다이제스트된 데이터가 앱 서명이 아닌 앱의 서명 인증서이기 때문입니다. 다음 코드 스니펫에서는 예 집합을 보여줍니다.{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
고유 ID
고유 ID는 제한된 기간에만 기기를 식별하는 128비트 값입니다. 이 값은 다음을 사용하여 계산됩니다.
HMAC_SHA256(T || C || R, HBK)
여기서
T
는 '시간 카운터 값'이며 이 값은Tag::CREATION_DATETIME
값을 2592000000으로 나누고 나머지는 버립니다.T
는 30일마다 변경됩니다(2592000000 = 30 * 24 * 60 * 60 * 1000).C
는Tag::APPLICATION_ID
의 값입니다.R
은 attest_key 호출의 attest_params 매개변수에Tag::RESET_SINCE_ID_ROTATION
이 있으면 1이고 태그가 없으면 0입니다.HBK
는 신뢰할 수 있는 실행 환경(TEE)에 알려진 하드웨어에 결합된 고유한 보안 비밀이며 TEE에 의해 공개되지 않습니다. 보안 비밀은 최소 128비트의 엔트로피를 포함하며 개별 기기마다 고유합니다(128비트 엔트로피인 경우 확률적 고유성이 허용됨). HBK는 HMAC 또는 AES_CMAC를 통해 통합된 키 자료에서 파생되어야 합니다.
HMAC_SHA256 출력을 128비트로 자릅니다.
증명 키 및 인증서
두 개의 키(RSA 키 하나와 ECDSA 키 하나) 및 키에 대한 인증서 체인은 안전하게 기기에 프로비저닝됩니다.
Android 12에서는 원격 키 프로비저닝을 도입하고 Android 13에서는 기기에서 이를 구현해야 합니다. 원격 키 프로비저닝은 현장의 기기에 앱별 ECDSA P256 증명 인증서를 제공합니다. 이러한 인증서는 팩토리에서 프로비저닝한 인증서보다 수명이 짧습니다.
여러 개의 IMEI
Android 14는 Android 키 증명 기록에서 여러 개의 IMEI를 사용할 수 있도록 지원합니다. OEM에서는 두 번째 IMEI에 KeyMint 태그를 추가하여 이 기능을 구현할 수 있습니다. 기기에 여러 개의 원격 라디오가 장착되는 경우가 점점 늘어나고 있으며, 이제 OEM에서도 두 개의 IMEI가 있는 기기를 지원할 수 있습니다.
기기에 두 번째 IMEI가 있는 경우 OEM에서는 이를 KeyMint 구현에 프로비저닝해야 합니다. 그렇게 해야만 두 번째 IMEI의 구현이 첫 번째 IMEI를 증명하는 것과 동일한 방식으로 증명될 수 있기 떄문입니다.
프로비저닝 정보 확장
프로비저닝 정보 확장에는 OID 1.3.6.1.4.1.11129.2.1.30
이 있습니다. 확장은 프로비저닝 서버가 기기에 관해 알고 있는 정보를 제공합니다.
스키마
이 확장은 다음 CDDL 스키마를 따릅니다.
{ 1 : int, ; certificates issued }
지도에는 버전이 지정되지 않으며 새로운 선택적 필드가 추가될 수 있습니다.
-
certs_issued
-
지난 30일 동안 기기에 발급된 인증서의 대략적인 개수입니다. 이 값이 평균보다 훨씬 큰 경우 이 값을 잠재적 악용을 나타내는 신호로 받아들 수 있습니다.
ID 증명
Android 8.0은 Keymaster 3이 설치된 기기의 ID 증명을 선택적으로 지원합니다. ID 증명을 사용하면 기기에서 일련번호 또는 IMEI와 같은 하드웨어 식별자 증명을 제공할 수 있습니다. ID 증명이 선택적 기능이기는 하지만 기기의 ID를 증명할 수 있으면 트루 제로터치 원격 구성 같은 사용 사례를 사용 설정하여 안전성을 더 높일 수 있기 때문에(원격 측에서 ID를 스푸핑한 기기가 아니라 올바른 기기와 통신한다고 확신할 수 있기 때문) 모든 Keymaster 3 구현은 ID 증명을 지원하는 것이 좋습니다.
ID 증명은 기기가 공장에서 출고되기 전에 신뢰할 수 있는 실행 환경(TEE)에서만 액세스할 수 있는 기기의 하드웨어 식별자 사본을 생성하여 작동합니다. 사용자는 기기의 부트로더를 잠금 해제하고 시스템 소프트웨어 및 Android 프레임워크에서 보고한 식별자를 변경할 수 있습니다. TEE에서 보유한 식별자의 사본은 이러한 방식으로 조작될 수 없습니다. 이에 따라 기기 ID 증명은 기기의 원래 하드웨어 식별자만 증명하므로 스푸핑 시도를 방지하게 됩니다.
ID 증명의 기본 API 노출 영역은 Keymaster 2에 도입된 기존 키 증명 메커니즘을 바탕으로 이루어집니다. Keymaster가 보유한 키의 증명 인증서를 요청할 때 호출자는 기기의 하드웨어 식별자가 증명 인증서의 메타데이터에 포함되도록 요청할 수 있습니다. 키가 TEE에 유지되면 인증서는 알려진 신뢰할 수 있는 루트에 체인을 다시 연결합니다. 이러한 인증서의 수신자는 인증서와 하드웨어 식별자 같은 인증서 콘텐츠를 TEE에서 작성한 것인지 확인할 수 있습니다. 하드웨어 식별자를 증명 인증서에 포함하라는 요청을 받으면 공장에서 게재된 대로 TEE는 저장소에 보유된 식별자만 증명합니다.
저장소 속성
기기의 식별자를 보유한 저장소는 다음 속성을 포함해야 합니다.
- 기기의 원본 식별자에서 파생된 값은 기기가 공장에서 출고되기 전에 저장소에 복사됩니다.
destroyAttestationIds()
메서드는 식별자에서 파생된 이 데이터 사본을 영구적으로 제거할 수 있습니다. 영구 제거는 데이터가 완전히 삭제되어 초기화 또는 기기에서 실행되는 다른 절차로 복원할 수 없는 상태를 의미합니다. 이는 사용자가 부트로더를 잠금 해제하고 시스템 소프트웨어를 변경하고 Android 프레임워크에서 반환한 식별자를 수정한 기기에 특히 중요합니다.- RMA 기능은 하드웨어 식별자에서 파생된 데이터의 새 사본을 생성할 수 있어야 합니다. 이렇게 하면 RMA를 통과한 기기에서 ID 증명을 다시 실행할 수 있습니다. RMA 기능에서 사용하는 메커니즘은 사용자가 스푸핑된 ID의 증명을 가져올 수 있기 때문에 사용자가 ID 증명을 직접 호출할 수 없도록 보호되어야 합니다.
- TEE의 Keymaster가 신뢰할 수 있는 앱 외에 다른 코드는 저장소에 보관된 식별자에서 파생된 데이터를 읽을 수 없습니다.
- 저장소는 변조 탐지가 가능합니다. 저장소의 콘텐츠가 수정되었다면 TEE는 이를 콘텐츠의 사본이 제거된 것과 동일하게 취급하고 모든 ID 증명 시도를 거부합니다. 이는 아래 설명한 대로 저장소에 서명하거나 MAC으로 구현됩니다.
- 저장소는 원본 식별자를 보관하지 않습니다. ID 증명에는 챌린지가 포함되므로 호출자는 항상 증명할 식별자를 제공합니다. TEE는 식별자가 원래의 값과 일치하는지만 확인하면 됩니다. 값 대신 원본 값의 보안 해시를 저장하면 확인할 수 있습니다.
구조
위에 나열된 속성을 포함하는 구현을 만들려면 ID에서 파생된 값을 다음 구조 S에 저장하세요. 시스템의 일반 위치를 제외하고 기기 소유자가 루팅을 통해 수정할 수 있는 ID 값의 다른 사본은 저장하지 않습니다.
S = D || HMAC(HBK, D)
여기에서:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
는 적절한 보안 해시를 사용하는 HMAC 구조입니다(SHA-256 추천).HBK
는 다른 목적으로 사용되지 않는 하드웨어에 결합된 키입니다.ID1...IDn
은 원본 ID 값입니다. 기기마다 식별자 수가 다르므로 특정 색인에 특정 값을 연결하는 것은 구현에 따라 달라집니다.||
는 연결을 나타냅니다.
HMAC 출력은 고정 크기이므로 개별 ID 해시 또는 D의 HMAC를 찾을 수 있는 헤더나 다른 구조는 필요하지 않습니다. 증명을 실행하기 위해 제공된 값을 확인하는 것 외에 수정되거나 손상된 개별 ID가 없다는 것을 확인하기 위해 구현은 S에서 D를 추출하고 HMAC(HBK, D)를 계산하고 S의 값과 비교하여 S를 확인해야 합니다. 또한 구현은 모든 개별 ID 요소와 S의 유효성을 검사하기 위해 상수 시간 비교를 사용해야 합니다. 비교 시간은 제공된 ID의 수와 테스트의 모든 부분의 정확한 일치 여부에 관계없이 일정해야 합니다.
하드웨어 식별자
ID 증명은 다음 하드웨어 식별자를 지원합니다.
- 브랜드 이름, Android의
Build.BRAND
에서 반환함 - 기기 이름, Android의
Build.DEVICE
에서 반환함 - 제품 이름, Android의
Build.PRODUCT
에서 반환함 - 제조업체 이름, Android의
Build.MANUFACTURER
에서 반환함 - 모델 이름, Android의
Build.MODEL
에서 반환함 - 일련번호
- 모든 무선의 IMEI
- 모든 무선의 MEID
기기 ID 증명을 지원하기 위해 기기는 이러한 식별자를 증명합니다. Android를 실행하는 모든 기기에는 처음 6개의 식별자가 있고 이러한 식별자는 이 기능이 작동하기 위해 필요합니다. 기기에 통합된 무선 라디오가 있다면 기기는 라디오의 IMEI 및 MEID의 증명도 지원해야 합니다.
키 증명을 실행하고 증명할 기기 식별자를 요청에 포함하여 ID 증명을 요청합니다. 식별자는 다음과 같은 태그가 지정됩니다.
ATTESTATION_ID_BRAND
ATTESTATION_ID_DEVICE
ATTESTATION_ID_PRODUCT
ATTESTATION_ID_MANUFACTURER
ATTESTATION_ID_MODEL
ATTESTATION_ID_SERIAL
ATTESTATION_ID_IMEI
ATTESTATION_ID_MEID
증명할 식별자는 UTF-8로 인코딩된 바이트 문자열입니다. 이 형식은 숫자 식별자에도 적용됩니다. 증명할 각 식별자는 UTF-8로 인코딩된 문자열로 표현됩니다.
기기에서 ID 증명을 지원하지 않는다면(또는 destroyAttestationIds()
가 이전에 호출되었고 기기에서 더 이상 ID를 증명할 수 없다면) 이러한 태그를 하나 이상 포함하는 키 증명 요청은 ErrorCode::CANNOT_ATTEST_IDS
를 반환하며 실패합니다.
기기가 ID 증명을 지원하고 위의 태그 중 하나 이상의 태그가 키 증명 요청에 포함되어 있다면 TEE는 각 태그와 함께 제공된 식별자가 하드웨어 식별자의 사본과 일치하는지 확인합니다. 하나 이상의 식별자가 일치하지 않으면 전체 증명은 ErrorCode::CANNOT_ATTEST_IDS
를 반환하며 실패합니다. 동일한 태그가 여러 번 제공되는 것은 유효합니다. 예를 들어 기기가 여러 IMEI와 함께 여러 라디오를 사용할 수 있는 경우 IMEI를 증명하는 데 유용할 수 있습니다. 증명 요청은 각 ATTESTATION_ID_IMEI
와 함께 제공된 값이 기기의 라디오 중 하나와 일치한다면 유효합니다. 다른 모든 태그에도 동일하게 적용됩니다.
증명이 성공하면 증명된 ID는 위의 스키마를 사용하여 발급된 증명 인증서의 증명 확장(OID 1.3.6.1.4.1.11129.2.1.17)에 추가됩니다. Keymaster 2 증명 스키마의 변경사항은 설명과 함께 굵게 표시되어 있습니다.
자바 API
이 섹션은 정보 제공만을 목적으로 합니다. Keymaster 구현자는 자바 API를 구현하거나 사용하지 않습니다. 이 정보는 앱에서 기능을 사용하는 방법에 관해 구현자의 이해를 돕기 위해 제공됩니다. 시스템 구성요소는 이를 다르게 사용할 수 있으므로 이 섹션을 표준으로 취급해서는 안 됩니다.