Der Schlüsselspeicher bietet einen sichereren Ort zum Erstellen, Speichern und kontrollierten Verwenden kryptografischer Schlüssel. Wenn hardwaresicherer Schlüsselspeicher verfügbar ist und verwendet wird, ist das Schlüsselmaterial besser vor dem Extrahieren vom Gerät geschützt. KeyMint (früher Keymaster) erzwingt Einschränkungen, die schwer zu umgehen sind.
Dies gilt jedoch nur, wenn die Keystore-Schlüssel bekanntermaßen in einem hardwaregestützten Speicher gespeichert sind. In Keymaster 1 gab es keine Möglichkeit für Apps oder Remoteserver, zuverlässig zu überprüfen, ob dies der Fall war. Der Keystore-Daemon hat die verfügbare Keymaster-Hardwareabstraktionsschicht (HAL) geladen und alles geglaubt, was die HAL in Bezug auf die Hardware-Sicherung von Schlüsseln gesagt hat.
Um dieses Problem zu beheben, wurde in Android 7.0 (Keymaster 2) die Schlüsselbestätigung und in Android 8.0 (Keymaster 3) die ID-Bestätigung eingeführt.
Die Schlüsselattestierung soll eine Möglichkeit bieten, eindeutig festzustellen, ob ein asymmetrisches Schlüsselpaar hardwaregestützt ist, welche Eigenschaften der Schlüssel hat und welche Einschränkungen für seine Verwendung gelten.
Mit der ID-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_CHALLENGETag::INCLUDE_UNIQUE_IDTag::RESET_SINCE_ID_ROTATION
Typ
Keymaster 2 und älter
typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;
AttestKey-Methode
Keymaster 3
    attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
        generates(ErrorCode error, vec<vec<uint8_t>> certChain);Keymaster 2 und älter
keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
devist die Keymaster-Gerätestruktur.keyToAttestist der vomgenerateKeyzurückgegebene Schlüssel-Blob, für den die Attestierung erstellt wird.attestParamsist eine Liste aller für die Attestierung erforderlichen Parameter. Dazu gehörenTag::ATTESTATION_CHALLENGEund möglicherweiseTag::RESET_SINCE_ID_ROTATIONsowieTag::APPLICATION_IDundTag::APPLICATION_DATA. Die beiden letztgenannten sind erforderlich, um den Schlüssel-Blob zu entschlüsseln, wenn sie bei der Schlüsselgenerierung angegeben wurden.certChainist der Ausgabeparameter, der ein Array von Zertifikaten zurückgibt. Eintrag 0 ist das Attestierungszertifikat. Es zertifiziert den Schlüssel auskeyToAttestund enthält die Attestierungserweiterung.
Die attestKey-Methode 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 wird möglicherweise ein anderer Algorithmus verwendet als für den Schlüssel, der attestiert wird.
Das Attestierungszertifikat enthält die Felder in der Tabelle unten und darf keine zusätzlichen Felder enthalten. Für einige Felder ist ein fester Feldwert angegeben. CTS-Tests prüfen, ob der Zertifikatsinhalt genau wie definiert ist.
Zertifikats-SEQUENCE
| Feldname (siehe RFC 5280) | Wert | 
|---|---|
| tbsCertificate | TBSCertificate SEQUENCE | 
| signatureAlgorithm | AlgorithmIdentifier des Algorithmus, der zum Signieren des Schlüssels verwendet wird: ECDSA für EC-Schlüssel, RSA für RSA-Schlüssel.  | 
  
