Der Schlüsselspeicher bietet einen sichereren Ort zum Erstellen, Speichern und kontrollierten Verwenden kryptografischer Schlüssel. Wenn hardwaregestützter Schlüsselspeicher verfügbar ist und verwendet wird, ist das Schlüsselmaterial besser vor dem Extrahieren vom Gerät geschützt. KeyMint (früher Keymaster) erzwingt Einschränkungen, die schwer zu umgehen sind.
Dies gilt jedoch nur, wenn die Keystore-Schlüssel bekanntermaßen in einem hardwaregestützten Speicher gespeichert sind. In Keymaster 1 gab es keine Möglichkeit für Apps oder Remoteserver, zuverlässig zu überprüfen, ob dies der Fall war. Der Keystore-Daemon hat die verfügbare Keymaster-Hardwareabstraktionsschicht (HAL) geladen und alles geglaubt, was die 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, zuverlässig festzustellen, 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-Attestierung 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_CHALLENGETag::INCLUDE_UNIQUE_IDTag::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);
devist die Keymaster-Gerätestruktur.keyToAttestist der vongenerateKeyzurückgegebene Schlüssel-Blob, für den die Attestierung erstellt wird.attestParamsist eine Liste aller für die Attestierung erforderlichen Parameter. Dazu gehörenTag::ATTESTATION_CHALLENGEund möglicherweiseTag::RESET_SINCE_ID_ROTATIONsowieTag::APPLICATION_IDundTag::APPLICATION_DATA. Die beiden letztgenannten sind erforderlich, um den Schlüssel-Blob zu entschlüsseln, wenn sie bei der Schlüsselgenerierung angegeben wurden.certChainist der Ausgabeparameter, der ein Array von Zertifikaten zurückgibt. Eintrag 0 ist das Attestierungszertifikat. Es zertifiziert den Schlüssel auskeyToAttestund enthält die Attestierungserweiterung.
Die attestKey-Methode wird als Public-Key-Vorgang für den bestätigten Schlüssel betrachtet, 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 Attestierung ohne Nutzerauthentifizierung generiert werden.
Bescheinigungszertifikat
Das Attestierungszertifikat ist ein Standard-X.509-Zertifikat mit einer optionalen Attestierungserweiterung, die eine Beschreibung des attestierten Schlüssels enthält. Das Zertifikat wird mit einem zertifizierten Attestierungsschlüssel signiert. Für den Attestierungsschlüssel wird möglicherweise ein anderer Algorithmus verwendet als für den Schlüssel, der attestiert wird.
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 einem 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 |
Derselbe wie das Betrefffeld des Batch-Attestierungsschlüssels. |
validity |
SEQUENCE aus zwei Datumsangaben mit den Werten von 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 in 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 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. Sie enthält Informationen zum zu bestätigenden Schlüsselpaar und zum Gerätestatus zum Zeitpunkt der Schlüsselgenerierung.
Die in der AIDL-Schnittstellenspezifikation definierten Keymaster-/KeyMint-Tag-Typen werden wie folgt in ASN.1-Typen übersetzt:
| KeyMint- oder Keymaster-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 des 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. Das ASN.1-Schema für AuthorizationList wird auch zum Importieren verschlüsselter Schlüssel verwendet.
Alle Felder, die nicht in der Attestierungserweiterung angezeigt werden, sind entsprechend gekennzeichnet.
Version 500
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 500
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 500
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,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
mlDsaVariant [11] 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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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,
}
Modules ::= SET OF Module
Module ::= SEQUENCE {
packageName OCTET_STRING,
version INTEGER,
}
RootOfTrust ::= SEQUENCE {
verifiedBootKey OCTET_STRING,
deviceLocked BOOLEAN,
verifiedBootState VerifiedBootState,
verifiedBootHash OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
Verified (0),
SelfSigned (1),
Unverified (2),
Failed (3),
}
Version 400
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 400
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 400
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,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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,
}
Modules ::= SET OF Module
Module ::= SEQUENCE {
packageName OCTET_STRING,
version INTEGER,
}
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 INTEGER, # Value 300
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 300
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,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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 INTEGER, # Value 200
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 200
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,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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 INTEGER, # Value 100
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 100
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,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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 INTEGER, # Value 4
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 41
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,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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 3
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 3
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 4
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,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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,
}
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 INTEGER, # Value 2
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 3
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 INTEGER, # Value 1
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 2
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 KeyMint- oder Keymaster-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 500 KeyMint-Version 5.0 -
attestationSecurityLevel -
Das Sicherheitsniveau des Speicherorts des bestätigten Schlüssels.
-
keymasterVersion/keyMintVersion -
Die Version der KeyMint- oder Keymaster-HAL-Implementierung.
Wert KeyMint- oder Keymaster-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 500 KeyMint-Version 5.0 -
keymasterSecurityLevel/keyMintSecurityLevel - Das Sicherheitsniveau der KeyMint- oder Keymaster-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 KeyMint oder Keymaster, die vom Android-System erzwungen wird. Diese Informationen werden durch Code auf der Plattform erfasst oder generiert. Es kann als vertrauenswürdig eingestuft werden, solange auf dem Gerät ein Betriebssystem ausgeführt wird, das dem Android Platform Security Model entspricht. Das bedeutet, dass der Bootloader des Geräts gesperrt ist und die
verifiedBootStateVerifiedist. -
hardwareEnforced - Die Autorisierungsliste von KeyMint oder Keymaster, 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 werden 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 SecurityLevel-Wert gibt an, inwieweit ein Keystore-bezogenes Element (z. B. Schlüsselpaar und Attestierung) gegen Angriffe geschützt ist.
| Wert | Bedeutung |
|---|---|
Software |
Sicher, solange das Android-System des Geräts dem Android Platform Security Model entspricht. Das bedeutet, dass der Bootloader des Geräts gesperrt ist und die verifiedBootState Verified ist. |
TrustedEnvironment |
Sicher, solange das TEE nicht manipuliert wird. Die Isolierungsanforderungen für TEEs sind in Abschnitt 9.11 [C-1-1] bis [C-1-4] des Android Compatibility Definition Document definiert. TEEs sind sehr widerstandsfähig gegen Kompromittierung aus der Ferne und mäßig widerstandsfähig gegen Kompromittierung durch direkte Hardwareangriffe. |
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 EXPLICIT kontextspezifisches Tag, das der KeyMint- oder Keymaster-Tag-Nummer entspricht. Dadurch kann das 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 in 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::ALGORITHMmit dem Tag-ID-Wert 2.In einem
AuthorizationList-Bestätigungsobjekt ist der Algorithmuswert immerRSA,ECoderML_DSA. -
keySize -
Entspricht dem Autorisierungs-Tag
Tag::KEY_SIZE, für das die Tag-ID 3 verwendet wird. -
blockMode -
Entspricht dem Autorisierungstag
Tag::BLOCK_MODE, für das die Tag-ID 4 verwendet wird. -
digest -
Entspricht dem Autorisierungstag
Tag::DIGEST, für das die Tag-ID 5 verwendet wird. -
padding -
Entspricht dem Autorisierungstag
Tag::PADDING, für das die Tag-ID 6 verwendet wird. -
callerNonce -
Entspricht dem Autorisierungstag
Tag::CALLER_NONCE, das den Tag-ID-Wert 7 verwendet. Dieses Tag ist in Attesten nie vorhanden. -
minMacLength -
Entspricht dem Autorisierungstag
Tag::MIN_MAC_LENGTH, das den Tag-ID-Wert 8 verwendet. Dieses Tag ist in Attesten nie vorhanden. -
ecCurve -
Entspricht dem Autorisierungstag
Tag::EC_CURVE, für das die Tag-ID 10 verwendet wird.Die Parameter, die zum Generieren eines Schlüsselpaars für elliptische Kurven (EC) verwendet werden, das ECDSA für die Signierung und Überprüfung im Android-System-Keystore verwendet.
-
mlDsaVariant -
Nur in der Schlüsselattestierungsversion >= 500 vorhanden.
Entspricht dem Autorisierungstag
Tag::ML_DSA_VARIANTmit der Tag-ID 11. -
rsaPublicExponent -
Entspricht dem Autorisierungstag
Tag::RSA_PUBLIC_EXPONENT, für das die Tag-ID 200 verwendet wird. -
mgfDigest -
Nur in der Schlüsselattestierungsversion >= 100 vorhanden.
Entspricht dem KeyMint-AutorisierungstagTag::RSA_OAEP_MGF_DIGEST, für das der Tag-ID-Wert 203 verwendet wird. -
rollbackResistance -
Nur in der Schlüsselattestierungsversion >= 3 verfügbar.
Entspricht dem Autorisierungstag
Tag::ROLLBACK_RESISTANCE, für das die Tag-ID 303 verwendet wird. -
earlyBootOnly -
Nur in der Schlüsselattestierungsversion >= 4 vorhanden.
Entspricht dem Autorisierungstag
Tag::EARLY_BOOT_ONLY, das die Tag-ID 305 verwendet. -
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 die Tag-ID 401 verwendet wird. -
usageExpireDateTime -
Entspricht dem Autorisierungstag
Tag::USAGE_EXPIRE_DATETIME, das den Tag-ID-Wert 402 verwendet. -
usageCountLimit -
Entspricht dem Autorisierungs-Tag
Tag::USAGE_COUNT_LIMIT, das den Tag-ID-Wert 405 verwendet. -
userSecureId -
Entspricht dem Autorisierungstag
Tag::USER_SECURE_ID, das die Tag-ID 502 verwendet. Dieses Tag ist in Attesten nie vorhanden. -
noAuthRequired -
Entspricht dem
Tag::NO_AUTH_REQUIRED-Autorisierungstag, der den Tag-ID-Wert 503 verwendet. -
userAuthType -
Entspricht dem Autorisierungs-Tag
Tag::USER_AUTH_TYPE, das den Tag-ID-Wert 504 verwendet. -
authTimeout -
Entspricht dem Autorisierungs-Tag
Tag::AUTH_TIMEOUT, das den Tag-ID-Wert 505 verwendet. -
allowWhileOnBody -
Entspricht dem Autorisierungstag
Tag::ALLOW_WHILE_ON_BODY, das den Tag-ID-Wert 506 verwendet.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 zur Erkennung des Tragens am Körper erkennt, ob das Gerät am Körper des Nutzers getragen wird.
-
trustedUserPresenceReq -
Nur in der Schlüsselattestierungsversion >= 3 verfügbar.
Entspricht dem
Tag::TRUSTED_USER_PRESENCE_REQUIRED-Autorisierungstag, 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 bietet 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 verfügbar.
Entspricht dem Autorisierungstag
Tag::TRUSTED_CONFIRMATION_REQUIRED, das die Tag-ID 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
SIGNverwenden. -
unlockedDeviceReq -
Nur in der Schlüsselattestierungsversion >= 3 verfügbar.
Entspricht dem
Tag::UNLOCKED_DEVICE_REQUIRED-Autorisierungstag, für das die Tag-ID 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, das den Tag-ID-Wert 704 verwendet.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 mit dem Keymaster verknüpft ist, angegeben als sechsstellige Ganzzahl. Beispiel: Version 8.1.0 wird als 080100 dargestellt.
Dieser Wert ist nur in Keymaster-Version 1.0 oder höher in der Autorisierungsliste enthalten.
-
osPatchLevel -
Entspricht dem Autorisierungstag
Tag::OS_PATCHLEVEL, für das die Tag-ID 706 verwendet wird.Der Monat und das Jahr, die mit dem in KeyMint (früher Keymaster) verwendeten Sicherheitspatch verknüpft sind, angegeben als sechsstellige Ganzzahl. Beispielsweise wird der Patch für August 2018 als 201808 dargestellt.
Verwenden Sie dieses Feld vorzugsweise anstelle von
vendorPatchLeveloderbootPatchLevel, um zu prüfen, ob ein Gerät kürzlich gepatcht wurde.Dieser Wert ist nur in Keymaster-Version 1.0 oder höher in der Autorisierungsliste enthalten.
-
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, für das die Tag-ID 710 verwendet wird. -
attestationIdDevice -
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_DEVICEmit der Tag-ID 711. -
attestationIdProduct -
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_PRODUCT, das die Tag-ID 712 verwendet. -
attestationIdSerial -
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_SERIAL, für das die Tag-ID 713 verwendet wird. -
attestationIdImei -
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_IMEI, das den Tag-ID-Wert 714 verwendet. -
attestationIdMeid -
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_MEID, das die Tag-ID 715 verwendet. -
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 Versionen der Schlüsselattestierung >= 3 vorhanden.
Entspricht dem Autorisierungstag
Tag::VENDOR_PATCHLEVEL, für das die Tag-ID 718 verwendet wird.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 ist die Ganzzahl, die durch Entfernen der Bindestriche aus dem Sicherheitspatch-Level gebildet wird. Wenn beispielsweise ein Schlüssel auf einem Android-Gerät mit dem Sicherheitsupdate des Anbieters vom 05.08.2018 generiert wurde, wäre dieser Wert 20180805.
-
bootPatchLevel -
Nur in Versionen der Schlüsselattestierung >= 3 vorhanden.
Entspricht dem Autorisierungstag
Tag::BOOT_PATCHLEVEL, für das die Tag-ID 719 verwendet wird.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 ist die Ganzzahl, die durch Entfernen der Bindestriche aus dem Sicherheitspatch-Level gebildet wird. Wenn beispielsweise ein Schlüssel auf einem Android-Gerät mit dem am 05.08.2018 installierten Sicherheitspatch des Kernels generiert wurde, lautet dieser Wert 20180805.
-
deviceUniqueAttestation -
Nur in Schlüsselattestierungsversionen >= 4 vorhanden.
Entspricht dem Autorisierungstag
Tag::DEVICE_UNIQUE_ATTESTATION, das den Tag-ID-Wert 720 verwendet. -
attestationIdSecondImei -
Nur in Schlüsselattestierungsversionen >= 300 verfügbar.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_SECOND_IMEImit dem Tag-ID-Wert 723. -
moduleHash -
Nur in Schlüsselattestierungsversionen >= 400 verfügbar.
Entspricht dem Autorisierungstag
Tag::MODULE_HASHmit dem Tag-ID-Wert 724.
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 Bootmodus mit Verifikation ausgeführt wird. SHA-256 wird empfohlen.
-
deviceLocked -
Gibt an, ob der Bootloader des Geräts gesperrt ist.
truebedeutet, dass auf dem Gerät ein signiertes Image gebootet wurde, das von Bootmodus mit Verifikation erfolgreich überprüft wurde. -
verifiedBootState - Der Status des Bootmodus mit Verifikation des Geräts.
-
verifiedBootHash - Ein Digest aller Daten, die durch Bootmodus mit Verifikation geschützt werden. Bei Geräten, die die Referenzimplementierung des Android-Bootmodus mit Verifikation verwenden, enthält dieses Feld den VBMeta-Digest.
VerifiedBootState-Werte
| Wert | Entsprechender Status des Bootmodus | Bedeutung |
|---|---|---|
Verified |
GREEN |
Eine vollständige Vertrauenskette erstreckt sich von einem hardwaregeschützten Root of Trust bis zum Bootloader und allen Partitionen, die von Bootmodus mit Verifikation verifiziert 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 aufgebaut 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 Geräteüberprüfung ist fehlgeschlagen. In diesem Status 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 in der Attestierung enthalten ist. 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_digestseingefügt. Der Feldname ist irreführend, da die zusammengefassten Daten die Signaturzertifikate der App und nicht die App-Signaturen sind. Das Feld ist nach derSignature-Klasse benannt, 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
Der Erweiterungswert besteht aus Concise Binary Object Representation (CBOR)-Daten, die diesem Concise Data Definition Language (CDDL)-Schema entsprechen:
{
1 : int, ; certificates issued
4 : string, ; validated attested entity (STRONG_BOX/TEE)
? 6 : bool, ; is lost device
}
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 -
Ein String, der den zertifizierten Ursprung des bestätigten Schlüssels angibt, der direkt vom Chiphersteller bestätigt wird. Beispiel:
STRONG_BOXoderTEE.
-
is_lost_device -
Ein boolescher Wert, der angibt, ob das Gerät als verloren gemeldet wurde. Wenn vorhanden und „true“, wurde das Zertifikat für ein Gerät bereitgestellt, das derzeit als verloren markiert ist.
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 wird die Bereitstellung von Schlüsseln per Remotezugriff eingeführt. Mit dieser Funktion erhalten Geräte im Feld ECDSA-P-256-Attestierungszertifikate pro App, die eine kürzere Lebensdauer als werkseitig bereitgestellte Zertifikate haben.
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:
Tist der „temporale Zählerwert“, der berechnet wird, indem der Wert vonTag::CREATION_DATETIMEdurch 2592000000 geteilt wird. Ein Rest wird dabei verworfen.Tändert sich alle 30 Tage (2592000000 = 30 * 24 * 60 * 60 * 1000).Cist der Wert vonTag::APPLICATION_ID.Rist 1, wennTag::RESET_SINCE_ID_ROTATIONim Parameter „attest_params“ für den Aufruf von „attest_key“ vorhanden ist, oder 0, wenn das Tag nicht vorhanden ist.HBKist ein eindeutiges, an die Hardware gebundenes Geheimnis, das der vertrauenswürdigen Ausführungsumgebung bekannt ist und von ihr niemals preisgegeben wird. Das Geheimnis enthält mindestens 128 Bit Entropie und ist für das jeweilige Gerät eindeutig (probabilistische Eindeutigkeit ist angesichts der 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 im Android-Schlüsselattestierungsdatensatz mehrere IMEIs 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, und 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.
ID-Attestierung
Android 8.0 bietet optionale Unterstützung für die Geräte-ID-Attestierung für Geräte mit Keymaster 3. Mit der ID-Attestierung kann das Gerät seine Hardwarekennzeichnungen 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-Remote-Konfiguration 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 verhindert 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 anfordern, 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 dauerhafte 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 vom Hardware-Identifier 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 dem Keymaster-Vertrauenswürdigen Applet in der TEE kann kein anderer Code die aus der Kennung abgeleiteten Daten lesen, die im Speicher abgelegt sind.
- Der Speicher ist manipulationssicher: Wenn der Inhalt des Speichers geändert wurde, behandelt das TEE ihn so, als wären die Kopien des Inhalts gelöscht worden, und lehnt alle Versuche zur ID-Attestierung 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. Durch das Speichern sicherer Hashes der Originalwerte anstelle der Werte selbst ist diese Überprüfung möglich.
Baustelle
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)HMACist die HMAC-Konstruktion mit einem geeigneten sicheren Hash (SHA-256 wird empfohlen).HBKist ein hardwaregebundener Schlüssel, der nicht für andere Zwecke verwendet wird.ID1...IDnsind 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 Überprü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 beliebigen Teils des Tests konstant sein.
Hardware-IDs
Die ID-Attestierung unterstützt die folgenden Hardware-IDs:
- Markenname, wie von
Build.BRANDin Android zurückgegeben - Gerätename, wie von
Build.DEVICEin Android zurückgegeben - Produktname, wie von
Build.PRODUCTin Android zurückgegeben - Der vom Betriebssystem
Build.MANUFACTURERzurückgegebene Name des Herstellers - Der Modellname, wie er von
Build.MODELin Android zurückgegeben wird - Seriennummer
- IMEIs aller Funkgeräte
- 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-Attestierung wird angefordert, indem eine Schlüsselattestierung durchgeführt und die zu attestierenden Geräte-IDs in die Anfrage aufgenommen werden. Die Kennungen sind so gekennzeichnet:
ATTESTATION_ID_BRANDATTESTATION_ID_DEVICEATTESTATION_ID_PRODUCTATTESTATION_ID_MANUFACTURERATTESTATION_ID_MODELATTESTATION_ID_SERIALATTESTATION_ID_IMEIATTESTATION_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 keine ID-Bestätigung unterstützt oder destroyAttestationIds() bereits 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-Attestierung unterstützt und eines oder mehrere der oben genannten Tags in eine Schlüsselattestierungsanfrage aufgenommen wurden, überprü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 Funkgeräte 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-Attestierungsschema sind fett dargestellt und mit Kommentaren versehen.
Java API
Dieser Abschnitt dient nur zu Informationszwecken. 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.