libsecp256k1 implementa una sola curva y lo hace con cuidado: firma de tiempo constante, pruebas exhaustivas y verificación formal de partes de la aritmética del cuerpo. La usan Bitcoin Core, muchas billeteras y bindings como coincurve y el backend cgo de go-ethereum. Los datos de esta página se comprobaron con el paquete de Alpine 3.24.2, versión 0.5.0 con los módulos recovery, extrakeys y schnorrsig; la última versión del proyecto era entonces la 0.8.0.
Las firmas se guardan en una estructura opaca; la codificación se elige al serializar —serialize_compact da 64 bytes de r‖s y serialize_der da DER— y el análisis es igual de explícito. parse_der es estricto: aceptó DER mínimo y rechazó la misma firma con un cero inicial redundante en r, según las reglas BIP-66 de Bitcoin. Las firmas históricas laxas necesitan el analizador laxo que se conserva en el directorio contrib del repositorio.
La operación de firma recibe un hash de 32 bytes —la biblioteca nunca calcula el hash de tu mensaje—, usa RFC 6979 (en la comprobación coincidió con una implementación independiente) y siempre produce firmas low-S. La verificación es la parte estricta: la forma high-S reflejada de una firma válida falló, y secp256k1_ecdsa_signature_normalize existe precisamente para corregir las firmas de firmantes de propósito general. Cuando las firmas de OpenSSL, Java o un KMS en la nube se verifican solo aproximadamente la mitad de las veces, la causa es high-S; el ejemplo normaliza antes de verificar.
Las claves públicas son puntos SEC1, de 65 bytes sin comprimir o de 33 comprimidos; un x‖y de 64 bytes se rechaza, y no hay compatibilidad con SPKI, PEM ni JWK. El módulo recovery recupera la clave pública a partir de una firma —la base de las direcciones de Ethereum— y el módulo schnorrsig implementa BIP-340. Comprueba firmas de mensajes de Bitcoin con el verificador de mensajes de Bitcoin y eventos de Nostr con el verificador de eventos de Nostr.