Теги авторизации

API KeyMint (ранее Keymaster) широко использует теги авторизации , представляющие собой пары «имя-значение». Каждый возможный тег имеет следующие свойства:

  • Имя перечисления с соответствующим значением
  • Связанный тип (например, integer, bytes, date, enum), который указывает, допускается ли наличие нескольких значений.

Например, тег с именем 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() имеет явно заданный параметр purpose, который должен соответствовать одному из значений Tag::PURPOSE ключевых характеристик.
    • Для выполнения операции AES метод begin() должен включать в поле params единственное значение параметра Tag::BLOCK_MODE , которое должно совпадать с одним из значений в характеристиках ключа.

Эта двойная функция особенно актуальна для набора тегов, передаваемых в качестве keyParams при генерации или импорте ключей.

  • Некоторые из тегов выступают в качестве параметров для самой операции генерации ключа. Например, Tag::CERTIFICATE_SUBJECT влияет только на процесс генерации (асимметричного) ключа, управляя полем в возвращаемом сертификате X.509.
  • Другие теги привязываются к вновь сгенерированному ключу в качестве его характеристик и инкапсулируются в возвращаемый keyblob, так что они постоянно связаны с ключом.

Подробную информацию о значениях тегов можно найти в следующих спецификациях интерфейса 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 .