elliptic implementiert ECDSA auf den NIST-Kurven und secp256k1 sowie Ed25519 in reinem JavaScript auf Basis von bn.js. Verbreitet hat sich die Bibliothek über crypto-browserify, ältere Ethereum- und Bitcoin-Bibliotheken und die Node.js-Polyfills, die Webpack 4 in Browser-Bundles einfügte – deshalb taucht sie bis heute in Lockfiles auf. ethers v6 und viem setzen stattdessen auf @noble/curves, das dieselben Kurven mit strengeren Standardeinstellungen abdeckt.
Die API unterscheidet sich in drei Punkten von den meisten Bibliotheken, und alle drei verursachen Interoperabilitätsfehler. sign() erwartet den Digest, nicht die Nachricht, und behandelt jede übergebene Bytefolge als diesen Digest – bei der Prüfung ergab das Signieren einer rohen Nachricht eine andere Signatur als das Signieren ihres SHA-256-Hashes. Zurück kommt ein Objekt Signature mit r, s und recoveryParam; das Übertragungsformat ist also das, was du serialisierst: toDER() für Gegenstellen im Stil von OpenSSL oder beide Werte auf 32 Byte aufgefüllt für rohes r‖s. Und s wird nur normalisiert, wenn du canonical: true übergibst, während die Signaturprüfung beide Hälften akzeptiert.
Die Nonces folgen RFC 6979 – der P-256-Testvektor wurde exakt reproduziert –, doch der Sicherheitshinweis GHSA-848j-6mx2-7j84 (CVE-2025-14505), der für 6.6.1 weiterhin offen ist, meldet, dass ein Zwischenwert gekürzt wird, wenn er mit Nullbytes beginnt. Die Prüfung hat das reproduziert: Auf P-521 mit SHA-512 ergaben 9 von 2.048 festen Eingaben eine andere Nonce als nach RFC 6979, während secp256k1 mit SHA-256 und P-256 mit SHA-512 bei jeweils 4.096 Eingaben keine Abweichung zeigten. Diese Signaturen bestehen die Prüfung weiterhin, doch wer dieselbe Nachricht mit demselben Schlüssel auch mit einer anderen Implementierung von RFC 6979 signiert, erhält verwandte Nonces, die laut dem Sicherheitshinweis den Schlüssel preisgeben können. Verwende elliptic nicht für P-521; warum verwandte Nonces gefährlich sind, zeigt der Nonce-Wiederverwendungs-Checker.
Frühere Sicherheitshinweise wurden in den Versionen 6.5.7 bis 6.6.1 behoben, darunter die Annahme BER-kodierter Signaturen und ein Fehler, durch den sich der Schlüssel extrahieren ließ, wenn ein String statt eines Hashes signiert wurde; 6.6.1 lehnte bei der Prüfung eine DER-Signatur mit einer überflüssigen führenden Null ab. Schlüssel sind Hex-Strings oder Byte-Arrays – SEC1-Punkte, komprimiert oder unkomprimiert, und rohe Skalare –, ohne Unterstützung für PEM, SPKI oder JWK.
Das Beispiel hasht zuerst, fordert eine kanonische Low-S-Signatur an und zeigt beide Serialisierungen. Scheitert eine Signatur aus elliptic anderswo, vergleiche ihre beiden Kodierungen im Konverter DER ⇄ Raw.