Schlüssel- und ID-Attestierung

Der Schlüsselspeicher bietet einen sichereren Ort zum Erstellen, Speichern und Verwenden kryptografischer Daten Schlüssel verwalten können. Wenn hardwaregestützter Schlüsselspeicher verfügbar ist und verwendet wird, ist das Schlüsselmaterial sicherer vor Extraktion vom Gerät Der Keymaster erzwingt Einschränkungen, die sich nur schwer umkehren lassen.

Dies trifft jedoch nur zu, wenn bekannt ist, dass sich die Schlüsselspeicherschlüssel in hardwaregestützter Speicher. In Keymaster 1 gab es keine Möglichkeit, um zuverlässig überprüfen zu können, ob dies der Fall war. Schlüsselspeicher-Daemon den verfügbaren Keymaster HAL geladen und glaubt, was auch immer der HAL sagte, in Bezug auf die Hardwaresicherung der Schlüssel.

Um dies zu beheben, hat Keymaster in Android 7.0 (Keymaster 2) die Schlüsselattestierung und die ID-Bestätigung eingeführt. Attestierung in Android 8.0 (Keymaster 3).

Die Schlüsselattestierung soll eine Möglichkeit bieten, feststellen, ob ein asymmetrisches Schlüsselpaar hardwaregestützt ist, welche Eigenschaften des Schlüssels sind und welche Einschränkungen für seine Nutzung gelten.

Die ID-Attestierung ermöglicht es dem Gerät, seine Hardwarekennungen nachzuweisen, wie Seriennummer oder IMEI.

Schlüsselattestierung

Um die Schlüsselattestierung zu unterstützen, wurden mit Android 7.0 eine Reihe von Tags, Typen und zur HAL-Methode hinzu.

Tags

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

Typ

Keymaster 2 und niedriger

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

AttestKey-Methode

Keymaster 3

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

Keymaster 2 und niedriger

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

Die Methode attestKey gilt als Public-Key-Vorgang auf der da er jederzeit aufgerufen werden kann und Autorisierungsbeschränkungen. Wenn für den attestierten Schlüssel beispielsweise Authentifizierung verwenden, kann eine Attestierung ohne Nutzer-Authentifizierung generiert werden. Authentifizierung.

Attestierungszertifikat

Das Attestierungszertifikat ist ein standardmäßiges X.509-Zertifikat mit einem optionalen Attestierungserweiterung, die eine Beschreibung des attestierten Schlüssels enthält. Die Das Zertifikat ist mit einem zertifizierten Attestierungsschlüssel signiert. Attestierungsschlüssel verwendet möglicherweise einen anderen Algorithmus als der attestierte Schlüssel.

Das Attestierungszertifikat enthält die Felder in der folgenden Tabelle und kann nicht keine zusätzlichen Felder enthalten. Einige Felder enthalten einen festen Feldwert. Logo: CTS Mit den Tests wird geprüft, ob der Zertifikatinhalt genau mit der Definition übereinstimmt.

Zertifikat SEQUENCE

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

TBSCertificate-SEQUENCE

Feldname (siehe RFC 5280) Wert
version INTEGER 2 (bedeutet v3-Zertifikat)
serialNumber INTEGER 1 (fester Wert: in allen Zertifikaten gleich)
signature AlgorithmIdentifier des zum Signieren des Schlüssels verwendeten Algorithmus: ECDSA für EC-Schlüssel RSA für RSA-Schlüssel.
issuer Entspricht dem Feld "Betreff" des Batchattestierungsschlüssels.
validity SEQUENCE von zwei Datumsangaben, enthält die Werte von Tag::ACTIVE_DATETIME und Tag:USAGE_EXPIRE_DATETIME. Diese Werte sind in Millisekunden seit dem 1. Januar 1970 angegeben. Unter RFC 5280 finden Sie die korrekten Datumsdarstellungen in Zertifikaten.
Wenn Tag::ACTIVE_DATETIME nicht vorhanden ist, verwenden Sie den Wert von Tag::CREATION_DATETIME Wenn Tag::USAGE_EXPIRE_DATETIME ist nicht vorhanden, verwende das Ablaufdatum Datum des Zertifikats für den Batchattestierungsschlüssel.
subject CN = "Android-Schlüsselspeicherschlüssel" (fester Wert: gleich für alle Zertifikate)
subjectPublicKeyInfo SubjectPublicKeyInfo mit dem attestierten öffentlichen Schlüssel.
extensions/Key Usage digitalSignature: wird festgelegt, wenn der Schlüssel den Zweck KeyPurpose::SIGN hat oder KeyPurpose::VERIFY. Alle anderen Bits nicht festgelegt.
extensions/CRL Distribution Points Wert TBD
extensions/"attestation" Die OID lautet 1.3.6.1.4.1.11129.2.1.17. der Inhalt in der Attestierungserweiterung unten. Wie bei allen X.509-Zertifikatserweiterungen, der Inhalt wird als OCTET_STRING dargestellt mit einer DER-Codierung der Attestierung SEQUENCE.

