Der Schlüsselspeicher bietet eine sicherere Möglichkeit, kryptografische Schlüssel kontrolliert zu erstellen, zu speichern und zu verwenden. Wenn ein hardwaregestützter Schlüsselspeicher verfügbar und verwendet wird, ist das Schlüsselmaterial besser vor dem Entfernen vom Gerät geschützt. Außerdem erzwingt Keymaster Einschränkungen, die schwer zu umgehen sind.
Dies gilt jedoch nur, wenn bekannt ist, dass sich die Schlüssel des Schlüsselspeichers in einem hardwaregestützten Speicher befinden. In Keymaster 1 gab es für Apps oder Remoteserver keine Möglichkeit, zuverlässig zu prüfen, ob dies der Fall war. Der Keystore-Daemon hat die verfügbare Keymaster HAL geladen und alles geglaubt, was die HAL in Bezug auf die Hardwaresicherung von Schlüsseln gesagt hat.
Um dies zu beheben, führte Keymaster in Android 7.0 (Keymaster 2) die Schlüsselattestierung und in Android 8.0 (Keymaster 3) die ID-Attestierung ein.
Mithilfe der Schlüsselattestierung soll klar ermittelt werden, ob ein asymmetrisches Schlüsselpaar hardwaregestützt ist, welche Eigenschaften der Schlüssel hat und welche Einschränkungen auf seine Nutzung angewendet werden.
Mit der Geräteattestierung kann das Gerät seine Hardware-IDs wie die Seriennummer oder die IMEI nachweisen.
Schlüsselattestierung
Zur Unterstützung der Schlüsselattestierung wurden in Android 7.0 eine Reihe von Tags, Typen und Methoden in die HAL eingeführt.
Tags
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
Typ
Keymaster 2 und niedriger
typedef struct { keymaster_blob_t* entries; size_t entry_count; } keymaster_cert_chain_t;
AttestKey
-Methode
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) generates(ErrorCode error, vec<vec<uint8_t>> certChain);
Keymaster 2 und niedriger
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
ist die Keymaster-Gerätestruktur.keyToAttest
ist der Schlüssel-Blob, der vongenerateKey
zurückgegeben wird und für den die Attestierung erstellt wird.attestParams
ist eine Liste aller Parameter, die für die Attestierung erforderlich sind. Dazu gehörenTag::ATTESTATION_CHALLENGE
und möglicherweiseTag::RESET_SINCE_ID_ROTATION
sowieTag::APPLICATION_ID
undTag::APPLICATION_DATA
. Die letzten beiden sind zum Entschlüsseln des Schlüssel-BLOBs erforderlich, wenn sie während der Schlüsselgenerierung angegeben wurden.certChain
ist der Ausgabeparameter, der ein Array von Zertifikaten zurückgibt. Eintrag 0 ist das Attestierungszertifikat. Es bestätigt den Schlüssel vonkeyToAttest
und enthält die Attestierungserweiterung.
Die attestKey
-Methode gilt als öffentlicher Schlüsselvorgang für den attestierten Schlüssel, da sie jederzeit aufgerufen werden kann und keine Autorisierungsbeschränkungen erfüllen muss. Wenn für die Verwendung des attestierten Schlüssels beispielsweise eine Nutzerauthentifizierung erforderlich ist, kann eine Attestierung ohne Nutzerauthentifizierung generiert werden.
Bescheinigung
Das Attestierungszertifikat ist ein standardmäßiges X.509-Zertifikat mit einer optionalen Attestierungserweiterung, die eine Beschreibung des attestierten Schlüssels enthält. Das Zertifikat ist mit einem zertifizierten Attestierungsschlüssel signiert. Für den Attestierungsschlüssel kann ein anderer Algorithmus verwendet werden als für den zu attestierenden Schlüssel.
Das Attestierungszertifikat enthält die Felder in der folgenden Tabelle und darf keine zusätzlichen Felder enthalten. Einige Felder enthalten einen festen Feldwert. Bei CTS-Tests wird geprüft, ob der Zertifikatsinhalt genau der Definition entspricht.
Zertifikats-SEQUENZ
Feldname (siehe RFC 5280) | Wert |
---|---|
TBsZertifikat | TBSCertificate-SEQUENCE |
signatureAlgorithm | AlgorithmIdentifier des Algorithmus, der zum Signieren des Schlüssels verwendet wird: ECDSA für EC-Schlüssel, RSA für RSA-Schlüssel. |
signatureValue | BIT STRING, Signatur, berechnet auf ASN.1 DER-codiertem tbsCertificate. |
TBSCertificate SEQUENCE
Feldname (siehe RFC 5280) | Wert |
---|---|
version |
INTEGER 2 (bedeutet V3-Zertifikat) |
serialNumber |
INTEGER 1 (fester Wert: bei allen Zertifikaten gleich) |
signature |
AlgorithmIdentifier des Algorithmus, der zum Signieren des Schlüssels verwendet wird: ECDSA für EC-Schlüssel, RSA für RSA-Schlüssel. |
issuer |
Entspricht dem „Subject“-Feld des Attestierungsschlüssels für die Batch-Datei. |
validity |
SEQUENCE aus zwei Datumsangaben, die die Werte von Tag::ACTIVE_DATETIME und Tag::USAGE_EXPIRE_DATETIME enthalten.
Diese Werte sind in Millisekunden seit dem 1. Januar 1970 angegeben.
Informationen zur korrekten Datumsdarstellung in Zertifikaten finden Sie unter RFC 5280. Wenn Tag::ACTIVE_DATETIME nicht vorhanden ist, verwende den Wert von Tag::CREATION_DATETIME . Wenn Tag::USAGE_EXPIRE_DATETIME nicht vorhanden ist, verwenden Sie das Ablaufdatum des Zertifikats für den Batchattestierungsschlüssel. |
subject |
CN = „Android Keystore Key“ (fester Wert: in allen Zertifikaten identisch) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo mit attestiertem öffentlichen Schlüssel |
extensions/Key Usage |
digitalSignature: Wird festgelegt, wenn der Schlüssel den Zweck KeyPurpose::SIGN oder KeyPurpose::VERIFY hat. Alle anderen Bits sind nicht gesetzt. |
extensions/CRL Distribution Points |
Wert TBD |
extensions/"attestation" |
Die OID lautet 1.3.6.1.4.1.11129.2.1.17. Der Inhalt ist unten im Abschnitt Attestierungserweiterung definiert. Wie bei allen X.509-Zertifikaterweiterungen wird der Inhalt als OCTET_STRING dargestellt, der eine DER-Codierung der Attestationssequenz enthält. |
Attestierungserweiterung
Die attestation
-Erweiterung hat die OID 1.3.6.1.4.1.11129.2.1.17
. Sie enthält Informationen zum Schlüsselpaar, das attestiert wird, und zum Status des Geräts zum Zeitpunkt der Schlüsselgenerierung.
Die in der AIDL-Schnittstellenspezifikation definierten Keymaster-/KeyMint-Tag-Typen werden so in ASN.1-Typen übersetzt:
Keymaster-/KeyMint-Typ | ASN.1-Typ | Hinweise |
---|---|---|
ENUM |
INTEGER |
|
ENUM_REP |
SET of INTEGER |
|
UINT |
INTEGER |
|
UINT_REP |
SET of INTEGER |
|
ULONG |
INTEGER |
|
ULONG_REP |
SET of INTEGER |
|
DATE |
INTEGER |
Millisekunden seit dem 1. Januar 1970, 00:00:00 UTC. |
BOOL |
NULL |
Das Vorhandensein eines Tags bedeutet „wahr“, „fehlen“ bedeutet „falsch“. |
BIGNUM |
Es gibt keine Tags dieses Typs, daher ist keine Zuordnung definiert. | |
BYTES |
OCTET_STRING |
Schema
Der Inhalt der Attestierungserweiterung wird durch das folgende ASN.1-Schema beschrieben:
Version 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), }
Version 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), }
Version 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), }
Version 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), }
Version 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), }
Version 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), }
Version 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-Felder
-
attestationVersion
-
Die ASN.1-Schemaversion.
Wert Keymaster-/KeyMint-Version 1 Keymaster-Version 2.0 2 Keymaster-Version 3.0 3 Keymaster-Version 4.0 4 Keymaster-Version 4.1 100 KeyMint Version 1.0 200 KeyMint Version 2.0 300 KeyMint Version 3.0 -
attestationSecurityLevel
-
Das Sicherheitsniveau des Speicherorts, an dem der attestierte Schlüssel gespeichert ist.
-
keymasterVersion
/keyMintVersion
-
Die Version der Keymaster/KeyMint-Hardwareabstraktionsschicht (HAL).
Wert Keymaster-/KeyMint-Version 2 Keymaster-Version 2.0 3 Keymaster-Version 3.0 4 Keymaster-Version 4.0 41 Keymaster Version 4.1 100 KeyMint Version 1.0 200 KeyMint Version 2.0 300 KeyMint-Version 3.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Das Sicherheitsniveau der Keymaster/KeyMint-Implementierung.
-
attestationChallenge
- Die Herausforderung, die bei der Schlüsselgenerierung angegeben wurde.
-
uniqueId
- Eine datenschutzfreundliche Geräte-ID, die System-Apps zum Zeitpunkt der Schlüsselgenerierung anfordern können. Wenn keine eindeutige ID angefordert wird, ist dieses Feld leer. Weitere Informationen finden Sie im Abschnitt Eindeutige ID.
-
softwareEnforced
-
Die Autorisierungsliste von Keymaster/KeyMint, die vom Android-System erzwungen wird. Diese Informationen werden durch Code auf der Plattform erfasst oder generiert und in der Systempartition des Geräts gespeichert. Es kann als vertrauenswürdig eingestuft werden, solange auf dem Gerät ein Betriebssystem ausgeführt wird, das dem Android-Plattformsicherheitsmodell entspricht. Das bedeutet, dass der Bootloader des Geräts gesperrt und die
verifiedBootState
Verified
ist. -
hardwareEnforced
- Die Autorisierungsliste von Keymaster/KeyMint, die von der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) oder StrongBox des Geräts erzwungen wird. Diese Informationen werden durch Code in der sicheren Hardware erfasst oder generiert und nicht von der Plattform gesteuert. Informationen können beispielsweise vom Bootloader oder über einen sicheren Kommunikationskanal stammen, der kein Vertrauen in die Plattform erfordert.
SecurityLevel-Werte
Der Wert SecurityLevel
gibt an, inwieweit ein Keystore-bezogenes Element (z. B. Schlüsselpaar und Attestierung) gegen Angriffe resistent ist.
Wert | Bedeutung |
---|---|
Software |
Sicher, solange das Android-System des Geräts dem Android-Plattformsicherheitsmodell entspricht, d. h. der Bootloader des Geräts gesperrt ist und die verifiedBootState Verified ist. |
TrustedEnvironment |
Sicher, solange die vertrauenswürdige Ausführungsumgebung (Trusted Execution Environment, TEE) nicht manipuliert wird. Die Anforderungen an die Isolation von TEEs sind in den Abschnitten 9.11 [C-1-1] bis [C-1-4] des Android Compatibility Definition Document definiert. TEEs sind äußerst widerstandsfähig gegen Remote-Angriffe und mäßig gegen direkte Hardwareangriffe. |
StrongBox |
Sicher, solange StrongBox nicht manipuliert wird. StrongBox wird in einem sicheren Element implementiert, ähnlich wie ein Hardwaresicherheitsmodul. Die Implementierungsanforderungen für StrongBox sind im Abschnitt 9.11.2 des Android Compatibility Definition Document definiert. StrongBox ist sehr widerstandsfähig gegen Remote-Manipulation und Manipulation durch direkte Hardwareangriffe (z. B. physische Manipulation und Side-Channel-Angriffe). |
Felder der Autorisierungsliste
Jedes Feld entspricht einem Keymaster-/KeyMint-Autorisierungs-Tag aus der AIDL-Schnittstellenspezifikation.
Die Spezifikation ist die maßgebliche Quelle für Autorisierungs-Tags: ihre Bedeutung, das Format ihres Inhalts, ob sie im softwareEnforced
- oder hardwareEnforced
-Feld im KeyDescription
-Objekt erscheinen sollen, ob sie sich gegenseitig ausschließen oder ob sie andere Tags enthalten. Alle AuthorizationList
-Felder sind optional.
Jedes Feld hat ein kontextspezifisches EXPLICIT
-Tag, das der Keymaster-/KeyMint-Tag-Nummer entspricht. Dadurch wird eine kompaktere Darstellung der Daten im EXPLICIT
ermöglicht.AuthorizationList
Der ASN.1-Parser muss daher den erwarteten Datentyp für jedes kontextspezifische Tag kennen. Beispiel: Tag::USER_AUTH_TYPE
ist als ENUM | 504
definiert. Im Schema für die Attestierungserweiterung ist das Feld purpose
in AuthorizationList
als userAuthType [504] EXPLICIT INTEGER OPTIONAL
angegeben. Seine ASN.1-Codierung enthält daher das kontextspezifische Tag 504
anstelle des Klassen-Tags UNIVERSAL
für den ASN.1-Typ INTEGER
, also 10
.
-
purpose
-
Entspricht dem Autorisierungs-Tag
Tag::PURPOSE
, das den Tag-ID-Wert 1 verwendet. -
algorithm
-
Entspricht dem Autorisierungs-Tag
Tag::ALGORITHM
, das den Tag-ID-Wert 2 verwendet.In einem Attestierungs-
AuthorizationList
-Objekt ist der Algorithmuswert immerRSA
oderEC
. -
keySize
-
Entspricht dem Autorisierungs-Tag
Tag::KEY_SIZE
, für das die Tag-ID 3 verwendet wird. -
digest
-
Entspricht dem Autorisierungs-Tag
Tag::DIGEST
, für das die Tag-ID 5 verwendet wird. -
padding
-
Entspricht dem Autorisierungs-Tag
Tag::PADDING
, für das die Tag-ID 6 verwendet wird. -
ecCurve
-
Entspricht dem Autorisierungs-Tag
Tag::EC_CURVE
, für das die Tag-ID 10 verwendet wird.Die Parameter, die zum Generieren eines elliptischen-Kurven-Schlüsselpaars (EC) verwendet werden, das ECDSA für die Signatur und Überprüfung im Android-System-Schlüsselspeicher verwendet.
-
rsaPublicExponent
-
Entspricht dem Autorisierungs-Tag
Tag::RSA_PUBLIC_EXPONENT
, das den Tag-ID-Wert 200 verwendet. -
mgfDigest
-
Nur bei einer Schlüsselattestierungsversion von mindestens 100 vorhanden.
Entspricht dem KeyMint-Autorisierungs-TagTag::RSA_OAEP_MGF_DIGEST
, das den Tag-ID-Wert 203 verwendet. -
rollbackResistance
-
Nur in Schlüsselattestierungsversionen ≥ 3 vorhanden.
Entspricht dem Autorisierungs-Tag
Tag::ROLLBACK_RESISTANCE
, für das die Tag-ID 303 verwendet wird. -
earlyBootOnly
-
Nur in der Schlüsselattestierungsversion 4 oder höher vorhanden.
Entspricht dem Autorisierungs-Tag
Tag::EARLY_BOOT_ONLY
, das den Tag-ID-Wert 305 verwendet. -
activeDateTime
-
Entspricht dem Autorisierungs-Tag
Tag::ACTIVE_DATETIME
, für das die Tag-ID 400 verwendet wird. -
originationExpireDateTime
-
Entspricht dem
Tag::ORIGINATION_EXPIRE_DATETIME
-Keymaster-Autorisierungs-Tag, für das die Tag-ID 401 verwendet wird. -
usageExpireDateTime
-
Entspricht dem Autorisierungs-Tag
Tag::USAGE_EXPIRE_DATETIME
, für das die Tag-ID 402 verwendet wird. -
usageCountLimit
-
Entspricht dem Autorisierungs-Tag
Tag::USAGE_COUNT_LIMIT
, das den Tag-ID-Wert 405 verwendet. -
noAuthRequired
-
Entspricht dem Autorisierungs-Tag
Tag::NO_AUTH_REQUIRED
, für das die Tag-ID 503 verwendet wird. -
userAuthType
-
Entspricht dem Autorisierungs-Tag
Tag::USER_AUTH_TYPE
, für das die Tag-ID 504 verwendet wird. -
authTimeout
-
Entspricht dem Autorisierungs-Tag
Tag::AUTH_TIMEOUT
, für das die Tag-ID 505 verwendet wird. -
allowWhileOnBody
-
Entspricht dem Autorisierungs-Tag
Tag::ALLOW_WHILE_ON_BODY
, für das die Tag-ID 506 verwendet wird.Ermöglicht die Verwendung des Schlüssels nach Ablauf des Zeitlimits für die Authentifizierung, wenn der Nutzer das Gerät noch am Körper trägt. Ein sicherer Körpersensor bestimmt, ob das Gerät am Körper des Nutzers getragen wird.
-
trustedUserPresenceRequired
-
Nur vorhanden in Version der Schlüsselattestierung >= 3.
Entspricht dem Autorisierungs-
Tag::TRUSTED_USER_PRESENCE_REQUIRED
-Tag mit der Tag-ID 507.Gibt an, dass dieser Schlüssel nur verwendet werden kann, wenn der Nutzer einen Nachweis seiner physischen Präsenz vorgelegt hat. Beispiele:
- Bei einem StrongBox-Schlüssel: eine Hardwaretaste, die direkt mit einer Kontaktfläche auf dem StrongBox-Gerät verbunden ist.
- Bei einem TEE-Schlüssel dient die Fingerabdruckauthentifizierung als Nachweis der Anwesenheit, solange der TEE die ausschließliche Kontrolle über den Scanner hat und den Abgleich des Fingerabdrucks durchführt.
-
trustedConfirmationRequired
-
Nur in Schlüsselattestierungsversionen ≥ 3 vorhanden.
Entspricht dem Autorisierungs-
Tag::TRUSTED_CONFIRMATION_REQUIRED
-Tag mit der Tag-ID 508.Gibt an, dass der Schlüssel nur verwendet werden kann, wenn der Nutzer die zu signierenden Daten mit einem Genehmigungstoken bestätigt. Weitere Informationen dazu, wie du eine Nutzerbestätigung erhältst, findest du unter Android Protected Confirmation (Android Protected-Bestätigung).
Hinweis:Dieses Tag gilt nur für Schlüssel, für die der Zweck
SIGN
verwendet wird. -
unlockedDeviceRequired
-
Nur in Schlüsselattestierungsversionen ≥ 3 vorhanden.
Entspricht dem Autorisierungs-Tag
Tag::UNLOCKED_DEVICE_REQUIRED
, das den Tag-ID-Wert 509 verwendet. -
allApplications
-
Entspricht dem Autorisierungs-Tag
Tag::ALL_APPLICATIONS
, das den Tag-ID-Wert 600 verwendet.Gibt an, ob alle Apps auf einem Gerät auf das Schlüsselpaar zugreifen können.
-
applicationId
-
Entspricht dem Autorisierungs-Tag
Tag::APPLICATION_ID
, für das die Tag-ID 601 verwendet wird. -
creationDateTime
-
Entspricht dem Autorisierungs-Tag
Tag::CREATION_DATETIME
mit der Tag-ID 701. -
origin
-
Entspricht dem Autorisierungs-Tag
Tag::ORIGIN
, das den Tag-ID-Wert 702 verwendet. -
rollbackResistant
-
Nur in den Schlüsselattestierungsversionen 1 und 2 vorhanden.
Entspricht dem Autorisierungs-Tag
Tag::ROLLBACK_RESISTANT
, für das die Tag-ID 703 verwendet wird. -
rootOfTrust
-
Entspricht dem Autorisierungs-Tag
Tag::ROOT_OF_TRUST
, für das die Tag-ID 704 verwendet wird.Weitere Informationen finden Sie im Abschnitt zur Datenstruktur RootOfTrust.
-
osVersion
-
Entspricht dem Autorisierungs-Tag
Tag::OS_VERSION
, für das die Tag-ID 705 verwendet wird.Die Version des Android-Betriebssystems, die dem Keymaster zugeordnet ist, angegeben als sechsstellige Ganzzahl. Beispiel: Version 8.1.0 wird als 080100 dargestellt.
Nur Keymaster Version 1.0 oder höher nimmt diesen Wert in die Autorisierungsliste auf.
-
osPatchLevel
-
Entspricht dem Autorisierungs-Tag
Tag::PATCHLEVEL
, für das die Tag-ID 706 verwendet wird.Der Monat und das Jahr, die mit dem Sicherheitspatch verknüpft sind, der in Keymaster verwendet wird, angegeben als sechsstellige Ganzzahl. Der Patch für August 2018 wird beispielsweise als 201808 dargestellt.
Nur Keymaster-Version 1.0 oder höher enthält diesen Wert in der Autorisierungsliste.
-
attestationApplicationId
-
Nur in Schlüsselattestierungsversionen ≥ 2 vorhanden.
Entspricht dem Keymaster-Autorisierungs-Tag
Tag::ATTESTATION_APPLICATION_ID
mit der Tag-ID 709.Weitere Informationen finden Sie im Abschnitt zur Datenstruktur AttestationApplicationId.
-
attestationIdBrand
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Keymaster-Tag
Tag::ATTESTATION_ID_BRAND
, das den Tag-ID-Wert 710 verwendet. -
attestationIdDevice
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Keymaster-Tag
Tag::ATTESTATION_ID_DEVICE
, das den Tag-ID-Wert 711 verwendet. -
attestationIdProduct
-
Nur in Schlüsselattestierungsversionen ≥ 2 vorhanden.
Entspricht dem Keymaster-Tag
Tag::ATTESTATION_ID_PRODUCT
mit der Tag-ID 712. -
attestationIdSerial
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Keymaster-Tag
Tag::ATTESTATION_ID_SERIAL
mit der Tag-ID 713. -
attestationIdImei
-
Nur in Schlüsselattestierungsversionen ≥ 2 vorhanden.
Entspricht dem Autorisierungs-Tag
Tag::ATTESTATION_ID_IMEI
, das den Tag-ID-Wert 714 verwendet. -
attestationIdMeid
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungs-Tag
Tag::ATTESTATION_ID_MEID
, das den Tag-ID-Wert 715 verwendet. -
attestationIdManufacturer
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungs-Tag
Tag::ATTESTATION_ID_MANUFACTURER
mit der Tag-ID 716. -
attestationIdModel
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungs-Tag
Tag::ATTESTATION_ID_MODEL
, das den Tag-ID-Wert 717 verwendet. -
vendorPatchLevel
-
Nur in Schlüsselattestierungsversionen ≥ 3 vorhanden.
Entspricht dem Autorisierungs-
Tag::VENDOR_PATCHLEVEL
-Tag mit der Tag-ID 718.Gibt die Sicherheitspatch-Ebene des Anbieter-Images an, die auf dem Gerät installiert sein muss, damit dieser Schlüssel verwendet werden kann. Der Wert wird im Format JJJJMMTT angezeigt und entspricht dem Datum des Sicherheitspatches des Anbieters. Wenn beispielsweise ein Schlüssel auf einem Android-Gerät generiert wurde, auf dem der Sicherheitspatch des Anbieters vom 1. August 2018 installiert ist, würde dieser Wert 20180801 lauten.
-
bootPatchLevel
-
Nur in Schlüsselattestierungsversionen ≥ 3 vorhanden.
Entspricht dem Autorisierungs-Tag
Tag::BOOT_PATCHLEVEL
, das den Tag-ID-Wert 719 verwendet.Gibt die Sicherheitspatch-Ebene des Kernel-Images an, die auf dem Gerät installiert sein muss, damit dieser Schlüssel verwendet werden kann. Der Wert wird im Format JJJJMMTT angezeigt und entspricht dem Datum des Systemsicherheits-Patches. Wenn ein Schlüssel beispielsweise auf einem Android-Gerät generiert wurde, auf dem der Sicherheitspatch vom 5. August 2018 installiert ist, lautet dieser Wert 20180805.
-
deviceUniqueAttestation
-
Nur in Schlüsselattestierungsversionen >= 4 vorhanden.
Entspricht dem Autorisierungs-
Tag::DEVICE_UNIQUE_ATTESTATION
-Tag mit der Tag-ID 720. -
attestationIdSecondImei
-
Nur in Schlüsselattestierungsversionen >= 300 vorhanden.
Entspricht dem Autorisierungs-
Tag::ATTESTATION_ID_SECOND_IMEI
-Tag mit der Tag-ID 723.
RootOfTrust-Felder
-
verifiedBootKey
- Ein sicherer Hashwert des öffentlichen Schlüssels, der zum Verifizieren der Integrität und Authentizität aller Codes verwendet wird, die beim Starten des Geräts im Rahmen des Verified Boot ausgeführt werden. SHA-256 wird empfohlen.
-
deviceLocked
-
Gibt an, ob der Bootloader des Geräts gesperrt ist.
true
bedeutet, dass das Gerät ein signiertes Image gestartet hat, das durch den verifizierten Bootmodus erfolgreich bestätigt wurde. -
verifiedBootState
- Der Status des verifizierten Bootmodus des Geräts.
-
verifiedBootHash
- Ein Hashwert aller Daten, die durch Verified Boot geschützt sind. Bei Geräten, auf denen die Referenzimplementierung von Android Verified Boot verwendet wird, enthält dieses Feld den VBMeta-Digest.
Werte für VerifiedBootState
Wert | Entsprechender Bootstatus | Bedeutung |
---|---|---|
Verified |
GREEN |
Eine vollständige Vertrauenskette erstreckt sich von einem hardwaregeschützten Root of Trust bis zum Bootloader und allen Partitionen, die durch den verifizierten Bootmodus verifiziert werden.
In diesem Status enthält das Feld verifiedBootKey den Hash des eingebetteten Root of Trust. Dabei handelt es sich um das Zertifikat, das vom Gerätehersteller ab Werk in das ROM des Geräts eingebettet wurde. |
SelfSigned |
YELLOW |
Wie bei Verified , mit dem Unterschied, dass die Überprüfung mit einem vom Nutzer konfigurierten Root of Trust statt mit dem vom Hersteller in der Werkseinstellung eingebetteten Root of Trust durchgeführt wurde.
In diesem Status enthält das Feld verifiedBootKey den Hash des vom Nutzer konfigurierten öffentlichen Schlüssels. |
Unverified |
ORANGE |
Der Bootloader des Geräts ist entsperrt, sodass keine Vertrauenskette aufgebaut werden kann. Das Gerät kann frei modifiziert werden, sodass die Integrität des Geräts vom Nutzer außerhalb des Bandes überprüft werden muss. In diesem Zustand enthält das Feld verifiedBootKey 32 Byte mit Nullen. |
Failed |
RED |
Das Gerät konnte nicht bestätigt werden. In diesem Status gibt es keine Garantien für den Inhalt der anderen RootOfTrust -Felder. |
AttestationApplicationId
Dieses Feld enthält die Einschätzung der Android-Plattform, welche Apps das geheime Schlüsselmaterial unter Attestierung verwenden dürfen. Sie kann mehrere Pakete enthalten, wenn und nur wenn mehrere Pakete dieselbe UID haben. Das Feld AttestationApplicationId
in AuthorizationList
hat den Typ OCTET_STRING
und ist gemäß dem folgenden ASN.1-Schema formatiert:
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
package_infos
-
Eine Reihe von
AttestationPackageInfo
-Objekten, von denen jedes den Namen und die Versionsnummer eines Pakets angibt. signature_digests
-
Eine Reihe von SHA-256-Digests der Signaturzertifikate der App. Eine App kann mehrere Zertifikatsketten für Signaturschlüssel haben. Für jedes wird das untergeordnete Zertifikat gehasht und in das Feld
signature_digests
eingefügt. Der Feldname ist irreführend, da es sich bei den gehashten Daten um die Signaturzertifikate der App handelt, nicht um die App-Signaturen. Der Name leitet sich von derSignature
-Klasse ab, die durch einen Aufruf vongetPackageInfo()
zurückgegeben wird. Das folgende Code-Snippet zeigt ein Beispiel:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
Eindeutige ID
Die eindeutige ID ist ein 128-Bit-Wert, der das Gerät identifiziert, aber nur für einen begrenzten Zeitraum. Der Wert wird so berechnet:
HMAC_SHA256(T || C || R, HBK)
Dabei gilt:
T
ist der „Zeitlicher-Zähler-Wert“, der berechnet wird, indem der Wert vonTag::CREATION_DATETIME
durch 2592000000 geteilt wird und der Rest verworfen wird.T
ändert sich alle 30 Tage (2.592.000.000 = 30 * 24 * 60 * 60 * 1.000).C
ist der Wert vonTag::APPLICATION_ID
.R
ist „1“, wennTag::RESET_SINCE_ID_ROTATION
im Parameter „attest_params“ des Aufrufs „attest_key“ vorhanden ist, oder „0“, wenn das Tag nicht vorhanden ist.HBK
ist ein eindeutiges hardwaregebundenes Geheimnis, das der vertrauenswürdigen Ausführungsumgebung bekannt ist und von ihr nie offengelegt wird. Das Geheimnis enthält mindestens 128 Bit Entropie und ist für jedes Gerät eindeutig (eine probabilistische Eindeutigkeit ist aufgrund der 128 Bit Entropie akzeptabel). HBK sollte über HMAC oder AES_CMAC aus verschmolzenem Schlüsselmaterial abgeleitet werden.
Kürzt die HMAC_SHA256-Ausgabe auf 128 Bit.
Attestierungsschlüssel und ‑zertifikate
Zwei Schlüssel, ein RSA- und ein ECDSA-Schlüssel, und die entsprechenden Zertifikatsketten werden sicher auf dem Gerät bereitgestellt.
Mit Android 12 wurde die Bereitstellung per Remote-Schlüssel eingeführt. Für Android 13 müssen Geräte diese Funktion implementieren. Die Remote-Schlüsselbereitstellung stellt Geräten vor Ort ECDSA-P256-Attestierungszertifikate pro App zur Verfügung. Diese Zertifikate haben eine kürzere Gültigkeitsdauer als die von der Fabrik bereitgestellten Zertifikate.
Mehrere IMEIs
Android 14 unterstützt mehrere IMEIs im Android Key Attestation-Eintrag. OEMs können diese Funktion implementieren, indem sie ein KeyMint-Tag für eine zweite IMEI hinzufügen. Geräte mit mehreren Mobilfunkschnittstellen werden immer häufiger. OEMs können jetzt Geräte mit zwei IMEIs unterstützen.
OEMs müssen eine sekundäre IMEI haben, sofern sie auf ihren Geräten vorhanden ist. Diese muss für die KeyMint-Implementierungen bereitgestellt werden, damit diese Implementierungen dies auf dieselbe Weise bestätigen können, wie sie die erste IMEI bestätigen.
ID-Attestierung
Android 8.0 bietet optionale Unterstützung für die ID-Attestierung für Geräte mit Keymaster 3. Die ID-Attestierung ermöglicht es dem Gerät, seine Hardware-IDs wie Seriennummer oder IMEI nachzuweisen. Obwohl dies eine optionale Funktion ist, wird dringend empfohlen, dass alle Keymaster 3-Implementierungen diese Funktion unterstützen. Wenn die Identität des Geräts nachgewiesen werden kann, können Anwendungsfälle wie die echte Zero-Touch-Remote-Konfiguration sicherer sein, da die Remote-Seite sicher sein kann, dass sie mit dem richtigen Gerät kommuniziert und nicht mit einem Gerät, das seine Identität vortäuscht.
Bei der Identitätsattestierung werden Kopien der Hardware-IDs des Geräts erstellt, auf die nur die Trusted Execution Environment (TEE) zugreifen kann, bevor das Gerät das Werk verlässt. Ein Nutzer kann den Bootloader des Geräts entsperren und die Systemsoftware sowie die von den Android-Frameworks gemeldeten IDs ändern. Die Kopien der vom TEE gespeicherten Kennungen können auf diese Weise nicht manipuliert werden. So wird sichergestellt, dass die Geräte-ID-Attestierung nur die ursprünglichen Hardware-IDs des Geräts bestätigt und Spoofing-Versuche vereitelt.
Die Haupt-API-Oberfläche für die Identitätsattestierung basiert auf dem vorhandenen Schlüsselattestierungsmechanismus, der mit Keymaster 2 eingeführt wurde. Wenn ein Anrufer ein Attestierungszertifikat für einen Schlüssel anfordert, der vom Keymaster aufbewahrt wird, kann er angeben, dass die Hardware-IDs des Geräts in die Metadaten des Attestierungszertifikats aufgenommen werden sollen. Wenn der Schlüssel im TEE vorhanden ist, wird das Zertifikat zu einer bekannten Root of Trust (Root of Trust) zurückverkettet. Der Empfänger eines solchen Zertifikats kann überprüfen, ob das Zertifikat und sein Inhalt, einschließlich der Hardware-IDs, von der TEE erstellt wurden. Wenn Hardware-IDs in das Attestierungszertifikat aufgenommen werden sollen, attestiert die TEE nur die im Speicher gespeicherten IDs, die auf dem Produktionsboden eingegeben wurden.
Speichereigenschaften
Der Speicher, in dem sich die Geräte-IDs befinden, muss folgende Eigenschaften haben:
- Die aus den ursprünglichen IDs des Geräts abgeleiteten Werte werden in den Speicher kopiert, bevor das Gerät das Werk verlässt.
- Mit der Methode
destroyAttestationIds()
kann diese Kopie der von der Kennung abgeleiteten Daten dauerhaft gelöscht werden. „Endgültige Vernichtung“ bedeutet, dass die Daten vollständig entfernt werden, sodass sie weder durch das Zurücksetzen auf die Werkseinstellungen noch durch andere Vorgänge auf dem Gerät wiederhergestellt werden können. Dies ist besonders wichtig für Geräte, bei denen ein Nutzer den Bootloader entsperrt und die Systemsoftware geändert sowie die von Android-Frameworks zurückgegebenen IDs geändert hat. - RMA-Einrichtungen sollten in der Lage sein, neue Kopien der Daten zu generieren, die von der Hardwarekennung abgeleitet werden. Auf diese Weise kann ein Gerät, das die RMA bestanden hat, noch einmal eine ID-Attestierung durchführen. Der von RMA-Einrichtungen verwendete Mechanismus muss geschützt sein, damit Nutzer ihn nicht selbst aufrufen können, da sie sonst Attestierungen für gefälschte IDs erhalten könnten.
- Nur die vertrauenswürdige Keymaster-App im TEE kann die im Speicher gespeicherten, von der Kennung abgeleiteten Daten lesen.
- Der Speicher ist manipulationssicher: Wenn der Inhalt des Speichers geändert wurde, behandelt der TEE ihn so, als wären die Kopien des Inhalts zerstört worden, und lehnt alle Versuche zur Attestierung der Identität ab. Dies wird durch Signatur oder MAC-Technologie wie unten beschrieben implementiert.
- Der Speicher enthält nicht die ursprünglichen IDs. Da die Bestätigung der Identität eine Herausforderung darstellt, gibt der Anrufer immer die zu bestätigenden Ausweise an. Das TEE muss nur überprüfen, ob diese mit den Werten übereinstimmen, die er ursprünglich hatte. Diese Überprüfung ist möglich, wenn sichere Hash-Werte der ursprünglichen Werte anstatt der Werte selbst gespeichert werden.
Baugewerbe
Wenn Sie eine Implementierung mit den oben aufgeführten Eigenschaften erstellen möchten, speichern Sie die von der ID abgeleiteten Werte in der folgenden Struktur S. Speichern Sie keine anderen Kopien der ID-Werte, mit Ausnahme der normalen Speicherorte im System, die ein Geräteinhaber durch Rooting ändern kann:
S = D || HMAC(HBK, D)
Dabei gilt:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
ist die HMAC-Konstruktion mit einer geeigneten sicheren Hash-Technologie (SHA-256 wird empfohlen)HBK
ist ein hardwaregebundener Schlüssel, der nicht für andere Zwecke verwendet wird.ID1...IDn
sind die ursprünglichen ID-Werte. Die Zuordnung eines bestimmten Werts zu einem bestimmten Index ist implementierungsabhängig, da verschiedene Geräte unterschiedliche Anzahlen von IDs haben.||
steht für Verkettung.
Da die HMAC-Ausgaben eine feste Größe haben, sind keine Header oder andere Strukturen erforderlich, um einzelne ID-Hashes oder den HMAC von D zu finden. Neben der Prüfung der bereitgestellten Werte zur Durchführung der Attestierung müssen Implementierungen S validieren. Dazu wird D aus S extrahiert, HMAC(HBK, D) berechnet und mit dem Wert in S verglichen, um zu bestätigen, dass keine einzelnen IDs geändert/beschädigt wurden. Außerdem müssen Implementierungen für alle einzelnen ID-Elemente und die Validierung von S Vergleiche in konstanter Zeit verwenden. Die Vergleichszeit muss unabhängig von der Anzahl der angegebenen IDs und der korrekten Übereinstimmung eines Teils des Tests konstant sein.
Hardware-IDs
Die ID-Attestierung unterstützt die folgenden Hardware-IDs:
- Markenname, wie von
Build.BRAND
unter Android zurückgegeben - Gerätename, wie von
Build.DEVICE
unter Android zurückgegeben - Produktname, wie von
Build.PRODUCT
unter Android zurückgegeben - Herstellername, wie von
Build.MANUFACTURER
unter Android zurückgegeben - Modellname, wie von
Build.MODEL
in Android zurückgegeben - Seriennummer
- IMEIs aller Funkschnittstellen
- MEIDs aller Funkschnittstellen
Zur Unterstützung der Attestierung der Geräte-ID bestätigt ein Gerät diese IDs. Alle Geräte mit Android haben die ersten sechs und sie sind für die Funktion erforderlich. Wenn das Gerät integrierte Mobilfunkschnittstellen hat, muss es auch die Attestierung für die IMEIs und/oder MEIDs der Funkschnittstellen unterstützen.
Die Geräteidentitätsattestierung wird angefordert, indem eine Schlüsselattestierung durchgeführt und die zu attestierenden Geräte-IDs in die Anfrage aufgenommen werden. Die Kennungen sind mit folgenden Tags versehen:
ATTESTATION_ID_BRAND
ATTESTATION_ID_DEVICE
ATTESTATION_ID_PRODUCT
ATTESTATION_ID_MANUFACTURER
ATTESTATION_ID_MODEL
ATTESTATION_ID_SERIAL
ATTESTATION_ID_IMEI
ATTESTATION_ID_MEID
Die zu attestierende Kennung ist ein UTF-8-codierter Byte-String. Dieses Format gilt auch für numerische Kennzeichnungen. Jede zu attestierende Kennung wird als UTF-8-codierter String angegeben.
Wenn das Gerät die ID-Attestierung nicht unterstützt (oder destroyAttestationIds()
zuvor aufgerufen wurde und das Gerät seine IDs nicht mehr attestieren kann), schlägt jede Schlüsselattestierungsanfrage, die eines oder mehrere dieser Tags enthält, mit ErrorCode::CANNOT_ATTEST_IDS
fehl.
Wenn das Gerät die Identitätsattestierung unterstützt und eines oder mehrere der oben genannten Tags in eine Schlüsselattestierungsanfrage aufgenommen wurden, prüft die TEE, ob die mit den einzelnen Tags bereitgestellte Kennung mit der Kopie der Hardware-IDs übereinstimmt. Wenn eine oder mehrere Kennungen nicht übereinstimmen, schlägt die gesamte Attestierung mit ErrorCode::CANNOT_ATTEST_IDS
fehl. Es ist zulässig, dasselbe Tag mehrmals anzugeben. Das kann beispielsweise beim Attestieren von IMEIs nützlich sein: Ein Gerät kann mehrere Funkschnittstellen mit mehreren IMEIs haben. Eine Attestierungsanfrage ist gültig, wenn der mit jeder ATTESTATION_ID_IMEI
angegebene Wert mit einem der Funkschnittstellen des Geräts übereinstimmt. Dasselbe gilt für alle anderen Tags.
Wenn die Attestierung erfolgreich war, werden die attestierten IDs der Attestierungserweiterung (OID 1.3.6.1.4.1.11129.2.1.17) des ausgestellten Attestierungszertifikats mithilfe des oben genannten Schemas hinzugefügt. Änderungen aus dem Attestierungsschema von Keymaster 2 sind fett formatiert und enthalten Kommentare.
Java API
Dieser Abschnitt dient nur zur Information. Keymaster-Implementierer implementieren und verwenden die Java API nicht. Damit sollen Implementierer besser nachvollziehen können, wie die Funktion von Apps verwendet wird. Systemkomponenten verwenden ihn möglicherweise anders. Daher ist es wichtig, dass dieser Abschnitt nicht als normativ behandelt wird.