O Tink substitui chaves individuais por keysets — conjuntos de chaves com IDs, uma delas marcada como primária — e algoritmos por templates com nome, como ECDSA_P256 ou ED25519. As primitivas (PublicKeySign, PublicKeyVerify) fazem a rotação de chaves de forma transparente, o que é o objetivo do design e a origem de suas surpresas de interoperabilidade. Os keysets são armazenados como JSON do Tink ou protobuf binário, não como PEM.
O template padrão ECDSA_P256 antepõe um prefixo de saída: 0x01 e o ID da chave, de 4 bytes, seguidos de uma assinatura DER. O JDK rejeitou uma assinatura assim com Invalid encoding for signature, e o mesmo fará qualquer verificador que não seja o Tink. Os templates terminados em _WITHOUT_PREFIX ou _RAW removem o prefixo, mas os nomes também escondem a codificação: ECDSA_P256_RAW produziu 64 bytes de r‖s IEEE P1363, não DER — a assinatura foi verificada com o SHA256withECDSAinP1363Format do JDK e falhou com SHA256withECDSA. Escolha o template pela codificação exata que o outro lado espera, como o exemplo faz com ECDSA_P256_IEEE_P1363_WITHOUT_PREFIX, e confira os bytes com o conversor DER ⇄ bruto.
A importação de uma chave pública externa passa por SignaturePemKeysetReader, e a chave resultante só verificou assinaturas DER: a mesma assinatura bruta que a chave P1363 do próprio Tink aceitou falhou com a chave importada de PEM até ser recodificada como DER. As assinaturas usam nonces aleatórios, o s não é normalizado e a verificação aceita high-S; uma entrada inválida lança GeneralSecurityException: invalid signature.
O Tink para Java 1.24.0 oferece templates de ECDSA na P-256, na P-384 e na P-521, de Ed25519 e de RSA (PKCS#1 v1.5 e PSS); nenhum template de ML-DSA ou SLH-DSA está registrado nesta versão (Name ML_DSA_65 does not exist). Para assinaturas pós-quânticas na JVM hoje, veja o Java JCA ou o Bouncy Castle.