El proyecto RustCrypto divide ECDSA en un crate genérico ecdsa y un crate por curva —p256, p384, p521, k256 para secp256k1 y los crates Brainpool—, que implementan todos los traits de signature (Signer, Verifier, PrehashSigner). Son Rust puro, sin dependencias de C, lo que los convierte en la opción habitual para WebAssembly y para destinos embebidos. La comprobación usó ecdsa 0.17.0 con p256, p384 y k256 0.14.0.
Las firmas son deterministas: la firma P-256 sobre el mensaje de prueba del RFC 6979 reprodujo el vector del RFC byte a byte. El tipo Signature es la forma r‖s en bruto de 64 bytes; DER requiere llamar explícitamente a to_der() y from_der(), y analizar la forma equivocada devuelve un error antes de que se llegue a verificar nada. El trait Signer calcula el hash del mensaje con la función hash predeterminada de la curva (SHA-256 para P-256); PrehashSigner::sign_prehash recibe un resumen y dio la misma firma para el SHA-256 del mensaje.
El tratamiento de low-S depende de la curva, y ahí está la trampa cuando un mismo código base maneja ambos tipos de curva. Los crates de las curvas NIST dejan s tal como se calcula —29 de 64 firmas P-256 fueron high-S— y sus verificadores aceptan ambas mitades. k256 normaliza s al firmar, y su verificador rechazó la forma high-S reflejada de una firma válida, conforme a las reglas de Bitcoin. Por eso, una firma secp256k1 producida por OpenSSL, Java o un KMS en la nube falla en k256 aproximadamente la mitad de las veces; llama antes a normalize_s() sobre ella, como muestra el ejemplo para P-256.
Las claves se cargan desde SPKI y PKCS#8 (PEM y DER, con las características pem y pkcs8), desde puntos SEC1 en cualquiera de sus dos formas, desde claves privadas SEC1 y desde escalares en bruto. Ed25519 está en el crate independiente ed25519-dalek, y aquí no hay algoritmos poscuánticos; para primitivas con validación FIPS o poscuánticas en Rust, consulta aws-lc-rs.
Como la firma es determinista, aquí una firma que cambia en una prueba es una señal real de regresión. Compara con otras bibliotecas mediante los vectores de prueba y el conversor DER ⇄ en bruto.