Die KeyMint API (früher Keymaster) verwendet in großem Umfang Autorisierungstags, die Name-Wert-Paare sind. Jedes mögliche Tag hat:
- Ein Enum-Name mit zugehörigem Wert
- Ein zugehöriger Typ (z. B. Ganzzahl, Byte, Datum, Enum), der angibt, ob mehrere Werte zulässig sind
Das Tag mit dem Namen Tag::BLOCK_MODE
hat beispielsweise den Basis-Enum-Wert 4
und den TagType::ENUM_REP
-Typmarker, der angibt, dass der zugehörige Wert ein wiederholbares Enum ist (in diesem Fall BlockMode
).
Tags haben in der API eine doppelte Funktion:
- Als Parameter für einen Vorgang, der für die API ausgeführt wird, z. B. die
Tag::MAC_LENGTH
für einen HMAC-Signierungsvorgang, gibt die angeforderte HMAC-Länge an. - Als Schlüsselmerkmale werden Werte bezeichnet, die dauerhaft an einen bestimmten Schlüssel gebunden sind (d. h. im Schlüssel-Blob enthalten sind). Das
Tag::EC_CURVE
gibt beispielsweise an, für welche elliptische Kurve ein Schlüssel bestimmt ist. Jedes Schlüsselmerkmal ist einer Sicherheitsstufe zugeordnet, die angibt, welcher Teil des Systems das Attribut überwacht:- Ein wichtiges Merkmal mit dem Sicherheitsniveau
TRUSTED_ENVIRONMENT
oderSTRONGBOX
wird in der sicheren Hardware erzwungen. - Ein wichtiges Merkmal der Sicherheitsstufe
SOFTWARE
oderKEYSTORE
ist, dass es nur vom Systemdienstkeystore2
erzwungen wird. Daher ist ein solches Merkmal nicht gegen eine Kompromittierung des Betriebssystems geschützt.
- Ein wichtiges Merkmal mit dem Sicherheitsniveau
Viele Tags fungieren sowohl als wichtige Merkmale als auch als Parameter:
- Die wichtigsten Merkmale geben die zulässigen Parameter für einen Schlüssel an, z. B.:
- Die
Tag::PURPOSE
eines ECDSA-Schlüssels kann sowohlSIGN
als auchAGREE_KEY
enthalten. - Die
Tag::BLOCK_MODE
für einen AES-Schlüssel kann die Modi ECB, CBC und CTR enthalten.
- Die
- Eine
begin()
-Anfrage enthält dann einen bestimmten Parameterwert für den Vorgang, z. B.:begin()
hat einen expliziten Parameter für den Zweck, der mit einem derTag::PURPOSE
-Werte der wichtigsten Merkmale übereinstimmen muss.begin()
für einen AES-Vorgang muss einen einzelnen Wert fürTag::BLOCK_MODE
im Feldparams
enthalten, der mit einem der Werte in den Schlüsselmerkmalen übereinstimmen muss.
Diese Doppelfunktion ist besonders relevant für die Erfassung von Tags, die als keyParams
bei einem Schlüsselgenerierungs- oder Importvorgang übergeben werden.
- Einige der Tags fungieren als Parameter für den Vorgang zur Schlüsselgenerierung. Das Tag
Tag::CERTIFICATE_SUBJECT
wirkt sich beispielsweise nur auf die Generierung asymmetrischer Schlüssel aus, indem es ein Feld im zurückgegebenen X.509-Zertifikat steuert. - Andere Tags werden als Schlüsselmerkmale an den neu generierten Schlüssel gebunden und im zurückgegebenen Keyblob gekapselt, sodass sie dauerhaft mit dem Schlüssel verknüpft sind.
Detaillierte Informationen zu Tag-Werten finden Sie in den folgenden HAL-Spezifikationen:
- KeyMint: Alle Tags sind im relevanten Android-Release-Branch in
Tag.aidl
definiert. - Keymaster: Tags werden in
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
für die jeweiligekeymaster-version
definiert, z. B.3.0/types.hal
für Keymaster 3 und4.0/types.hal
für Keymaster 4. Für Keymaster 2 und niedriger werden Tags inplatform/hardware/libhardware/include/hardware/keymaster_defs.h
definiert.