Schlüssel- und Identitätsattestierung

Der Schlüsselspeicher bietet eine sicherere Möglichkeit, kryptografische Schlüssel kontrolliert zu erstellen, zu speichern und zu verwenden. Wenn ein hardwaregestützter Schlüsselspeicher verfügbar und verwendet wird, ist das Schlüsselmaterial besser vor dem Entfernen vom Gerät geschützt. Keymaster erzwingt Einschränkungen, die schwer zu umgehen sind.

Dies gilt jedoch nur, wenn bekannt ist, dass sich die Schlüssel des Schlüsselspeichers in einem hardwaregestützten Speicher befinden. In Keymaster 1 gab es keine Möglichkeit für Apps oder Remote-Server, zuverlässig zu überprüfen, ob dies der Fall war. Der Keystore-Daemon hat die verfügbare Keymaster HAL geladen und alles geglaubt, was die HAL in Bezug auf die Hardwaresicherung von Schlüsseln gesagt hat.

Um dies zu beheben, führte Keymaster in Android 7.0 (Keymaster 2) die Schlüsselattestierung und in Android 8.0 (Keymaster 3) die ID-Attestierung ein.

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 Geräteattestierung kann das Gerät seine Hardware-IDs wie die Seriennummer oder die IMEI nachweisen.

Schlüsselattestierung

Zur Unterstützung der Schlüsselattestierung wurden in Android 7.0 eine Reihe von Tags, Typen und Methoden in die HAL eingeführt.

Tags

  • Tag::ATTESTATION_CHALLENGE
  • Tag::INCLUDE_UNIQUE_ID
  • Tag::RESET_SINCE_ID_ROTATION

Typ

Keymaster 2 und niedriger

typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;

AttestKey-Methode

Keymaster 3

    attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
        generates(ErrorCode error, vec<vec<uint8_t>> certChain);

Keymaster 2 und niedriger

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev ist die Keymaster-Gerätestruktur.
  • keyToAttest ist der Schlüssel-Blob, der von generateKey zurückgegeben wird und für den die Attestierung erstellt wird.
  • attestParams ist eine Liste aller Parameter, die für die Attestierung erforderlich sind. Dazu gehören Tag::ATTESTATION_CHALLENGE und möglicherweise Tag::RESET_SINCE_ID_ROTATION sowie Tag::APPLICATION_ID und Tag::APPLICATION_DATA. Die beiden letzteren sind zum Entschlüsseln des Schlüssel-Blobs erforderlich, 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 bestätigt den Schlüssel von keyToAttest und enthält die Attestierungserweiterung.

Die attestKey-Methode gilt als öffentlicher Schlüsselvorgang für den attestierten Schlüssel, da sie jederzeit aufgerufen werden kann und keine Autorisierungsbeschränkungen erfüllen muss. Wenn für die Verwendung des attestierten Schlüssels beispielsweise eine Nutzerauthentifizierung erforderlich ist, kann eine Attestierung ohne Nutzerauthentifizierung generiert werden.

Bescheinigung

Das Attestierungszertifikat ist ein standardmäßiges X.509-Zertifikat mit einer optionalen Attestierungserweiterung, die eine Beschreibung des attestierten Schlüssels enthält. Das Zertifikat ist mit einem zertifizierten Attestierungsschlüssel signiert. Für den Attestierungsschlüssel kann ein anderer Algorithmus verwendet werden als für den zu attestierenden Schlüssel.

Das Attestationszertifikat enthält die Felder in der folgenden Tabelle und darf keine zusätzlichen Felder enthalten. Für einige Felder wird ein fester Feldwert angegeben. Bei CTS-Tests wird überprüft, ob der Zertifikatsinhalt genau wie definiert ist.

Zertifikats-SEQUENZ

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, berechnet auf ASN.1 DER-codiertem tbsCertificate.

TBSCertificate SEQUENCE

Feldname (siehe RFC 5280) Wert
version INTEGER 2 (bedeutet V3-Zertifikat)
serialNumber INTEGER 1 (fester Wert: bei allen Zertifikaten gleich)
signature AlgorithmIdentifier des Algorithmus, der zum Signieren des Schlüssels verwendet wird: ECDSA für EC-Schlüssel, RSA für RSA-Schlüssel.
issuer Entspricht dem Feld „Subject“ des Schlüssels für die Batchattestierung.
validity SEQUENCE aus zwei Datumsangaben, die die Werte von Tag::ACTIVE_DATETIME und Tag::USAGE_EXPIRE_DATETIME enthalten. Diese Werte werden in Millisekunden seit dem 1. Januar 1970 angegeben. Informationen zur korrekten Datumsdarstellung in Zertifikaten finden Sie unter RFC 5280.
Wenn Tag::ACTIVE_DATETIME nicht vorhanden ist, verwende den Wert von Tag::CREATION_DATETIME. Wenn Tag::USAGE_EXPIRE_DATETIME nicht vorhanden ist, verwenden Sie das Ablaufdatum des Attestierungsschlüsselzertifikats für die Batchverarbeitung.
subject CN = „Android Keystore Key“ (fester Wert: in allen Zertifikaten identisch)
subjectPublicKeyInfo SubjectPublicKeyInfo mit attestiertem öffentlichen Schlüssel
extensions/Key Usage digitalSignature: Wird festgelegt, wenn der Schlüssel den Zweck KeyPurpose::SIGN oder KeyPurpose::VERIFY hat. Alle anderen Bits sind nicht gesetzt.
extensions/CRL Distribution Points Wert TBD
extensions/"attestation" Die OID lautet 1.3.6.1.4.1.11129.2.1.17. Der Inhalt ist unten im Abschnitt Attestierungserweiterung definiert. Wie bei allen X.509-Zertifikaterweiterungen wird der Inhalt als OCTET_STRING dargestellt, der eine DER-Codierung der Attestationssequenz enthält.

