Das Projekt RustCrypto teilt ECDSA in ein generisches Crate ecdsa und je ein Crate pro Kurve auf – p256, p384, p521, k256 für secp256k1 und die Brainpool-Crates –, die alle die Traits des Crates signature implementieren (Signer, Verifier, PrehashSigner). Die Crates sind reines Rust ohne C-Abhängigkeiten und deshalb die übliche Wahl für WebAssembly und Embedded-Ziele. Für die Prüfung wurden ecdsa 0.17.0 sowie p256, p384 und k256 0.14.0 verwendet.
Das Signieren ist deterministisch: Die P-256-Signatur über die Testnachricht aus RFC 6979 reproduzierte den Vektor des RFC Byte für Byte. Der Typ Signature ist die 64 Byte lange rohe r‖s-Form; DER erfordert explizit to_der() und from_der(), und das Parsen der falschen Form gibt einen Fehler zurück, bevor überhaupt geprüft wird. Der Trait Signer hasht die Nachricht mit dem Standard-Hash der Kurve (SHA-256 bei P-256); PrehashSigner::sign_prehash nimmt einen Digest entgegen und lieferte für den SHA-256-Hash der Nachricht die identische Signatur.
Der Umgang mit Low-S hängt von der Kurve ab – genau das ist die Falle, wenn eine Codebasis beide Kurvenarten verarbeitet. Die Crates für die NIST-Kurven lassen s so, wie es berechnet wurde – 29 von 64 P-256-Signaturen waren High-S –, und ihre Verifizierer akzeptieren beide Hälften. k256 normalisiert s beim Signieren, und sein Verifizierer lehnte die gespiegelte High-S-Form einer gültigen Signatur ab, wie es die Regeln von Bitcoin vorsehen. Eine secp256k1-Signatur aus OpenSSL, Java oder einem Cloud-KMS scheitert in k256 deshalb etwa in der Hälfte der Fälle; rufe vorher normalize_s() für sie auf, wie es das Beispiel für P-256 zeigt.
Schlüssel lassen sich aus SPKI und PKCS#8 laden (PEM und DER, mit den Features pem und pkcs8), aus SEC1-Punkten in beiden Formen, aus privaten Schlüsseln im SEC1-Format und aus rohen Skalaren. Ed25519 liegt im separaten Crate ed25519-dalek, und Post-Quanten-Algorithmen gibt es hier nicht; für FIPS-validierte oder Post-Quanten-Primitive in Rust sieh dir aws-lc-rs an.
Weil das Signieren deterministisch ist, ist eine geänderte Signatur in einem Test hier ein echtes Anzeichen für eine Regression. Vergleiche mit anderen Bibliotheken anhand von Testvektoren und mit dem Konverter DER ⇄ Raw.