Как устранять ошибки регистрации

Иногда Tink выдает сообщения об ошибках, например:

  • No wrapper registered for type
  • No manager for type T has been registered
  • Unable to get primitive interface P for key of type T

Эта страница помогает устранять такие проблемы.

Случай 1. Ошибка начинается со слов "Контейнер не найден" или аналогичных.

Вы вызываете GetPrimitive(), чтобы получить примитивный тип, которого нет в Configuration (или который не был зарегистрирован).

В языках, которые принимают объект Configuration (например, Java и C++), убедитесь, что вы передаете Configuration, который поддерживает примитив. В Java рекомендуется передавать TinkConfig2026.get(), который поддерживает все примитивы Tink (включая KeysetDeriver, JwtMac, JwtPublicKeySign и JwtPublicKeyVerify), или конфигурацию для конкретного примитива, например AeadConfig2026.get(), KeyDerivationConfig2026.get() или JwtConfig2026.get().

В языках или устаревших API, использующих глобальную регистрацию (или если вы передаете RegistryConfiguration.get() в Java), это обычно исправляется вызовом TinkConfig.register() где-то ранее в двоичном файле. Достаточно зарегистрировать его один раз при запуске. Для некоторых примитивов требуется более специализированная регистрация:

  • Для KeysetDeriver требуется KeyDerivationConfig.register()
  • Для JwtMac требуется JwtMacConfig.register()
  • Для JwtPublicKeySign и JwtPublicKeyVerify требуется JwtSignatureConfig.register()

Случай 2. В сообщении об ошибке указаны тип ключа и примитив.

Например, в сообщении об ошибке может быть указано Unable to get primitive interface P for key of type T для определенных значений P и T.

В этом случае Tink не может создать примитив, который вы запросили для имеющегося набора ключей. Обычно это происходит, если у вас есть набор ключей неправильного типа. Например, вы запрашиваете Mac, а набор ключей предназначен для Aead.

Один из распространенных случаев – попытка получить примитив открытого ключа из набора ключей, содержащего закрытые ключи. Чтобы проверить, в этом ли проблема, попробуйте вызвать GetPrimitive() для результата GetPublicKeysetHandle().

Если это не поможет, актуальный список типов ключей можно найти здесь, в наших межъязыковых тестах. Проверьте, указан ли примитив P вместе с типом ключа T.

Если примитив указан с соответствующим типом ключа, возможно, реализация Tink для вашего языка не поддерживает тип ключа T. Проверьте список типов ключей, чтобы узнать, поддерживает ли Tink ваш тип ключа на вашем языке.