Attestierungserweiterung

Die attestation-Erweiterung hat die OID 1.3.6.1.4.1.11129.2.1.17. Es enthält Informationen zum attestierten Schlüsselpaar und zum Status des Geräts zum Zeitpunkt der Schlüsselgenerierung.

Die in der AIDL-Schnittstellenspezifikation definierten Keymaster-/KeyMint-Tag-Typen werden so in ASN.1-Typen übersetzt:

Keymaster/KeyMint-Typ ASN.1-Typ Hinweise
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER Millisekunden seit dem 1. Januar 1970, 00:00:00 UTC.
BOOL NULL Wenn das Tag vorhanden ist, wird „wahr“ zurückgegeben, andernfalls „falsch“.
BIGNUM Da kein Tag diesen Typ hat, ist keine Zuordnung definiert.
BYTES OCTET_STRING

Schema

Der Inhalt der Attestierungserweiterung wird durch das folgende ASN.1-Schema beschrieben:

Version 300

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Version 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Version 100

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Version 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Version 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Version 2

KeyDescription ::= SEQUENCE {
    attestationVersion  2,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Version 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

KeyDescription-Felder

attestationVersion
Die ASN.1-Schemaversion.
WertKeymaster-/KeyMint-Version
1Keymaster-Version 2.0
2Keymaster-Version 3.0
3Keymaster-Version 4.0
4Keymaster-Version 4.1
100KeyMint Version 1.0
200KeyMint Version 2.0
300KeyMint-Version 3.0
attestationSecurityLevel

Das Sicherheitsniveau des Speicherorts, an dem der attestierte Schlüssel gespeichert ist.

keymasterVersion/keyMintVersion
Die Version der Keymaster/KeyMint-Hardwareabstraktionsschicht (HAL).
WertKeymaster-/KeyMint-Version
2Keymaster-Version 2.0
3Keymaster-Version 3.0
4Keymaster-Version 4.0
41Keymaster-Version 4.1
100KeyMint Version 1.0
200KeyMint Version 2.0
300KeyMint-Version 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Das Sicherheitsniveau der Keymaster/KeyMint-Implementierung.
attestationChallenge
Die Herausforderung, die bei der Schlüsselgenerierung angegeben wurde.
uniqueId
Eine datenschutzfreundliche Geräte-ID, die System-Apps zum Zeitpunkt der Schlüsselgenerierung anfordern können. Wenn 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 erfasst oder generiert und in der Systempartition des Geräts gespeichert. Es kann als vertrauenswürdig eingestuft werden, solange auf dem Gerät ein Betriebssystem ausgeführt wird, das dem Android-Plattformsicherheitsmodell entspricht. Das bedeutet, dass der Bootloader des Geräts gesperrt und die verifiedBootState Verified ist.
hardwareEnforced
Die Autorisierungsliste von Keymaster/KeyMint, die von der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) oder dem StrongBox des Geräts erzwungen wird. Diese Informationen werden durch Code in der sicheren Hardware erfasst oder generiert und nicht von der Plattform gesteuert. Informationen können beispielsweise vom Bootloader oder über einen sicheren Kommunikationskanal stammen, der kein Vertrauen in die Plattform erfordert.

SecurityLevel-Werte

Der Wert SecurityLevel gibt an, inwiefern ein Element im Zusammenhang mit dem Schlüsselspeicher (z. B. Schlüsselpaar und Attestierung) gegen Angriffe resistent ist.

Wert Bedeutung
Software Sicher, solange das Android-System des Geräts dem Android-Plattformsicherheitsmodell entspricht, d. h. der Bootloader des Geräts gesperrt ist und die verifiedBootState Verified ist.
TrustedEnvironment Sicher, solange die vertrauenswürdige Ausführungsumgebung (Trusted Execution Environment, TEE) nicht manipuliert wird. Die Anforderungen an die Isolation von TEEs sind in den Abschnitten 9.11 [C-1-1] bis [C-1-4] des Android Compatibility Definition Document definiert. TEEs sind sehr widerstandsfähig gegen Remote-Manipulation und mäßig widerstandsfähig gegen Manipulation durch direkte Hardwareangriffe.
StrongBox Sicher, solange StrongBox nicht manipuliert wird. StrongBox wird in einem sicheren Element implementiert, ähnlich wie ein Hardwaresicherheitsmodul. Die Implementierungsanforderungen für StrongBox sind im Abschnitt 9.11.2 des Android Compatibility Definition Document definiert. StrongBox ist sehr widerstandsfähig gegen Remote-Manipulation und Manipulation durch direkte Hardwareangriffe (z. B. physische Manipulation und Side-Channel-Angriffe).