| signatureValue | BIT STRING, Signatur, die für das ASN.1 DER-codierte tbsCertificate berechnet wurde. | 
TBSCertificate SEQUENCE
| Feldname (siehe RFC 5280) | Wert | 
|---|---|
version | 
   INTEGER 2 (entspricht 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 in RFC 5280.Wenn Tag::ACTIVE_DATETIME nicht vorhanden ist, verwenden Sie den Wert von Tag::CREATION_DATETIME. Wenn Tag::USAGE_EXPIRE_DATETIME nicht vorhanden ist, verwenden Sie das Ablaufdatum des Zertifikats für den Batch-Attestierungsschlüssel. | 
  
subject | 
   CN = „Android Keystore Key“ (fester Wert: auf allen Zertifikaten gleich) | 
subjectPublicKeyInfo | 
   SubjectPublicKeyInfo mit dem bestätigten öffentlichen Schlüssel. | 
extensions/Key Usage | 
   digitalSignature: wird festgelegt, wenn der Schlüssel den Zweck KeyPurpose::SIGN oder KeyPurpose::VERIFY hat. Alle anderen Bits sind nicht festgelegt. | 
  
extensions/CRL Distribution Points | 
   Wert noch offen | 
extensions/"attestation" | 
   Die OID ist 1.3.6.1.4.1.11129.2.1.17. Der Inhalt wird unten im Abschnitt Attestierungserweiterung definiert. Wie bei allen X.509-Zertifikaterweiterungen wird der Inhalt als OCTET_STRING dargestellt, der eine DER-Codierung der Attestierungs-SEQUENCE enthält. | 
Attestierungserweiterung
Die Erweiterung attestation hat die OID 1.3.6.1.4.1.11129.2.1.17. Sie enthält Informationen zum 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:
| KeyMint- oder Keymaster-Typ | ASN.1-Typ | Hinweise | 
|---|---|---|
ENUM | 
    INTEGER | 
  |
ENUM_REP | 
    SET of INTEGER | 
  |
UINT | 
    INTEGER | 
  |
UINT_REP | 
    SET of INTEGER | 
  |
ULONG | 
    INTEGER | 
  |
ULONG_REP | 
    SET of INTEGER | 
  |
DATE | 
    INTEGER | 
    Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT. | 
BOOL | 
    NULL | 
    Das Vorhandensein 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           INTEGER, # Value 400
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 400
    keyMintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}
AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei    [723] EXPLICIT OCTET_STRING OPTIONAL,
    moduleHash                 [724] EXPLICIT OCTET_STRING OPTIONAL,
}
Modules ::= SET OF Module
Module ::= SEQUENCE {
    packageName                OCTET_STRING,
    version                    INTEGER,
}
RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}
Version 300
KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 300
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 300
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}
AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei    [723] EXPLICIT OCTET_STRING OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}
Version 200
KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 200
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 200
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}
AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    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,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}
Version 100
KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 100
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 100
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}
AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    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,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}
Version 4
KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 4
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 41
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}
AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}
Version 3
KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 3
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 4
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}
AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}
Version 2
KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 2
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 3
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
}
AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    allApplications            [600] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant          [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
    verifiedBootKey           OCTET_STRING,
    deviceLocked              BOOLEAN,
    verifiedBootState         VerifiedBootState,
}
VerifiedBootState ::= ENUMERATED {
    Verified                  (0),
    SelfSigned                (1),
    Unverified                (2),
    Failed                    (3),
}
Version 1
KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 1
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 2
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
}
AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    allApplications            [600] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant          [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
}
VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}
KeyDescription-Felder
- 
    
attestationVersion - 
    Die ASN.1-Schemaversion.
    
Wert KeyMint- oder Keymaster-Version 1 Keymaster-Version 2.0 2 Keymaster-Version 3.0 3 Keymaster-Version 4.0 4 Keymaster-Version 4.1 100 KeyMint-Version 1.0 200 KeyMint-Version 2.0 300 KeyMint-Version 3.0 400 KeyMint-Version 4.0  - 
    
attestationSecurityLevel - 
    
Das Sicherheitsniveau des Speicherorts des bestätigten Schlüssels.
 - 
    
keymasterVersion/keyMintVersion - 
    Die Version der KeyMint- oder Keymaster-HAL-Implementierung.
    
Wert KeyMint- oder Keymaster-Version 2 Keymaster-Version 2.0 3 Keymaster-Version 3.0 4 Keymaster-Version 4.0 41 Keymaster-Version 4.1 100 KeyMint-Version 1.0 200 KeyMint-Version 2.0 300 KeyMint-Version 3.0 400 KeyMint-Version 4.0  - 
    
keymasterSecurityLevel/keyMintSecurityLevel - Das Sicherheitsniveau der KeyMint- oder Keymaster-Implementierung.
 - 
    
attestationChallenge - Die bei der Schlüsselgenerierung angegebene Challenge.
 - 
    
