Библиотека ecdsa реализует ECDSA и EdDSA на чистом Python, без OpenSSL. Поэтому её легко установить где угодно, она удобна для тестовых векторов и обучения и до сих пор остаётся зависимостью старых стеков JOSE, например python-jose. Сопровождающие прямо пишут, что библиотека не рассчитана на защиту от атак по побочным каналам, поэтому в рабочих системах подписи следует создавать с помощью pyca/cryptography или coincurve.
Почти все сбои совместимости вызваны тремя значениями по умолчанию. Хеш-функция по умолчанию — SHA-1: SigningKey, созданный без hashfunc, подписывает дайджесты SHA-1, и это подтвердилось при проверке подписи с настройками по умолчанию в pyca/cryptography: с SHA-1 она прошла, а с SHA-256 — нет. Подпись имеет формат raw r‖s (64 байта на P-256), а не DER. Наконец, VerifyingKey.to_string() возвращает только 64 байта x‖y без префикса 0x04, а OpenSSL, Go и WebCrypto не принимают такие данные как точку.
При подписи используется случайный nonce, если не вызвать sign_deterministic(); этот метод воспроизвёл тестовый вектор P-256 из RFC 6979. Значение s остаётся таким, каким получилось при вычислении (примерно в половине случаев это high-S), если не выбрать один из кодировщиков *_canonize, а проверка принимает s из любой половины диапазона. Кодировка выбирается при каждом вызове через sigencode= и sigdecode=, поэтому сторона подписи и сторона проверки должны указать одну и ту же пару; подпись DER, переданная декодеру raw по умолчанию, вызывает BadSignatureError: Malformed formatting of signature.
Среди библиотек для Python у неё самый широкий набор кривых (от P-224 до P-521, secp256k1 и Brainpool), а также Ed25519 и Ed448. Ключи принимаются в виде SPKI в PEM или DER, точек SEC1 и скаляров в формате raw; to_pem() записывает SEC1 EC PRIVATE KEY, если не передать format="pkcs8".
Пример сразу меняет все три значения по умолчанию: SHA-256, детерминированный nonce и каноническая подпись DER с low-S. Чтобы сверить созданную им подпись с другой библиотекой, быстрее всего воспользоваться конвертером DER ⇄ raw и генератором тестовых векторов.