Felder der Autorisierungsliste

Jedes Feld entspricht einem Keymaster-/KeyMint-Autorisierungs-Tag aus der AIDL-Schnittstellenspezifikation. Die Spezifikation ist die maßgebliche Quelle für Autorisierungs-Tags: ihre Bedeutung, das Format ihres Inhalts, ob sie im softwareEnforced- oder hardwareEnforced-Feld im KeyDescription-Objekt erscheinen sollen, ob sie sich gegenseitig ausschließen mit anderen Tags usw. Alle AuthorizationList-Felder sind optional.

Jedes Feld hat ein kontextspezifisches EXPLICIT-Tag, das der Keymaster-/KeyMint-Tag-Nummer entspricht. Dadurch wird eine kompaktere Darstellung der Daten im EXPLICIT ermöglicht.AuthorizationList Der ASN.1-Parser muss daher den erwarteten Datentyp für jedes kontextspezifische Tag kennen. Beispiel: Tag::USER_AUTH_TYPE ist als ENUM | 504 definiert. Im Schema für die Attestierungserweiterung ist das Feld purpose in AuthorizationList als userAuthType [504] EXPLICIT INTEGER OPTIONAL angegeben. Die ASN.1-Codierung enthält daher das kontextspezifische Tag 504 anstelle des Klassentags UNIVERSAL für den ASN.1-Typ INTEGER, also 10.

purpose
Entspricht dem Autorisierungs-Tag Tag::PURPOSE, für das die Tag-ID 1 verwendet wird.
algorithm

Entspricht dem Autorisierungs-Tag Tag::ALGORITHM, für das die Tag-ID 2 verwendet wird.

In einem Attestierungsobjekt vom Typ AuthorizationList ist der Algorithmuswert immer RSA oder EC.

keySize
Entspricht dem Autorisierungs-Tag Tag::KEY_SIZE, für das die Tag-ID 3 verwendet wird.
digest
Entspricht dem Autorisierungs-Tag Tag::DIGEST, für das die Tag-ID 5 verwendet wird.
padding
Entspricht dem Autorisierungs-Tag Tag::PADDING, für das die Tag-ID 6 verwendet wird.
ecCurve

Entspricht dem Autorisierungs-Tag Tag::EC_CURVE, für das die Tag-ID 10 verwendet wird.

Die Parameter, die zum Generieren eines elliptischen-Kurven-Schlüsselpaars (EC) verwendet werden, das ECDSA für die Signatur und Überprüfung im Android-System-Schlüsselspeicher verwendet.

rsaPublicExponent
Entspricht dem Autorisierungs-Tag Tag::RSA_PUBLIC_EXPONENT, für das die Tag-ID 200 verwendet wird.
mgfDigest

Nur bei einer Schlüsselattestierungsversion von mindestens 100 vorhanden.

Entspricht dem Tag::RSA_OAEP_MGF_DIGEST-Autorisierungs-Tag von KeyMint, für das die Tag-ID 203 verwendet wird.
rollbackResistance

Nur in der Schlüsselattestierungsversion 3 oder höher vorhanden.

Entspricht dem Autorisierungs-Tag Tag::ROLLBACK_RESISTANCE, für das die Tag-ID 303 verwendet wird.

earlyBootOnly

Nur in der Schlüsselattestierungsversion 4 oder höher vorhanden.

Entspricht dem Autorisierungs-Tag::EARLY_BOOT_ONLY-Tag, für das die Tag-ID 305 verwendet wird.

activeDateTime
Entspricht dem Autorisierungs-Tag Tag::ACTIVE_DATETIME, für das die Tag-ID 400 verwendet wird.
originationExpireDateTime
Entspricht dem Tag::ORIGINATION_EXPIRE_DATETIME-Keymaster-Autorisierungs-Tag, für das die Tag-ID 401 verwendet wird.
usageExpireDateTime
Entspricht dem Autorisierungs-Tag Tag::USAGE_EXPIRE_DATETIME, für das die Tag-ID 402 verwendet wird.
usageCountLimit
Entspricht dem Autorisierungs-Tag Tag::USAGE_COUNT_LIMIT, für das die Tag-ID 405 verwendet wird.
noAuthRequired

Entspricht dem Autorisierungs-Tag Tag::NO_AUTH_REQUIRED, für das die Tag-ID 503 verwendet wird.

