libsecp256k1 поддерживает одну кривую и делает это тщательно: подпись с постоянным временем выполнения, исчерпывающие тесты и формальная проверка корректности части арифметики поля. Её используют Bitcoin Core, многие кошельки и привязки, например coincurve и бэкенд cgo в go-ethereum. Факты на этой странице проверены на пакете Alpine 3.24.2: версия 0.5.0 с модулями recovery, extrakeys и schnorrsig; сам проект к тому времени выпустил уже 0.8.0.
Подписи хранятся в непрозрачной структуре; кодировка выбирается при сериализации (serialize_compact даёт 64 байта r‖s, serialize_der — DER), и разбор так же явный. parse_der строгий: следуя правилам BIP-66 из Bitcoin, он принял минимальный DER и отклонил ту же подпись с лишним ведущим нулём в r. Для старых подписей с нестрогой кодировкой нужен нестрогий парсер, который лежит в каталоге contrib репозитория.
Функция подписи принимает 32-байтовый хеш (сама библиотека сообщение никогда не хеширует), использует RFC 6979 (результат совпал с независимой реализацией) и всегда выдаёт low-S. Строгая часть — проверка: зеркальная форма high-S верной подписи проверку не прошла, а secp256k1_ecdsa_signature_normalize существует именно для того, чтобы исправлять подписи от универсальных реализаций. Если подпись из OpenSSL, Java или облачного KMS проходит проверку примерно в половине случаев, причина в high-S; пример нормализует подпись перед проверкой.
Открытые ключи — точки SEC1: 65 байт в несжатой форме или 33 байта в сжатой; 64-байтовое значение x‖y отклоняется, а SPKI, PEM и JWK не поддерживаются. Модуль recovery восстанавливает открытый ключ по подписи (на этом основаны адреса Ethereum), а модуль schnorrsig реализует BIP-340. Для подписей сообщений Bitcoin есть проверка сообщений Bitcoin, для событий Nostr — проверка событий Nostr.