Tink remplace les clés individuelles par des jeux de clés (keysets), c’est-à-dire des collections de clés dotées d’identifiants dont l’une est marquée comme principale, et les algorithmes par des modèles nommés (templates) comme ECDSA_P256 ou ED25519. Les primitives (PublicKeySign, PublicKeyVerify) assurent la rotation des clés de façon transparente : c’est tout l’intérêt de cette conception, et aussi la source de ses surprises d’interopérabilité. Les jeux de clés sont stockés en JSON Tink ou en protobuf binaire, pas en PEM.
Le modèle par défaut ECDSA_P256 ajoute en tête un préfixe de sortie : 0x01 et l’identifiant de clé sur 4 octets, suivis d’une signature DER. Le JDK a rejeté une telle signature avec Invalid encoding for signature, comme le fera tout vérificateur autre que Tink. Les modèles dont le nom se termine par _WITHOUT_PREFIX ou _RAW suppriment le préfixe, mais les noms masquent aussi l’encodage : ECDSA_P256_RAW a produit 64 octets de r‖s IEEE P1363, et non du DER ; la signature a été vérifiée avec le SHA256withECDSAinP1363Format du JDK et a échoué avec SHA256withECDSA. Choisissez le modèle selon l’encodage exact qu’attend l’autre côté, comme le fait l’exemple avec ECDSA_P256_IEEE_P1363_WITHOUT_PREFIX, et contrôlez les octets avec le convertisseur DER ⇄ brut.
L’import d’une clé publique externe passe par SignaturePemKeysetReader, et la clé obtenue n’a vérifié que des signatures DER : la même signature brute, acceptée par une clé P1363 propre à Tink, a échoué face à la clé importée depuis PEM tant qu’elle n’avait pas été réencodée en DER. Les signatures utilisent des nonces aléatoires, s n’est pas normalisé et la vérification accepte les signatures high-S ; une entrée invalide lève GeneralSecurityException: invalid signature.
Tink pour Java 1.24.0 propose des modèles ECDSA sur P-256, P-384 et P-521, Ed25519 et RSA (PKCS#1 v1.5 et PSS) ; aucun modèle ML-DSA ou SLH-DSA n’est enregistré dans cette version (Name ML_DSA_65 does not exist). Pour des signatures post-quantiques sur la JVM aujourd’hui, consultez Java JCA ou Bouncy Castle.