O ring oferece uma lista curta de algoritmos, com assembly derivado do BoringSSL e uma API resistente a uso indevido: não há como escolher um nonce, assinar um digest pré-calculado nem carregar uma chave em um formato incomum. Isso o torna rápido e difícil de usar errado, e é por isso que o trabalho fica na conversão de chaves e assinaturas vindas de outras stacks.
A codificação faz parte do algoritmo: ECDSA_P256_SHA256_FIXED_SIGNING produz r‖s bruto de 64 bytes e ECDSA_P256_SHA256_ASN1_SIGNING, DER, com as constantes de verificação _FIXED e _ASN1 correspondentes. Uma assinatura verificada com a outra constante simplesmente falha com Unspecified, então uma assinatura JWS verificada com a constante ASN1 — ou uma assinatura do OpenSSL com a FIXED — parece exatamente uma assinatura forjada. O exemplo mostra os dois resultados. As assinaturas usam um nonce aleatório, o s não é normalizado e a verificação aceita as duas metades.
As chaves privadas são lidas apenas como PKCS#8 DER, e as chaves Ed25519 precisam ser PKCS#8 v2 com a chave pública incluída: a forma v1 de 48 bytes, que o OpenSSL e a maioria das ferramentas gravam, foi rejeitada por Ed25519KeyPair::from_pkcs8 com VersionNotSupported, enquanto from_pkcs8_maybe_unchecked e from_seed_unchecked a aceitaram. Chaves privadas PEM, SEC1 e JWK precisam ser convertidas antes, por exemplo com o conversor de JWK. As chaves públicas são pontos SEC1 isolados: public_key() retorna a forma não comprimida de 65 bytes, e pontos comprimidos não são aceitos.
A lista de curvas se resume à P-256 e à P-384, além do Ed25519; não há P-521, secp256k1 nem algoritmo pós-quântico. Projetos que precisam deles, ou de validação FIPS, migram para o aws-lc-rs, que oferece uma API compatível com o ring.
Para conferir em que codificação está uma assinatura do ring, cole-a no conversor DER ⇄ bruto.