Schlüssel- und Identitätsattestierung

Keystore bietet einen sichereren Ort zum Erstellen, Speichern und Verwenden kryptografischer Schlüssel auf kontrollierte Weise. Wenn hardwaregestützte Schlüsselspeicher verfügbar sind und verwendet werden, ist das Schlüsselmaterial besser vor dem Extrahieren vom Gerät geschützt. Außerdem erzwingt Keymaster Einschränkungen, die nur schwer zu umgehen sind.

Dies gilt jedoch nur, wenn die Keystore-Schlüssel bekanntermaßen in einem hardwarebasierten Speicher gespeichert sind. In Keymaster 1 gab es keine Möglichkeit für Apps oder Remote-Server, zuverlässig zu überprüfen, ob dies der Fall war. Der Keystore-Daemon hat den verfügbaren Keymaster-HAL geladen und alles geglaubt, was der HAL in Bezug auf die Hardware-Sicherung von Schlüsseln gesagt hat.

Um dieses Problem zu beheben, wurde in Android 7.0 (Keymaster 2) die Schlüsselbestätigung und in Android 8.0 (Keymaster 3) die ID-Bestätigung eingeführt.

Die Schlüsselattestierung soll eine Möglichkeit bieten, genau zu bestimmen, ob ein asymmetrisches Schlüsselpaar hardwaregestützt ist, welche Eigenschaften der Schlüssel hat und welche Einschränkungen für seine Verwendung gelten.

Mit der ID-Bestätigung kann das Gerät seine Hardwarekennzeichnungen wie Seriennummer oder IMEI nachweisen.

Schlüsselattestierung

Zur Unterstützung der Schlüsselbestätigung wurden in Android 7.0 eine Reihe von Tags, Typen und Methoden für die HAL eingeführt.

Tags

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

Typ

Keymaster 2 und älter

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

AttestKey-Methode

Keymaster 3

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

Keymaster 2 und älter

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev ist die Keymaster-Gerätestruktur.
  • keyToAttest ist der vom generateKey zurückgegebene Schlüssel-Blob, für den die Attestierung erstellt wird.
  • attestParams ist eine Liste aller für die Attestierung erforderlichen Parameter. Dazu gehören Tag::ATTESTATION_CHALLENGE und möglicherweise Tag::RESET_SINCE_ID_ROTATION sowie Tag::APPLICATION_ID und Tag::APPLICATION_DATA. Die beiden letztgenannten sind erforderlich, um den Schlüssel-Blob zu entschlüsseln, wenn sie bei der Schlüsselgenerierung angegeben wurden.
  • certChain ist der Ausgabeparameter, der ein Array von Zertifikaten zurückgibt. Eintrag 0 ist das Attestierungszertifikat. Es zertifiziert den Schlüssel aus keyToAttest und enthält die Attestierungserweiterung.

Die attestKey-Methode gilt als Public-Key-Vorgang für den bestätigten Schlüssel, da sie jederzeit aufgerufen werden kann und keine Autorisierungsbeschränkungen erfüllt werden müssen. Wenn für die Verwendung des bestätigten Schlüssels beispielsweise eine Nutzerauthentifizierung erforderlich ist, kann eine Bestätigung ohne Nutzerauthentifizierung generiert werden.

Attestierungszertifikat

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

Das Attestierungszertifikat enthält die Felder in der Tabelle unten und darf keine zusätzlichen Felder enthalten. Für einige Felder ist ein fester Feldwert angegeben. CTS-Tests prüfen, ob der Zertifikatsinhalt genau wie definiert ist.

Zertifikats-SEQUENCE

Feldname (siehe RFC 5280) Wert
tbsCertificate TBSCertificate SEQUENCE
signatureAlgorithm AlgorithmIdentifier des Algorithmus, der zum Signieren des Schlüssels verwendet wird:
ECDSA für EC-Schlüssel, RSA für RSA-Schlüssel.
signatureValue BIT STRING, Signatur, die für das ASN.1 DER-codierte tbsCertificate berechnet wurde.

