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
.