@noble/curves implementa la criptografía de curva elíptica en TypeScript puro, sin dependencias, y ha pasado varias auditorías. Es el motor que hay debajo de ethers v6, viem y muchas herramientas de Bitcoin y Nostr, y la respuesta habitual cuando a WebCrypto le falta una curva: abarca P-256, P-384, P-521, secp256k1 y las curvas Brainpool r1, Ed25519 y Ed448 con sus variantes pre-hash y con contexto, y las firmas Schnorr BIP-340.
Sus valores predeterminados son los estrictos. Una firma son 64 bytes de r‖s compacto, el nonce sigue el RFC 6979 —la comprobación reprodujo el vector de prueba P-256 del RFC— y s siempre se normaliza a la mitad baja. La verificación es igual de estricta: se rechazaron todas las firmas high-S que produjo node:crypto y se aceptaron todas las low-S. Las firmas de OpenSSL, Java, Go o WebCrypto son high-S aproximadamente la mitad de las veces, así que verificarlas requiere lowS: false, y una entrada DER requiere format: "der": sin esa opción, un blob DER de 70 bytes lanza un error de longitud.
La versión 2 cambió el significado del primer argumento. En 1.x, sign() y verify() recibían un hash calculado por ti; en 2.x calculan ellas mismas el hash del mensaje con la función hash de la curva, y la comprobación confirmó que la 1.9.7 solo reproduce el vector del RFC cuando recibe el SHA-256 del mensaje. Por eso, el código actualizado sin cambios calcula el hash dos veces y falla frente a todas las demás bibliotecas; pasa prehash: false donde de verdad tengas un resumen. La versión 1 tampoco normalizaba las firmas P-256, así que firmas que se verificaban en 1.x pueden fallar en 2.x.
Las claves son solo bytes en bruto: un escalar secreto de 32 bytes, y las claves públicas como puntos SEC1, comprimidos (33 bytes) por defecto y sin comprimir si se pide. SPKI, PKCS#8 y JWK no se leen, así que las claves procedentes de OpenSSL o de un JWKS hay que desempaquetarlas antes; el conversor de JWK y el laboratorio de curvas elípticas ayudan con eso. Este paquete no contiene código poscuántico; el mismo autor lo publica por separado.
El ejemplo muestra las dos opciones que hacen que noble sea interoperable con un firmante al estilo de OpenSSL —format y lowS— y la salida determinista de su propio firmante. Para comparar a mano una firma en distintas codificaciones, usa el conversor DER ⇄ en bruto; para firmas de billeteras, el verificador de firmas de Ethereum funciona con el mismo código de curvas.