TBSCertificate SEQUENCE

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

Attestierungserweiterung

Die Erweiterung attestation hat die OID 1.3.6.1.4.1.11129.2.1.17. Es enthält Informationen zum Schlüsselpaar, das bestätigt wird, und zum Status des Geräts zum Zeitpunkt der Schlüsselgenerierung.

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

Keymaster-/KeyMint-Typ ASN.1-Typ Hinweise
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT.
BOOL NULL Das Vorhandensein eines Tags bedeutet „wahr“, das Fehlen bedeutet „falsch“.
BIGNUM Keine Tags haben diesen Typ, daher ist keine Zuordnung definiert.
BYTES OCTET_STRING

Schema

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

Version 400

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

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

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

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

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

Version 300

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

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

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

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

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

Version 200

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

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

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

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

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

Version 100

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

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

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

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

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

Version 4

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

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

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

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

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

Version 3

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

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

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

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

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

Version 2

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

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

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

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

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

Version 1

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

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

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

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

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

KeyDescription-Felder

attestationVersion
Die ASN.1-Schemaversion.
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
400KeyMint-Version 4.0
attestationSecurityLevel

Das Sicherheitsniveau des Speicherorts des bestätigten Schlüssels.

keymasterVersion/keyMintVersion
Die Version der Keymaster-/KeyMint-Implementierung der Hardwareabstraktionsschicht (Hardware Abstraction Layer, HAL).
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
400KeyMint-Version 4.0
keymasterSecurityLevel/keyMintSecurityLevel
Das Sicherheitsniveau der Keymaster-/KeyMint-Implementierung.
attestationChallenge
Die bei der Schlüsselgenerierung bereitgestellte Challenge.
uniqueId
Eine datenschutzrelevante Geräte-ID, die System-Apps bei der Schlüsselgenerierung anfordern können. Wenn die eindeutige ID nicht angefordert wird, ist dieses Feld leer. Weitere Informationen finden Sie im Abschnitt Eindeutige ID.
softwareEnforced
Die Autorisierungsliste von Keymaster/KeyMint, die vom Android-System erzwungen wird. Diese Informationen werden durch Code auf der Plattform erhoben oder generiert. Das Gerät kann als vertrauenswürdig eingestuft werden, solange darauf ein Betriebssystem ausgeführt wird, das dem Android Platform Security Model entspricht. Das bedeutet, dass der Bootloader des Geräts gesperrt ist und die verifiedBootState Verified ist.
hardwareEnforced
Die Autorisierungsliste von Keymaster/KeyMint, die von der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) oder StrongBox des Geräts erzwungen wird. Diese Informationen werden durch Code in der sicheren Hardware erhoben oder generiert und nicht von der Plattform gesteuert. Informationen können beispielsweise vom Bootloader oder über einen sicheren Kommunikationskanal stammen, bei dem die Plattform nicht vertrauenswürdig sein muss.

SecurityLevel-Werte

Der Wert SecurityLevel gibt an, inwieweit ein Keystore-bezogenes Element (z. B. Schlüsselpaar und Attest) gegen Angriffe geschützt ist.

Wert Bedeutung
Software Sicher, solange das Android-System des Geräts dem Android Platform Security Model entspricht (d. h. der Bootloader des Geräts ist gesperrt und die verifiedBootState ist Verified).
TrustedEnvironment Sicher, solange das TEE nicht manipuliert wird. Die Isolierungsanforderungen für TEEs sind im Android Compatibility Definition Document in den Abschnitten 9.11 [C-1-1] bis [C-1-4] definiert. TEEs sind sehr widerstandsfähig gegen Remote-Angriffe und mäßig widerstandsfähig gegen Angriffe durch direkte Hardwaremanipulation.
StrongBox Sicher, solange StrongBox nicht manipuliert wird. StrongBox wird in einem sicheren Element implementiert, das einem Hardwaresicherheitsmodul ähnelt. Die Implementierungsanforderungen für StrongBox sind im Abschnitt 9.11.2 des Android Compatibility Definition Document definiert. StrongBox ist sehr widerstandsfähig gegen Kompromittierung per Fernzugriff und durch direkte Hardware-Angriffe (z. B. physische Manipulation und Side-Channel-Angriffe).

