Tink sustituye las claves individuales por keysets —colecciones de claves con ID, una de ellas marcada como primaria— y los algoritmos por plantillas con nombre, como ECDSA_P256 o ED25519. Las primitivas (PublicKeySign, PublicKeyVerify) rotan las claves de forma transparente, que es el objetivo del diseño y el origen de sus sorpresas de interoperabilidad. Los keysets se almacenan como JSON de Tink o protobuf binario, no como PEM.
La plantilla predeterminada ECDSA_P256 antepone un prefijo de salida: 0x01 y el ID de clave de 4 bytes, seguidos de una firma DER. El JDK rechazó una firma así con Invalid encoding for signature, y lo mismo hará cualquier verificador que no sea Tink. Las plantillas terminadas en _WITHOUT_PREFIX o _RAW eliminan el prefijo, pero los nombres también ocultan la codificación: ECDSA_P256_RAW produjo 64 bytes de r‖s IEEE P1363, no DER; se verificó con SHA256withECDSAinP1363Format del JDK y falló con SHA256withECDSA. Elige la plantilla según la codificación exacta que espera el otro lado, como hace el ejemplo con ECDSA_P256_IEEE_P1363_WITHOUT_PREFIX, y comprueba los bytes con el conversor DER ⇄ en bruto.
Una clave pública externa se importa mediante SignaturePemKeysetReader, y la clave resultante solo verificó firmas DER: la misma firma en bruto que aceptaba la clave P1363 generada por el propio Tink falló con la clave importada desde PEM hasta que se volvió a codificar como DER. Las firmas usan nonces aleatorios, s no se normaliza y la verificación acepta high-S; una entrada no válida lanza GeneralSecurityException: invalid signature.
Tink para Java 1.24.0 ofrece plantillas de ECDSA en P-256, P-384 y P-521, de Ed25519 y de RSA (PKCS#1 v1.5 y PSS); en esta versión no hay registrada ninguna plantilla ML-DSA ni SLH-DSA (Name ML_DSA_65 does not exist). Para firmas poscuánticas en la JVM hoy, consulta Java JCA o Bouncy Castle.