Attestierungserweiterung

Die Erweiterung attestation enthält eine vollständige Beschreibung des Keymasters Autorisierungen, die mit dem Schlüssel verknüpft sind, in einer Struktur, die direkt zu den Autorisierungslisten, die in Android und im Keymaster HAL verwendet werden. Jedes Tag in Eine Autorisierungsliste wird durch eine ASN.1 dargestellt. SEQUENCE expliziten mit der Keymaster-Tag-Nummer, aber mit dem Typdeskriptor (vier hoch werden ausgeblendet.

Beispiel: In Keymaster 3 ist Tag::PURPOSE definiert in types.hal als ENUM_REP | 1. Für die Attestierungserweiterung wird der Wert ENUM_REP entfernt, sodass das Tag 1 beibehalten wird. (Für Keymaster 2 und niedriger wird KM_TAG_PURPOSE in keymaster_defs.h.)

Werte werden gemäß der folgenden Tabelle auf einfache Weise in ASN.1-Typen umgewandelt:

Keymaster-Typ ASN.1-Typ
ENUM GANZZAHL
ENUM_REP SET von INTEGER
UINT GANZZAHL
UINT_REP SET von INTEGER
ULONG GANZZAHL
ULONG_REP SET von INTEGER
DATE INTEGER (Millisekunden seit 1. Januar 1970 00:00:00 GMT)
BOOL NULL (im Keymaster bedeutet „Tag“ „wahr“, „fehlend“ bedeutet „falsch“.
Dieselbe Semantik gilt für die ASN.1-Codierung.)
BIGNUM Wird derzeit nicht verwendet, daher ist keine Zuordnung definiert
BYTES OCTET_STRING

Schema

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

KeyDescription ::= SEQUENCE {
  attestationVersion         INTEGER, # KM2 value is 1. KM3 value is 2. KM4 value is 3.
  attestationSecurityLevel   SecurityLevel,
  keymasterVersion           INTEGER,
  keymasterSecurityLevel     SecurityLevel,
  attestationChallenge       OCTET_STRING,
  uniqueId                   OCTET_STRING,
  softwareEnforced           AuthorizationList,
  teeEnforced                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, # KM4
  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, # KM4
  trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, # KM4
  unlockedDeviceRequired      [509] EXPLICIT NULL OPTIONAL, # KM4
  allApplications             [600] EXPLICIT NULL OPTIONAL,
  creationDateTime            [701] EXPLICIT INTEGER OPTIONAL,
  origin                      [702] EXPLICIT INTEGER OPTIONAL,
  rollbackResistant           [703] EXPLICIT NULL OPTIONAL, # KM2 and KM3 only.
  rootOfTrust                 [704] EXPLICIT RootOfTrust OPTIONAL,
  osVersion                   [705] EXPLICIT INTEGER OPTIONAL,
  osPatchLevel                [706] EXPLICIT INTEGER OPTIONAL,
  attestationApplicationId    [709] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdBrand          [710] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdDevice         [711] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdProduct        [712] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdSerial         [713] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdImei           [714] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdMeid           [715] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdManufacturer   [716] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdModel          [717] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  vendorPatchLevel            [718] EXPLICIT INTEGER OPTIONAL, # KM4
  bootPatchLevel              [719] EXPLICIT INTEGER OPTIONAL, # KM4
}

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

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

KeyDescription-Felder

keymasterVersion und attestationChallenge werden identifiziert, statt nach Tag, sodass die Tags in der codierten Form nur Feldtyp. Die verbleibenden Felder werden implizit wie in den Schema.

Feldname Typ Wert
attestationVersion GANZZAHL Version des Attestierungsschemas: 1, 2 oder 3.
attestationSecurity Sicherheitsniveau Das Sicherheitsniveau dieser Attestierung. Es ist möglich, Software Attestierungen hardwaregestützter Schlüssel. Solche Attestierungen sind nicht vertrauenswürdig, wenn die Das Android-System wurde manipuliert.
keymasterVersion GANZZAHL Version des Keymaster-Geräts: 0, 1, 2, 3 oder 4.
keymasterSecurity Sicherheitsniveau Das Sicherheitsniveau der Keymaster-Implementierung.
attestationChallenge OCTET_STRING Der Wert von Tag::ATTESTATION_CHALLENGE wurde für die Attestierungsanfrage angegeben.
uniqueId OCTET_STRING Optionale eindeutige ID, vorhanden, wenn Schlüssel Tag::INCLUDE_UNIQUE_ID
softwareEnforced Autorisierungsliste Optionale Keymaster-Autorisierungen, die nicht vom TEE erzwungen werden, wenn irgendetwas.
teeEnforced Autorisierungsliste Optionale Keymaster-Autorisierungen, die gegebenenfalls vom TEE erzwungen werden.

AuthorizationList-Felder

AuthorizationList-Felder sind alle optional und werden identifiziert nach Keymaster-Tag-Wert, wobei die Typ-Bits ausgeblendet sind. Da explizites Tagging verwendet wird, enthalten die Felder auch ein Tag, das angibt, ASN.1-Typ, um das Parsen zu erleichtern.

Weitere Informationen zu den Werten in den einzelnen Feldern finden Sie unter types.hal für Keymaster 3 und keymaster_defs.h für Keymaster 2 und niedriger. Namen der Keymaster-Tags wurden in Feldnamen umgewandelt, indem KM_TAG weggelassen wurde und das Ändern des Präfixes Rest des Camel-Case-Vorgangs, sodass Tag::KEY_SIZE zu keySize

RootOfTrust-Felder

Die RootOfTrust-Felder werden positionell identifiziert.

Feldname Typ Wert
verifiedBootKey OCTET_STRING Ein sicherer Hash des Schlüssels, der zur Überprüfung des System-Images verwendet wird. SHA-256 wird empfohlen.
deviceLocked BOOLESCH "True", wenn der Bootloader gesperrt ist, was bedeutet, dass nur signierte Images und der verifizierte Bootmodus ist abgeschlossen.
verifiedBootState VerifiedBootState Status des verifizierten Bootmodus.
verifiedBootHash OCTET_STRING Ein Digest aller Daten, die durch den verifizierten Bootmodus geschützt sind. Für Geräte mit Implementierung des verifizierten Bootmodus von Android, wird dieser Wert enthält den Digest des VBMeta-Structs oder des verifizierten Bootmodus. der Metadatenstruktur. Weitere Informationen zur Berechnung dieses Werts finden Sie unter Der VBMeta-Digest

VerifiedBootState-Werte

Die Werte von verifiedBootState haben folgende Bedeutung:

Wert Bedeutung
Verified Gibt eine vollständige Vertrauenskette an, die vom Bootloader bis zum bestätigten Status reicht einschließlich Bootloader, Bootpartition und alle verifizierten Partitionen.
In diesem Status ist der verifiedBootKey-Wert der Hash des eingebetteten d. h. das unveränderliche Zertifikat, das in das ROM gebrannt wurde.
Dieser Status entspricht dem Bootstatus green, wie in der <ph type="x-smartling-placeholder"></ph> Dokumentation zum verifizierten Bootvorgang.
SelfSigned Gibt an, dass die Bootpartition mit der eingebetteten Zertifikat und die Signatur ist gültig. Der Bootloader zeigt eine Warnung an und Fingerabdruck des öffentlichen Schlüssels, bevor der Bootvorgang fortgesetzt werden kann.
In diesem Status ist der Wert verifiedBootKey der Hash der selbstsignaturierenden Zertifikat.
Dieser Status entspricht dem gelben Boot-Status gemäß der Dokumentation <ph type="x-smartling-placeholder"></ph> Dokumentation zum verifizierten Bootvorgang.
Unverified Gibt an, dass ein Gerät uneingeschränkt geändert werden kann. Geräteintegrität Out-of-Band-Verifizierung durch den Nutzer. Der Bootloader zeigt dem Nutzer eine Warnung an. bevor der Bootvorgang fortgesetzt wird.
In diesem Status ist der Wert verifiedBootKey leer.
Dieser Status entspricht dem Bootstatus orange, wie in der <ph type="x-smartling-placeholder"></ph> Dokumentation zum verifizierten Bootvorgang.
Failed Gibt an, dass das Gerät nicht bestätigt werden konnte. Kein Attestierungszertifikat enthält diesen Wert, da der Bootloader in diesem Status anhält. Es ist der hier enthalten sind.
Dieser Status entspricht dem roten Boot-Status gemäß der Dokumentation <ph type="x-smartling-placeholder"></ph> Dokumentation zum verifizierten Bootvorgang.

SecurityLevel-Werte

Die Werte von securityLevel haben folgende Bedeutung:

Wert Bedeutung
Software Der Code, der das relevante Element erstellt oder verwaltet (Attestierung oder Schlüssel) ist im Android-System implementiert und kann geändert werden, wenn dieses System kompromittiert wurden.
TrustedEnvironment Der Code, der das relevante Element erstellt oder verwaltet (Attestierung oder Schlüssel) in einer vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) implementiert wird. Es könnte sein, verändert, wenn das TEE kompromittiert ist, aber der TEE sehr resistent gegen Remote-Angriffe ist. und sind mäßig gegen direkte Hardwareangriffe resistent gegen Manipulationen.
StrongBox Der Code, der das relevante Element erstellt oder verwaltet (Attestierung oder Schlüssel) werden in einem dedizierten Hardware-Sicherheitsmodul implementiert. Es könnte sein, verändert, wenn das Hardware-Sicherheitsmodul kompromittiert ist, ist widerstandsfähig gegen Manipulationen aus der Ferne und sehr resistent gegen Manipulationen durch direkte oder direkte Zugriffe. Hardwareangriff.

