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
.