AuthorizationList-Felder

Jedes Feld entspricht einem Keymaster-/KeyMint-Autorisierungstag aus der AIDL-Schnittstellenspezifikation. Die Spezifikation ist die Quelle der Wahrheit über Autorisierungstags: ihre Bedeutung, das Format ihrer Inhalte, ob sie in den Feldern softwareEnforced oder hardwareEnforced im KeyDescription-Objekt erwartet werden, ob sie sich gegenseitig mit anderen Tags ausschließen usw. Alle AuthorizationList-Felder sind optional.

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

Die folgenden Felder sind in von KeyMint 4 generierten Attesten vorhanden:
purpose
Entspricht dem Autorisierungstag Tag::PURPOSE, für das der Tag-ID-Wert 1 verwendet wird.
algorithm

Entspricht dem Autorisierungs-Tag Tag::ALGORITHM, das den Tag-ID-Wert 2 verwendet.

In einem AuthorizationList-Objekt für die Geräteattestierung ist der Algorithmuswert immer RSA oder EC.

keySize
Entspricht dem Autorisierungs-Tag Tag::KEY_SIZE, für das der Tag-ID-Wert 3 verwendet wird.
blockMode
Entspricht dem Autorisierungstag Tag::BLOCK_MODE, für das der Tag-ID-Wert 4 verwendet wird.
digest
Entspricht dem Autorisierungstag Tag::DIGEST, für das der Tag-ID-Wert 5 verwendet wird.
padding
Entspricht dem Autorisierungstag Tag::PADDING, für das der Tag-ID-Wert 6 verwendet wird.
callerNonce
Entspricht dem Autorisierungstag Tag::CALLER_NONCE, für das der Tag-ID-Wert 7 verwendet wird.
minMacLength
Entspricht dem Autorisierungs-Tag Tag::MIN_MAC_LENGTH, das den Tag-ID-Wert 8 verwendet.
ecCurve

Entspricht dem Autorisierungs-Tag Tag::EC_CURVE mit dem Tag-ID-Wert 10.

Die Gruppe von Parametern, die zum Generieren eines Schlüsselpaars für elliptische Kurven (EC) verwendet werden, das ECDSA zum Signieren und Verifizieren im Android-System-Keystore verwendet.

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

Nur in der Schlüsselattestierungsversion >= 100 verfügbar.

Entspricht dem Tag::RSA_OAEP_MGF_DIGEST-Autorisierungstag von KeyMint, für den der Tag-ID-Wert 203 verwendet wird.
rollbackResistance

Nur in der Schlüsselattestierungsversion >= 3 vorhanden.

Entspricht dem Tag::ROLLBACK_RESISTANCE-Autorisierungstag, für das der Tag-ID-Wert 303 verwendet wird.

earlyBootOnly

Nur in der Schlüsselattestierungsversion >= 4 vorhanden.

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

activeDateTime
Entspricht dem Autorisierungs-Tag Tag::ACTIVE_DATETIME, das den Tag-ID-Wert 400 verwendet.
originationExpireDateTime
Entspricht dem Autorisierungstag Tag::ORIGINATION_EXPIRE_DATETIME, für das der Tag-ID-Wert 401 verwendet wird.
usageExpireDateTime
Entspricht dem Autorisierungstag Tag::USAGE_EXPIRE_DATETIME, das den Tag-ID-Wert 402 verwendet.
usageCountLimit
Entspricht dem Autorisierungstag Tag::USAGE_COUNT_LIMIT, für das der Tag-ID-Wert 405 verwendet wird.
userSecureId
Entspricht dem Autorisierungstag Tag::USER_SECURE_ID, das den Tag-ID-Wert 502 verwendet.
noAuthRequired