userAuthType
Entspricht dem Autorisierungs-Tag Tag::USER_AUTH_TYPE mit der Tag-ID 504.
authTimeout
Entspricht dem Autorisierungs-Tag Tag::AUTH_TIMEOUT, für das die Tag-ID 505 verwendet wird.
allowWhileOnBody

Entspricht dem Autorisierungs-Tag Tag::ALLOW_WHILE_ON_BODY, für das die Tag-ID 506 verwendet wird.

Ermöglicht die Verwendung des Schlüssels nach Ablauf des Zeitlimits für die Authentifizierung, wenn der Nutzer das Gerät noch am Körper trägt. Ein sicherer Körpersensor bestimmt, ob das Gerät am Körper des Nutzers getragen wird.

trustedUserPresenceRequired

Nur in der Schlüsselattestierungsversion 3 oder höher vorhanden.

Entspricht dem Autorisierungs-Tag::TRUSTED_USER_PRESENCE_REQUIRED-Tag mit der Tag-ID 507.

Gibt an, dass dieser Schlüssel nur verwendet werden kann, wenn der Nutzer einen Nachweis seiner physischen Präsenz erbracht hat. Beispiele:

  • Bei einem StrongBox-Schlüssel: Eine Hardwaretaste, die direkt mit einer Kontaktfläche auf dem StrongBox-Gerät verbunden ist.
  • Bei einem TEE-Schlüssel dient die Fingerabdruckauthentifizierung als Nachweis der Anwesenheit, solange die TEE die ausschließliche Kontrolle über den Scanner hat und den Abgleich des Fingerabdrucks durchführt.
trustedConfirmationRequired

Nur in der Schlüsselattestierungsversion 3 oder höher vorhanden.

Entspricht dem Autorisierungs-Tag::TRUSTED_CONFIRMATION_REQUIRED-Tag mit der Tag-ID 508.

Gibt an, dass der Schlüssel nur verwendet werden kann, wenn der Nutzer die zu signierenden Daten mit einem Genehmigungstoken bestätigt. Weitere Informationen zum Abrufen der Nutzerbestätigung finden Sie unter Android-geschützte Bestätigung.

Hinweis:Dieses Tag gilt nur für Schlüssel, für die der Zweck SIGN verwendet wird.

unlockedDeviceRequired

Nur in der Schlüsselattestierungsversion 3 oder höher vorhanden.

Entspricht dem Autorisierungs-Tag::UNLOCKED_DEVICE_REQUIRED-Tag mit der Tag-ID 509.

allApplications

Entspricht dem Autorisierungs-Tag Tag::ALL_APPLICATIONS, für das die Tag-ID 600 verwendet wird.

Gibt an, ob alle Apps auf einem Gerät auf das Schlüsselpaar zugreifen können.

applicationId
Entspricht dem Autorisierungs-Tag Tag::APPLICATION_ID, für das die Tag-ID 601 verwendet wird.
creationDateTime
Entspricht dem Autorisierungs-Tag Tag::CREATION_DATETIME mit der Tag-ID 701.
origin

Entspricht dem Autorisierungs-Tag Tag::ORIGIN, für das die Tag-ID 702 verwendet wird.

rollbackResistant

Nur in den Schlüsselattestierungsversionen 1 und 2 vorhanden.

Entspricht dem Autorisierungs-Tag Tag::ROLLBACK_RESISTANT, für das die Tag-ID 703 verwendet wird.

rootOfTrust

Entspricht dem Autorisierungs-Tag Tag::ROOT_OF_TRUST, für das die Tag-ID 704 verwendet wird.

Weitere Informationen finden Sie im Abschnitt zur Datenstruktur RootOfTrust.

osVersion

Entspricht dem Autorisierungs-Tag Tag::OS_VERSION, für das die Tag-ID 705 verwendet wird.

Die Version des Android-Betriebssystems, die dem Keymaster zugeordnet ist, angegeben als sechsstellige Ganzzahl. Beispiel: Version 8.1.0 wird als 080100 dargestellt.

Nur Keymaster-Version 1.0 oder höher enthält diesen Wert in der Autorisierungsliste.

osPatchLevel

Entspricht dem Autorisierungs-Tag Tag::PATCHLEVEL, für das die Tag-ID 706 verwendet wird.

Der Monat und das Jahr, die mit dem Sicherheitspatch verknüpft sind, der in Keymaster verwendet wird, als sechsstellige Ganzzahl angegeben. Der Patch für August 2018 wird beispielsweise als 201808 dargestellt.

Nur Keymaster-Version 1.0 oder höher enthält diesen Wert in der Autorisierungsliste.

attestationApplicationId

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Keymaster-Autorisierungs-Tag Tag::ATTESTATION_APPLICATION_ID mit der Tag-ID 709.

Weitere Informationen finden Sie im Abschnitt zur Datenstruktur AttestationApplicationId.

attestationIdBrand

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Keymaster-Tag Tag::ATTESTATION_ID_BRAND, für das die Tag-ID 710 verwendet wird.