Eindeutige ID

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

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

Dabei gilt:

  • T ist der "temporäre Zählerwert", der berechnet wird, indem der Wert von Tag::CREATION_DATETIME um 25.920.000.000, wobei alle Rest. T-Änderungen alle 30 Tage (259.200.000 = 30 × 24 × 60 * 60 * 1000).
  • C ist der Wert von Tag::APPLICATION_ID.
  • R ist 1, wenn Tag::RESET_SINCE_ID_ROTATION gleich im Parameter attest_params an den Aufruf von attest_key übergeben werden, oder 0, wenn der Wert Tag ist nicht vorhanden.
  • HBK ist ein eindeutiges hardwaregebundenes Secret, das der vertrauenswürdigen Ausführungsumgebung und wird nie von ihr offengelegt. Das Secret enthält mindestens 128 Bit Entropie und ist für das jeweilige Gerät einzigartig (probabilistische Eindeutigkeit ist angesichts der 128 Bit Entropie akzeptabel). HBK sollte über HMAC oder AES_CMAC abgeleitet wird.

Kürzt die HMAC_SHA256-Ausgabe auf 128 Bit.

Attestierungsschlüssel und Zertifikate

Zwei Schlüssel, ein RSA und ein ECDSA, sowie die entsprechenden Zertifikatsketten sicher im Gerät bereitgestellt.