Entspricht dem Autorisierungstag Tag::NO_AUTH_REQUIRED, das die Tag-ID 503 verwendet.

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

Entspricht dem Autorisierungstag Tag::ALLOW_WHILE_ON_BODY mit der Tag-ID 506.

Ermöglicht die Verwendung des Schlüssels nach Ablauf des Authentifizierungszeitlimits, wenn der Nutzer das Gerät weiterhin am Körper trägt. Ein sicherer Sensor am Körper erkennt, ob das Gerät am Körper des Nutzers getragen wird.

trustedUserPresenceReq

Nur in der Schlüsselattestierungsversion >= 3 vorhanden.

Entspricht dem Autorisierungstag Tag::TRUSTED_USER_PRESENCE_REQUIRED, für das die Tag-ID 507 verwendet wird.

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

  • Für einen StrongBox-Schlüssel eine Hardwaretaste, die fest mit einem Pin auf dem StrongBox-Gerät verbunden ist.
  • Bei einem TEE-Schlüssel liefert die Fingerabdruckauthentifizierung einen Anwesenheitsnachweis, solange das TEE die exklusive Kontrolle über den Scanner hat und den Fingerabdruckabgleich durchführt.
trustedConfirmationReq

Nur in der Schlüsselattestierungsversion >= 3 vorhanden.

Entspricht dem Autorisierungstag Tag::TRUSTED_CONFIRMATION_REQUIRED, das den Tag-ID-Wert 508 verwendet.

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

Hinweis:Dieses Tag gilt nur für Schlüssel, die den Zweck SIGN verwenden.

unlockedDeviceReq

Nur in der Schlüsselattestierungsversion >= 3 vorhanden.

Entspricht dem Autorisierungstag Tag::UNLOCKED_DEVICE_REQUIRED, für das der Tag-ID-Wert 509 verwendet wird.

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

Entspricht dem Autorisierungstag Tag::ORIGIN, für das der Tag-ID-Wert 702 verwendet wird.

rootOfTrust

Entspricht dem Autorisierungstag Tag::ROOT_OF_TRUST, für das der Tag-ID-Wert 704 verwendet wird.

Weitere Informationen finden Sie im Abschnitt zur Datenstruktur RootOfTrust.

osVersion

Entspricht dem Autorisierungstag Tag::OS_VERSION, für das der Tag-ID-Wert 705 verwendet wird.

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

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

osPatchLevel

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

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

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

attestationApplicationId

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungstag Tag::ATTESTATION_APPLICATION_ID, für das der Tag-ID-Wert 709 verwendet wird.

Weitere Informationen finden Sie im Abschnitt zur Datenstruktur AttestationApplicationId.

attestationIdBrand

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungstag Tag::ATTESTATION_ID_BRAND, das den Tag-ID-Wert 710 verwendet.

attestationIdDevice

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungstag Tag::ATTESTATION_ID_DEVICE mit dem Tag-ID-Wert 711.

attestationIdProduct

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungstag Tag::ATTESTATION_ID_PRODUCT mit dem Tag-ID-Wert 712.

attestationIdSerial

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungstag Tag::ATTESTATION_ID_SERIAL, für das der Tag-ID-Wert 713 verwendet wird.

attestationIdImei

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungstag Tag::ATTESTATION_ID_IMEI mit dem Tag-ID-Wert 714.

attestationIdMeid

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

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

attestationIdManufacturer

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungstag Tag::ATTESTATION_ID_MANUFACTURER, für das der Tag-ID-Wert 716 verwendet wird.

attestationIdModel

Nur in Schlüsselattestierungsversionen >= 2 vorhanden.

Entspricht dem Autorisierungstag Tag::ATTESTATION_ID_MODEL, das den Tag-ID-Wert 717 verwendet.

vendorPatchLevel

Nur in Schlüsselattestierungsversionen >= 3 vorhanden.

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

