Tink заменяет отдельные ключи наборами ключей (keysets), а алгоритмы — именованными шаблонами, например ECDSA_P256 или ED25519; набор ключей — это коллекция ключей с идентификаторами, один из которых помечен как основной. Примитивы (PublicKeySign, PublicKeyVerify) прозрачно выполняют ротацию ключей: в этом смысл такой архитектуры и источник её неожиданностей при взаимодействии с другими библиотеками. Наборы ключей хранятся в формате Tink JSON или в двоичном protobuf, а не в PEM.
Стандартный шаблон ECDSA_P256 добавляет в начало подписи префикс вывода (output prefix): 0x01 и 4-байтовый идентификатор ключа, за которыми следует подпись DER. JDK отклонил такую подпись с ошибкой Invalid encoding for signature, и так же поступит любой код проверки, кроме Tink. Шаблоны, имена которых заканчиваются на _WITHOUT_PREFIX или _RAW, не добавляют префикс, но имена скрывают и кодировку: ECDSA_P256_RAW выдал 64 байта IEEE P1363 r‖s, а не DER, и такая подпись прошла проверку с SHA256withECDSAinP1363Format из JDK, но не прошла с SHA256withECDSA. Выбирайте шаблон по точной кодировке, которую ожидает другая сторона, как пример делает с ECDSA_P256_IEEE_P1363_WITHOUT_PREFIX, и проверяйте байты в конвертере DER ⇄ raw.
Сторонний открытый ключ импортируется через SignaturePemKeysetReader, и полученный ключ проверял только подписи DER: та же подпись raw, которую принимал ключ, созданный в Tink по шаблону P1363, не проходила проверку с ключом, импортированным из PEM, пока её не перекодировали в DER. При подписи используются случайные nonce, s не нормализуется, а проверка принимает high-S; некорректные входные данные вызывают GeneralSecurityException: invalid signature.
Tink для Java 1.24.0 предлагает шаблоны ECDSA на P-256, P-384 и P-521, Ed25519 и RSA (PKCS#1 v1.5 и PSS); шаблонов ML-DSA и SLH-DSA в этом релизе не зарегистрировано (Name ML_DSA_65 does not exist). Для постквантовых подписей на JVM сейчас используйте Java JCA или Bouncy Castle.