Le projet RustCrypto répartit ECDSA entre une crate générique ecdsa et une crate par courbe (p256, p384, p521, k256 pour secp256k1 et les crates Brainpool), qui implémentent toutes les traits de signature (Signer, Verifier, PrehashSigner). Elles sont écrites en pur Rust, sans dépendances C, ce qui en fait le choix habituel pour WebAssembly et les cibles embarquées. Les essais ont utilisé ecdsa 0.17.0 avec p256, p384 et k256 0.14.0.
La signature est déterministe : sur P-256, la signature du message de test de la RFC 6979 a reproduit octet par octet le vecteur de la RFC. Le type Signature correspond à la forme r‖s brute de 64 octets ; le DER passe explicitement par to_der() et from_der(), et l’analyse de la mauvaise forme renvoie une erreur avant toute vérification. Le trait Signer hache le message avec la fonction de hachage par défaut de la courbe (SHA-256 pour P-256) ; PrehashSigner::sign_prehash prend un condensat et a donné une signature identique pour le SHA-256 du message.
Le traitement de low-S varie selon la courbe, et c’est là le piège quand une même base de code gère les deux familles. Les crates des courbes NIST conservent s tel qu’il a été calculé (29 des 64 signatures P-256 étaient high-S), et leurs vérificateurs acceptent les deux moitiés. k256 normalise s à la signature, et son vérificateur a rejeté la forme miroir high-S d’une signature valide, conformément aux règles de Bitcoin. Une signature secp256k1 produite par OpenSSL, Java ou un KMS cloud échoue donc dans k256 environ une fois sur deux : appelez d’abord normalize_s() dessus, comme l’exemple le montre pour P-256.
Les clés se chargent depuis SPKI et PKCS#8 (PEM et DER, avec les fonctionnalités pem et pkcs8), depuis des points SEC1 compressés ou non, des clés privées SEC1 et des scalaires bruts. Ed25519 se trouve dans la crate distincte ed25519-dalek, et il n’y a ici aucun algorithme post-quantique ; pour des primitives validées FIPS ou post-quantiques en Rust, consultez aws-lc-rs.
Comme la signature est déterministe, une signature qui change dans un test signale ici une véritable régression. Comparez avec d’autres bibliothèques à l’aide des vecteurs de test et du convertisseur DER ⇄ brut.