Gibt das Sicherheitspatch-Level des Anbieter-Image an, das auf dem Gerät installiert sein muss, damit dieser Schlüssel verwendet werden kann. Der Wert wird im Format JJJJMMTT angezeigt und steht für das Datum des Sicherheitsupdates des Anbieters. Wenn beispielsweise ein Schlüssel auf einem Android-Gerät mit dem Sicherheitsupdate des Anbieters vom 1. August 2018 generiert wurde, wäre dieser Wert 20180801.

bootPatchLevel

Nur in Schlüsselattestierungsversionen >= 3 vorhanden.

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

Gibt das Sicherheitspatch-Level des Kernel-Image an, das auf dem Gerät installiert sein muss, damit dieser Schlüssel verwendet werden kann. Der Wert wird im Format JJJJMMTT angezeigt und steht für das Datum des Systemsicherheitsupdates. Wenn beispielsweise ein Schlüssel auf einem Android-Gerät mit dem am 5. August 2018 installierten Sicherheitspatch des Systems generiert wurde, lautet dieser Wert 20180805.

deviceUniqueAttestation

Nur in Schlüsselattestierungsversionen >= 4 vorhanden.

Entspricht dem Autorisierungstag Tag::DEVICE_UNIQUE_ATTESTATION, für das der Tag-ID-Wert 720 verwendet wird.

attestationIdSecondImei

Nur in Schlüsselattestierungsversionen >= 300 vorhanden.

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

moduleHash

Nur in Schlüsselattestierungsversionen >= 400 verfügbar.

Entspricht dem Autorisierungstag Tag::MODULE_HASH, das den Tag-ID-Wert 724 verwendet.

RootOfTrust-Felder

verifiedBootKey
Ein sicherer Hash des öffentlichen Schlüssels, der verwendet wird, um die Integrität und Authentizität des gesamten Codes zu überprüfen, der während des Geräte-Bootvorgangs im Rahmen von Verified Boot ausgeführt wird. SHA-256 wird empfohlen.
deviceLocked
Gibt an, ob der Bootloader des Geräts gesperrt ist. true bedeutet, dass auf dem Gerät ein signiertes Image gebootet wurde, das von Verified Boot erfolgreich überprüft wurde.
verifiedBootState
Der Status des verifizierten Bootmodus des Geräts.
verifiedBootHash
Ein Digest aller Daten, die durch Verified Boot geschützt sind. Bei Geräten, die die Referenzimplementierung des Android-Bootmodus mit Verifikation verwenden, enthält dieses Feld den VBMeta-Digest.

VerifiedBootState-Werte

Wert Entsprechender Bootstatus Bedeutung
Verified GREEN Eine vollständige Vertrauenskette erstreckt sich von einem hardwaregeschützten Root of Trust bis zum Bootloader und allen Partitionen, die von Verified Boot überprüft werden. In diesem Status enthält das Feld verifiedBootKey den Hash des eingebetteten Root of Trust, also des Zertifikats, das vom Gerätehersteller in der Fabrik in das ROM des Geräts eingebettet wurde.
SelfSigned YELLOW Wie Verified, mit dem Unterschied, dass die Überprüfung mit einem vom Nutzer konfigurierten Root of Trust anstelle des vom Hersteller in der Fabrik eingebetteten Root of Trust durchgeführt wurde. In diesem Status enthält das Feld verifiedBootKey den Hash des vom Nutzer konfigurierten öffentlichen Schlüssels.
Unverified ORANGE Der Bootloader des Geräts ist entsperrt, daher kann keine Vertrauenskette hergestellt werden. Das Gerät kann frei modifiziert werden. Die Integrität des Geräts muss daher vom Nutzer außerhalb des Bandes überprüft werden. In diesem Zustand enthält das Feld verifiedBootKey 32 Byte mit Nullen.
Failed RED Die Überprüfung des Geräts ist fehlgeschlagen. In diesem Zustand gibt es keine Garantien für den Inhalt der anderen RootOfTrust-Felder.

AttestationApplicationId

