Autorisierungs-Tags

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 oder STRONGBOX wird in der sicheren Hardware erzwungen.
    • Ein wichtiges Merkmal der Sicherheitsstufe SOFTWARE oder KEYSTORE ist, dass es nur vom Systemdienst keystore2 erzwungen wird. Daher ist ein solches Merkmal nicht gegen eine Kompromittierung des Betriebssystems geschützt.

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 sowohl SIGN als auch AGREE_KEY enthalten.
    • Die Tag::BLOCK_MODE für einen AES-Schlüssel kann die Modi ECB, CBC und CTR enthalten.
  • 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 der Tag::PURPOSE-Werte der wichtigsten Merkmale übereinstimmen muss.
    • begin() für einen AES-Vorgang muss einen einzelnen Wert für Tag::BLOCK_MODE im Feld params 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: