调试注册错误

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:错误以“No wrapper found”(未找到封装容器)或类似内容开头。

您正在调用 GetPrimitive() 来获取不在 Configuration 中(或尚未注册)的基元类型。

在采用 Configuration 对象的语言(例如 Java 和 C++)中,请确保传递支持该原语的 Configuration。在 Java 中,我们建议传递 TinkConfig2026.get()(支持所有 Tink 原语,包括 KeysetDeriver、JwtMac、JwtPublicKeySign 和 JwtPublicKeyVerify),或传递特定于原语的配置,例如 AeadConfig2026.get()、KeyDerivationConfig2026.get() 或 JwtConfig2026.get()。

在使用全局注册的语言或旧版 API 中(或者如果您在 Java 中传递 RegistryConfiguration.get()),通常可以通过在二进制文件中的较早位置调用 TinkConfig.register() 来解决此问题。注册一次即可,并且可以在启动时完成。某些原语需要更专业的注册:

  • KeysetDeriver 需要 KeyDerivationConfig.register()
  • JwtMac 需要 JwtMacConfig.register()
  • JwtPublicKeySign 和 JwtPublicKeyVerify 需要 JwtSignatureConfig.register()

情况 2:错误列出了密钥类型和基元。

例如,对于某些特定的 P 和 T 值,错误消息可能会显示 Unable to get primitive interface P for key of type T。

在这种情况下,Tink 无法为您拥有的密钥集创建您请求的特定原语。通常,发生这种情况是因为您的密钥集类型不正确。例如,您可能请求的是 Mac,但密钥集是 Aead。

一种常见情况是,用户尝试从包含私钥的密钥集中获取公钥原语。如需查看是否存在此问题,请考虑改为对 GetPublicKeysetHandle() 的结果调用 GetPrimitive()。

如果这没有帮助,您可以在跨语言测试中找到密钥类型的最新列表(点击此处)。您应检查原语 P 是否与密钥类型 T 一起列出。

如果原语与相应的密钥类型一起列出,则可能是您所用语言的 Tink 实现不支持密钥类型 T。查看密钥类型列表,了解 Tink 是否支持您所用语言的密钥类型。