ring ofrece una lista corta de algoritmos con código ensamblador derivado de BoringSSL y una API resistente al mal uso: no hay forma de elegir un nonce, firmar un resumen precalculado ni cargar una clave en un formato poco habitual. Eso la hace rápida y difícil de usar mal, y es la razón de que el trabajo esté en convertir claves y firmas de otros stacks.
La codificación forma parte del algoritmo: ECDSA_P256_SHA256_FIXED_SIGNING produce r‖s en bruto de 64 bytes y ECDSA_P256_SHA256_ASN1_SIGNING, DER, con sus constantes de verificación _FIXED y _ASN1 correspondientes. Una firma comprobada con la otra constante simplemente falla con Unspecified, así que una firma JWS verificada con la constante ASN1 —o una firma de OpenSSL con FIXED— parece exactamente una falsificación. El ejemplo muestra ambos resultados. Las firmas usan un nonce aleatorio, s no se normaliza y la verificación acepta ambas mitades.
Las claves privadas solo se leen como DER PKCS#8, y las claves Ed25519 deben ser PKCS#8 v2 con la clave pública incluida: Ed25519KeyPair::from_pkcs8 rechazó con VersionNotSupported la forma v1 de 48 bytes que escriben OpenSSL y la mayoría de las herramientas, mientras que from_pkcs8_maybe_unchecked y from_seed_unchecked la aceptaron. Las claves privadas PEM, SEC1 y JWK hay que convertirlas antes, por ejemplo con el conversor de JWK. Las claves públicas son puntos SEC1 sin envoltorio: public_key() devuelve el formato sin comprimir de 65 bytes, y los puntos comprimidos no se aceptan.
La lista de curvas se queda en P-256 y P-384, más Ed25519; no hay P-521, ni secp256k1, ni ningún algoritmo poscuántico. Los proyectos que los necesitan, o que necesitan validación FIPS, se pasan a aws-lc-rs, que ofrece una API compatible con ring.
Para comprobar en qué codificación está una firma de ring, pégala en el conversor DER ⇄ en bruto.