Большая часть кода на Python — PyJWT, Authlib, paramiko, certbot, SDK от AWS и Google — выполняет реальные криптографические операции через cryptography. Слой hazmat даёт прямой доступ к ключам и подписям; wheel-пакеты содержат собственную сборку OpenSSL, поэтому поведение зависит от версии пакета, а не от операционной системы (в 50.0.2 входит OpenSSL 4.0.3).
Подписи ECDSA создаются в ASN.1 DER, и verify() ожидает DER. WebCrypto, JWS и большинство аппаратных токенов используют 64-байтовый формат raw r‖s, который verify() отклоняет с тем же исключением InvalidSignature, что и поддельную подпись. decode_dss_signature и encode_dss_signature преобразуют DER в пару целых чисел и обратно; дополнение до фиксированной длины нужно добавить самостоятельно, как показано в примере, а проверить результат вручную можно в конвертере DER ⇄ raw.
Nonce выбирается случайно, если не запросить RFC 6979: вызов ec.ECDSA(hashes.SHA256(), deterministic_signing=True) точно воспроизвёл тестовый вектор из RFC для кривой P-256 — вплоть до значения s в форме high-S, потому что пакет нигде не нормализует s, а проверка принимает обе половины диапазона. Подписи, которые будет проверять код с правилом low-S, например libsecp256k1 или @noble/curves, сначала нужно преобразовать, заменив s на n − s. sign() и verify() сами хешируют данные; если у вас уже есть дайджест, передайте Prehashed(hashes.SHA256()), иначе данные будут хешированы дважды.
В версии 50.0.2 поддерживается широкий набор кривых (от P-224 до P-521, secp256k1 и кривые Brainpool r1), а также Ed25519, Ed448, ML-KEM-768/1024 и ML-DSA-44/65/87. Ключи загружаются из PEM и DER (SPKI, PKCS#8, зашифрованный PKCS#8, SEC1), OpenSSH и из точек SEC1 без обёртки; чтения JWK нет, поэтому ключи JWK приходится обрабатывать через PyJWT, Authlib или jwcrypto либо через конвертер JWK.
Большинство ошибок, которые ищут в поисковиках, возникают при загрузке ключей, а не при подписи: открытый ключ, переданный в load_pem_private_key, зашифрованный ключ без пароля или точка, которая не лежит на указанной кривой. Если подпись из другого стека не проходит проверку, помогут инструмент проверки подписей и матрица совместимости библиотек.