API KeyMint (ранее Keymaster) широко использует теги авторизации , представляющие собой пары «имя-значение». Каждый возможный тег имеет:
- Имя перечисления с соответствующим значением
- Связанный тип (например, целое число, байты, дата, перечисление), который включает указание, допускается ли несколько значений
Например, тег с именем Tag::BLOCK_MODE имеет базовое значение перечисления 4 и маркер типа TagType::ENUM_REP , который указывает, что связанное значение является повторяемым перечислением (в данном случае BlockMode ).
Теги выполняют двойную функцию в API:
- Например, в качестве параметров для операции, выполняемой через API,
Tag::MAC_LENGTHв операции подписания HMAC указывает запрошенную длину HMAC. - В качестве ключевых характеристик используются значения, постоянно привязанные к определённому ключу (то есть включённые в ключевой блок), например,
Tag::EC_CURVEуказывает, к какой эллиптической кривой относится ключ. Каждая ключевая характеристика связана с уровнем безопасности, который указывает, какая часть системы контролирует данный атрибут:- В защищенном оборудовании реализована ключевая характеристика с уровнем безопасности
TRUSTED_ENVIRONMENTилиSTRONGBOX. - Ключевая характеристика с уровнем безопасности
SOFTWAREилиKEYSTOREобеспечивается только системной службойkeystore2(и поэтому такая характеристика неустойчива к взлому ОС).
- В защищенном оборудовании реализована ключевая характеристика с уровнем безопасности
Многие теги выступают одновременно в качестве ключевых характеристик и параметров:
- Характеристики ключа указывают набор допустимых параметров для ключа, например:
-
Tag::PURPOSEключа ECDSA может включать какSIGN, так иAGREE_KEY. -
Tag::BLOCK_MODEдля ключа AES может включать режимы ECB, CBC и CTR.
-
- Затем запрос
begin()включает конкретное значение параметра для операции, например:-
begin()имеет явный параметр назначения, который должен соответствовать одному из значенийTag::PURPOSEключевых характеристик. -
begin()для операции AES должен включать одно значение дляTag::BLOCK_MODEв полеparams, которое должно соответствовать одному из значений в ключевых характеристиках.
-
Эта двойная функция особенно актуальна для сбора тегов, переданных как keyParams при генерации ключа или операции импорта.
- Некоторые теги действуют как параметры для самой операции генерации ключа. Например, тег
Tag::CERTIFICATE_SUBJECTвлияет только на процесс генерации (асимметричного) ключа, управляя полем в возвращаемом сертификате X.509. - Другие теги привязываются к вновь сгенерированному ключу как ключевые характеристики и инкапсулируются в возвращаемый ключевой блок, чтобы они были постоянно связаны с ключом.
Подробную информацию о значениях тегов можно найти в следующих спецификациях интерфейса HAL:
- KeyMint — Все теги определены в
Tag.aidlв соответствующей ветке выпуска Android. - Keymaster — теги определены в
platform/hardware/interfaces/keymaster/ keymaster-version /types.halдля каждой соответствующейkeymaster-version, например3.0/types.halдля Keymaster 3 и4.0/types.halдля Keymaster 4. Для Keymaster 2 и ниже теги определены вplatform/hardware/libhardware/include/hardware/keymaster_defs.h.