attestationIdDevice

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Keymaster-Tag Tag::ATTESTATION_ID_DEVICE mit der Tag-ID 711.

attestationIdProduct

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Keymaster-Tag Tag::ATTESTATION_ID_PRODUCT mit der Tag-ID 712.

attestationIdSerial

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Keymaster-Tag Tag::ATTESTATION_ID_SERIAL mit der Tag-ID 713.

attestationIdImei

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungs-Tag Tag::ATTESTATION_ID_IMEI mit der Tag-ID 714.

attestationIdMeid

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungs-Tag Tag::ATTESTATION_ID_MEID, für das die Tag-ID 715 verwendet wird.

attestationIdManufacturer

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungs-Tag Tag::ATTESTATION_ID_MANUFACTURER mit der Tag-ID 716.

attestationIdModel

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungs-Tag Tag::ATTESTATION_ID_MODEL, für das die Tag-ID 717 verwendet wird.

vendorPatchLevel

Nur in Schlüsselattestierungsversionen ≥ 3 vorhanden.

Entspricht dem Autorisierungs-Tag::VENDOR_PATCHLEVEL-Tag mit der Tag-ID 718.

Gibt die Sicherheitspatch-Ebene des Anbieter-Images an, die auf dem Gerät installiert sein muss, damit dieser Schlüssel verwendet werden kann. Der Wert wird im Format JJJJMMTT angezeigt und entspricht dem Datum des Sicherheitspatches des Anbieters. Wenn beispielsweise ein Schlüssel auf einem Android-Gerät generiert wurde, auf dem der Sicherheitspatch des Anbieters vom 1. August 2018 installiert ist, würde dieser Wert 20180801 lauten.

bootPatchLevel

Nur in Schlüsselattestierungsversionen ≥ 3 vorhanden.

Entspricht dem Autorisierungs-Tag::BOOT_PATCHLEVEL-Tag mit der Tag-ID 719.

Gibt die Sicherheitspatch-Ebene des Kernel-Images an, die auf dem Gerät installiert sein muss, damit dieser Schlüssel verwendet werden kann. Der Wert wird im Format JJJJMMTT angezeigt und entspricht dem Datum des Systemsicherheits-Patches. Wenn beispielsweise ein Schlüssel auf einem Android-Gerät generiert wurde, auf dem der Sicherheitspatch vom 5. August 2018 installiert ist, lautet dieser Wert 20180805.

deviceUniqueAttestation

Nur in Schlüsselattestierungsversionen >= 4 vorhanden.

Entspricht dem Autorisierungs-Tag::DEVICE_UNIQUE_ATTESTATION-Tag mit der Tag-ID 720.

attestationIdSecondImei

Nur in Schlüsselattestierungsversionen >= 300 vorhanden.

Entspricht dem Autorisierungs-Tag::ATTESTATION_ID_SECOND_IMEI-Tag mit der Tag-ID 723.

RootOfTrust-Felder

verifiedBootKey
Ein sicherer Hashwert des öffentlichen Schlüssels, der zum Verifizieren der Integrität und Authentizität aller Codes verwendet wird, die beim Starten des Geräts im Rahmen des Verified Boot ausgeführt werden. SHA-256 wird empfohlen.
deviceLocked
Ob der Bootloader des Geräts gesperrt ist. true bedeutet, dass das Gerät ein signiertes Image gestartet hat, das durch den verifizierten Bootmodus erfolgreich bestätigt wurde.
verifiedBootState
Der Status des verifizierten Bootmodus des Geräts.
verifiedBootHash
Ein Hashwert aller Daten, die durch Verified Boot geschützt sind. Bei Geräten, auf denen die Referenzimplementierung von Android Verified Boot verwendet wird, enthält dieses Feld den VBMeta-Digest.

Werte für VerifiedBootState

Wert Entsprechender Bootstatus Bedeutung
Verified GREEN Eine vollständige Vertrauenskette erstreckt sich von einem hardwaregeschützten Root of Trust bis zum Bootloader und allen Partitionen, die durch Verified Boot geprüft werden. In diesem Zustand 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 Entspricht Verified, mit der Ausnahme, dass die Überprüfung mit einem vom Nutzer konfigurierten Root of Trust statt mit dem vom Hersteller im Werk eingebetteten Root of Trust durchgeführt wurde. In diesem Zustand enthält das Feld verifiedBootKey den Hash des vom Nutzer konfigurierten öffentlichen Schlüssels.
Unverified ORANGE Der Bootloader des Geräts ist entsperrt, sodass keine Vertrauenskette aufgebaut werden kann. Das Gerät kann frei modifiziert werden, sodass die Integrität des Geräts vom Nutzer außerhalb des Bandes überprüft werden muss. In diesem Zustand enthält das Feld verifiedBootKey 32 Byte mit Nullen.
Failed RED Die Überprüfung des Geräts ist fehlgeschlagen. In diesem Zustand können keine Garantien für den Inhalt der anderen RootOfTrust-Felder übernommen werden.

AttestationApplicationId

