Die KeyMint API (ehemals Keymaster) verwendet Autorisierungs-Tags, die Name-Wert-Paare sind. Jedes mögliche Tag hat:
- Einen Enum-Namen mit zugehörigem Wert
- Einen zugehörigen Typ (z. B. Ganzzahl, Byte, Datum, Enum), der anzeigt, ob mehrere Werte zulässig sind
Das Tag mit dem Namen
Tag::BLOCK_MODE
hat beispielsweise den Enum-Basiswert 4 und einen TagType::ENUM_REP-Typ
marker, der angibt, dass der zugehörige Wert ein wiederholbarer Enum-Wert ist (in diesem
Fall BlockMode).
Tags haben in der API eine Doppelfunktion:
- Als Parameter für einen Vorgang, der in der API ausgeführt wird. Bei einem HMAC-Signierungsvorgang gibt
Tag::MAC_LENGTHbeispielsweise die angeforderte HMAC-Länge an. - Als Schlüsselmerkmale, also Werte, die dauerhaft
an einen bestimmten Schlüssel gebunden sind (d. h. im Schlüssel-Blob enthalten sind).
Tag::EC_CURVEgibt beispielsweise an, für welche elliptische Kurve ein Schlüssel bestimmt ist. Jedes Schlüsselmerkmal ist mit einem Sicherheitsniveau verknüpft, das angibt welcher Teil des Systems das Attribut erzwingt:- Ein Schlüsselmerkmal mit der Sicherheitsstufe
TRUSTED_ENVIRONMENToderSTRONGBOXwird in der sicheren Hardware erzwungen. - Ein Schlüsselmerkmal mit dem Sicherheitsniveau
SOFTWAREoderKEYSTOREwird nur vom Systemdienstkeystore2erzwungen. Ein solches Merkmal ist daher nicht vor einer Kompromittierung des Betriebssystems geschützt.
- Ein Schlüsselmerkmal mit der Sicherheitsstufe
Viele Tags fungieren sowohl als Schlüsselmerkmale als auch als Parameter:
- Die Schlüsselmerkmale geben die zulässigen Parameter für einen Schlüssel an,
z. B.:
- Der
Tag::PURPOSEeines ECDSA-Schlüssels kann sowohlSIGNals auchAGREE_KEYenthalten. - Der
Tag::BLOCK_MODEfür einen AES-Schlüssel kann die Modi ECB, CBC, und CTR enthalten.
- Der
- Eine
begin()Anfrage enthält dann einen bestimmten Parameterwert für den Vorgang, z. B.:begin()hat einen expliziten Zweckparameter, der mit einem derTag::PURPOSEWerte der Schlüsselmerkmale übereinstimmen muss.begin()für einen AES-Vorgang muss im Feldparamseinen einzelnen Wert fürTag::BLOCK_MODEenthalten, der mit einem der Werte in den Schlüsselmerkmalen übereinstimmen muss.
Diese Doppelfunktion ist besonders relevant für die Sammlung von Tags, die bei einem Vorgang zur Schlüsselerstellung oder zum Schlüsselimport als keyParams übergeben werden.
- Einige der Tags fungieren als Parameter für den Vorgang zur Schlüsselerstellung selbst. Das Tag
Tag::CERTIFICATE_SUBJECTwirkt sich beispielsweise nur auf den (asymmetrischen) Prozess zur Schlüsselerstellung aus, indem es ein Feld im zurückgegebenen X.509-Zertifikat steuert. - Andere Tags sind als Schlüssel merkmale an den neu generierten Schlüssel gebunden und im zurückgegebenen Schlüssel-Blob gekapselt, sodass sie dauerhaft mit dem Schlüssel verknüpft sind.
Detaillierte Informationen zu Tag-Werten finden Sie in den folgenden HAL-Spezifikationen der Schnittstelle:
- KeyMint: Alle Tags sind im relevanten Android-Release-Branch in
Tag.aidldefiniert. - Keymaster: Tags sind definiert
in
platform/hardware/interfaces/keymaster/keymaster-version/types.halfür jede entsprechendekeymaster-version, z. B.3.0/types.halfür Keymaster 3 und4.0/types.halfür Keymaster 4. Für Keymaster 2 und niedriger, Tags sind definiert inplatform/hardware/libhardware/include/hardware/keymaster_defs.h.