elliptic implémente ECDSA sur les courbes NIST et secp256k1, ainsi qu’Ed25519, en JavaScript pur au-dessus de bn.js. Cette bibliothèque s’est répandue via crypto-browserify, d’anciennes bibliothèques Ethereum et Bitcoin et les polyfills Node.js que Webpack 4 injectait dans les bundles pour navigateur, ce qui explique qu’elle apparaisse encore dans les fichiers de verrouillage. ethers v6 et viem reposent plutôt sur @noble/curves, qui couvre les mêmes courbes avec des valeurs par défaut plus strictes.
L’API se distingue de la plupart des bibliothèques sur trois points qui provoquent des bugs d’interopérabilité. sign() prend le condensat, pas le message, et traite comme condensat tous les octets qu’elle reçoit : les essais ont signé un message brut et obtenu une signature différente de celle de son SHA-256. Cette fonction renvoie un objet Signature avec r, s et recoveryParam, si bien que le format échangé est celui que vous sérialisez : toDER() pour les pairs de type OpenSSL, ou les deux valeurs complétées à 32 octets pour du r‖s brut. Enfin, s n’est pas normalisé, sauf si vous passez canonical: true, alors que la vérification accepte les deux moitiés.
Les nonces suivent la RFC 6979 (le vecteur de test P-256 a été reproduit exactement), mais l’avis de sécurité GHSA-848j-6mx2-7j84 (CVE-2025-14505), toujours ouvert pour la 6.6.1, signale qu’une valeur intermédiaire est tronquée lorsqu’elle commence par des octets nuls. Les essais l’ont reproduit : sur P-521 avec SHA-512, 9 entrées fixes sur 2048 ont produit un nonce différent de celui de la RFC 6979, alors que secp256k1 avec SHA-256 et P-256 avec SHA-512 n’ont montré aucune différence sur 4096 entrées chacune. Ces signatures passent toujours la vérification, mais signer le même message avec la même clé à l’aide d’une autre implémentation de la RFC 6979 donne des nonces liés, ce qui, selon l’avis, peut exposer la clé. Évitez elliptic pour P-521 et consultez le vérificateur de réutilisation de nonce pour comprendre pourquoi des nonces liés posent problème.
Des avis antérieurs ont été corrigés entre la 6.5.7 et la 6.6.1, parmi lesquels l’acceptation de signatures encodées en BER et un bug d’extraction de clé quand une chaîne était signée à la place d’un condensat ; lors des essais, la 6.6.1 a rejeté une signature DER comportant un zéro initial superflu. Les clés sont des chaînes hexadécimales ou des tableaux d’octets (points SEC1, compressés ou non, et scalaires bruts), sans prise en charge de PEM, SPKI ou JWK.
L’exemple hache d’abord, demande une signature canonique low-S et affiche les deux sérialisations. Lorsqu’une signature issue d’elliptic échoue ailleurs, comparez ses deux encodages dans le convertisseur DER ⇄ brut.