Dieses Feld enthält die Einschätzung der Android-Plattform, welche Apps das geheime Schlüsselmaterial unter Attestierung verwenden dürfen. Sie kann mehrere Pakete enthalten, wenn und nur wenn mehrere Pakete dieselbe UID haben. Das Feld AttestationApplicationId in AuthorizationList hat den Typ OCTET_STRING und ist gemäß dem folgenden ASN.1-Schema formatiert:

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
Eine Reihe von AttestationPackageInfo-Objekten, von denen jedes den Namen und die Versionsnummer eines Pakets angibt.
signature_digests

Eine Reihe von SHA-256-Digests der Signaturzertifikate der App. Eine App kann mehrere Zertifikatsketten für Signaturschlüssel haben. Für jedes wird das untergeordnete Zertifikat gehasht und in das Feld signature_digests eingefügt. Der Feldname ist irreführend, da es sich bei den gehashten Daten um die Signaturzertifikate der App handelt, nicht um die App-Signaturen. Der Name leitet sich von der Signature-Klasse ab, die durch einen Aufruf von getPackageInfo() zurückgegeben wird. Das folgende Code-Snippet zeigt ein Beispiel:

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
    

Eindeutige ID

Die eindeutige ID ist ein 128-Bit-Wert, der das Gerät identifiziert, aber nur für einen begrenzten Zeitraum. Der Wert wird anhand der folgenden Formel berechnet:

HMAC_SHA256(T || C || R, HBK)

Dabei gilt:

  • T ist der „Zeitlicher-Zähler-Wert“, der berechnet wird, indem der Wert von Tag::CREATION_DATETIME durch 2592000000 geteilt wird und der Rest verworfen wird. T ändert sich alle 30 Tage (2.592.000.000 = 30 * 24 * 60 * 60 * 1.000).
  • C ist der Wert von Tag::APPLICATION_ID.
  • R ist „1“, wenn Tag::RESET_SINCE_ID_ROTATION im Parameter „attest_params“ des Aufrufs „attest_key“ vorhanden ist, oder „0“, wenn das Tag nicht vorhanden ist.
  • HBK ist ein eindeutiges hardwaregebundenes Geheimnis, das der vertrauenswürdigen Ausführungsumgebung bekannt ist und von ihr nie offengelegt wird. Das Geheimnis enthält mindestens 128 Bit Entropie und ist für jedes Gerät eindeutig (eine probabilistische Eindeutigkeit ist aufgrund der 128 Bit Entropie akzeptabel). HBK sollte über HMAC oder AES_CMAC aus verschmolzenem Schlüsselmaterial abgeleitet werden.

Kürzen Sie die HMAC_SHA256-Ausgabe auf 128 Bit.

Attestierungsschlüssel und ‑zertifikate

Zwei Schlüssel, ein RSA- und ein ECDSA-Schlüssel, und die entsprechenden Zertifikatsketten werden sicher auf dem Gerät bereitgestellt.

Mit Android 12 wurde die Bereitstellung per Remote-Schlüssel eingeführt. Für Android 13 müssen Geräte diese Funktion implementieren. Die Remote-Schlüsselbereitstellung stellt Geräten vor Ort ECDSA-P256-Attestierungszertifikate pro App zur Verfügung. Diese Zertifikate haben eine kürzere Gültigkeitsdauer als die von der Fabrik bereitgestellten Zertifikate.

Mehrere IMEIs

Android 14 unterstützt mehrere IMEIs im Android Key Attestation-Eintrag. OEMs können diese Funktion implementieren, indem sie ein KeyMint-Tag für eine zweite IMEI hinzufügen. Geräte mit mehreren Mobilfunkschnittstellen werden immer häufiger. OEMs können jetzt Geräte mit zwei IMEIs unterstützen.

OEMs müssen eine sekundäre IMEI haben, sofern diese auf ihren Geräten vorhanden ist, die für die Keymint-Implementierungen bereitgestellt werden muss, damit diese Implementierungen sie auf dieselbe Weise bestätigen können wie die erste IMEI.

Erweiterung der Informationen zur Nutzerverwaltung

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 über das Gerät bekannt sind.

Schema

Die Erweiterung folgt dem folgenden CDDL-Schema:

  {
        1 : int,   ; certificates issued
  }

Die Karte ist nicht versioniert und es können neue optionale Felder hinzugefügt werden.

certs_issued

Eine ungefähre Anzahl der Zertifikate, die für das Gerät in den letzten 30 Tagen ausgestellt wurden. Dieser Wert kann als Signal für potenziellen Missbrauch verwendet werden, wenn er um mehrere Größenordnungen über dem Durchschnitt liegt.

Ausweisattestierung