uniqueId - Eine datenschutzrelevante Geräte-ID, die System-Apps bei der Schlüsselgenerierung anfordern können. Wenn die eindeutige ID nicht angefordert wird, ist dieses Feld leer. Weitere Informationen finden Sie im Abschnitt Eindeutige ID.
 - 
    
softwareEnforced - 
    Die Autorisierungsliste von KeyMint oder Keymaster, die vom Android-System erzwungen wird. Diese Informationen werden durch Code auf der Plattform erhoben oder generiert. Sie kann als vertrauenswürdig eingestuft werden, solange auf dem Gerät ein Betriebssystem ausgeführt wird, das dem Android Platform Security Model entspricht. Das bedeutet, dass der Bootloader des Geräts gesperrt ist und die 
verifiedBootStateVerifiedist. - 
    
hardwareEnforced - Die Autorisierungsliste von KeyMint oder Keymaster, die von der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) oder StrongBox des Geräts erzwungen wird. Diese Informationen werden durch Code in der sicheren Hardware erhoben oder generiert und werden nicht von der Plattform gesteuert. Informationen können beispielsweise vom Bootloader oder über einen sicheren Kommunikationskanal stammen, bei dem die Plattform nicht vertrauenswürdig sein muss.
 
SecurityLevel-Werte
Der 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 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-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). | 
Felder in AuthorizationList
Jedes Feld entspricht einem Keymaster-/KeyMint-Autorisierungstag aus der AIDL-Schnittstellenspezifikation.
Die Spezifikation ist die Quelle der Wahrheit über Autorisierungstags: ihre Bedeutung, das Format ihrer Inhalte, ob sie in den Feldern softwareEnforced oder hardwareEnforced im KeyDescription-Objekt erwartet werden, ob sie sich gegenseitig mit anderen Tags ausschließen usw. Alle AuthorizationList-Felder sind optional.
Jedes Feld hat ein EXPLICIT kontextspezifisches Tag, das der KeyMint- oder Keymaster-Tag-Nummer entspricht. Dadurch kann die Darstellung der Daten im AuthorizationList kompakter sein. Der ASN.1-Parser muss daher den erwarteten Datentyp für jedes kontextspezifische Tag kennen. Beispiel: Tag::USER_AUTH_TYPE ist als ENUM | 504 definiert. Im Schema für die Attestierungserweiterung wird das Feld purpose im AuthorizationList als userAuthType  [504] EXPLICIT INTEGER OPTIONAL angegeben. Die ASN.1-Codierung enthält daher das kontextspezifische Tag 504 anstelle des Klassentags UNIVERSAL für den ASN.1-Typ INTEGER, der 10 ist.
- 
    
purpose - 
    Entspricht dem Autorisierungstag 
Tag::PURPOSE, für das der Tag-ID-Wert 1 verwendet wird. - 
    
algorithm - 
    
Entspricht dem Autorisierungs-Tag
Tag::ALGORITHMmit dem Tag-ID-Wert 2.In einem
AuthorizationList-Objekt für die Geräteattestierung ist der Algorithmuswert immerRSAoderEC. - 
    
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_CURVEmit dem Tag-ID-Wert 10.Die Gruppe von Parametern, die zum Generieren eines Schlüsselpaars für elliptische Kurven (EC) verwendet werden, das ECDSA zum Signieren und Verifizieren im Android-System-Keystore verwendet.
 - 
    
rsaPublicExponent - 
    Entspricht dem Autorisierungs-Tag 
Tag::RSA_PUBLIC_EXPONENT, für das die Tag-ID 200 verwendet wird. - 
    
mgfDigest - 
    
Nur in der Schlüsselattestierungsversion >= 100 verfügbar.
Entspricht demTag::RSA_OAEP_MGF_DIGEST-Autorisierungstag von KeyMint, für den der Tag-ID-Wert 203 verwendet wird. - 
    
rollbackResistance - 
    
Nur in der Schlüsselattestierungsversion >= 3 vorhanden.
Entspricht dem
Tag::ROLLBACK_RESISTANCE-Autorisierungstag, für den 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, das die Tag-ID 405 verwendet. - 
    
userSecureId - 
    Entspricht dem Autorisierungstag 