Dieses Feld gibt an, welche Apps nach Ansicht der Android-Plattform den geheimen Schlüssel verwenden dürfen, der für die Attestierung verwendet wird. Es kann mehrere Pakete enthalten, wenn und nur wenn mehrere Pakete dieselbe UID haben. Das Feld AttestationApplicationId in AuthorizationList hat den Typ OCTET_STRING und ist gemäß dem folgenden ASN.1-Schema formatiert:

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

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

Eine Reihe von SHA-256-Digests der Signaturzertifikate der App. Eine App kann mehrere Zertifikatsketten für Signaturschlüssel haben. Für jedes wird das „Leaf“-Zertifikat gehasht und in das Feld signature_digests eingefügt. Der Feldname ist irreführend, da die zusammengefassten Daten die Signaturzertifikate der App und nicht die App-Signaturen sind. Der Name bezieht sich auf die Klasse Signature, die von einem Aufruf von getPackageInfo() zurückgegeben wird. Das folgende Code-Snippet zeigt ein Beispielset:

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

Erweiterung für Bereitstellungsinformationen

Die Erweiterung für Bereitstellungsinformationen hat die OID 1.3.6.1.4.1.11129.2.1.30. Die Erweiterung enthält Informationen, die dem Bereitstellungsserver zum Gerät bekannt sind.

Schema

Die Erweiterung folgt dem folgenden CDDL-Schema:

  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
  }

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

certs_issued

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

validated_attested_entity

Die validierte bestätigte Entität ist ein String, der den Typ des Geräts beschreibt, das vom Bereitstellungsserver als bestätigt bestätigt wurde. Beispiel: STRONG_BOX oder TEE.

Attestierungsschlüssel

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

Mit Android 12 wurde die Remote Key Provisioning eingeführt. In Android 13 ist die Implementierung auf Geräten erforderlich. Mit der Remote Key Provisioning-Funktion werden Geräte im Feld mit ECDSA P256-Attestierungszertifikaten pro App ausgestattet. Diese Zertifikate haben eine kürzere Lebensdauer als die werkseitig bereitgestellten Zertifikate.

Eindeutige ID

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

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