Mit Android 12 wird die Remote-Schlüsselbereitstellung eingeführt und für Android 13 sind Geräte erforderlich um sie zu implementieren. Mit der Remote-Schlüsselbereitstellung erhalten Geräte im Außendienst ECDSA P256-Zertifizierungszertifikate pro Anwendung. Diese Zertifikate sind kürzer als die werkseitig bereitgestellten Zertifikate.

Mehrere IMEIs

Unter Android 14 werden nun mehrere IMEIs in den Eintrag zur Android-Schlüsselattestierung. OEMs können diese Funktion implementieren, indem sie ein KeyMint-Tag für eine zweite IMEI hinzufügen. Geräte nutzen immer häufiger mehrere Mobilfunkschnittstellen. und OEMs können jetzt Geräte mit zwei IMEIs unterstützen.

OEMs müssen eine sekundäre IMEI haben, sofern sie auf ihren Geräten vorhanden ist, um der KeyMint-Implementierung(en) bereitgestellt werden, damit diese genauso, wie sie die erste IMEI bestätigen

ID-Attestierung

Android 8.0 bietet optionale Unterstützung für die ID-Attestierung für Geräte mit Keymaster 3. Die ID-Attestierung ermöglicht es dem Gerät, seine Hardware nachzuweisen Seriennummern oder IMEI-Nummern. Dies ist zwar eine optionale Funktion, unbedingt von allen Keymaster 3-Implementierungen unterstützen. da der Nachweis der Identität des Geräts Anwendungsfälle wie wahre Zero-Touch-Remote-Konfiguration für mehr Sicherheit zu sorgen (da die Remote-Seite sicher sein, dass es mit dem richtigen Gerät kommuniziert und nicht durch Geräte-Spoofing Identität).