Tag::USER_SECURE_ID, das die Tag-ID 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_BODYmit 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 bietet die Fingerabdruckauthentifizierung einen Anwesenheitsnachweis, solange das TEE die exklusive Kontrolle über den Scanner hat und den Fingerabdruckabgleich durchführt.
 
 - 
    
trustedConfirmationReq - 
    
Nur in der Schlüsselattestierungsversion >= 3 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
SIGNverwenden. - 
    
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 mit dem Keymaster verknüpft 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 der Tag-ID-Wert 706 verwendet wird.Der Monat und das Jahr, die mit dem im Keymaster verwendeten Sicherheitspatch verknüpft sind, angegeben als sechsstellige Ganzzahl. Beispielsweise wird der Patch für August 2018 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, das den Tag-ID-Wert 709 verwendet.Weitere Informationen finden Sie im Abschnitt zur Datenstruktur AttestationApplicationId.
 - 
    
attestationIdBrand - 
    
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_BRAND, das die Tag-ID 710 verwendet. - 
    
attestationIdDevice - 
    
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_DEVICEmit dem Tag-ID-Wert 711. - 
    
attestationIdProduct - 
    
Nur in Schlüsselattestierungsversionen >= 2 vorhanden.
Entspricht dem Autorisierungstag
Tag::ATTESTATION_ID_PRODUCTmit 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_IMEImit 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_PATCHLEVELmit 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_PATCHLEVELmit dem Tag-ID-Wert 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 Autorisierungs-Tag
Tag::ATTESTATION_ID_SECOND_IMEI, das die Tag-ID 723 verwendet. - 
    
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ätestarts im Rahmen von Verified Boot ausgeführt wird. SHA-256 wird empfohlen.
 - 
    
deviceLocked - 
    Gibt an, ob der Bootloader des Geräts gesperrt ist. 
truebedeutet, dass auf dem Gerät ein signiertes Image gebootet wurde, das von Verified Boot erfolgreich überprüft wurde. - 
    
verifiedBootState - Der Status des verifizierten Bootmodus des Geräts.
 - 
    
verifiedBootHash - Ein Digest aller Daten, die durch Bootmodus mit Verifikation geschützt werden. Bei Geräten, die die Referenzimplementierung des Android-Bootmodus mit Verifikation verwenden, enthält dieses Feld den VBMeta-Digest.
 
VerifiedBootState-Werte
| Wert | Entsprechender 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_digestseingefügt. Der Feldname ist irreführend, da die zusammengefassten Daten die Signaturzertifikate der App und nicht die App-Signaturen sind. Der Name bezieht sich auf die KlasseSignature, die von einem Aufruf vongetPackageInfo()zurückgegeben wird. Das folgende Code-Snippet zeigt ein Beispielset:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...} 
Erweiterung für Bereitstellungsinformationen
  Die Erweiterung für Bereitstellungsinformationen hat die OID 1.3.6.1.4.1.11129.2.1.30. Die Erweiterung enthält Informationen, die dem Bereitstellungsserver zum Gerät bekannt sind.