Dabei gilt:

  • T ist der „temporale Zählerwert“, der berechnet wird, indem der Wert von Tag::CREATION_DATETIME durch 2592000000 geteilt wird. Dabei wird der Rest verworfen. T ändert sich alle 30 Tage (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C ist der Wert von Tag::APPLICATION_ID.
  • R ist 1, wenn Tag::RESET_SINCE_ID_ROTATION im Parameter „attest_params“ für den Aufruf von „attest_key“ vorhanden ist, oder 0, wenn das Tag nicht vorhanden ist.
  • HBK ist ein eindeutiges, an die Hardware gebundenes Geheimnis, das der vertrauenswürdigen Ausführungsumgebung bekannt ist und von ihr niemals preisgegeben wird. Das Secret enthält mindestens 128 Bit Entropie und ist für das jeweilige Gerät eindeutig (probabilistische Eindeutigkeit ist bei 128 Bit Entropie akzeptabel). Der HBK sollte aus dem kombinierten Schlüsselmaterial über HMAC oder AES_CMAC abgeleitet werden.

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

Mehrere IMEIs

Unter Android 14 werden mehrere IMEIs im Android-Schlüsselattestierungsdatensatz unterstützt. OEMs können diese Funktion implementieren, indem sie ein KeyMint-Tag für eine zweite IMEI hinzufügen. Es wird immer üblicher, dass Geräte mehrere Mobilfunkmodule haben. OEMs können jetzt Geräte mit zwei IMEIs unterstützen.

OEMs müssen eine sekundäre IMEI, sofern auf ihren Geräten vorhanden, für die KeyMint-Implementierung(en) bereitstellen, damit diese Implementierungen sie auf dieselbe Weise bestätigen können wie die erste IMEI.

Identitätserklärung

Android 8.0 bietet optionale Unterstützung für die ID-Attestierung für Geräte mit Keymaster 3. Mit der ID-Bestätigung kann das Gerät seine Hardware-IDs wie Seriennummer oder IMEI nachweisen. Obwohl es sich um eine optionale Funktion handelt, wird dringend empfohlen, dass alle Keymaster 3-Implementierungen sie unterstützen, da die Möglichkeit, die Identität des Geräts nachzuweisen, Anwendungsfälle wie die echte Zero-Touch-Konfiguration per Remote-Zugriff sicherer macht. Die Remote-Seite kann sich sicher sein, dass sie mit dem richtigen Gerät kommuniziert und nicht mit einem Gerät, das seine Identität fälscht.

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

Die Haupt-API-Oberfläche für die ID-Bestätigung basiert auf dem vorhandenen Schlüsselbestätigungsmechanismus, der mit Keymaster 2 eingeführt wurde. Wenn ein Attestierungszertifikat für einen von Keymaster verwalteten Schlüssel angefordert wird, kann der Aufrufer verlangen, dass die Hardware-IDs des Geräts in die Metadaten des Attestierungszertifikats aufgenommen werden. Wenn der Schlüssel im TEE gespeichert ist, wird das Zertifikat auf eine bekannte Root of Trust zurückgeführt. Der Empfänger eines solchen Zertifikats kann überprüfen, ob das Zertifikat und sein Inhalt, einschließlich der Hardware-IDs, von der TEE geschrieben wurden. Wenn Sie aufgefordert werden, Hardware-IDs in das Attestierungszertifikat aufzunehmen, werden vom TEE nur die IDs attestiert, die im Speicher enthalten sind und in der Fabrik eingetragen wurden.

Speicherattribute

Der Speicher, in dem die Kennungen des Geräts gespeichert werden, muss die folgenden Eigenschaften haben:

  • Die aus den ursprünglichen Geräte-IDs abgeleiteten Werte werden in den Speicher kopiert, bevor das Gerät das Werk verlässt.
  • Mit der Methode destroyAttestationIds() kann diese Kopie der aus der Kennung abgeleiteten Daten dauerhaft gelöscht werden. Die endgültige Vernichtung bedeutet, dass die Daten vollständig entfernt werden, sodass sie weder durch das Zurücksetzen auf die Werkseinstellungen noch durch ein anderes Verfahren auf dem Gerät wiederhergestellt werden können. Dies ist besonders wichtig für Geräte, bei denen ein Nutzer den Bootloader entsperrt, die Systemsoftware geändert und die von Android-Frameworks zurückgegebenen IDs modifiziert hat.
  • RMA-Einrichtungen sollten in der Lage sein, neue Kopien der aus der Hardware-Kennung abgeleiteten Daten zu generieren. So kann ein Gerät, das die RMA durchläuft, die ID-Bestätigung noch einmal durchführen. Der von RMA-Einrichtungen verwendete Mechanismus muss geschützt werden, damit Nutzer ihn nicht selbst aufrufen können, da sie sonst Atteste für gefälschte IDs erhalten könnten.
  • Außer der Keymaster-Vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) kann kein anderer Code die im Speicher abgelegten, aus dem Identifier abgeleiteten Daten lesen.
  • Der Speicher ist manipulationssicher: Wenn der Inhalt des Speichers geändert wurde, behandelt das TEE ihn so, als wären die Kopien des Inhalts zerstört worden, und lehnt alle Versuche zur ID-Bestätigung ab. Dies wird durch Signieren oder MACing des Speichers wie unten beschrieben implementiert.
  • Im Speicher sind nicht die ursprünglichen IDs enthalten. Da die ID-Bestätigung eine Challenge umfasst, liefert der Aufrufer immer die zu bestätigenden Kennungen. Das TEE muss nur prüfen, ob sie mit den ursprünglichen Werten übereinstimmen. Für diese Überprüfung werden sichere Hashes der Originalwerte anstelle der Werte gespeichert.

Baugewerbe

Um eine Implementierung mit den oben aufgeführten Eigenschaften zu erstellen, speichern Sie die ID-abgeleiteten Werte in der folgenden Konstruktion S. Speichern Sie keine anderen Kopien der ID-Werte, mit Ausnahme der normalen Orte im System, die ein Geräteinhaber durch Rooting ändern kann:

