Tink replaces individual keys with keysets — collections of keys with ids, one marked primary — and algorithms with named templates such as ECDSA_P256 or ED25519. The primitives (PublicKeySign, PublicKeyVerify) rotate keys transparently, which is the point of the design and the source of its interop surprises. Keysets are stored as Tink JSON or binary protobuf, not PEM.
The default ECDSA_P256 template prepends an output prefix: 0x01 and the 4-byte key id, followed by a DER signature. The JDK rejected such a signature with Invalid encoding for signature, as will every non-Tink verifier. Templates ending in _WITHOUT_PREFIX or _RAW drop the prefix, but the names also hide the encoding: ECDSA_P256_RAW produced 64 bytes of IEEE P1363 r‖s, not DER — it verified with the JDK's SHA256withECDSAinP1363Format and failed with SHA256withECDSA. Pick the template by the exact encoding the other side expects, as the sample does with ECDSA_P256_IEEE_P1363_WITHOUT_PREFIX, and check the bytes with the DER ⇄ raw converter.
Importing a foreign public key goes through SignaturePemKeysetReader, and the resulting key verified DER signatures only: the same raw signature that its own P1363 key accepted failed against the PEM-imported key until it was re-encoded as DER. Signatures use random nonces, s is not normalized and verification accepts high-S; invalid input raises GeneralSecurityException: invalid signature.
Tink for Java 1.24.0 offers ECDSA on P-256, P-384 and P-521, Ed25519 and RSA (PKCS#1 v1.5 and PSS) templates; no ML-DSA or SLH-DSA template is registered in this release (Name ML_DSA_65 does not exist). For post-quantum signatures on the JVM today see Java JCA or Bouncy Castle.