@noble/curves implementiert Kryptografie mit elliptischen Kurven in reinem TypeScript ohne Abhängigkeiten und wurde mehrfach auditiert. Die Bibliothek arbeitet unter der Haube von ethers v6, viem und vielen Bitcoin- und Nostr-Tools und ist die übliche Antwort, wenn WebCrypto eine Kurve fehlt: Abgedeckt sind P-256, P-384, P-521, secp256k1 und die Brainpool-r1-Kurven, Ed25519 und Ed448 mit ihren Prehash- und Kontextvarianten sowie Schnorr-Signaturen nach BIP-340.
Die Standardeinstellungen sind streng. Eine Signatur besteht aus 64 Byte kompaktem r‖s, die Nonce folgt RFC 6979 – der Test reproduzierte den P-256-Testvektor des RFC –, und s wird immer in die untere Hälfte normalisiert. Die Prüfung ist ebenso streng: Jede High-S-Signatur, die node:crypto erzeugt hatte, wurde abgelehnt, jede Low-S-Signatur akzeptiert. Signaturen aus OpenSSL, Java, Go oder WebCrypto sind etwa in der Hälfte der Fälle High-S; um sie zu prüfen, braucht es lowS: false, und DER-Eingaben brauchen format: "der" – ohne diese Option löst ein 70 Byte langer DER-Blob einen Längenfehler aus.
Version 2 hat die Bedeutung des ersten Arguments geändert. In 1.x erwarteten sign() und verify() einen Hash, den du selbst berechnet hast; in 2.x hashen sie die Nachricht selbst mit der Hashfunktion der Kurve, und der Test bestätigte, dass 1.9.7 den Vektor des RFC nur reproduziert, wenn die Funktion den SHA-256-Hash der Nachricht erhält. Code, der ohne Änderungen aktualisiert wird, hasht deshalb doppelt und scheitert im Zusammenspiel mit jeder anderen Bibliothek; übergib prehash: false, wo du wirklich einen Digest hast. Version 1 ließ außerdem P-256-Signaturen unnormalisiert, sodass Signaturen, die in 1.x die Prüfung bestanden, in 2.x scheitern können.
Schlüssel gibt es nur als rohe Bytes: ein geheimer 32-Byte-Skalar und öffentliche Schlüssel als SEC1-Punkte – standardmäßig komprimiert (33 Byte), auf Wunsch unkomprimiert. SPKI, PKCS#8 und JWK liest die Bibliothek nicht, Schlüssel aus OpenSSL oder einem JWKS müssen also zuerst entpackt werden; dabei helfen der JWK-Konverter und der Playground für elliptische Kurven. Post-Quanten-Code enthält dieses Paket nicht; derselbe Autor veröffentlicht ihn separat.
Das Beispiel zeigt die beiden Optionen, mit denen noble mit einem Signierer im Stil von OpenSSL zusammenarbeitet – format und lowS –, sowie die deterministische Ausgabe des eigenen Signierers. Um eine Signatur von Hand über Kodierungen hinweg zu vergleichen, nimm den Konverter DER ⇄ Raw; für Wallet-Signaturen läuft der Ethereum-Signatur-Verifizierer auf demselben Kurvencode.