Schema
Der Erweiterungswert besteht aus Concise Binary Object Representation (CBOR)-Daten, die diesem Concise Data Definition Language (CDDL)-Schema entsprechen:
  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
  }
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 Identität ist ein String, der den Typ des Geräts beschreibt, das vom Bereitstellungsserver als bestätigt bestätigt wurde. Beispiel:
STRONG_BOXoderTEE. 
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. Ab Android 15 müssen alle Geräte diese Funktion implementieren. Mit der Remote Key Provisioning-Funktion werden Geräte im Feld mit ECDSA P256-Attestierungszertifikaten pro App bereitgestellt. Diese Zertifikate haben eine kürzere Gültigkeitsdauer 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:
Tist der „temporale Zählerwert“, der berechnet wird, indem der Wert vonTag::CREATION_DATETIMEdurch 2592000000 geteilt wird. Ein Rest wird dabei verworfen.Tändert sich alle 30 Tage (2592000000 = 30 * 24 * 60 * 60 * 1000).Cist der Wert vonTag::APPLICATION_ID.Rist 1, wennTag::RESET_SINCE_ID_ROTATIONim Parameter „attest_params“ für den Aufruf von „attest_key“ vorhanden ist, oder 0, wenn das Tag nicht vorhanden ist.HBKist ein eindeutiges, an die Hardware gebundenes Geheimnis, das der vertrauenswürdigen Ausführungsumgebung bekannt ist und von ihr niemals preisgegeben wird. Das Geheimnis enthält mindestens 128 Bit Entropie und ist für das jeweilige Gerät eindeutig (probabilistische Eindeutigkeit ist angesichts der 128 Bit Entropie akzeptabel). Der HBK sollte aus dem kombinierten Schlüsselmaterial über HMAC oder AES_CMAC abgeleitet werden.
Kürzen Sie die HMAC_SHA256-Ausgabe auf 128 Bit.
Mehrere IMEIs
Unter Android 14 werden 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 Geräte-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 einen bekannten 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. „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 Hardware-Kennungen 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 App im TEE kann kein anderer Code die aus der Kennung abgeleiteten Daten lesen, die im Speicher abgelegt sind.
 - Der Speicher ist manipulationssicher: Wenn der Inhalt des Speichers geändert wurde, behandelt das TEE ihn so, als wären die Kopien des Inhalts 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, gibt der Anrufer immer die zu bestätigenden Kennungen an. Das TEE muss nur prüfen, ob sie mit den ursprünglichen Werten übereinstimmen. Bei dieser Ü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)HMACist die HMAC-Konstruktion mit einem geeigneten sicheren Hash (SHA-256 wird empfohlen).HBKist ein hardwaregebundener Schlüssel, der nicht für andere Zwecke verwendet wird.ID1...IDnsind die ursprünglichen ID-Werte. Die Zuordnung eines bestimmten Werts zu einem bestimmten Index ist implementierungsabhängig, da verschiedene Geräte eine unterschiedliche Anzahl von Kennungen haben.||steht für die Verkettung.
Da die HMAC-Ausgaben eine feste Größe haben, sind keine Header oder andere Strukturen erforderlich, um einzelne ID-Hashes oder den HMAC von D zu finden. Zusätzlich zur Überprüfung der bereitgestellten Werte für die Attestierung müssen Implementierungen S validieren, indem sie D aus S extrahieren, HMAC(HBK, D) berechnen und mit dem Wert in S vergleichen, um zu prüfen, ob einzelne IDs geändert oder beschädigt wurden. Außerdem müssen Implementierungen für alle einzelnen ID-Elemente und die Validierung von S Vergleiche mit konstanter Zeit verwenden. Die Vergleichszeit muss unabhängig von der Anzahl der bereitgestellten IDs und der korrekten Zuordnung eines beliebigen Teils des Tests konstant sein.
Hardware-Kennungen
Die ID-Attestierung unterstützt die folgenden Hardware-IDs:
- Markenname, wie von 
Build.BRANDin Android zurückgegeben - Gerätename, wie von 
Build.DEVICEin Android zurückgegeben - Produktname, wie von 
Build.PRODUCTin Android zurückgegeben - Name des Herstellers, wie von 
Build.MANUFACTURERin Android zurückgegeben - Der Modellname, wie er von 
Build.MODELin Android zurückgegeben wird - Seriennummer
 - IMEIs aller Funkgeräte
 - MEIDs aller Funkmodule
 
Zur Unterstützung der Geräte-ID-Attestierung werden diese IDs von einem Gerät attestiert. Alle Geräte mit Android haben die ersten sechs und sie sind erforderlich, damit diese Funktion funktioniert. Wenn das Gerät integrierte Mobilfunkmodule hat, muss es auch die Attestierung für die IMEIs und/oder MEIDs der Module unterstützen.
Die ID-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_BRANDATTESTATION_ID_DEVICEATTESTATION_ID_PRODUCTATTESTATION_ID_MANUFACTURERATTESTATION_ID_MODELATTESTATION_ID_SERIALATTESTATION_ID_IMEIATTESTATION_ID_MEID
Der zu bestätigende Bezeichner ist ein UTF-8-codierter Byte-String. Dieses Format gilt auch für numerische Kennungen. Jede zu bestätigende Kennung wird als UTF‑8-codierter String ausgedrückt.
Wenn das Gerät die Geräte-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, überprüft die TEE, ob die mit den einzelnen Tags bereitgestellte Kennung mit ihrer Kopie der Hardware-IDs ü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 beschriebene 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.