Android 8.0 bietet optionale Unterstützung für die ID-Attestierung auf Geräten mit Keymaster 3. Mit der Geräteattestierung kann das Gerät seine Hardware-IDs wie die Seriennummer oder die IMEI nachweisen. Obwohl dies eine optionale Funktion ist, wird dringend empfohlen, dass alle Keymaster 3-Implementierungen diese Funktion unterstützen. Wenn die Identität des Geräts nachgewiesen werden kann, können Anwendungsfälle wie die echte Zero-Touch-Remote-Konfiguration sicherer sein, da die Remote-Seite sicher sein kann, dass sie mit dem richtigen Gerät kommuniziert und nicht mit einem Gerät, das seine Identität vortäuscht.

Bei der Identitätsattestierung werden Kopien der Hardware-IDs des Geräts erstellt, auf die nur die Trusted Execution Environment (TEE) zugreifen kann, bevor das Gerät das Werk verlässt. Ein Nutzer kann den Bootloader des Geräts entsperren und die Systemsoftware sowie die von den Android-Frameworks gemeldeten IDs ändern. Die Kopien der vom TEE gespeicherten Kennungen können auf diese Weise nicht manipuliert werden. So wird sichergestellt, dass die Geräte-ID-Attestierung nur die ursprünglichen Hardware-IDs des Geräts bestätigt und Spoofing-Versuche vereitelt.

Die Haupt-API-Oberfläche für die Identitätsattestierung basiert auf dem vorhandenen Schlüsselattestierungsmechanismus, der mit Keymaster 2 eingeführt wurde. Wenn ein Anrufer ein Attestierungszertifikat für einen Schlüssel anfordert, der vom Keymaster aufbewahrt wird, kann er angeben, dass die Hardware-IDs des Geräts in die Metadaten des Attestierungszertifikats aufgenommen werden sollen. Wenn der Schlüssel im TEE gespeichert ist, wird das Zertifikat bis zu einer bekannten Vertrauensbasis zurückverfolgt. Der Empfänger eines solchen Zertifikats kann überprüfen, ob das Zertifikat und sein Inhalt, einschließlich der Hardware-IDs, von der TEE erstellt wurden. Wenn Hardware-IDs in das Attestierungszertifikat aufgenommen werden sollen, attestiert die TEE nur die im Speicher gespeicherten IDs, die auf dem Produktionsboden eingegeben wurden.

Speichereigenschaften

Der Speicher, in dem sich die Geräte-IDs befinden, muss folgende Eigenschaften haben:

  • Die aus den ursprünglichen IDs des Geräts abgeleiteten Werte werden in den Speicher kopiert, bevor das Gerät das Werk verlässt.
  • Mit der destroyAttestationIds()-Methode kann diese Kopie der anhand der Kennung abgeleiteten Daten dauerhaft gelöscht werden. „Endgültige Vernichtung“ bedeutet, dass die Daten vollständig entfernt werden, sodass sie weder durch das Zurücksetzen auf die Werkseinstellungen noch durch andere Vorgänge auf dem Gerät wiederhergestellt werden können. Dies ist besonders wichtig für Geräte, bei denen ein Nutzer den Bootloader entsperrt und die Systemsoftware geändert sowie die von Android-Frameworks zurückgegebenen IDs geändert hat.
  • RMA-Einrichtungen sollten in der Lage sein, neue Kopien der Daten zu generieren, die von der Hardware-ID abgeleitet wurden. So kann für ein Gerät, das die RMA durchläuft, noch einmal eine Identitätsattestierung durchgeführt werden. Der von RMA-Einrichtungen verwendete Mechanismus muss geschützt sein, damit Nutzer ihn nicht selbst aufrufen können, da sie sonst Attestierungen für gefälschte IDs erhalten könnten.
  • Nur die vertrauenswürdige Keymaster-App im TEE kann die im Speicher gespeicherten, von der Kennung abgeleiteten Daten lesen.
  • Der Speicher ist manipulationssicher: Wenn der Inhalt des Speichers geändert wurde, behandelt der TEE ihn so, als wären die Kopien des Inhalts zerstört worden, und lehnt alle Versuche zur Attestierung der Identität ab. Dies wird durch Signatur oder MAC-Technologie wie unten beschrieben implementiert.
  • Der Speicher enthält nicht die ursprünglichen IDs. Da die Bestätigung der Identität eine Herausforderung darstellt, gibt der Anrufer immer die zu bestätigenden Ausweise an. Die TEE muss nur prüfen, ob diese mit den ursprünglichen Werten übereinstimmen. Diese Überprüfung ist möglich, wenn sichere Hash-Werte der ursprünglichen Werte anstatt der Werte selbst gespeichert werden.

Baugewerbe

Wenn Sie eine Implementierung mit den oben aufgeführten Eigenschaften erstellen möchten, speichern Sie die von der ID abgeleiteten Werte in der folgenden Struktur S. Speichern Sie keine anderen Kopien der ID-Werte, mit Ausnahme der normalen Speicherorte im System, die ein Geräteinhaber durch Rooting ändern kann:

S = D || HMAC(HBK, D)

