Die KeyMint API (früher Keymaster API) verwendet häufig Autorisierungs-Tags, also Namens-/Wertpaare. Jedes mögliche Tag hat:
- Ein Enum-Name mit zugehörigem Wert
- Ein zugeordneter Typ (z. B. „integer“, „bytes“, „date“, „enum“), der angibt, ob mehrere Werte zulässig sind
Das Tag mit dem Namen Tag::BLOCK_MODE
hat beispielsweise den Basisenumwert 4
und die Typmarkierung TagType::ENUM_REP
, die angibt, dass der zugehörige Wert ein wiederholbares Enum ist (in diesem Fall BlockMode
).
Tags haben in der API zwei Funktionen:
- Als Parameter für einen Vorgang, der in der API ausgeführt wird, gibt beispielsweise
Tag::MAC_LENGTH
bei einem HMAC-Signaturvorgang 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). Beispielsweise gibt
Tag::EC_CURVE
an, für welche elliptische Kurve ein Schlüssel bestimmt ist. Jede wichtige Eigenschaft ist mit einer Sicherheitsstufe verknüpft, die angibt, welcher Teil des Systems das Attribut überwacht:- Eine wichtige Eigenschaft des Sicherheitsniveaus
TRUSTED_ENVIRONMENT
oderSTRONGBOX
wird in der sicheren Hardware erzwungen. - Eine wichtige Eigenschaft mit dem Sicherheitslevel
SOFTWARE
oderKEYSTORE
wird nur vomkeystore2
-Systemdienst erzwungen. Eine solche Eigenschaft ist daher nicht widerstandsfähig gegen Manipulationen des Betriebssystems.
- Eine wichtige Eigenschaft des Sicherheitsniveaus
Viele Tags dienen sowohl als wichtige Merkmale als auch als Parameter:
- Die Schlüsselmerkmale 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 Parameter für den ausdrücklichen Zweck, der mit einem derTag::PURPOSE
-Werte der Hauptmerkmale ü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üsseleigenschaften übereinstimmen muss.
Diese Doppelfunktion ist besonders relevant für die Erfassung von Tags, die bei der Schlüsselgenerierung oder dem Import als keyParams
übergeben werden.
- Einige der Tags dienen als Parameter für die Schlüsselgenerierung. Das
Tag::CERTIFICATE_SUBJECT
-Tag wirkt sich beispielsweise nur auf den (asymmetrischen) Schlüsselgenerierungsprozess aus, indem ein Feld im zurückgegebenen X.509-Zertifikat gesteuert wird. - Andere Tags werden dem neu generierten Schlüssel als Schlüsselmerkmale zugeordnet und im zurückgegebenen Schlüsselblob gekapselt, sodass sie dauerhaft mit dem Schlüssel verknüpft sind.
Ausführliche Informationen zu Tag-Werten finden Sie in den folgenden HAL-Schnittstellenspezifikationen:
- KeyMint: Alle Tags werden in
Tag.aidl
im entsprechenden Android-Release-Branch 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. Bei Keymaster 2 und niedriger werden Tags inplatform/hardware/libhardware/include/hardware/keymaster_defs.h
definiert.