Bei der ID-Attestierung werden Kopien der Hardwarekennungen des Geräts erstellt auf die nur die vertrauenswürdige Ausführungsumgebung (Trusted Execution Environment, TEE) vor dem Gerät zugreifen kann die Fabrik verlässt. Ein Nutzer kann den Bootloader des Geräts entsperren und die Systemsoftware und die von den Android-Frameworks gemeldeten Kennungen. Die Kopien der Kennung im Besitz des TEE dürfen nicht auf diese Weise manipuliert werden. Sie stellen sicher, dass die Geräte-ID-Attestierung immer nur die eigene Hardwarekennungen und verhindern damit Spoofing-Versuche.

Die Haupt-API-Oberfläche für die ID-Attestierung baut auf dem vorhandenen Schlüssel auf. Attestierungsmechanismus, der mit Keymaster 2 eingeführt wurde. Wenn Sie eine Attestierungszertifikat für einen Schlüssel von Keymaster, der vom Aufrufer angefordert werden kann Die Hardwarekennung des Geräts muss in der Bescheinigung enthalten sein die Metadaten des Zertifikats an. Wenn der Schlüssel im TEE vorhanden ist, wird das Zertifikat zu einer bekannten Vertrauensbasis zurückführen. Der Empfänger eines solchen Zertifikats kann Prüfen Sie, ob das Zertifikat und sein Inhalt, einschließlich der Hardware, -Kennungen, wurden vom TEE geschrieben. Wenn Sie gebeten werden, Hardware anzugeben Kennzeichnungen im Bescheinigungszertifikat bestätigt, bestätigt das TEE nur die im Lager aufbewahrte Kennungen gemäß den Angaben für die Fabrikhalle.

Speichereigenschaften

Der Speicher mit den Gerätekennungen muss folgende Eigenschaften haben:

  • Die aus den ursprünglichen Geräte-IDs abgeleiteten Werte werden an folgenden Ort kopiert: im Speicher, bevor das Gerät in fabrikneuem Zustand ist.
  • Die Methode destroyAttestationIds() kann endgültig löschen der über die ID abgeleiteten Daten. Dauerhafte Vernichtung bedeutet, dass Daten vollständig entfernt, sodass weder das Zurücksetzen auf die Werkseinstellungen noch andere kann sie wiederhergestellt werden. Das ist besonders wichtig für Geräte, auf denen ein Nutzer den Bootloader entsperrt und die Systemsoftware verändert und die von Android zurückgegebenen IDs geändert wurden. Frameworks.
  • RMA-Einrichtungen sollten Folgendes können: neue Kopien der von der Hardwarekennung abgeleiteten Daten generieren. Auf diese Weise Gerät, das die RMA erfolgreich abschließt, kann noch einmal eine ID-Attestierung durchführen. Die Der von RMA-Einrichtungen verwendete Mechanismus muss so geschützt sein, dass Nutzer aufrufen, da dies es ihnen ermöglichen würde, Attestierungen von gefälschte IDs.
  • Nur der vertrauenswürdige Code der Keymaster App im TEE kann den aus einer ID abgeleitete Daten gespeichert werden.
  • Die Speicherung ist manipulationssicher: Wenn der Inhalt des Speichers behandelt das TEE ihn genauso, als ob die Kopien der Inhalte gelöscht wurde und alle ID-Attestierungsversuche ablehnt. Dies wird implementiert, durch Signieren oder MACing des Speichers wie beschrieben unten.
  • Die ursprünglichen IDs werden nicht gespeichert. Weil ID-Attestierung mit einer Herausforderung verbunden ist, stellt der Anrufer immer die IDs bereit, bestätigt haben. Das TEE muss nur überprüfen, ob diese mit den Werten übereinstimmen, die sie ursprünglich hatte. Speichern von sicheren Hashes der ursprünglichen Werte anstelle des Werte aktiviert diese Überprüfung.

Baugewerbe