Dabei gilt:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC ist die HMAC-Konstruktion mit einer geeigneten sicheren Hash-Technologie (SHA-256 wird empfohlen)
  • HBK ist ein hardwaregebundener Schlüssel, der nicht für andere Zwecke verwendet wird.
  • ID1...IDn sind die ursprünglichen ID-Werte. Die Zuordnung eines bestimmten Werts zu einem bestimmten Index ist implementierungsabhängig, da verschiedene Geräte unterschiedliche Anzahlen von IDs haben.
  • || steht für die Konkatenierung

Da die HMAC-Ausgaben eine feste Größe haben, sind keine Header oder andere Strukturen erforderlich, um einzelne ID-Hashes oder den HMAC von D zu finden. Neben der Prüfung der angegebenen Werte zur 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 keine einzelnen IDs geändert oder beschädigt wurden. Außerdem müssen Implementierungen für alle einzelnen ID-Elemente und die Validierung von S Vergleiche in konstanter Zeit verwenden. Die Vergleichszeit muss unabhängig von der Anzahl der angegebenen IDs und der korrekten Übereinstimmung eines Teils des Tests konstant sein.

Hardware-IDs

Die ID-Attestierung unterstützt die folgenden Hardware-IDs:

  1. Markenname, wie von Build.BRAND unter Android zurückgegeben
  2. Gerätename, wie von Build.DEVICE unter Android zurückgegeben
  3. Produktname, wie von Build.PRODUCT unter Android zurückgegeben
  4. Herstellername, wie von Build.MANUFACTURER unter Android zurückgegeben
  5. Modellname, wie von Build.MODEL unter Android zurückgegeben
  6. Seriennummer
  7. IMEIs aller Funkschnittstellen
  8. MEIDs aller Funkschnittstellen

Zur Unterstützung der Attestierung der Geräte-ID bestätigt ein Gerät diese IDs. Alle Geräte mit Android haben die ersten sechs und sie sind für die Funktion erforderlich. Wenn das Gerät integrierte Mobilfunkschnittstellen hat, muss es auch die Attestierung für die IMEIs und/oder MEIDs der Funkschnittstellen unterstützen.

Die Geräteidentitätsattestierung wird angefordert, indem eine Schlüsselattestierung durchgeführt und die zu attestierenden Geräte-IDs in die Anfrage aufgenommen werden. Die Kennungen sind mit folgenden Tags versehen:

  • ATTESTATION_ID_BRAND
  • ATTESTATION_ID_DEVICE
  • ATTESTATION_ID_PRODUCT
  • ATTESTATION_ID_MANUFACTURER
  • ATTESTATION_ID_MODEL
  • ATTESTATION_ID_SERIAL
  • ATTESTATION_ID_IMEI
  • ATTESTATION_ID_MEID

Die zu attestierende Kennung ist ein UTF-8-codierter Byte-String. Dieses Format gilt auch für numerische IDs. Jede zu attestierende Kennung wird als UTF-8-codierter String angegeben.

Wenn das Gerät die Attestierung von IDs nicht unterstützt (oder destroyAttestationIds() zuvor aufgerufen wurde und das Gerät seine IDs nicht mehr attestieren kann), schlägt jede Schlüsselattestierungsanfrage fehl, die eines oder mehrere dieser Tags enthält. In diesem Fall wird ErrorCode::CANNOT_ATTEST_IDS zurückgegeben.

Wenn das Gerät die Identitätsattestierung unterstützt und eines oder mehrere der oben genannten Tags in eine Schlüsselattestierungsanfrage aufgenommen wurden, prüft die TEE, ob die mit den einzelnen Tags bereitgestellte Kennung mit der Kopie der Hardware-IDs übereinstimmt. Wenn eine oder mehrere Kennungen nicht übereinstimmen, schlägt die gesamte Attestierung mit ErrorCode::CANNOT_ATTEST_IDS fehl. Es ist zulässig, dasselbe Tag mehrmals anzugeben. Das kann beispielsweise beim Attestieren von IMEIs nützlich sein: Ein Gerät kann mehrere Funkschnittstellen mit mehreren IMEIs haben. Eine Attestierungsanfrage ist gültig, wenn der mit jeder ATTESTATION_ID_IMEI angegebene Wert mit einem der Funkschnittstellen des Geräts übereinstimmt. Dasselbe gilt für alle anderen Tags.

Wenn die Attestierung erfolgreich war, werden die attestierten IDs der Attestierungserweiterung (OID 1.3.6.1.4.1.11129.2.1.17) des ausgestellten Attestierungszertifikats mithilfe des oben genannten Schemas hinzugefügt. Änderungen gegenüber dem Keymaster 2-Attestationsschema sind fett hervorgehoben und mit Kommentaren versehen.

Java API

Dieser Abschnitt dient nur zu Informationszwecken. Keymaster-Implementierer implementieren und verwenden die Java API nicht. Damit sollen Implementierer besser nachvollziehen können, wie die Funktion von Apps verwendet wird. Systemkomponenten verwenden ihn möglicherweise anders. Daher ist es wichtig, dass dieser Abschnitt nicht als normativ behandelt wird.