Keystore bietet einen sichereren Ort zum Erstellen, Speichern und Verwenden kryptografischer Schlüssel auf kontrollierte Weise. Wenn hardwaregestützte Schlüsselspeicher verfügbar sind und verwendet werden, ist das Schlüsselmaterial besser vor dem Extrahieren vom Gerät geschützt. Außerdem erzwingt Keymaster Einschränkungen, die nur schwer zu umgehen sind.
Dies gilt jedoch nur, wenn die Keystore-Schlüssel bekanntermaßen in einem hardwarebasierten Speicher gespeichert sind. In Keymaster 1 gab es keine Möglichkeit für Apps oder Remote-Server, zuverlässig zu überprüfen, ob dies der Fall war. Der Keystore-Daemon hat den verfügbaren Keymaster-HAL geladen und alles geglaubt, was der HAL in Bezug auf die Hardware-Sicherung von Schlüsseln gesagt hat.
Um dieses Problem zu beheben, wurde in Android 7.0 (Keymaster 2) die Schlüsselbestätigung und in Android 8.0 (Keymaster 3) die ID-Bestätigung eingeführt.
Die Schlüsselattestierung soll eine Möglichkeit bieten, genau zu bestimmen, ob ein asymmetrisches Schlüsselpaar hardwaregestützt ist, welche Eigenschaften der Schlüssel hat und welche Einschränkungen für seine Verwendung gelten.
Mit der ID-Bestätigung kann das Gerät seine Hardwarekennzeichnungen wie Seriennummer oder IMEI nachweisen.
Schlüsselattestierung
Zur Unterstützung der Schlüsselbestätigung wurden in Android 7.0 eine Reihe von Tags, Typen und Methoden für die HAL eingeführt.
Tags
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
Typ
Keymaster 2 und älter
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 älter
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 vomgenerateKey
zurückgegebene Schlüssel-Blob, für den die Attestierung erstellt wird.attestParams
ist eine Liste aller für die Attestierung erforderlichen Parameter. Dazu gehörenTag::ATTESTATION_CHALLENGE
und möglicherweiseTag::RESET_SINCE_ID_ROTATION
sowieTag::APPLICATION_ID
undTag::APPLICATION_DATA
. Die beiden letztgenannten sind erforderlich, um den Schlüssel-Blob zu entschlüsseln, wenn sie bei der Schlüsselgenerierung angegeben wurden.certChain
ist der Ausgabeparameter, der ein Array von Zertifikaten zurückgibt. Eintrag 0 ist das Attestierungszertifikat. Es zertifiziert den Schlüssel auskeyToAttest
und enthält die Attestierungserweiterung.
Die attestKey
-Methode gilt als Public-Key-Vorgang für den bestätigten Schlüssel, da sie jederzeit aufgerufen werden kann und keine Autorisierungsbeschränkungen erfüllt werden müssen. Wenn für die Verwendung des bestätigten Schlüssels beispielsweise eine Nutzerauthentifizierung erforderlich ist, kann eine Bestätigung ohne Nutzerauthentifizierung generiert werden.
Attestierungszertifikat
Das Attestierungszertifikat ist ein Standard-X.509-Zertifikat mit einer optionalen Attestierungserweiterung, die eine Beschreibung des attaktierten Schlüssels enthält. Das Zertifikat wird mit einem zertifizierten Attestierungsschlüssel signiert. Für den Attestierungsschlüssel kann ein anderer Algorithmus als für den zu attestienden Schlüssel verwendet werden.
Das Attestierungszertifikat enthält die Felder in der Tabelle unten und darf keine zusätzlichen Felder enthalten. Für einige Felder ist ein fester Feldwert angegeben. CTS-Tests prüfen, ob der Zertifikatsinhalt genau wie definiert ist.
Zertifikats-SEQUENCE
Feldname (siehe RFC 5280) | Wert |
---|---|
tbsCertificate | 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, die für das ASN.1 DER-codierte tbsCertificate berechnet wurde. |
TBSCertificate SEQUENCE
Feldname (siehe RFC 5280) | Wert |
---|---|
version |
INTEGER 2 (entspricht dem V3-Zertifikat) |
serialNumber |
INTEGER 1 (fester Wert: auf 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 Betrefffeld des Batch-Attestierungsschlüssels. |
validity |
SEQUENCE aus zwei Datumsangaben mit den Werten Tag::ACTIVE_DATETIME und Tag::USAGE_EXPIRE_DATETIME .
Diese Werte werden in Millisekunden seit dem 1. Januar 1970 angegeben.
Informationen zur korrekten Darstellung von Datumsangaben in Zertifikaten finden Sie unter RFC 5280.Wenn Tag::ACTIVE_DATETIME nicht vorhanden ist, verwenden Sie den Wert von Tag::CREATION_DATETIME . Wenn Tag::USAGE_EXPIRE_DATETIME nicht vorhanden ist, verwenden Sie das Ablaufdatum des Zertifikats für den Batch-Bestätigungsschlüssel. |
subject |
CN = „Android Keystore Key“ (fester Wert: auf allen Zertifikaten gleich) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo mit dem bestätigten ö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 festgelegt. |
extensions/CRL Distribution Points |
Wert noch offen |
extensions/"attestation" |
Die OID ist 1.3.6.1.4.1.11129.2.1.17. Der Inhalt wird unten im Abschnitt Attestation extension (Attestierungserweiterung) definiert. Wie bei allen X.509-Zertifikaterweiterungen wird der Inhalt als OCTET_STRING dargestellt, der eine DER-Codierung der Attestierungs-SEQUENCE enthält. |
Attestierungserweiterung
Die Erweiterung attestation
hat die OID 1.3.6.1.4.1.11129.2.1.17
. Es enthält Informationen zum Schlüsselpaar, das bestätigt 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 GMT. |
BOOL |
NULL |
Das Vorhandensein eines Tags bedeutet „wahr“, das Fehlen bedeutet „falsch“. |
BIGNUM |
Keine Tags haben diesen Typ, daher ist keine Zuordnung definiert. | |
BYTES |
OCTET_STRING |
Schema
Der Inhalt der Attestierungserweiterung wird durch das folgende ASN.1-Schema beschrieben:
Version 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), }
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 400 KeyMint-Version 4.0 -
attestationSecurityLevel
-
Das Sicherheitsniveau des Speicherorts des bestätigten Schlüssels.
-
keymasterVersion
/keyMintVersion
-
Die Version der Keymaster-/KeyMint-Implementierung der Hardwareabstraktionsschicht (Hardware Abstraction Layer, 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 400 KeyMint-Version 4.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Das Sicherheitsniveau der Keymaster-/KeyMint-Implementierung.
-
attestationChallenge
- Die bei der Schlüsselgenerierung bereitgestellte Challenge.
-
uniqueId
- Eine datenschutzrelevante Geräte-ID, die System-Apps bei der Schlüsselgenerierung anfordern können. Wenn die eindeutige ID nicht 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 erhoben oder generiert. Das Gerät kann als vertrauenswürdig eingestuft werden, solange darauf ein Betriebssystem ausgeführt wird, das dem Android Platform Security Model entspricht. Das bedeutet, dass der Bootloader des Geräts gesperrt ist 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 erhoben oder generiert und nicht von der Plattform gesteuert. Informationen können beispielsweise vom Bootloader oder über einen sicheren Kommunikationskanal stammen, bei dem die Plattform nicht vertrauenswürdig sein muss.
SecurityLevel-Werte
Der Wert SecurityLevel
gibt an, inwieweit ein Keystore-bezogenes Element (z. B. Schlüsselpaar und Attest) gegen Angriffe geschützt ist.
Wert | Bedeutung |
---|---|
Software |
Sicher, solange das Android-System des Geräts dem Android Platform Security Model entspricht (d. h. der Bootloader des Geräts ist gesperrt und die verifiedBootState ist Verified ). |
TrustedEnvironment |
Sicher, solange das TEE nicht manipuliert wird. Die Isolierungsanforderungen für TEEs sind im Android Compatibility Definition Document in den Abschnitten 9.11 [C-1-1] bis [C-1-4] definiert. TEEs sind sehr widerstandsfähig gegen Remote-Angriffe und mäßig widerstandsfähig gegen Angriffe durch direkte Hardwaremanipulation. |
StrongBox |
Sicher, solange StrongBox nicht manipuliert wird. StrongBox wird in einem sicheren Element implementiert, das einem Hardwaresicherheitsmodul ähnelt. Die Implementierungsanforderungen für StrongBox sind im Abschnitt 9.11.2 des Android Compatibility Definition Document definiert. StrongBox ist sehr widerstandsfähig gegen Kompromittierung per Fernzugriff und durch direkte Hardware-Angriffe (z. B. physische Manipulation und Side-Channel-Angriffe). |
AuthorizationList-Felder
Jedes Feld entspricht einem Keymaster-/KeyMint-Autorisierungstag aus der AIDL-Schnittstellenspezifikation.
Die Spezifikation ist die Quelle der Wahrheit über Autorisierungstags: ihre Bedeutung, das Format ihrer Inhalte, ob sie in den Feldern softwareEnforced
oder hardwareEnforced
im KeyDescription
-Objekt erwartet werden, ob sie sich gegenseitig mit anderen Tags ausschließen usw. Alle AuthorizationList
-Felder sind optional.
Jedes Feld hat ein kontextspezifisches EXPLICIT
-Tag, das der Keymaster-/KeyMint-Tag-Nummer entspricht. Dadurch können die Daten in der AuthorizationList
kompakter dargestellt werden. 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 wird das Feld purpose
im AuthorizationList
als userAuthType [504] EXPLICIT INTEGER OPTIONAL
angegeben. Die ASN.1-Codierung enthält daher das kontextspezifische Tag 504
anstelle des Klassentags UNIVERSAL
für den ASN.1-Typ INTEGER
, der 10
ist.
-
purpose
-
Entspricht dem Autorisierungstag
Tag::PURPOSE
, für das der Tag-ID-Wert 1 verwendet wird. -
algorithm
-
Entspricht dem Autorisierungs-Tag
Tag::ALGORITHM
, das den Tag-ID-Wert 2 verwendet.In einem
AuthorizationList
-Objekt für die Geräteattestierung ist der Algorithmuswert immerRSA
oderEC
. -
keySize
-
Entspricht dem Autorisierungs-Tag
Tag::KEY_SIZE
, für das der Tag-ID-Wert 3 verwendet wird. -
blockMode
-
Entspricht dem Autorisierungstag
Tag::BLOCK_MODE
, für das der Tag-ID-Wert 4 verwendet wird. -
digest
-
Entspricht dem Autorisierungstag
Tag::DIGEST
, für das der Tag-ID-Wert 5 verwendet wird. -
padding
-
Entspricht dem Autorisierungstag
Tag::PADDING
, für das der Tag-ID-Wert 6 verwendet wird. -
callerNonce
-
Entspricht dem Autorisierungstag
Tag::CALLER_NONCE
, für das der Tag-ID-Wert 7 verwendet wird. -
minMacLength
-
Entspricht dem Autorisierungs-Tag
Tag::MIN_MAC_LENGTH
, das den Tag-ID-Wert 8 verwendet. -
ecCurve
-
Entspricht dem Autorisierungs-Tag
Tag::EC_CURVE
mit dem Tag-ID-Wert 10.Die Gruppe von Parametern, die zum Generieren eines Schlüsselpaars für elliptische Kurven (EC) verwendet werden, das ECDSA zum Signieren und Verifizieren im Android-System-Keystore verwendet.
-
rsaPublicExponent
-
Entspricht dem Autorisierungs-Tag
Tag::RSA_PUBLIC_EXPONENT
, für das die Tag-ID 200 verwendet wird. -
mgfDigest
-
Nur in der Schlüsselattestierungsversion >= 100 verfügbar.
Entspricht demTag::RSA_OAEP_MGF_DIGEST
-Autorisierungstag von KeyMint, für den der Tag-ID-Wert 203 verwendet wird. -
rollbackResistance
-
Nur in der Schlüsselattestierungsversion >= 3 vorhanden.
Entspricht dem
Tag::ROLLBACK_RESISTANCE
-Autorisierungstag, für das der Tag-ID-Wert 303 verwendet wird. -
earlyBootOnly
-
Nur in der Schlüsselattestierungsversion >= 4 vorhanden.
Entspricht dem Autorisierungstag
Tag::EARLY_BOOT_ONLY
, für das die Tag-ID 305 verwendet wird. -
activeDateTime
-
Entspricht dem Autorisierungs-Tag
Tag::ACTIVE_DATETIME
, das den Tag-ID-Wert 400 verwendet. -
originationExpireDateTime
-
Entspricht dem Autorisierungstag
Tag::ORIGINATION_EXPIRE_DATETIME
, für das der Tag-ID-Wert 401 verwendet wird. -
usageExpireDateTime
-
Entspricht dem Autorisierungstag
Tag::USAGE_EXPIRE_DATETIME
, das den Tag-ID-Wert 402 verwendet. -
usageCountLimit
-
Entspricht dem Autorisierungstag
Tag::USAGE_COUNT_LIMIT
, für das der Tag-ID-Wert 405 verwendet wird. -
userSecureId
-
Entspricht dem Autorisierungstag
Tag::USER_SECURE_ID
, das den Tag-ID-Wert 502 verwendet. -
noAuthRequired
-
Entspricht dem Autorisierungstag
Tag::NO_AUTH_REQUIRED
, das die Tag-ID 503 verwendet. -
userAuthType
-
Entspricht dem Autorisierungs-Tag
Tag::USER_AUTH_TYPE
, das den Tag-ID-Wert 504 verwendet. -
authTimeout
-
Entspricht dem Autorisierungstag
Tag::AUTH_TIMEOUT
, für das die Tag-ID 505 verwendet wird. -
allowWhileOnBody
-
Entspricht dem Autorisierungstag
Tag::ALLOW_WHILE_ON_BODY
mit der Tag-ID 506.Ermöglicht die Verwendung des Schlüssels nach Ablauf des Authentifizierungszeitlimits, wenn der Nutzer das Gerät weiterhin am Körper trägt. Ein sicherer Sensor am Körper erkennt, ob das Gerät am Körper des Nutzers getragen wird.
-
trustedUserPresenceReq
-
Nur in der Schlüsselattestierungsversion >= 3 vorhanden.
Entspricht dem Autorisierungstag
Tag::TRUSTED_USER_PRESENCE_REQUIRED
, für das die Tag-ID 507 verwendet wird.Gibt an, dass dieser Schlüssel nur verwendet werden kann, wenn der Nutzer einen Nachweis seiner physischen Präsenz erbracht hat. Hier einige Beispiele:
- Für einen StrongBox-Schlüssel eine Hardwaretaste, die fest mit einem Pin auf dem StrongBox-Gerät verbunden ist.
- Bei einem TEE-Schlüssel liefert die Fingerabdruckauthentifizierung einen Anwesenheitsnachweis, solange das TEE die exklusive Kontrolle über den Scanner hat und den Fingerabdruckabgleich durchführt.
-
trustedConfirmationReq
-
Nur in der Schlüsselattestierungsversion >= 3 vorhanden.
Entspricht dem Autorisierungstag
Tag::TRUSTED_CONFIRMATION_REQUIRED
, das den Tag-ID-Wert 508 verwendet.Gibt an, dass der Schlüssel nur verwendet werden kann, wenn der Nutzer die zu signierenden Daten mit einem Genehmigungstoken bestätigt. Weitere Informationen zum Einholen der Nutzerbestätigung finden Sie unter Android Protected Confirmation.
Hinweis:Dieses Tag gilt nur für Schlüssel, die den Zweck
SIGN
verwenden. -
unlockedDeviceReq
-
Nur in der Schlüsselattestierungsversion >= 3 vorhanden.
Entspricht dem Autorisierungstag
Tag::UNLOCKED_DEVICE_REQUIRED
, für das der Tag-ID-Wert 509 verwendet wird. -
creationDateTime
-
Entspricht dem Autorisierungs-Tag
Tag::CREATION_DATETIME
, für das die Tag-ID 701 verwendet wird. -
origin
-
Entspricht dem Autorisierungstag
Tag::ORIGIN
, für das der Tag-ID-Wert 702 verwendet wird. -
rootOfTrust
-
Entspricht dem Autorisierungstag
Tag::ROOT_OF_TRUST
, für das der Tag-ID-Wert 704 verwendet wird.Weitere Informationen finden Sie im Abschnitt zur Datenstruktur RootOfTrust.
-
osVersion
-
Entspricht dem Autorisierungstag
Tag::OS_VERSION
, für das der Tag-ID-Wert 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 enthält diesen Wert in der Autorisierungsliste.
-
osPatchLevel
-
Entspricht dem Autorisierungstag
Tag::PATCHLEVEL
, für das die Tag-ID 706 verwendet wird.Der Monat und das Jahr, die mit dem im Keymaster verwendeten Sicherheitspatch verknüpft sind, 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 Autorisierungstag
Tag::ATTESTATION_APPLICATION_ID
, für das der Tag-ID-Wert 709 verwendet wird.Weitere Informationen finden Sie im Abschnitt zur Datenstruktur AttestationApplicationId.
-
attestationIdBrand
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_BRAND
, das den Tag-ID-Wert 710 verwendet. -
attestationIdDevice
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_DEVICE
mit dem Tag-ID-Wert 711. -
attestationIdProduct
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_PRODUCT
mit dem Tag-ID-Wert 712. -
attestationIdSerial
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_SERIAL
, für das der Tag-ID-Wert 713 verwendet wird. -
attestationIdImei
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_IMEI
mit dem Tag-ID-Wert 714. -
attestationIdMeid
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_MEID
, für das die Tag-ID 715 verwendet wird. -
attestationIdManufacturer
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_MANUFACTURER
, für das der Tag-ID-Wert 716 verwendet wird. -
attestationIdModel
-
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_MODEL
, das den Tag-ID-Wert 717 verwendet. -
vendorPatchLevel
-
Nur in Schlüsselattestierungsversionen >= 3 vorhanden.
Entspricht dem Autorisierungstag
Tag::VENDOR_PATCHLEVEL
mit der Tag-ID 718.Gibt das Sicherheitspatch-Level des Anbieter-Image an, das auf dem Gerät installiert sein muss, damit dieser Schlüssel verwendet werden kann. Der Wert wird im Format JJJJMMTT angezeigt und steht für das Datum des Sicherheitsupdates des Anbieters. Wenn beispielsweise ein Schlüssel auf einem Android-Gerät mit dem Sicherheitsupdate des Anbieters vom 1. August 2018 generiert wurde, wäre dieser Wert 20180801.
-
bootPatchLevel
-
Nur in Schlüsselattestierungsversionen >= 3 vorhanden.
Entspricht dem Autorisierungstag
Tag::BOOT_PATCHLEVEL
mit der Tag-ID 719.Gibt das Sicherheitspatch-Level des Kernel-Image an, das auf dem Gerät installiert sein muss, damit dieser Schlüssel verwendet werden kann. Der Wert wird im Format JJJJMMTT angezeigt und steht für das Datum des Systemsicherheitsupdates. Wenn beispielsweise ein Schlüssel auf einem Android-Gerät mit dem am 5. August 2018 installierten Sicherheitspatch des Systems generiert wurde, lautet dieser Wert 20180805.
-
deviceUniqueAttestation
-
Nur in Schlüsselattestierungsversionen >= 4 vorhanden.
Entspricht dem Autorisierungstag
Tag::DEVICE_UNIQUE_ATTESTATION
, für das der Tag-ID-Wert 720 verwendet wird. -
attestationIdSecondImei
-
Nur in Schlüsselattestierungsversionen >= 300 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_SECOND_IMEI
mit der Tag-ID 723. -
moduleHash
-
Nur in Schlüsselattestierungsversionen >= 400 verfügbar.
Entspricht dem Autorisierungstag
Tag::MODULE_HASH
, das den Tag-ID-Wert 724 verwendet.
RootOfTrust-Felder
-
verifiedBootKey
- Ein sicherer Hash des öffentlichen Schlüssels, der verwendet wird, um die Integrität und Authentizität des gesamten Codes zu überprüfen, der während des Geräte-Bootvorgangs im Rahmen von Verified Boot ausgeführt wird. SHA-256 wird empfohlen.
-
deviceLocked
-
Gibt an, ob der Bootloader des Geräts gesperrt ist.
true
bedeutet, dass auf dem Gerät ein signiertes Image gebootet wurde, das von Verified Boot erfolgreich überprüft wurde. -
verifiedBootState
- Der Status des verifizierten Bootmodus des Geräts.
-
verifiedBootHash
- Ein Digest aller Daten, die durch Verified Boot geschützt sind. Bei Geräten, die die Referenzimplementierung des Android-Bootmodus mit Verifikation verwenden, enthält dieses Feld den VBMeta-Digest.
VerifiedBootState-Werte
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 von Verified Boot überprüft werden.
In diesem Status enthält das Feld verifiedBootKey den Hash des eingebetteten Root of Trust, also des Zertifikats, das vom Gerätehersteller in der Fabrik in das ROM des Geräts eingebettet wurde. |
SelfSigned |
YELLOW |
Wie Verified , mit dem Unterschied, dass die Überprüfung mit einem vom Nutzer konfigurierten Root of Trust anstelle des vom Hersteller in der Fabrik 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, daher kann keine Vertrauenskette hergestellt werden. Das Gerät kann frei modifiziert werden. Die Integrität des Geräts muss daher vom Nutzer außerhalb des Bandes überprüft werden. In diesem Zustand enthält das Feld verifiedBootKey 32 Byte mit Nullen. |
Failed |
RED |
Die Überprüfung des Geräts ist fehlgeschlagen. In diesem Zustand gibt es keine Garantien für den Inhalt der anderen RootOfTrust -Felder. |
AttestationApplicationId
Dieses Feld gibt an, welche Apps nach Ansicht der Android-Plattform den geheimen Schlüssel verwenden dürfen, der für die Attestierung verwendet wird. Es 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, die jeweils den Namen und die Versionsnummer eines Pakets enthalten. 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 „Leaf“-Zertifikat gehasht und in das Feld
signature_digests
eingefügt. Der Feldname ist irreführend, da die zusammengefassten Daten die Signaturzertifikate der App und nicht die App-Signaturen sind. Der Name bezieht sich auf die KlasseSignature
, die von einem Aufruf vongetPackageInfo()
zurückgegeben wird. Das folgende Code-Snippet zeigt ein Beispielset:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
Erweiterung für Bereitstellungsinformationen
Die Erweiterung für Bereitstellungsinformationen hat die OID 1.3.6.1.4.1.11129.2.1.30
. Die Erweiterung enthält Informationen, die dem Bereitstellungsserver zum Gerät bekannt sind.
Schema
Die Erweiterung folgt dem folgenden CDDL-Schema:
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
Die Karte ist nicht versioniert und es können neue optionale Felder hinzugefügt werden.
-
certs_issued
-
Eine ungefähre Anzahl der Zertifikate, die dem Gerät in den letzten 30 Tagen ausgestellt wurden. Dieser Wert kann als Signal für potenziellen Missbrauch verwendet werden, wenn er um einige Größenordnungen über dem Durchschnitt liegt.
-
validated_attested_entity
-
Die validierte bestätigte Entität ist ein String, der den Typ des Geräts beschreibt, das vom Bereitstellungsserver als bestätigt bestätigt wurde. Beispiel:
STRONG_BOX
oderTEE
.
Attestierungsschlüssel
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 Remote Key Provisioning eingeführt. In Android 13 ist die Implementierung auf Geräten erforderlich. Mit der Remote Key Provisioning-Funktion werden Geräte im Feld mit ECDSA P256-Attestierungszertifikaten pro App ausgestattet. Diese Zertifikate haben eine kürzere Lebensdauer als die werkseitig bereitgestellten Zertifikate.
Eindeutige ID
Die eindeutige ID ist ein 128‑Bit-Wert, der das Gerät identifiziert, jedoch nur für einen begrenzten Zeitraum. Der Wert wird so berechnet:
HMAC_SHA256(T || C || R, HBK)
Dabei gilt:
T
ist der „temporale Zählerwert“, der berechnet wird, indem der Wert vonTag::CREATION_DATETIME
durch 2592000000 geteilt wird. Dabei wird der Rest verworfen.T
ändert sich alle 30 Tage (2592000000 = 30 * 24 * 60 * 60 * 1000).C
ist der Wert vonTag::APPLICATION_ID
.R
ist 1, wennTag::RESET_SINCE_ID_ROTATION
im Parameter „attest_params“ für den Aufruf von „attest_key“ vorhanden ist, oder 0, wenn das Tag nicht vorhanden ist.HBK
ist ein eindeutiges, an die Hardware gebundenes Geheimnis, das der vertrauenswürdigen Ausführungsumgebung bekannt ist und von ihr niemals preisgegeben wird. Das Secret enthält mindestens 128 Bit Entropie und ist für das jeweilige Gerät eindeutig (probabilistische Eindeutigkeit ist bei 128 Bit Entropie akzeptabel). Der HBK sollte aus dem kombinierten Schlüsselmaterial über HMAC oder AES_CMAC abgeleitet werden.
Kürzen Sie die HMAC_SHA256-Ausgabe auf 128 Bit.
Mehrere IMEIs
Unter Android 14 werden mehrere IMEIs im Android-Schlüsselattestierungsdatensatz unterstützt. OEMs können diese Funktion implementieren, indem sie ein KeyMint-Tag für eine zweite IMEI hinzufügen. Es wird immer üblicher, dass Geräte mehrere Mobilfunkmodule haben. OEMs können jetzt Geräte mit zwei IMEIs unterstützen.
OEMs müssen eine sekundäre IMEI, sofern auf ihren Geräten vorhanden, für die KeyMint-Implementierung(en) bereitstellen, damit diese Implementierungen sie auf dieselbe Weise bestätigen können wie die erste IMEI.
Identitätserklärung
Android 8.0 bietet optionale Unterstützung für die ID-Attestierung für Geräte mit Keymaster 3. Mit der ID-Bestätigung kann das Gerät seine Hardware-IDs wie Seriennummer oder IMEI nachweisen. Obwohl es sich um eine optionale Funktion handelt, wird dringend empfohlen, dass alle Keymaster 3-Implementierungen sie unterstützen, da die Möglichkeit, die Identität des Geräts nachzuweisen, Anwendungsfälle wie die echte Zero-Touch-Konfiguration per Remote-Zugriff sicherer macht. Die Remote-Seite kann sich sicher sein, dass sie mit dem richtigen Gerät kommuniziert und nicht mit einem Gerät, das seine Identität fälscht.
Bei der ID-Attestierung werden Kopien der Hardware-IDs des Geräts erstellt, auf die nur die 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 vom TEE gespeicherten Kopien der IDs können nicht auf diese Weise manipuliert werden. So wird sichergestellt, dass bei der Geräte-ID-Attestierung nur die ursprünglichen Hardware-IDs des Geräts attestiert werden, wodurch Spoofing-Versuche vereitelt werden.
Die Haupt-API-Oberfläche für die ID-Bestätigung basiert auf dem vorhandenen Schlüsselbestätigungsmechanismus, der mit Keymaster 2 eingeführt wurde. Wenn ein Attestierungszertifikat für einen von Keymaster verwalteten Schlüssel angefordert wird, kann der Aufrufer verlangen, dass die Hardware-IDs des Geräts in die Metadaten des Attestierungszertifikats aufgenommen werden. Wenn der Schlüssel im TEE gespeichert ist, wird das Zertifikat auf eine bekannte Root of Trust zurückgeführt. Der Empfänger eines solchen Zertifikats kann überprüfen, ob das Zertifikat und sein Inhalt, einschließlich der Hardware-IDs, von der TEE geschrieben wurden. Wenn Sie aufgefordert werden, Hardware-IDs in das Attestierungszertifikat aufzunehmen, werden vom TEE nur die IDs attestiert, die im Speicher enthalten sind und in der Fabrik eingetragen wurden.
Speicherattribute
Der Speicher, in dem die Kennungen des Geräts gespeichert werden, muss die folgenden Eigenschaften haben:
- Die aus den ursprünglichen Geräte-IDs abgeleiteten Werte werden in den Speicher kopiert, bevor das Gerät das Werk verlässt.
- Mit der Methode
destroyAttestationIds()
kann diese Kopie der aus der Kennung abgeleiteten Daten dauerhaft gelöscht werden. Die endgültige Vernichtung bedeutet, dass die Daten vollständig entfernt werden, sodass sie weder durch das Zurücksetzen auf die Werkseinstellungen noch durch ein anderes Verfahren auf dem Gerät wiederhergestellt werden können. Dies ist besonders wichtig für Geräte, bei denen ein Nutzer den Bootloader entsperrt, die Systemsoftware geändert und die von Android-Frameworks zurückgegebenen IDs modifiziert hat. - RMA-Einrichtungen sollten in der Lage sein, neue Kopien der aus der Hardware-Kennung abgeleiteten Daten zu generieren. So kann ein Gerät, das die RMA durchläuft, die ID-Bestätigung noch einmal durchführen. Der von RMA-Einrichtungen verwendete Mechanismus muss geschützt werden, damit Nutzer ihn nicht selbst aufrufen können, da sie sonst Atteste für gefälschte IDs erhalten könnten.
- Außer der Keymaster-Vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) kann kein anderer Code die im Speicher abgelegten, aus dem Identifier abgeleiteten Daten lesen.
- Der Speicher ist manipulationssicher: Wenn der Inhalt des Speichers geändert wurde, behandelt das TEE ihn so, als wären die Kopien des Inhalts zerstört worden, und lehnt alle Versuche zur ID-Bestätigung ab. Dies wird durch Signieren oder MACing des Speichers wie unten beschrieben implementiert.
- Im Speicher sind nicht die ursprünglichen IDs enthalten. Da die ID-Bestätigung eine Challenge umfasst, liefert der Aufrufer immer die zu bestätigenden Kennungen. Das TEE muss nur prüfen, ob sie mit den ursprünglichen Werten übereinstimmen. Für diese Überprüfung werden sichere Hashes der Originalwerte anstelle der Werte gespeichert.
Baugewerbe
Um eine Implementierung mit den oben aufgeführten Eigenschaften zu erstellen, speichern Sie die ID-abgeleiteten Werte in der folgenden Konstruktion S. Speichern Sie keine anderen Kopien der ID-Werte, mit Ausnahme der normalen Orte 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 einem geeigneten sicheren Hash (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 eine unterschiedliche Anzahl von Kennungen haben.||
steht für die 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. Zusätzlich zur Prüfung der bereitgestellten Werte für die Attestierung müssen Implementierungen S validieren, indem sie D aus S extrahieren, HMAC(HBK, D) berechnen und mit dem Wert in S vergleichen, um zu prüfen, ob einzelne IDs geändert oder beschädigt wurden. Außerdem müssen Implementierungen für alle einzelnen ID-Elemente und die Validierung von S Vergleiche mit konstanter Zeit verwenden. Die Vergleichszeit muss unabhängig von der Anzahl der bereitgestellten IDs und der korrekten Zuordnung eines Teils des Tests konstant sein.
Hardware-Kennungen
Die ID-Attestierung unterstützt die folgenden Hardware-IDs:
- Markenname, wie von
Build.BRAND
in Android zurückgegeben - Gerätename, wie von
Build.DEVICE
in Android zurückgegeben - Produktname, wie von
Build.PRODUCT
in Android zurückgegeben - Name des Herstellers, wie von
Build.MANUFACTURER
in Android zurückgegeben - Modellname, wie von
Build.MODEL
in Android zurückgegeben - Seriennummer
- IMEIs aller Funkmodule
- MEIDs aller Funkmodule
Zur Unterstützung der Geräte-ID-Attestierung werden diese IDs von einem Gerät attestiert. Alle Geräte mit Android haben die ersten sechs und sie sind erforderlich, damit diese Funktion funktioniert. Wenn das Gerät integrierte Mobilfunkmodule hat, muss es auch die Attestierung für die IMEIs und/oder MEIDs der Module unterstützen.
Die ID-Bestätigung wird angefordert, indem eine Schlüsselbestätigung durchgeführt und die zu bestätigenden Geräte-IDs in die Anfrage aufgenommen werden. Die Kennungen sind so gekennzeichnet:
ATTESTATION_ID_BRAND
ATTESTATION_ID_DEVICE
ATTESTATION_ID_PRODUCT
ATTESTATION_ID_MANUFACTURER
ATTESTATION_ID_MODEL
ATTESTATION_ID_SERIAL
ATTESTATION_ID_IMEI
ATTESTATION_ID_MEID
Der zu bestätigende Bezeichner ist ein UTF-8-codierter Byte-String. Dieses Format gilt auch für numerische Kennungen. Jede zu bestätigende Kennung wird als UTF‑8-codierter String ausgedrückt.
Wenn das Gerät die ID-Bestätigung nicht unterstützt oder destroyAttestationIds()
zuvor aufgerufen wurde und das Gerät seine IDs nicht mehr bestätigen kann, schlägt jede Schlüsselbestätigungsanfrage, die eines oder mehrere dieser Tags enthält, mit ErrorCode::CANNOT_ATTEST_IDS
fehl.
Wenn das Gerät die ID-Bestätigung unterstützt und eines oder mehrere der oben genannten Tags in einer Schlüsselbestätigungsanfrage enthalten sind, prüft die TEE, ob die mit den einzelnen Tags bereitgestellte Kennung mit ihrer Kopie der Hardwarekennungen übereinstimmt. Wenn eine oder mehrere Kennungen nicht übereinstimmen, schlägt die gesamte Attestierung mit ErrorCode::CANNOT_ATTEST_IDS
fehl. Dasselbe Tag kann mehrmals angegeben werden. Das kann beispielsweise beim Attestieren von IMEIs nützlich sein: Ein Gerät kann mehrere Funkmodule mit mehreren IMEIs haben. Eine Attestierungsanfrage ist gültig, wenn der mit jedem ATTESTATION_ID_IMEI
angegebene Wert mit einem der Funkmodule des Geräts übereinstimmt. Dasselbe gilt für alle anderen Tags.
Wenn die Attestierung erfolgreich ist, wird die attestierte ID der Attestierungserweiterung (OID 1.3.6.1.4.1.11129.2.1.17) des ausgestellten Attestierungszertifikats hinzugefügt. Dabei wird das oben genannte Schema verwendet. Änderungen am Keymaster 2-Bestätigungsschema sind fett dargestellt und mit Kommentaren versehen.
Java API
Dieser Abschnitt dient nur zur Information. Keymaster-Implementierer implementieren oder verwenden die Java API nicht. Dies soll Implementierern helfen, die Verwendung der Funktion durch Apps nachzuvollziehen. Systemkomponenten verwenden sie möglicherweise anders. Daher ist es wichtig, dass dieser Abschnitt nicht als normativ betrachtet wird.