S = D || HMAC(HBK, D)

Dabei gilt:

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

Da die HMAC-Ausgaben eine feste Größe haben, sind keine Header oder andere Strukturen erforderlich, um einzelne ID-Hashes oder den HMAC von D zu finden. Zusätzlich zur Prüfung der bereitgestellten Werte für die Attestierung müssen Implementierungen S validieren, indem sie D aus S extrahieren, HMAC(HBK, D) berechnen und mit dem Wert in S vergleichen, um zu prüfen, ob einzelne IDs geändert oder beschädigt wurden. Außerdem müssen Implementierungen für alle einzelnen ID-Elemente und die Validierung von S Vergleiche mit konstanter Zeit verwenden. Die Vergleichszeit muss unabhängig von der Anzahl der bereitgestellten IDs und der korrekten Zuordnung eines Teils des Tests konstant sein.

Hardware-Kennungen

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

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

Zur Unterstützung der Geräte-ID-Attestierung werden diese IDs von einem Gerät attestiert. Alle Geräte mit Android haben die ersten sechs und sie sind erforderlich, damit diese Funktion funktioniert. Wenn das Gerät integrierte Mobilfunkmodule hat, muss es auch die Attestierung für die IMEIs und/oder MEIDs der Module unterstützen.

Die ID-Bestätigung wird angefordert, indem eine Schlüsselbestätigung durchgeführt und die zu bestätigenden Geräte-IDs in die Anfrage aufgenommen werden. Die Kennungen sind so gekennzeichnet:

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

Der zu bestätigende Bezeichner ist ein UTF-8-codierter Byte-String. Dieses Format gilt auch für numerische Kennungen. Jede zu bestätigende Kennung wird als UTF‑8-codierter String ausgedrückt.

Wenn das Gerät die ID-Bestätigung nicht unterstützt oder destroyAttestationIds() zuvor aufgerufen wurde und das Gerät seine IDs nicht mehr bestätigen kann, schlägt jede Schlüsselbestätigungsanfrage, die eines oder mehrere dieser Tags enthält, mit ErrorCode::CANNOT_ATTEST_IDS fehl.

Wenn das Gerät die ID-Bestätigung unterstützt und eines oder mehrere der oben genannten Tags in einer Schlüsselbestätigungsanfrage enthalten sind, prüft die TEE, ob die mit den einzelnen Tags bereitgestellte Kennung mit ihrer Kopie der Hardwarekennungen übereinstimmt. Wenn eine oder mehrere Kennungen nicht übereinstimmen, schlägt die gesamte Attestierung mit ErrorCode::CANNOT_ATTEST_IDS fehl. Dasselbe Tag kann mehrmals angegeben werden. Das kann beispielsweise beim Attestieren von IMEIs nützlich sein: Ein Gerät kann mehrere Funkmodule mit mehreren IMEIs haben. Eine Attestierungsanfrage ist gültig, wenn der mit jedem ATTESTATION_ID_IMEI angegebene Wert mit einem der Funkmodule des Geräts übereinstimmt. Dasselbe gilt für alle anderen Tags.

Wenn die Attestierung erfolgreich ist, wird die attestierte ID der Attestierungserweiterung (OID 1.3.6.1.4.1.11129.2.1.17) des ausgestellten Attestierungszertifikats hinzugefügt. Dabei wird das oben genannte Schema verwendet. Änderungen am Keymaster 2-Bestätigungsschema sind fett dargestellt und mit Kommentaren versehen.

Java API

Dieser Abschnitt dient nur zur Information. Keymaster-Implementierer implementieren oder verwenden die Java API nicht. Dies soll Implementierern helfen, die Verwendung der Funktion durch Apps nachzuvollziehen. Systemkomponenten verwenden sie möglicherweise anders. Daher ist es wichtig, dass dieser Abschnitt nicht als normativ betrachtet wird.