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 vongenerateKey
, für die die Attestierung erstellt wird.attestParams
ist eine Liste aller Parameter, die für Attestierung. Dazu gehörenTag::ATTESTATION_CHALLENGE
und möglicherweiseTag::RESET_SINCE_ID_ROTATION
sowieTag::APPLICATION_ID
undTag::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 vonkeyToAttest
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 vonTag::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 vonTag::APPLICATION_ID
.R
ist 1, wennTag::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 wirdID1...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:
- Markenname, wie von
Build.BRAND
in Android zurückgegeben - Gerätename, wie von
Build.DEVICE
in Android zurückgegeben - Produktname, wie von
Build.PRODUCT
in Android zurückgegeben - Herstellername, wie von
Build.MANUFACTURER
in Android zurückgegeben - Modellname, wie von
Build.MODEL
in Android zurückgegeben - Seriennummer
- IMEIs aller Funkschnittstellen
- 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.