Um eine Implementierung mit den oben aufgeführten Eigenschaften zu erstellen, speichern Sie den ID-abgeleitete Werte in der folgenden Konstruktion S. Speichern Sie keine weiteren Kopien von ID-Werte mit Ausnahme der normalen Stellen im System, die ein Geräteeigentümer kann durch Rooting geändert werden:

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 empfohlen)
  • HBK ist ein hardwaregebundener Schlüssel, der für keinen anderen Zweck verwendet wird
  • ID1...IDn sind die ursprünglichen ID-Werte. einer Wert eines bestimmten Index hängt von der Implementierung ab, da Geräte haben eine unterschiedliche Anzahl von IDs.
  • || steht für Verkettung.

Da die HMAC-Ausgaben eine feste Größe haben, werden keine Header oder andere Strukturen erforderlich, um einzelne ID-Hashes oder den HMAC von D zu finden. Außerdem zur Prüfung der bereitgestellten Werte zur Durchführung der Attestierung müssen die Implementierungen S überprüfen, indem D aus S extrahiert, HMAC(HBK, D) berechnet und mit den Wert in S, um zu überprüfen, ob einzelne IDs verändert/beschädigt wurden. Außerdem Bei Implementierungen müssen Vergleiche mit konstanten Zeitangaben für alle einzelnen IDs verwendet werden und die Validierung von S. Der Vergleichszeitraum muss unabhängig von die Anzahl der bereitgestellten IDs und die korrekte Übereinstimmung aller Teile des Tests.

Hardware-IDs

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. Herstellername, wie von Build.MANUFACTURER in Android zurückgegeben
  5. Modellname, wie von Build.MODEL in Android zurückgegeben
  6. Seriennummer
  7. IMEIs aller Funkschnittstellen
  8. MEIDs aller Funkschnittstellen

Um die Geräte-ID-Attestierung zu unterstützen, werden diese IDs von einem Gerät bestätigt. Alle mit Android-Geräten haben die ersten sechs. um die Funktion zu nutzen. Wenn das Gerät über integrierte Mobilfunkverbindungen verfügt, muss auch die Attestierung für die IMEIs und/oder MEIDs der Funkschnittstellen unterstützen.

Die ID-Attestierung wird durch eine Schlüsselattestierung angefordert und die Geräte-IDs, die in der Anfrage bestätigt werden sollen. Die IDs sind mit folgenden Tags versehen:

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

Die zu bestätigende Kennung ist ein UTF-8-codierter Bytestring. Dieses Format gilt für numerische Kennzeichnungen. Jede zu bestätigende Kennung wird als UTF-8-codierter String.

Wenn das Gerät keine ID-Attestierung unterstützt (oder destroyAttestationIds() wurde bereits angerufen und das Gerät kann keine länger seine IDs bestätigen), werden alle Schlüsselattestierungsanfragen gesendet, die mindestens eine der schlagen diese Tags mit ErrorCode::CANNOT_ATTEST_IDS fehl.

Wenn das Gerät die ID-Attestierung unterstützt und mindestens eines der oben genannten Tags Schlüsselattestierungsanfrage enthalten, prüft das TEE die ID die jeweils mit der Kopie der Hardwarekennungen übereinstimmen. Wenn eine oder mehrere Kennzeichnungen nicht übereinstimmen, schlägt die gesamte Attestierung fehl mit ErrorCode::CANNOT_ATTEST_IDS Es ist gültig, dass dasselbe Tag mehrfach angegeben werden. Das kann beispielsweise beim Bestätigen von IMEIs nützlich sein: Ein Gerät kann mehrere Funkschnittstellen mit mehreren IMEIs haben. Eine Attestierungsanfrage ist gültig, wenn der mit jedem ATTESTATION_ID_IMEI angegebene Wert übereinstimmt eines der Funkschnittstellen des Geräts. Dasselbe gilt für alle anderen Tags.

Wenn die Attestierung erfolgreich ist, werden die attestierten IDs Attestierungserweiterung (OID 1.3.6.1.4.1.11129.2.1.17) des ausgestellten Bescheinigungszertifikats, mithilfe des Schemas oben. Änderungen gegenüber Keymaster 2 Attestierungsschemas sind fett formatiert und enthalten Kommentare.

Java API

Dieser Abschnitt dient nur zur Information. Keine der Keymaster-Implementierer die Java-API implementieren oder nutzen. Sie soll den Implementierern helfen, zu verstehen, wie die Funktion von Anwendungen genutzt wird. Möglicherweise wird es von Systemkomponenten verwendet Daher ist es wichtig, dass dieser Abschnitt nicht als normativ behandelt wird.